From 6493d82d59a08ff372ddb1847fdd431d9b6c8d60 Mon Sep 17 00:00:00 2001
From: bbarber <bradb@shore.net>
Date: Sat, 5 Dec 2009 09:30:15 -0500
Subject: [PATCH] qhull 3.1 2001/10/04 -- contents of qhull3.1.tgz

New features
 - Added option 'Qt' to triangulate non-simplicial facets
 - Added option 'TI file' to input data from file
 - Added option 'Q10' to prevent special processing for narrow distributions
        e.g., RBOX 1000 L100000 s G1e-6 t1001803691 | QHULL Tv Q10
 - Tried to compute Voronoi volumes ('Pv'). Requires dual face graph--not easy
        See Clarkson's hull program for code.

Changes to options
 - Added numtricoplanars to 'Fs'. Number of good, triangulated facets for 'Qt'
 - Added Zdelvertextot to 'Fs'.  If non-zero and Delaunay, input is degenerate
 - Qhull command ('FQ') may be repeated.
 - If 'TPn' and 'TWn' defined, trace the addition of point 'n'
     otherwise continue tracing (previously it stopped in 4-d)
 - Removed 'Ft' from qdelaunay.  Use 'Qt o' or 'qhull d QJ Qt' instead.
     For non-simplicial regions, 'Ft' does not satisify the Delaunay property.
 - If 'Po' or 'TVn', qhull checks outer planes.  Use 'Q5' to turn off.
 - If 'T4', print facet lists and check polygon after adding each point

Corrections to code
 - rbox: allow 'c' and 'd' with 's r', meshes, etc.
 - qh_findbest: redesigned as directed search. qh_findbesthorizon for coplanar
      qh_findbest is faster for many distributions
 - qh_findbestnew: redesigned to search horizon of coplanar best newfacets
      needed for distributions with a sharp edge,
          e.g., rbox 1000 s Z1 G1e-13 | qhull Tv
 - qh_findbest/qh_findbestnew: search neighbors of better horizon facets
      was needed for RBOX 1000 s Z1 G1e-13 t996564279 | qhull Tv
      and RBOX 1000 s W1e-13 P0 t996547055 | QHULL d Qbb Qc Tv
 - qh_findbest with noupper: could return an upperdelaunay facet if dist>qh.MINoutside.
 - qh_findbestnew: allow facet->upperdelaunay if dist > qh.MINoutside
 - qh_partitioncoplanar: call qh_partitionpoint if outside and perpendicular
      for distributions with a sharp edge
 - qh_partitionvisible: report precision error if all newfacets degenerate.
      was needed for RBOX 1000 s W1e-13 t995138628 | QHULL d
 - qh_createsimplex: clears qh.num_visible, may be non-zero with 'TRn QJ'

Changes to prompts, warnings, and statistics
 - For Delaunay & Voronoi, 's' reports deleted vertices due to facet merging.
   They were incorrectly reported as nearly incident points.
 - Warn if recompute centrum after constructing hull
 - Simplified narrow hull warning and print all digits of cosine.
     A narrow hull may lead to a point outside of the hull.
 - Print total vertices deleted instead of ave. per iteration (Zdelvertextot)
 - Improved tracing for qh_partitionpoint and qh_partitioncoplanar
 - Added number of distance tests for checking outer planes (qh_check_maxout)
 - Simplified "qhull precision error: Only n facets remain."
 - Included 'TRn' in the causes of a premature exit

Changes to documentation
 - README.txt: Added quickstart instructions for Visual C++
 - rbox: Added example of edge of narrow lens, rbox 1000 L100000 s G1e-6
 - Added cross references between options 'o' and 'p'.
 - qh-eg.html: added examples comparing 'Qt', 'QJ', and neither 'Qt' nor 'QJ'
        eg.15a.surface, eg.15b.triangle, eg.17a.delaunay.2, etc.
 - Reorganized and enhanced discussion of precision problems in qh_impre.htm
 - Fixed spelling errors [K. Briggs]
 - Fixed link errors, validated HTML, and spell checked [HomeSite]
 - Removed unnecessary #TOP links
 - Added source links to the qh-quick.htm's header and footer
 - qh-geom.htm, qh-poly.htm: add links to Voronoi functions in io.c
 - src/index.htm: Added how to search qhulllib.h for qhull options
 - qvoronoi.htm/qdelaun.htm: 'Fc' and 'FN' includes deleted vertices

Changes to URLs
 - Added http://www.voronoi.com and http://www.magic-software.com

Changes to code
 - qh_qhull: if 'TVn' or 'TCn' do not call qh_check_maxout and qh_nearcoplanar
 - reviewed time profile.  Qhull is slower.  Optimized qh_findbestnew()
 - qh_addpoint: Added warning note about avoiding a local minimum
 - qh_checkpolygon: report qh.facet_next error if NARROWhull & dist>MINoutside
 - qh_findbest: renamed "newfacets" parameter to "isnewfacets" since it is boolT
 - qh_findbest/qh_findbestnew: testhorizon even if !MERGING
        Otherwise qhull c D6 | qhull Q0 Tv assigns coplanar points
 - qh_resetlists: add qh_RESETvisible for qh_triangulate
 - qh_findbest: search better facets first.  Rewritten.
 - qh_findbest: increased minminsearch, always check coplanar facets.
        See: RBOX 1000 s Z1 G1e-13 t996564279 | QHULL Tv
 - qh_findbestnew: report precision error for deleted cones [rare event]
        e.g.:  RBOX 1000 s W1e-13 P0 t1001034076 | QHULL d Qbb Qc Tv
 - qh_findbesthorizon: search horizon of qh.coplanarset.  New.
 - qh_findbestsharp: replaced with qh_sharpnewfacets followed by qh_findbestnew
 - qh_partitionpoint, Delaunay sites can not be inside.  Otherwise points may
       be outside upperDelaunay facets yet not near-inside Delaunay facets
       See: RBOX s 1000 t993602376 | QHULL C-1e-3 d  Qbb FA Tv
 - qh_partitioncoplanar: call qh_findbest/qh_findbestnew with qh DELAUNAY
 - qh_printlists: format long lines
 - qh_printvertex: format long lines
 - user.h: tightened qh_WARNnarrow and qh_MAXnarrow.  Do not see problems
       until they are -1.0.
 - user.h: defined qh_DISToutside, qh_SEARCHdist, and qh_USEfindbestnew
 - qh_checkfacet: in 3-d, allow #ridges > #vertices.  Can get a vertex twice
   in a ridge list, e.g,  RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv

Changes to FAQ
 - Recommended use of triangulated output ('Qt')

Changes to distribution
 - Recompiled in Visual C++ 5.0 with optimization (as was version 2.6)
 - q_test: Added bad cases for Qhull and tests for new features

Changes to Qhull library
 - Added qh_triangulate() to poly2.c.  It triangulates the output.
 - Added option 'Q11' to copy normals and recompute centrums for tricoplanar facets
        'FP' may not print the nearest vertex for coplanar points
        Use option 'Q11' when adding points after qh_triangulate()
---
 Announce.txt      |   2 +-
 QHULL-GO.pif      | Bin 0 -> 967 bytes
 README.txt        |  59 ++-
 eg/q_eg           |   6 +-
 eg/q_test         |  50 ++-
 eg/q_test.bat     |  70 +++-
 html/index.htm    | 108 +++---
 html/qconvex.htm  |  51 ++-
 html/qdelau_f.htm |  83 +++--
 html/qdelaun.htm  | 153 ++++----
 html/qh-eg.htm    |  96 +++--
 html/qh-faq.htm   | 920 ++++++++++++++++++++++++----------------------
 html/qh-home.htm  |  22 +-
 html/qh-impre.htm | 659 +++++++++++++++++++--------------
 html/qh-in.htm    | 104 ++++--
 html/qh-optc.htm  |   8 +-
 html/qh-optf.htm  | 552 +++++++++++++++-------------
 html/qh-optg.htm  |   6 +-
 html/qh-opto.htm  |  32 +-
 html/qh-optp.htm  |  26 +-
 html/qh-optq.htm  |  90 ++++-
 html/qh-optt.htm  |  38 +-
 html/qh-quick.htm | 135 ++++---
 html/qhalf.htm    |  46 ++-
 html/qhull.htm    |  47 ++-
 html/qhull.man    |  26 +-
 html/qhull.txt    |  61 +--
 html/qvoron_f.htm |  58 +--
 html/qvoronoi.htm |  84 +++--
 html/rbox.htm     |  19 +-
 src/Changes.txt   | 113 ++++++
 src/Makefile      | 189 ----------
 src/geom.c        | 688 ++++++++++++++++++----------------
 src/geom.h        |  11 +-
 src/geom2.c       | 122 +++---
 src/global.c      |  75 +++-
 src/index.htm     | 100 ++---
 src/io.c          | 101 +++--
 src/io.h          |   2 +-
 src/merge.c       |  44 ++-
 src/merge.h       |   3 +-
 src/poly.c        |  55 ++-
 src/poly.h        |  11 +-
 src/poly2.c       | 593 +++++++++++++++++++++++++-----
 src/qconvex.c     |  16 +-
 src/qdelaun.c     |  25 +-
 src/qh-geom.htm   |  36 +-
 src/qh-globa.htm  |  17 +-
 src/qh-io.htm     |  18 +-
 src/qh-mem.htm    |  16 +-
 src/qh-merge.htm  |  31 +-
 src/qh-poly.htm   |  57 ++-
 src/qh-qhull.htm  |  36 +-
 src/qh-set.htm    |  20 +-
 src/qh-stat.htm   |  16 +-
 src/qh-user.htm   |  48 +--
 src/qhalf.c       |  15 +-
 src/qhull.c       | 197 ++++++----
 src/qhull.h       |  38 +-
 src/qhull_a.h     |   4 +-
 src/qset.c        |   5 +-
 src/qset.h        |  13 +
 src/qvoronoi.c    |  19 +-
 src/rbox.c        | 248 ++++++-------
 src/stat.c        |  40 +-
 src/stat.h        |  28 +-
 src/unix.c        |  20 +-
 src/user.h        |  68 +++-
 src/user_eg.c     |   4 +-
 src/user_eg2.c    |  15 +-
 70 files changed, 4062 insertions(+), 2706 deletions(-)
 create mode 100644 QHULL-GO.pif
 delete mode 100644 src/Makefile

diff --git a/Announce.txt b/Announce.txt
index 748a213..6681341 100644
--- a/Announce.txt
+++ b/Announce.txt
@@ -1,5 +1,5 @@
 
-   Qhull       Version 3.0          February 11, 2001
+   Qhull       Version 3.1          October 4, 2001
 
         http://www.geom.umn.edu/locate/qhull
         http://www.geomview.org
diff --git a/QHULL-GO.pif b/QHULL-GO.pif
new file mode 100644
index 0000000000000000000000000000000000000000..a5414428207cfe796fb9a7fff6ae0790af968500
GIT binary patch
literal 967
zcmZRm2=oZ`@zHhnSHKDym>3vb-D6;i^qd?+7@!)!YzCr$6~q8zJ;NARccOGqR}mw_
zf5`v_26pP2N|tH9p3Xu3!TxR`3IU#Ot`Q9Fj0_BgjNzVsF8<-c3dR;@3dVW{46ICZ
z88a9_fuF))#PI(=0~j+2FfquJWh;J7Fx$g?eHBcAw*UVx&9nySF4_Q~zkS_<^jv&=
zsAWDdnBc&O0pW0MFq@S@l7X4w1j7qvCI&9JIvy4V1`Y-uFb+vA%FWD6%z;ayF?>ps
zGgA^3ob&UF^K(+sB*9#eodFEmz!+m;>S0o55(Dyqi4F?<82A`&F&QE|6PqDqi!m|)
E0HlyXDgXcg

literal 0
HcmV?d00001

diff --git a/README.txt b/README.txt
index 869bee3..a79c168 100644
--- a/README.txt
+++ b/README.txt
@@ -1,6 +1,6 @@
 Name
 
-      qhull, rbox         Version 3.0        February 11, 2001
+      qhull, rbox         Version 3.1        October 4, 2001
   
 Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection
  
@@ -116,27 +116,48 @@ Compiling for Unix
       - type 'make install'
 
 
-Compiling for Windows 95 and Windows NT
+Compiling for Windows 95, 98, NT, 2000
 
   Qhull compiles as a console application in Visual C++ 5.0 at warning 
-  level 3.  
-  
-  Define a project for the Qhull library or include these files in the
-  projects below.
-    - qhull.a         qhull.h qhull_a.h geom.c geom2.c geom.h global.c io.c
-                      io.h mem.c mem.h merge.c merge.h poly.c poly2.c poly.h 
-                      qset.c qset.h stat.c stat.h
-
-  Define projects for the following programs
-    - qconvex         qconvex.c plus the qhull.a files
-    - qdelaunay       qdelaun.c plus the qhull.a files
-    - qhalf           qhalf.c plus the qhull.a files
-    - qhull           unix.c plus the qhull.a files
-    - qvoronoi        qvoronoi.c plus the qhull.a files
-    - rbox:           rbox.c and user.h
-    - user_eg:        user_eg.c plus the qhull.a files
-    - user_eg2:       user_eg2.c plus the qhull.a files
+  level 3.
+
+  Visual C++ quickstart for qhull.exe:  
+    - create a "Win32 console application" called "qhull"
+	- add the following files:
+	    geom.c geom2.c global.c io.c mem.c merge.c poly.c poly2.c qhull.c
+		qset.c stat.c unix.c user.c
+    - create a "Win32 console application" called "rbox" 
+	- add rbox.c
+
+  Visual C++ quickstart for qhull library, qconvex, etc.
+    - To simplify setting up lots of projects, 
+	    create a "Win32 console application" called "qhull source"
+		add all .c files from .../src/...
+		change Project:Settings... when done
+
+    - create a "Win32 console application" called "rbox"
+	- move rbox.c from "qhull source"
+	- build the project
 
+    - create a "Win32 static library" called "library"
+	- move these files from "qhull source"
+	    geom.c geom2.c global.c io.c mem.c merge.c poly.c poly2.c qhull.c
+		qset.c stat.c user.c
+	- build the project
+
+    - create a "Win32 console application" called "qhull"
+	- move unix.c from "qhull source"
+	- add "qhull library.lib" from Visual C++'s build directory
+
+    - create a "Win32 console application" called "qconvex"
+	- move qconvex.c from "qhull source"
+	- copy "qhull library.lib" from "qhull"
+
+    - do the same for qdelaun.c, qhalf, qvoronoi.c, user_eg.c, user_eg2.c
+	- delete "qhull sources" since it is no longer needed
+	- use Project:Settings to make any changes
+	- use batch build to rebuild everything
+  
   Qhull compiles with Borland C++ 5.0 bcc32.  A Makefile is included.
   Execute 'make -f MBorland'.  If you use the Borland IDE, set the ANSI
   option in Options:Project:Compiler:Source:Language-compliance.
diff --git a/eg/q_eg b/eg/q_eg
index fdfb1c8..05061c2 100644
--- a/eg/q_eg
+++ b/eg/q_eg
@@ -18,12 +18,14 @@ rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QG0 PG >eg/eg.10c.sphere.horizon
 rbox 100 s P0.5,0.5,0.5 | qconvex s Ga QV0 PgG >eg/eg.10d.sphere.cone
 rbox 100 s P0.5,0.5,0.5 | qconvex s Ga >eg/eg.10e.sphere.new
 rbox 100 s P0.5,0.5,0.5 | qhull s Ga QV0g Q0 >eg/eg.14.sphere.corner
-rbox 500 W0 | qconvex s QR0 QJ5e-2 Qc Gvp >eg/eg.15.joggle
+rbox 500 W0 | qconvex s QR0 Qc Gvp >eg/eg.15a.surface
+rbox 500 W0 | qconvex s QR0 Qt Qc Gvp >eg/eg.15b.triangle
+rbox 500 W0 | qconvex s QR0 QJ5e-2 Qc Gvp >eg/eg.15c.joggle
 echo 2 = rbox 6 r s D2, rbox 15 B0.3 W0.25, c G0.5 >eg/eg.data.17
 echo 25 >>eg/eg.data.17
 rbox 15 D2 B0.3 W0.25 c G0.5 | tail +3 >>eg/eg.data.17
 rbox 6 r s D2 B0.2 | tail +3 >>eg/eg.data.17
-qdelaunay s QJ <eg/eg.data.17 GnraD2 >eg/eg.17a.delaunay.2
+qdelaunay s Qt <eg/eg.data.17 GnraD2 >eg/eg.17a.delaunay.2
 qdelaunay s <eg/eg.data.17 GnraD2 >eg/eg.17b.delaunay.2i
 qdelaunay s <eg/eg.data.17 C-0 Ga >eg/eg.17c.delaunay.2-3
 qvoronoi s QJ <eg/eg.data.17 Gna >eg/eg.17d.voronoi.2
diff --git a/eg/q_test b/eg/q_test
index 555b4f4..4f9cbe2 100644
--- a/eg/q_test
+++ b/eg/q_test
@@ -3,15 +3,15 @@
 #  NOTE:  all tests duplicated in q_test.bat
 set -v
 echo === errors if 'user_eg' and 'user_eg2' not found ===
-echo === check user_eg =====================
-user_eg "QR1 p" "v p" Fp
+echo === check user_eg ${d:-`date`} =====================
+user_eg "QR1 p n Qt" "v p" Fp
 user_eg2 "QR1 p" "v p" Fp
-echo === check front ends ==========================================================
+echo === check front ends ${d:-`date`} ==================
 qconvex -
 qconvex .
 qconvex
-rbox c D2 | qconvex s n 
-rbox c D2 | qconvex i  
+rbox c D3 | qconvex s n Qt 
+rbox c D2 | qconvex s i 
 rbox c D2 | qconvex o
 rbox 1000 s | qconvex s Tv FA
 rbox c d D2 | qconvex s Qc Fx
@@ -19,17 +19,17 @@ rbox y 1000 W0 | qconvex s n
 rbox y 1000 W0 | qconvex s QJ
 rbox d G1 D12 | qconvex QR0 FA
 rbox c D6 | qconvex FA TF500
-rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx
+rbox c P0 d D2 | qconvex p Fa Fc FP FI Fn FN FS Fv Fx 
 rbox c d D2 | qconvex s i QV0
 rbox c | qconvex Q0
 qvoronoi -
 qvoronoi .
 qvoronoi
 rbox c P0 D2 | qvoronoi s o
-rbox c P0 D2 | qvoronoi Fi
+rbox c P0 D2 | qvoronoi Fi Tv
 rbox c P0 D2 | qvoronoi Fo
 rbox c P0 D2 | qvoronoi Fv
-rbox c P0 D2 | qvoronoi s Qu Fv
+rbox c P0 D2 | qvoronoi s Qu Qt Fv
 rbox c P0 D2 | qvoronoi Qu Fo
 rbox c G1 d D2 | qvoronoi s p 
 rbox c G1 d D2 | qvoronoi QJ p 
@@ -41,17 +41,17 @@ qdelaunay
 rbox c P0 D2 | qdelaunay s o
 rbox c P0 D2 | qdelaunay i
 rbox c P0 D2 | qdelaunay Fv
-rbox c P0 D2 | qdelaunay s Qu Fv
+rbox c P0 D2 | qdelaunay s Qu Qt Fv
 rbox c G1 d D2 | qdelaunay s i
-rbox c G1 d D2 | qdelaunay Ft
-rbox c G1 d D2 | qdelaunay QJ s Ft
+rbox c G1 d D2 | qhull d Qbb Ft
+rbox c G1 d D2 | qhull d Qbb QJ s Ft
 rbox M3,4 z 100 D2 | qdelaunay s
 rbox c P-0.1 P+0.1 P+0.1 D2 | qdelaunay s Fx Fa Fc FP FQ Fn FN
 rbox P0 P0 c D2 | qdelaunay s FP QV0
 qhalf -
 qhalf .
 qhalf
-rbox d | qhull FQ n | qhalf s H0,0,0 Fp
+rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp
 rbox c | qhull FQ FV n | qhalf s i
 rbox c | qhull FQ FV n | qhalf o
 rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx
@@ -193,6 +193,7 @@ rbox 1000 s D2 | qhull FA Tcv
 rbox 1000 s | qhull FA Tcv
 rbox c D4 | qhull FA Tcv
 rbox c D5 | qhull FA Tcv
+rbox c D5 | qhull FA Qt Tcv
 rbox 10 D2 | qhull d FA Tcv
 rbox 10 D2 | qhull d Qu FA Tcv
 rbox 10 D2 | qhull FA Tcv
@@ -205,7 +206,21 @@ rbox P0.5,0.5 P0.5,0.5 W0 5 D2 | qhull d FN Qc
 rbox 10 D3 | qhull Fa PA5
 rbox 10 D3 | qhull Fa PF0.4
 
-echo === test unbounded intersection
+echo === test Qt ${d:-`date`}
+rbox c | qhull Qt s o Tcv
+rbox c | qhull Qt f i
+rbox c | qhull Qt m n
+rbox c | qhull Qt p o
+rbox c | qhull Qt Fx
+rbox c | qhull Qt FA s Fa
+rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv
+rbox 6 r s c G0.1 D2 | qhull d FA Tcv
+rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv
+rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv
+rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt
+RBOX 100 W0 | QHULL Tv Q11 FO
+
+echo === test unbounded intersection ${d:-`date`}
 rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv
 rbox 1000 W1e-3 D3 | qhull PA8 Fa FS s n Tcv 
 rbox 1000 W1e-3 D3 | qhull C-0.01 PM10 Fm n Tcv Qc
@@ -275,6 +290,7 @@ rbox 10 D3 | qhull Qb1:0B1:0 d Tcv Q8
 rbox 10 D3 | qhull Qb1:0B1:0B2:0 d Tcv Q8
 rbox 10 D3 | qhull Qb1:0 d Tcv 
 rbox 10 D3 | qhull Qb1:0B1:0  Tcv
+echo "== next command will error ${d:-`date`} =="
 rbox 10 D2 | qhull Qb1:1B1:1 Tcv
 rbox 200 L20 D2 t | qhull FO Tcv C-0
 rbox 1000 L20 t | qhull FO Tcv C-0
@@ -334,6 +350,14 @@ rbox 300 D5 t |qhull A-0.999 Qx Qc Tcv
 rbox 100 D6 t |qhull A-0.9999 Qx Qc Tcv
 rbox 50 D7 t |qhull A-0.99999 Qx Qc Tcv W0.1
 
+echo === check bad cases for Qhull.  May cause errors ${d:-`date`}
+RBOX 1000 L100000 s G1e-6 t | QHULL Tv
+RBOX 1000 L100000 s G1e-6 t | QHULL Tv Q10
+rbox 1000 s Z1 G1e-13 t | qhull Tv
+RBOX 1000 s W1e-13 P0 t | QHULL d Qbb Qc Tv
+RBOX 1000 s W1e-13 t | QHULL d Tv
+RBOX 1000 s W1e-13 t D2 | QHULL d Tv
+
 echo =======================================================
 echo =======================================================
 echo === The following commands may cause errors ${d:-`date`}
diff --git a/eg/q_test.bat b/eg/q_test.bat
index ff5eb12..c1ca11a 100644
--- a/eg/q_test.bat
+++ b/eg/q_test.bat
@@ -1,9 +1,9 @@
-echo q_test for Windows DOS box 2001/01/20 >q_test.x
+echo q_test for Windows DOS box 2001/10/04 >q_test.x
 echo === errors if 'user_eg' and 'user_eg2' not found ===
 echo === check user_eg === >>q_test.x
-echo "user_eg "QR1 p" "v p" Fp" >>q_test.x
-user_eg "QR1 p" "v p" Fp >>q_test.x
-echo "user_eg2 "QR1 p" "v p" Fp" >>q_test.x
+echo "user_eg 'QR1 p n Qt' 'v p' Fp" >>q_test.x
+user_eg "QR1 p n Qt" "v p" Fp >>q_test.x
+echo "user_eg2 'QR1 p' 'v p' Fp" >>q_test.x
 user_eg2 "QR1 p" "v p" Fp >>q_test.x
 echo === check front ends ========================================================== >>q_test.x
 echo "qconvex -" >>q_test.x
@@ -12,10 +12,10 @@ echo "qconvex ." >>q_test.x
 qconvex . >>q_test.x
 echo "qconvex" >>q_test.x
 qconvex >>q_test.x
-echo "rbox c D2 | qconvex s n " >>q_test.x
-rbox c D2 | qconvex s n  >>q_test.x
-echo "rbox c D2 | qconvex i  " >>q_test.x
-rbox c D2 | qconvex i   >>q_test.x
+echo "rbox c D3 | qconvex s n Qt" >>q_test.x
+rbox c D3 | qconvex s n Qt >>q_test.x
+echo "rbox c D2 | qconvex i Qt " >>q_test.x
+rbox c D2 | qconvex i Qt  >>q_test.x
 echo "rbox c D2 | qconvex o" >>q_test.x
 rbox c D2 | qconvex o >>q_test.x
 echo "rbox 1000 s | qconvex s Tv FA" >>q_test.x
@@ -50,8 +50,8 @@ echo "rbox c P0 D2 | qvoronoi Fo" >>q_test.x
 rbox c P0 D2 | qvoronoi Fo >>q_test.x
 echo "rbox c P0 D2 | qvoronoi Fv" >>q_test.x
 rbox c P0 D2 | qvoronoi Fv >>q_test.x
-echo "rbox c P0 D2 | qvoronoi s Qu Fv" >>q_test.x
-rbox c P0 D2 | qvoronoi s Qu Fv >>q_test.x
+echo "rbox c P0 D2 | qvoronoi s Qu Qt Fv" >>q_test.x
+rbox c P0 D2 | qvoronoi s Qu Qt Fv >>q_test.x
 echo "rbox c P0 D2 | qvoronoi Qu Fo" >>q_test.x
 rbox c P0 D2 | qvoronoi Qu Fo >>q_test.x
 echo "rbox c G1 d D2 | qvoronoi s p " >>q_test.x
@@ -74,8 +74,8 @@ echo "rbox c P0 D2 | qdelaunay i" >>q_test.x
 rbox c P0 D2 | qdelaunay i >>q_test.x
 echo "rbox c P0 D2 | qdelaunay Fv" >>q_test.x
 rbox c P0 D2 | qdelaunay Fv >>q_test.x
-echo "rbox c P0 D2 | qdelaunay s Qu Fv" >>q_test.x
-rbox c P0 D2 | qdelaunay s Qu Fv >>q_test.x
+echo "rbox c P0 D2 | qdelaunay s Qu Qt Fv" >>q_test.x
+rbox c P0 D2 | qdelaunay s Qu Qt Fv >>q_test.x
 echo "rbox c G1 d D2 | qdelaunay s i" >>q_test.x
 rbox c G1 d D2 | qdelaunay s i >>q_test.x
 echo "rbox c G1 d D2 | qdelaunay Ft" >>q_test.x
@@ -94,7 +94,7 @@ echo "qhalf ." >>q_test.x
 qhalf . >>q_test.x
 echo "qhalf" >>q_test.x
 qhalf >>q_test.x
-echo "rbox d | qhull FQ n | qhalf s H0,0,0 Fp" >>q_test.x
+echo "rbox d | qhull FQ n | qhalf s Qt H0,0,0 Fp" >>q_test.x
 rbox d | qhull FQ n | qhalf s H0,0,0 Fp >>q_test.x
 echo "rbox c | qhull FQ FV n | qhalf s i" >>q_test.x
 rbox c | qhull FQ FV n | qhalf s i >>q_test.x
@@ -102,6 +102,7 @@ echo "rbox c | qhull FQ FV n | qhalf o" >>q_test.x
 rbox c | qhull FQ FV n | qhalf o >>q_test.x
 echo "rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx" >>q_test.x
 rbox d D2 | qhull FQ n | qhalf s H0 Fc FP Fn FN FQ Fv Fx >>q_test.x
+
 echo === check quality of merges for ${d:-`hostname`} ${d:-`date`} >>q_test.x
 echo "rbox 1000 W0 t | qhull QR2 QJ s Fs Tv" >>q_test.x
 rbox 1000 W0 t | qhull QR2 QJ s Fs Tv >>q_test.x
@@ -127,11 +128,13 @@ echo "rbox 1000 W5e-4 D4 t | qhull C-1e-5 Qc Tv" >>q_test.x
 rbox 1000 W5e-4 D4 t | qhull C-1e-5 Qc Tv >>q_test.x
 echo "rbox 400 W1e-3 D5 t | qhull C-1e-5 Qx Qc Tv" >>q_test.x
 rbox 400 W1e-3 D5 t | qhull C-1e-5 Qx Qc Tv >>q_test.x
+
 echo === check input format etc. ${d:-`date`} >>q_test.x
 echo "rbox d h | qhull Fd FV n FD  Tcv | qhull Fd H Fp Tcv" >>q_test.x
 rbox d h | qhull Fd FV n FD Tcv | qhull Fd H Fp Tcv >>q_test.x
 echo "rbox 10 h | qhull Fd FD p Tcv | qhull Fd d Tcv " >>q_test.x
 rbox 10 h | qhull Fd FD p Tcv | qhull Fd d Tcv  >>q_test.x
+
 echo === check rbox ${d:-`date`} >>q_test.x
 echo "rbox 3 n D2" >>q_test.x
 rbox 3 n D2 >>q_test.x
@@ -339,6 +342,32 @@ rbox 10 D3 | qhull Fa PA5 >>q_test.x
 echo "rbox 10 D3 | qhull Fa PF0.4" >>q_test.x
 rbox 10 D3 | qhull Fa PF0.4 >>q_test.x
 
+echo === test Qt >>q_test.x
+echo "rbox c | qhull Qt s o Tcv" >>q_test.x
+rbox c | qhull Qt s o Tcv >>q_test.x
+echo "rbox c | qhull Qt f i" >>q_test.x
+rbox c | qhull Qt f i >>q_test.x
+echo "rbox c | qhull Qt m n" >>q_test.x
+rbox c | qhull Qt m n >>q_test.x
+echo "rbox c | qhull Qt p o" >>q_test.x
+rbox c | qhull Qt p o >>q_test.x
+echo "rbox c | qhull Qt Fx" >>q_test.x
+rbox c | qhull Qt Fx >>q_test.x
+echo "rbox c | qhull Qt FA s Fa" >>q_test.x
+rbox c | qhull Qt FA s Fa >>q_test.x
+echo "rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv" >>q_test.x
+rbox 6 r s c G0.1 D2 | qhull Qt d FA Tcv >>q_test.x
+echo "rbox 6 r s c G0.1 D2 | qhull d FA Tcv" >>q_test.x
+rbox 6 r s c G0.1 D2 | qhull d FA Tcv >>q_test.x
+echo "rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv" >>q_test.x
+rbox 6 r s c G0.1 D2 | qhull Qt v p Tcv >>q_test.x
+echo "rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv" >>q_test.x
+rbox c | qhull Qt C-0.1 Qc FF s FQ Fi n Fo FQ FI Fm Fn FN FO FO FQ Fs FS FV Fv Tcv >>q_test.x
+echo "rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt" >>q_test.x
+rbox 6 r s c G0.1 D2 P0.1,0.1 | qhull s FP d FO Qt >>q_test.x
+echo "RBOX 100 W0 | QHULL Tv Q11 FO" >>q_test.x
+RBOX 100 W0 | QHULL Tv Q11 FO >>q_test.x
+
 echo === test unbounded intersection >>q_test.x
 echo "rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv" >>q_test.x
 rbox c | qhull PD0:0.5 n | qhull H0 Fp Tcv >>q_test.x
@@ -468,6 +497,7 @@ echo "rbox 10 D3 | qhull Qb1:0 d Tcv " >>q_test.x
 rbox 10 D3 | qhull Qb1:0 d Tcv  >>q_test.x
 echo "rbox 10 D3 | qhull Qb1:0B1:0  Tcv" >>q_test.x
 rbox 10 D3 | qhull Qb1:0B1:0  Tcv >>q_test.x
+echo "== next command will error ==" >>q_test.x
 echo "rbox 10 D2 | qhull Qb1:1B1:1 Tcv" >>q_test.x
 rbox 10 D2 | qhull Qb1:1B1:1 Tcv >>q_test.x
 echo "rbox 200 L20 D2 t | qhull FO Tcv C-0" >>q_test.x
@@ -579,6 +609,20 @@ rbox 100 D6 t |qhull A-0.9999 Qc Tcv >>q_test.x
 echo "rbox 50 D7 t |qhull A-0.99999 Qc Tcv W0.1" >>q_test.x
 rbox 50 D7 t |qhull A-0.99999 Qc Tcv W0.1 >>q_test.x
 
+echo === check bad cases for Qhull.  May cause errors ${d:-`date`} >>q_test.x
+echo "RBOX 1000 L100000 s G1e-6 t | QHULL Tv" >>q_test.x
+RBOX 1000 L100000 s G1e-6 t | QHULL Tv >>q_test.x
+echo "RBOX 1000 L100000 s G1e-6 t | QHULL Tv Q10" >>q_test.x
+RBOX 1000 L100000 s G1e-6 t | QHULL Tv Q10 >>q_test.x
+echo "rbox 1000 s Z1 G1e-13 t | qhull Tv" >>q_test.x
+rbox 1000 s Z1 G1e-13 t | qhull Tv >>q_test.x
+echo "RBOX 1000 s W1e-13 P0 t | QHULL d Qbb Qc Tv" >>q_test.x
+RBOX 1000 s W1e-13 P0 t | QHULL d Qbb Qc Tv >>q_test.x
+echo "RBOX 1000 s W1e-13 t | QHULL d Tv" >>q_test.x
+RBOX 1000 s W1e-13 t | QHULL d Tv >>q_test.x
+echo "RBOX 1000 s W1e-13 t D2 | QHULL d Tv" >>q_test.x
+RBOX 1000 s W1e-13 t D2 | QHULL d Tv >>q_test.x
+
 echo ======================================================= >>q_test.x
 echo ======================================================= >>q_test.x
 echo === The following commands may cause errors =========== >>q_test.x
diff --git a/html/index.htm b/html/index.htm
index 9f1f10c..71527b8 100644
--- a/html/index.htm
+++ b/html/index.htm
@@ -16,13 +16,13 @@ NOTE -- verify all links by 'grep href=' 'grep name=' add # 'sort /+7'
 
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
-<b>Up:</b></a> <a
+<b>Up:</b><a
 href="http://www.geom.umn.edu/~bradb/qhull-news.html">News</a> about Qhull<br>
 <b>Up:</b> <a href="qh-faq.htm">FAQ</a> about Qhull<br>
 <b>To:</b> <a href="#TOC">Qhull manual: Table of Contents</a>
 (please wait while loading) <br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -30,7 +30,6 @@ href="http://www.geom.umn.edu/~bradb/qhull-news.html">News</a> about Qhull<br>
 &#149; <a href="qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
 &#149; <a href="qh-optt.htm#trace">Trace</a><br>
-</p>
 
 <hr>
 <!-- Main text of document -->
@@ -77,14 +76,16 @@ A facet's outer plane is clearly above all of the points;
 its inner plane is clearly below the facet's vertices.  Any
 exact convex hull must lie between the inner and outer plane.
 
-<p>Qhull uses joggled input or merged facets.  Joggled input 
-guarantees a simplicial output, but it
+<p>Qhull uses merged facets, triangulated output, or joggled
+input.  Triangulated output triangulates non-simplicial, merged
+facets.  Joggled input also 
+guarantees simplicial output, but it
 is less accurate than merged facets.  For merged facets, Qhull
 reports the maximum outer and inner plane. 
 
-<p><i>Brad Barber, Cambridge MA, February 11, 2001</i></p>
+<p><i>Brad Barber, Cambridge MA, October 4, 2001</i></p>
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -92,7 +93,7 @@ reports the maximum outer and inner plane.
 Contents </a></h2>
 
 <ul>
-    <li><a href="#when">When</a> to use Qhull</li>
+    <li><a href="#when">When</a> to use Qhull
 	     <ul>
         <li><a href="../README.txt">README.txt</a> - installation
         instructions<br>
@@ -102,7 +103,7 @@ Contents </a></h2>
 		<li><a href="qh-quick.htm#programs">Programs</a> - Program quick reference<br>
 		<li><a href="qh-quick.htm#options">Options</a> - Option quick reference<br>
         <li><a href="../src/Changes.txt">Changes.txt</a> - change history <br>
-        <li><a href="qhull.txt">qhull.txt</a> - Unix manual page</dd>
+        <li><a href="qhull.txt">qhull.txt</a> - Unix manual page
 	     </ul>
     <li><a href="#description">Description</a> of Qhull
 	     <ul>
@@ -117,7 +118,7 @@ Contents </a></h2>
 			viewer</li>
 		<li><a href="qh-eg.htm">Examples</a> of Qhull using Geomview</li>
         </ul>
-  <li><a href=qh-quick.htm#programs>Qhull programs</a></a>
+  <li><a href=qh-quick.htm#programs>Qhull programs</a>
 	<ul>
 	<li><a href="qconvex.htm">qconvex</a> -- convex hulls
 	<li><a href="qdelaun.htm">qdelaunay</a> -- Delaunay triangulations and
@@ -194,10 +195,23 @@ Contents </a></h2>
 halfspace intersections about a point, Voronoi diagrams, furthest-site Delaunay
 triangulations, and furthest-site Voronoi diagrams.</p>
 
-<p>Qhull may be used for 2-d, 3-d, 4-d, and higher dimensions.
-For example, a Pentium 166 computes the Delaunay triangulation of
-1000 points in 3-d in one CPU second. It computes the convex hull
-of the 7-d hypercube in two CPU seconds.</p>
+<p>For convex hulls and halfspace intersections, Qhull may be used 
+for 2-d upto 8-d.  For Voronoi diagrams and Delaunay triangulations, Qhull may be
+used for 2-d upto 7-d.  In higher dimensions, the size of the output
+grows rapidly and Qhull does not work well with virtual memory. 
+If <i>n</i> is the size of
+the input and <i>d</i> is the dimension (d>=3), the size of the output 
+and execution time
+grows by <i>n^(floor(d/2)</i> 
+[see <a href=qh-in.htm#performance>Performance</a>].  For example, do
+not try to build a 16-d convex hull of 1000 points.  It will
+have on the order of 1,000,000,000,000,000,000,000,000 facets.
+
+<!-- duplicated in qh-home.htm and html/index.htm -->
+<p>Qhull does <i>not</i> support constrained Delaunay
+triangulations, triangulation of non-convex surfaces, mesh
+generation of non-convex objects, or medium-sized inputs in 9-D
+and higher. </p>
 
 <p>This is a big package with many options. It is one of the
 fastest available. It is the only 3-d code that handles precision
@@ -215,8 +229,8 @@ constraints. Both programs use exact arithmetic. They are in <a
 href="ftp://netlib.bell-labs.com/netlib/voronoi">ftp://netlib.bell-labs.com/netlib/voronoi</a>.
 Qhull <a
 href="http://www.geom.umn.edu/software/download/qhull.html">version
-1.0</a> may also meet your needs. It is 1/5 the size of Version
-2.1.</p>
+1.0</a> may also meet your needs. It detects precision problems,
+but does not handle them.</p>
 
 <p><a href=http://www.mpi-sb.mpg.de/LEDA/leda.html>Leda</a> is a 
 library for writing computational
@@ -231,15 +245,10 @@ non-simplicial facets, try Fukuda's <a
 href="http://www.ifor.math.ethz.ch/ifor/staff/fukuda/cdd_home/cdd.html">cdd</a>.
 It is much faster than Qhull for these distributions. </p>
 
-<p>The size of the output
-grows by <i>n^(floor(d/2)</i> where <i>n</i> is the size of
-the input and <i>d</i> is the dimension (d>=3).  For example, do
-not try to build a 16-d convex hull of 1000 points.  It will
-have on the order of 1,000,000,000,000,000,000,000,000 facets.
-
 <p>Custom software for 2-d and 3-d convex hulls may be faster
-than Qhull. Qhull uses general-dimension data structures and
-code. </p>
+than Qhull.  Custom software should use less memory.  Qhull uses 
+general-dimension data structures and code.   The data structures
+support non-simplicial facets.</p>
 
 <p>Qhull is not suitable for mesh generation or triangulation of
 arbitrary surfaces. You may use Qhull if the surface is convex or
@@ -294,7 +303,7 @@ intersection of halfspaces. </p>
 
 <p>The input data on <tt>stdin</tt> consists of:</p>
 
-<ul compact="COMPACT">
+<ul>
     <li>first line contains the dimension</li>
     <li>second line contains the number of input points</li>
     <li>remaining lines contain point coordinates</li>
@@ -315,6 +324,10 @@ intersection of halfspaces. </p>
 <p>Input may be entered by hand. End the input with a control-D
 (^D) character. </p>
 
+<p>To input data from a file, use I/O redirection or '<a
+href="qh-optt.htm#TI">TI file</a>'.  The filename may not
+include spaces or quotes.</p>
+
 <p>A comment starts with a non-numeric character and continues to
 the end of line. The first comment is reported in summaries and
 statistics. With multiple <tt>qhull</tt> commands, use option '<a
@@ -367,11 +380,19 @@ the last point is <i>n-1</i>.</p>
 
 <ul>
     <li>summary output ('<a href="qh-opto.htm#s">s</a>') </li>
-    <li>facet merging ('<a href="qh-optc.htm#C0">C-0</a>' in 2-d,
+    <li>merged facets ('<a href="qh-optc.htm#C0">C-0</a>' in 2-d,
         3-d, 4-d; '<a href="qh-optq.htm#Qx">Qx</a>' in 5-d and
         up)</li>
 </ul>
 
+<p>Except for bounding box
+('<a href="qh-optq.htm#Qbk">Qbk:n</a>', etc.), drop facets 
+('<a href="qh-optp.htm#Pdk">Pdk:n</a>', etc.), and
+Qhull command ('<a href="qh-opto.htm#FQ">FQ</a>'), only the last
+occurence of an option counts.  
+Bounding box and drop facets may be repeated for each dimension.
+Option 'FQ' may be repeated any number of times.
+
 <p>The Unix <tt>tcsh</tt> and <tt>ksh </tt>shells make it easy to
 try out different options. In Windows 95, use a DOS window with <tt>doskey</tt>
 and a window scroller (e.g., <tt>peruse</tt>). </p>
@@ -382,7 +403,9 @@ and a window scroller (e.g., <tt>peruse</tt>). </p>
 
 <p>To write the results to a file, use I/O redirection or '<a
 href="qh-optt.htm#TO">TO file</a>'. Windows 95 users should use
-'TO file' or the console. </p>
+'TO file' or the console.  If a filename is surrounded by single quotes, 
+it may include spaces.
+</p>
 
 <p>The default output option is a short summary ('<a
 href="qh-opto.htm#s">s</a>') to <tt>stdout</tt>. There are many
@@ -435,18 +458,18 @@ requirements, and floating-point error handling. </p>
         an offset. The length of the normal is one. The
         hyperplane defines a halfspace. If <i>V</i> is a normal, <i>b</i>
         is an offset, and <i>x</i> is a point inside the convex
-        hull, then <i>Vx+b <0</i>. </i></li>
-    <li><i>An </i><em><i>outer plane</i></em><i> is a positive
+        hull, then <i>Vx+b &lt;0</i>.</li>
+    <li>An <em>outer plane</em> is a positive
         offset from a hyperplane. When Qhull is done, all points
-        will be below all outer planes. </i></li>
-    <li><i>An </i><em><i>inner plane</i></em><i> is a negative
+        will be below all outer planes.</li>
+    <li>An <em>inner plane</em> is a negative
         offset from a hyperplane. When Qhull is done, all
-        vertices will be above the corresponding inner planes. </i></li>
-    <li><i>An orientation is either 'top' or 'bottom'. It is the
+        vertices will be above the corresponding inner planes.</li>
+    <li>An <em>orientation</em> is either 'top' or 'bottom'. It is the
         topological equivalent of a hyperplane's geometric
-        orientation. </i></li>
-    <li><i>A </i><em><i>simplicial facet</i></em><i> is a set of
-        d</i> neighboring facets, a set of <i>d</i> vertices, a
+        orientation. </li>
+    <li>A <em>simplicial facet</em> is a set of
+        <i>d</i> neighboring facets, a set of <i>d</i> vertices, a
         hyperplane equation, an inner plane, an outer plane, and
         an orientation. For example in 3-d, a simplicial facet is
         a triangle. </li>
@@ -550,7 +573,7 @@ facet is convex with its neighbors. It checks the topology of the
 convex hull.</p>
 
 <p>Qhull should work on all inputs. It may report precision
-errors if you turn off facet merging with option '<a
+errors if you turn off merged facets with option '<a
 href="qh-optq.htm#Q0">Q0</a>'. This can get as bad as facets with
 flipped orientation or two facets with the same vertices. You'll
 get a long help message if you run into such a case. They are
@@ -638,14 +661,14 @@ Huhdanpaa, &quot;The Quickhull Algorithm for Convex Hulls,&quot; <i>ACM
 Transactions on Mathematical Software</i>, Vol. 22, No. 4 (Dec.
 1996), p. 469-483 [<a
 href="http://www.acm.org/pubs/citations/journals/toms/1996-22-4/p469-barber/">http://www.acm.org</a>;
-<a href="ftp://geom.umn.edu/pub/software/qhull-96.ps.Z">ftp://geom.umn.edu</a>].
+<a href="ftp://geom.umn.edu/pub/software/qhull-96.ps">ftp://geom.umn.edu</a>].
 </p>
 
 <p><a name="cla-sho89">Clarkson</a>, K.L. and P.W. Shor,
 &quot;Applications of random sampling in computational geometry,
 II&quot;, <i>Discrete Computational Geometry</i>, 4:387-421, 1989</p>
 
-<p><a name="cla-meh92">Clarkson</a>, K.L., K. Mehlhorn, and R.
+<p><a name="cla-meh93">Clarkson</a>, K.L., K. Mehlhorn, and R.
 Seidel, &quot;Four results on randomized incremental
 construction,&quot; <em>Computational Geometry: Theory and
 Applications</em>, vol. 3, p. 185-211, 1993.</p>
@@ -695,12 +718,12 @@ xf qhull.tar, cd qhull, make </p>
 
 <p><b>Up:</b> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
-<b>Up:</b></a> <a
+<b>Up:</b><a
 href="http://www.geom.umn.edu/~bradb/qhull-news.html">News</a> about Qhull<br>
 <b>Up:</b> <a href="qh-faq.htm">FAQ</a> about Qhull<br>
 <b>To:</b> <a href="#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -712,8 +735,7 @@ href="http://www.geom.umn.edu/~bradb/qhull-news.html">News</a> about Qhull<br>
 <b>Dn:</b> <a href="qh-eg.htm">Description of Qhull examples</a><br>
 <b>Dn:</b> <a href="qh-in.htm">Qhull internals</a><br>
 <b>Dn:</b> <a href="../src/index.htm">Qhull functions, macros, and data
-structures</a> </p>
-</p>
+structures</a>
 <!-- GC common information -->
 <hr>
 
diff --git a/html/qconvex.htm b/html/qconvex.htm
index dfa8492..a1c5c94 100644
--- a/html/qconvex.htm
+++ b/html/qconvex.htm
@@ -11,7 +11,7 @@
 <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a> -- Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -22,7 +22,7 @@
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 <hr>
 <!-- Main text of document -->
@@ -51,12 +51,16 @@ href="qh-eg.htm#how">How Qhull adds a point</a>.</p>
                 href="qh-opto.htm#n">n</a></dt>
             <dd>Print the normals for each facet of a cube.</dd>
             <dt>&nbsp;</dt>
+            <dt><b>Example:</b> rbox c | qconvex <a
+                href="qh-opto.htm#i">i</a> <a href="qh-optq.htm#Qt">Qt</a></dt>
+            <dd>Print the triangulated facets of a cube.</dd>
+            <dt>&nbsp;</dt>
             <dt><b>Example:</b> rbox y 500 W0 | qconvex</dt>
             <dd>Compute the convex hull of a simplex with 500
                 points on its surface.</dd>
             <dt>&nbsp;</dt>
             <dt><b>Example:</b> rbox x W1e-12 1000 | qconvex
-            <a href="qh-optq.htm#QR">QR0</a>
+            <a href="qh-optq.htm#QR">QR0</a></dt>
         <dd>Compute the convex hull of 1000 points near the
 		    surface of a randomly rotated simplex.  Report
 			the maximum thickness of a facet.</dd>
@@ -97,11 +101,11 @@ href="qh-eg.htm#how">How Qhull adds a point</a>.</p>
 
 <p>Except for rbox, all of the qhull programs compute a convex hull. 
 
-<p>If you use '<a href="qh-optq.htm#QJn">QJ</a>' (joggle), all facets 
-will be simplicial (e.g., triangles in 3-d).  Duplicate points will 
-be joggled apart. If you do not use
+<p>If you use '<a href="qh-optq.htm#Qt">Qt</a>' (triangulated output) or '<a href="qh-optq.htm#QJn">QJ</a>' (joggled input), all facets 
+will be simplicial (e.g., triangles in 3-d).  If you do not use
 'QJ', <tt>qconvex</tt> merges coplanar facets.  This is more accurate
-than joggled input.  See <a
+than joggled input.  With 'QJ', duplicate points will 
+be joggled apart.  See <a
 href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 
 <p>The output for 4-d convex hulls may be confusing if the convex
@@ -115,19 +119,20 @@ are there extra points in a 4-d or higher convex hull?</a><br>
 '<a href=qhull.htm#outputs>qhull</a> <a href=qh-optq.htm#Qx>Qx</a>' 
 in 5-d and higher.  It disables the following Qhull
 <a href=qh-quick.htm#options>options</a>: <i>d v H Qbb Qf Qg Qm 
-Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9</i>.
+Qr Qu Qv Qx Qz TR E V Fp Gt Q0,etc</i>.
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
-<h3><a href="#TOP">»</a><a name="synopsis">qconvex synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">qconvex synopsis</a></h3>
 <pre>
 qconvex- compute the convex hull.  
     input (stdin): dimension, number of points, point coordinates
     comments start with a non-numeric character
 
 options (qconvex.htm):
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
     Tv   - verify result: structure, convexity, and point inclusion
     .    - concise list of all options
@@ -159,7 +164,7 @@ input</a></h3>
 <blockquote>
 
 <p>The input data on <tt>stdin</tt> consists of:</p>
-<ul compact="COMPACT">
+<ul>
     <li>dimension
     <li>number of points</li>
     <li>point coordinates</li>
@@ -264,7 +269,7 @@ individually or together.</p>
     <dd>print coordinates of vertices and coplanar points.  The first line is the dimension.
 	The second line is the number of vertices and coplanar points.  The coordinates
 	are next, one line per point.  Use '<a href="qh-optq.htm#Qc">Qc</a> <a href="qh-optq.htm#Qi">Qi</a> p'
-	to print the coordinates of all points.
+	to print the coordinates of all points.</dd>
     <dt>&nbsp;</dt>
     <dt>&nbsp;</dt>
     <dd><b>Facets</b></dd>
@@ -282,8 +287,8 @@ individually or together.</p>
     <dd>print area for each facet.  The first line is the number of facets.
 	Facet area follows, one line per facet.  For the cube example, each facet has area one.</dd>
     <dt><a href="qh-optf.htm#FI">FI</a></dt>
-    <dd>list intersection IDs.  The first line is the number of 
-	intersections.  The IDs follow, one per line.</dd>
+    <dd>list facet IDs.  The first line is the number of 
+	facets.  The IDs follow, one per line.</dd>
 
     <dt>&nbsp;</dt>
     <dt>&nbsp;</dt>
@@ -301,7 +306,7 @@ individually or together.</p>
 	number of coplanar points.  Each remaining line starts with the point ID of
 	a vertex, followed by the point ID of a coplanar point, its facet, and distance.
 	Use '<a href="qh-optq.htm#Qc">Qc</a> <a href="qh-optq.htm#Qi">Qi</a>
-        <a href="qh-optf.htm#FP">FP</a>' for coplanar and interior points.
+        <a href="qh-optf.htm#FP">FP</a>' for coplanar and interior points.</dd>
 
     <dt>&nbsp;</dt>
     <dt>&nbsp;</dt>
@@ -310,7 +315,7 @@ individually or together.</p>
     <dd>print hyperplane for each facet.  The first line is the dimension.  The
 	second line is the number of facets.  Each remaining line is the hyperplane's
 	coefficients followed by its offset.</dd>
-    <dt><a href="qh-optf.htm#n">Fo</a></dt>
+    <dt><a href="qh-optf.htm#Fo">Fo</a></dt>
     <dd>print outer plane for each facet.  The output plane is above all points.
 	 The first line is the dimension.  The
 	second line is the number of facets.  Each remaining line is the outer plane's
@@ -364,6 +369,9 @@ individually or together.</p>
 
 <blockquote>
 <dl compact>
+    <dt><a href="qh-optq.htm#Qt">Qt</a></dt>
+    <dd>triangulated output.  Qhull triangulates non-simplicial facets.  It may produce
+     degenerate facets of zero area.</dd>
     <dt><a href="qh-optq.htm#QJn">QJ</a></dt>
     <dd>joggle the input instead of merging facets.  This guarantees simplicial facets 
 	(e.g., triangles in 3-d).</dd>
@@ -384,6 +392,8 @@ individually or together.</p>
     <dd>report progress after constructing <em>n</em> facets</dd>
     <dt><a href="qh-optt.htm#Tv">Tv</a></dt>
     <dd>verify result</dd>
+    <dt><a href="qh-optt.htm#TO">TI file</a></dt>
+    <dd>input data from file.  The filename may not use spaces or quotes.</dd>
     <dt><a href="qh-optt.htm#TO">TO file</a></dt>
     <dd>output results to file.  Use single quotes if the filename
 	contains spaces (e.g., <tt>TO 'file with spaces.txt'</tt></dd>
@@ -452,7 +462,6 @@ See <a href="index.htm#structure">Qhull's data structures</a>.</p>
         href="qh-optq.htm#QVn">QVn</a>', etc.</li>
 </ul>
 </blockquote>
-</blockquote>
 <h3><a href="#TOP">»</a><a name="options">qconvex options</a></h3>
 
 <pre>
@@ -465,6 +474,7 @@ input (stdin):
     comments:    start with a non-numeric character
 
 options:
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
     Qc   - keep coplanar points with nearest facet
     Qi   - keep interior points with nearest facet
@@ -487,6 +497,7 @@ Trace options:
     Tv   - verify result: structure, convexity, and point inclusion
     Tz   - send all output to stdout
     TFn  - report summary when n or more facets created
+    TI file - input data from file, no spaces or single quotes
     TO file - output results to file, may be enclosed in single quotes
     TPn  - turn on tracing when point n added to hull
      TMn - turn on tracing at merge n
@@ -555,7 +566,7 @@ Geomview output (2-d, 3-d, and 4-d)
 
 Print options:
     PAn  - keep n largest facets by area
-    Pdk:n - drop facet if normal[k] <= n (default 0.0)
+    Pdk:n - drop facet if normal[k] &lt;= n (default 0.0)
     PDk:n - drop facet if normal[k] >= n
     Pg   - print good facets (needs 'QGn' or 'QVn')
     PFn  - keep facets whose area is at least n
@@ -575,7 +586,7 @@ Print options:
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149;<a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -586,7 +597,7 @@ Print options:
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 <!-- GC common information -->
 <hr>
diff --git a/html/qdelau_f.htm b/html/qdelau_f.htm
index ab420e1..de91f12 100644
--- a/html/qdelau_f.htm
+++ b/html/qdelau_f.htm
@@ -7,10 +7,11 @@
 
 <body>
 <!-- Navigation links -->
-<p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
+<a name="TOP"><b>Up</b></a><b>:</b> 
+<a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -21,7 +22,7 @@
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 
 <hr>
@@ -39,6 +40,16 @@ href="qvoron_f.htm">furthest-site Voronoi diagram</a>.
 
 <blockquote>
 <dl>
+    <dt><b>Example:</b> rbox 10 D2 | qdelaunay <a
+        href="qh-optq.htm#Qu">Qu</a> <a
+        href="qh-optq.htm#Qt">Qt</a> <a href="qh-opto.htm#s">s</a>
+        <a href="qh-opto.htm#i">i</a> <a href="qh-optt.htm#TO">TO
+        result</a></dt>
+    <dd>Compute the 2-d, furthest-site Delaunay triangulation of 10 random
+        points. Triangulate the output.
+        Write a summary to the console and the regions to
+        'result'.</dd>
+    <dt>&nbsp;</dt>
     <dt><b>Example:</b> rbox 10 D2 | qdelaunay <a
         href="qh-optq.htm#Qu">Qu</a> <a
         href="qh-optq.htm#QJn">QJ</a> <a href="qh-opto.htm#s">s</a>
@@ -72,7 +83,8 @@ coefficient is nearly zero). Vertical facets correspond to input
 sites that are coplanar to the convex hull of the input. An
 example is points on the boundary of a lattice.</p>
 
-<p>If you use '<a href="qh-optq.htm#QJn">QJ</a>' (joggle), all furthest-site 
+<p>If you use '<a href="qh-optq.htm#Qt">Qt</a>' (triangulated output) or 
+'<a href="qh-optq.htm#QJn">QJ</a>' (joggled input), all furthest-site 
 Delaunay regions 
 will be simplicial (e.g., triangles in 2-d).  If you do not use
 'QJ', <tt>qdelaunay Qu</tt> merges the furthest-site Delaunay regions 
@@ -81,9 +93,11 @@ than joggled input.  See <a
 href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 
 <p>The output for 3-d, furthest-site Delaunay triangulations may be confusing if the 
-input contains cospherical data. See
+input contains cospherical data. See the FAQ item
 <a href=qh-faq.htm#extra>Why
-are there extra points in a 4-d or higher convex hull?</a><br>
+are there extra points in a 4-d or higher convex hull?</a>
+Avoid these problems with triangulated output ('<a href="qh-optq.htm#Qt">Qt</a>') or
+joggled input ('<a href="qh-optq.htm#QJn">QJ</a>').
 </p>
 
 <p>The 'qdelaunay' program is equivalent to 
@@ -91,14 +105,14 @@ are there extra points in a 4-d or higher convex hull?</a><br>
 '<a href=qhull.htm#outputs>qhull d</a> <a href=qh-optq.htm#Qbb>Qbb</a> <a href=qh-optq.htm#Qx>Qx</a>' 
 in 4-d and higher.  It disables the following Qhull
 <a href=qh-quick.htm#options>options</a>: <i>d n v H U Qb QB Qc Qf Qg Qi
-Qm Qr QR Qv Qx TR E V FC Fi Fo Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9</i>.
+Qm Qr QR Qv Qx TR E V FC Fi Fo Fp FV Q0,etc</i>.
 
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
-<h3><a href="#TOP">»</a><a name="synopsis">furthest-site qdelaunay synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">furthest-site qdelaunay synopsis</a></h3>
 <blockquote>
 
 See <a href="qdelaun.htm#synopsis">qdelaunay synopsis</a>.  The same
@@ -111,7 +125,7 @@ input</a></h3>
 
 <blockquote>
 <p>The input data on <tt>stdin</tt> consists of:</p>
-<ul compact="COMPACT">
+<ul>
     <li>dimension 
     <li>number of points</li>
     <li>point coordinates</li>
@@ -174,8 +188,7 @@ outputs</a></h3>
     <dd>list input sites for each furthest-site Delaunay region. The first line is the number of regions.  The
 	remaining lines list the input sites for each region.  The regions are
 		oriented.  In 3-d and
-        higher, report cospherical sites by adding extra points (option 'i' assigns 
-		different indices than option 'Ft').  For the points-in-square example,
+        higher, report cospherical sites by adding extra points.  For the points-in-square example,
 	the square is the only furthest-site Delaunay region.</dd>
     <dt><a href="qh-optf.htm#Fv">Fv</a></dt>
     <dd>list input sites for each furthest-site Delaunay region.  The first line is the number of regions.  
@@ -185,11 +198,11 @@ outputs</a></h3>
     <dt><a href="qh-optf.htm#Ft">Ft</a></dt>
     <dd>print a triangulation of the furthest-site Delaunay regions in OFF format.  The first line
 	is the dimension.  The second line is the number of input sites and added points, 
-	followed by the number of simplicies and the number of ridges.
+	followed by the number of simplices and the number of ridges.
     The input coordinates are next, followed by the centrum coordinates.  There is
 	one centrum for each non-simplicial furthest-site Delaunay region.  Each remaining line starts
 	with dimension+1.  The 
-	simplicies are oriented.
+	simplices are oriented.
 	For the points-in-square example, the square has a centrum at the
 	origin.  It splits the square into four triangular regions.</dd>
     <dt><a href="qh-optf.htm#Fn">Fn</a></dt>
@@ -218,7 +231,7 @@ outputs</a></h3>
     <dd><b>Input sites</b></dd>
     <dt><a href="qh-optf.htm#Fx">Fx</a></dt>
     <dd>list extreme points of the input sites.  These points are vertices of the furthest-point
-	Delaunay triangluation.  They are on the
+	Delaunay triangulation.  They are on the
 	boundary of the convex hull.   The first line is the number of
 	extreme points.  Each point is listed, one per line.  The points-in-square example
 	has four extreme points.</dd>
@@ -253,7 +266,10 @@ controls</a></h3>
 
 <dl compact>
    <dt><a href="qh-optq.htm#Qu">Qu</a></dt>
-    <dd>must be used.</dd>
+    <dd>must be used for furthest-site Delaunay triangulation.</dd>
+    <dt><a href="qh-optq.htm#Qt">Qt</a></dt>
+    <dd>triangulated output.  Qhull triangulates non-simplicial facets.  It may produce
+     degenerate facets of zero area.</dd>
    <dt><a href="qh-optq.htm#QJn">QJ</a></dt>
     <dd>joggle the input to avoid cospherical and coincident
         sites.</dd>
@@ -262,11 +278,16 @@ controls</a></h3>
         'good').</dd>
     <dt><a href="qh-optt.htm#Tv">Tv</a></dt>
     <dd>verify result.</dd>
+    <dt><a href="qh-optt.htm#TO">TI file</a></dt>
+    <dd>input data from file.  The filename may not use spaces or quotes.</dd>
+    <dt><a href="qh-optt.htm#TO">TO file</a></dt>
+    <dd>output results to file.  Use single quotes if the filename
+	contains spaces (e.g., <tt>TO 'file with spaces.txt'</tt></dd>
     <dt><a href="qh-optt.htm#TFn">TFn</a></dt>
     <dd>report progress after constructing <em>n</em> facets</dd>
     <dt><a href="qh-optp.htm#PDk">PDk:1</a></dt>
     <dd>include upper and lower facets in the output.  Set <em>k</em>
-        to the last dimension (e.g., 2 for 2-d inputs). </dd>
+        to the last dimension (e.g., 'PD2:1' for 2-d inputs). </dd>
     <dt><a href="qh-opto.htm#f">f</a></dt>
     <dd>facet dump.  Print the data structure for each facet (i.e., furthest-site Delaunay region).</dd>
 </dl>
@@ -295,13 +316,19 @@ use <tt>qdelaunay Qz</tt>.  In this case, it is the same as
 the furthest-site Delaunay triangulation.
 
 <p>A non-simplicial, furthest-site Delaunay region indicates nearly cocircular or
-cospherical input sites. To avoid non-simplicial regions joggle
-the input with '<a href="qh-optq.htm#QJn">QJ</a>'.  You may triangulate
+cospherical input sites. To avoid non-simplicial regions triangulate
+the output ('<a href="qh-optq.htm#Qt">Qt</a>') or joggle
+the input ('<a href="qh-optq.htm#QJn">QJ</a>').  You may also triangulate
 non-simplicial regions with option '<a
 href="qh-optf.htm#Ft">Ft</a>'. It adds
 the centrum to non-simplicial regions. Alternatively, use an <a
 href="qh-impre.htm#exact">exact arithmetic code</a>.</p>
 
+<p>Furthest-site Delaunay triangulations do not include facets that are
+coplanar with the convex hull of the input sites.  A facet is
+coplanar if the last coefficient of its normal is
+nearly zero (see <a href="../src/user.h#ZEROdelaunay">qh_ZEROdelaunay</a>).
+
 </blockquote>
 <h3><a href="#TOP">»</a><a name="conventions">furthest-site qdelaunay conventions</a></h3>
 <blockquote>
@@ -309,8 +336,9 @@ href="qh-impre.htm#exact">exact arithmetic code</a>.</p>
 <p>The following terminology is used for furthest-site Delaunay
 triangulations in Qhull. The underlying structure is the upper
 facets of a convex hull in one higher dimension. See <a
-href="qconvex.htm#conventions">convex hull conventions</a> and <a
-href="qdelaun.htm#conventions">Delaunay conventions</a>.</p>
+href="qconvex.htm#conventions">convex hull conventions</a>, <a
+href="qdelaun.htm#conventions">Delaunay conventions</a>,
+and <a href="index.htm#structure">Qhull's data structures</a></p>
 <blockquote>
 <ul>
     <li><em>input site</em> - a point in the input (one dimension
@@ -320,10 +348,11 @@ href="qdelaun.htm#conventions">Delaunay conventions</a>.</p>
         coordinates</li>
     <li><em>vertex</em> - a point on the paraboloid. It
         corresponds to a unique input site. </li>
-    <li><em>upper facet</em> - a facet with a positive last
-        coefficient for the hyperplane</li>
-    <li><em>furthest-site Delaunay region</em> - an upper facet projected
-        to the input sites</li>
+    <li><em>furthest-site Delaunay facet</em> - an upper facet of the
+        paraboloid. The last coefficient of its normal is
+		clearly positive.</li>
+    <li><em>furthest-site Delaunay region</em> - a furthest-site Delaunay 
+	    facet projected to the input sites</li>
     <li><em>non-simplicial facet</em> - more than <em>d</em>
         points are cocircular or cospherical</li>
     <li><em>good facet</em> - a furthest-site Delaunay facet with optional
@@ -345,7 +374,7 @@ for furthest-site Delaunay triangulations.
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -356,7 +385,7 @@ for furthest-site Delaunay triangulations.
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 <!-- GC common information -->
 <hr>
diff --git a/html/qdelaun.htm b/html/qdelaun.htm
index b05f18e..0326185 100644
--- a/html/qdelaun.htm
+++ b/html/qdelaun.htm
@@ -7,10 +7,11 @@
 
 <body>
 <!-- Navigation links -->
-<p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
+<a name="TOP"><b>Up</b></a><b>:</b> 
+<a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -21,7 +22,7 @@
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 
 <hr>
@@ -39,15 +40,6 @@ by O'Rourke [<a href="index.htm#orou94">'94</a>]. </p>
 
 <blockquote>
 <dl>
-    <dt><b>Example:</b> rbox 10 D2 | qdelaunay <a
-        href="qh-optq.htm#QJn">QJ</a> <a href="qh-opto.htm#s">s</a>
-        <a href="qh-opto.htm#i">i</a> <a href="qh-optt.htm#TO">TO
-        result</a></dt>
-    <dd>Compute the 2-d Delaunay triangulation of 10 random
-        points. Joggle the input to guarantee triangular output.
-        Write a summary to the console and the regions to
-        'result'.</dd>
-    <dt>&nbsp;</dt>
     <dt><b>Example:</b> rbox r y c G0.1 D2 | qdelaunay <a href="qh-opto.htm#s">s</a>
         <a href="qh-optf.htm#Fv">Fv</a> <a href="qh-optt.htm#TO">TO
         result</a></dt>
@@ -56,6 +48,21 @@ by O'Rourke [<a href="index.htm#orou94">'94</a>]. </p>
         Write a summary to the console and unoriented regions to 'result'.
         Merge regions for cocircular input sites (i.e., the
         square).</dd>
+    <dt>&nbsp;</dt>
+    <dt><b>Example:</b> rbox r y c G0.1 D2 | qdelaunay <a href="qh-opto.htm#s">s</a>
+        <a href="qh-optf.htm#Fv">Fv</a> <a href="qh-optq.htm#Qt">Qt</a></dt>
+    <dd>Compute the 2-d Delaunay triangulation of a triangle and
+        a small square. Write a summary and unoriented 
+	regions to the console.  Produce triangulated output.</dd>
+    <dt>&nbsp;</dt>
+    <dt><b>Example:</b> rbox 10 D2 | qdelaunay <a
+        href="qh-optq.htm#QJn">QJ</a> <a href="qh-opto.htm#s">s</a>
+        <a href="qh-opto.htm#i">i</a> <a href="qh-optt.htm#TO">TO
+        result</a></dt>
+    <dd>Compute the 2-d Delaunay triangulation of 10 random
+        points. Joggle the input to guarantee triangular output.
+        Write a summary to the console and the regions to
+        'result'.</dd>
 </dl>
 </blockquote>
 
@@ -73,19 +80,24 @@ Voronoi diagrams</a>.</p>
 <p>See <a href="qh-faq.htm#TOC">Qhull FAQ</a> - Delaunay and
 Voronoi diagram questions.</p>
 
+<p>If you use '<a href="qh-optq.htm#Qt">Qt</a>' (triangulated output), 
+all Delaunay regions 
+will be simplicial (e.g., triangles in 2-d).  Some regions may be
+degenerate and have zero area.  Qhull can identify coincident
+points.  If you do not use 'Qt', cocircular and cospherical data will lead
+to non-simplicial output (e.g., a square).
+
 <p>If you use '<a href="qh-optq.htm#QJn">QJ</a>' (joggle), all Delaunay regions 
 will be simplicial (e.g., triangles in 2-d).  Duplicate points will 
-create small regions since the points are joggled apart. If you do not use
-'QJ', <tt>qdelaunay</tt> merges the Delaunay regions 
-for cocircular or cospherical input sites.  This is more accurate
-than joggled input.  It can identify coincident
-points.  See <a
+create small regions since the points are joggled apart.  See <a
 href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 
 <p>The output for 3-d Delaunay triangulations may be confusing if the 
-input contains cospherical data. See
+input contains cospherical data.  See the FAQ item
 <a href=qh-faq.htm#extra>Why
-are there extra points in a 4-d or higher convex hull?</a><br>
+are there extra points in a 4-d or higher convex hull?</a> 
+Avoid these problems with triangulated output ('<a href="qh-optq.htm#Qt">Qt</a>') or
+joggled input ('<a href="qh-optq.htm#QJn">QJ</a>').
 </p>
 
 <p>The 'qdelaunay' program is equivalent to 
@@ -93,14 +105,14 @@ are there extra points in a 4-d or higher convex hull?</a><br>
 '<a href=qhull.htm#outputs>qhull d</a> <a href=qh-optq.htm#Qbb>Qbb</a> <a href=qh-optq.htm#Qx>Qx</a>' 
 in 4-d and higher.  It disables the following Qhull
 <a href=qh-quick.htm#options>options</a>: <i>d n v H U Qb QB Qc Qf Qg Qi
-Qm Qr QR Qv Qx TR E V FC Fi Fo Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9</i>.
+Qm Qr QR Qv Qx TR E V FC Fi Fo Fp Ft FV Q0,etc</i>.
 
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
-<h3><a href="#TOP">»</a><a name="synopsis">qdelaunay synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">qdelaunay synopsis</a></h3>
 
 <pre>
 qdelaunay- compute the Delaunay triangulation.
@@ -108,6 +120,7 @@ qdelaunay- compute the Delaunay triangulation.
     comments start with a non-numeric character
 
 options (qdelaun.htm):
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
     Qu   - furthest-site Delaunay triangulation
     Tv   - verify result: structure, convexity, and in-circle test
@@ -117,7 +130,6 @@ options (qdelaun.htm):
 output options (subset):
     s    - summary of results (default)
     i    - vertices incident to each Delaunay region
-    Ft   - Delaunay triangulation with centrums for non-simplicial (OFF)\n\
     Fx   - extreme points (vertices of the convex hull)
     o    - OFF format (shows the points lifted to a paraboloid)
     G    - Geomview output (2-d and 3-d points lifted to a paraboloid)
@@ -127,10 +139,9 @@ output options (subset):
 
 examples:
     rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i
-    rbox c P0 D2 | qdelaunay Fv           rbox c P0 D2 | qdelaunay s Qu Fv
-    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay Ft
-    rbox c G1 d D2 | qdelaunay QJ s Ft    rbox M3,4 z 100 D2 | qdelaunay s
-
+    rbox c P0 D3 | qdelaunay Fv Qt        rbox c P0 D2 | qdelaunay s Qu Fv
+    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay s i Qt
+    rbox M3,4 z 100 D2 | qdelaunay s      rbox M3,4 z 100 D2 | qdelaunay s Qt
 </pre>
 
 
@@ -139,7 +150,7 @@ input</a></h3>
 
 <blockquote>
 <p>The input data on <tt>stdin</tt> consists of:</p>
-<ul compact="COMPACT">
+<ul>
     <li>dimension 
     <li>number of points</li>
     <li>point coordinates</li>
@@ -210,24 +221,14 @@ outputs</a></h3>
     <dd>list input sites for each Delaunay region. The first line is the number of regions.  The
 	remaining lines list the input sites for each region.  The regions are
 		oriented.  In 3-d and
-        higher, report cospherical sites by adding extra points (option 'i' assigns 
-		different indices than option 'Ft').  For the circle-in-square example,
+        higher, report cospherical sites by adding extra points.  Use triangulated
+	output ('<a href="qh-optq.htm#Qt">Qt</a>') to avoid non-simpicial regions.  For the circle-in-square example,
 	eight Delaunay regions are triangular and the ninth has four input sites.</dd>
     <dt><a href="qh-optf.htm#Fv">Fv</a></dt>
     <dd>list input sites for each Delaunay region.  The first line is the number of regions.  
 	Each remaining line starts with the number of input sites.  The regions
 	are unoriented.  For the circle-in-square example,
 	eight Delaunay regions are triangular and the ninth has four input sites.</dd>
-    <dt><a href="qh-optf.htm#Ft">Ft</a></dt>
-    <dd>print a triangulation of the Delaunay regions in OFF format.  The first line
-	is the dimension.  The second line is the number of input sites and added points, 
-	followed by the number of simplicies and the number of ridges.
-    The input coordinates are next, followed by the centrum coordinates.  There is
-	one centrum for each non-simplicial Delaunay region.  Each remaining line starts
-	with dimension+1.  The 
-	simplicies are oriented.
-	The circle-in-square example has one centrum for the cocircular points.  It 
-	splits the cocircular region into four.</dd>
     <dt><a href="qh-optf.htm#Fn">Fn</a></dt>
     <dd>list neighboring regions for each Delaunay region.  The first line is the
 	number of regions.  Each remaining line starts with the number of 
@@ -242,7 +243,7 @@ outputs</a></h3>
 	outside of the Delaunay triangulation.
 	For the circle-in-square example, each point on the circle belongs to four 
 	Delaunay regions.  Use '<a href="qh-optq.htm#Qc">Qc</a> FN'
-	to include coincident input sites. </dd>
+	to include coincident input sites and deleted vertices. </dd>
     <dt><a href="qh-optf.htm#Fa">Fa</a></dt>
     <dd>print area for each Delaunay region. The first line is the number of regions.
 	The areas follow, one line per region.  For the circle-in-square example, the
@@ -253,7 +254,9 @@ outputs</a></h3>
     <dt><a href="qh-optf.htm#Fc">Fc</a></dt>
     <dd>list coincident input sites for each Delaunay region.
 	The first line is the number of regions.  The remaining lines start with 
-	the number of coincident sites.  A coincident site is assigned to one Delaunay
+	the number of coincident sites and deleted vertices.  Deleted vertices
+	indicate highly degenerate input (see'<A href="qh-optf.htm#Fs">Fs</a>').  
+	A coincident site is assigned to one Delaunay
 	region.  Do not use '<a href="qh-optq.htm#QJn">QJ</a>' with 'Fc'; the joggle will separate
 	coincident sites.</dd>
     <dt><a href="qh-optf.htm#FP">FP</a></dt>
@@ -261,7 +264,9 @@ outputs</a></h3>
         nearest site (i.e., vertex). The first line is the 
 	number of coincident sites.  Each remaining line starts with the point ID of
 	an input site, followed by the point ID of a coincident point, its region, and distance.
-		Do not use '<a href="qh-optq.htm#QJn">QJ</a>' with 'FP'; the joggle will separate
+        Includes deleted vertices which
+	indicate highly degenerate input (see'<A href="qh-optf.htm#Fs">Fs</a>').  
+        Do not use '<a href="qh-optq.htm#QJn">QJ</a>' with 'FP'; the joggle will separate
 	coincident sites.</dd>
     <dt><a href="qh-optf.htm#Fx">Fx</a></dt>
     <dd>list extreme points of the input sites.  These points are on the
@@ -297,6 +302,9 @@ controls</a></h3>
 <blockquote>
 
 <dl compact>
+   <dt><a href="qh-optq.htm#Qt">Qt</a></dt>
+    <dd>triangulated output.  Qhull triangulates non-simplicial facets.  It may produce
+degenerate facets of zero area.</dd>
    <dt><a href="qh-optq.htm#QJn">QJ</a></dt>
     <dd>joggle the input to avoid cospherical and coincident
         sites.</dd>
@@ -313,11 +321,16 @@ controls</a></h3>
         'good').</dd>
     <dt><a href="qh-optt.htm#Tv">Tv</a></dt>
     <dd>verify result.</dd>
+    <dt><a href="qh-optt.htm#TO">TI file</a></dt>
+    <dd>input data from file.  The filename may not use spaces or quotes.</dd>
+    <dt><a href="qh-optt.htm#TO">TO file</a></dt>
+    <dd>output results to file.  Use single quotes if the filename
+	contains spaces (e.g., <tt>TO 'file with spaces.txt'</tt></dd>
     <dt><a href="qh-optt.htm#TFn">TFn</a></dt>
     <dd>report progress after constructing <em>n</em> facets</dd>
     <dt><a href="qh-optp.htm#PDk">PDk:1</a></dt>
     <dd>include upper and lower facets in the output.  Set <em>k</em>
-        to the last dimension (e.g., 2 for 2-d inputs). </dd>
+        to the last dimension (e.g., 'PD2:1' for 2-d inputs). </dd>
     <dt><a href="qh-opto.htm#f">f</a></dt>
     <dd>facet dump.  Print the data structure for each facet (i.e., Delaunay region).</dd>
 </dl>
@@ -359,14 +372,26 @@ hull (a paraboloid). </p>
 notes</a></h3>
 <blockquote>
 
+<p>You can simplify the Delaunay triangulation by enclosing the input
+sites in a large square or cube.  This is particularly recommended
+for cocircular or cospherical input data.
+
 <p>A non-simplicial Delaunay region indicates nearly cocircular or
-cospherical input sites. To avoid non-simplicial regions joggle
-the input with '<a href="qh-optq.htm#QJn">QJ</a>'.  You may triangulate
-non-simplicial regions with option '<a
-href="qh-optf.htm#Ft">Ft</a>'. It adds
-the centrum to non-simplicial regions. Alternatively, use an <a
+cospherical input sites. To avoid non-simplicial regions either triangulate
+the output ('<a href="qh-optq.htm#Qt">Qt</a>')or joggle
+the input ('<a href="qh-optq.htm#QJn">QJ</a>').  Alternatively, use an <a
 href="qh-impre.htm#exact">exact arithmetic code</a>.</p>
 
+<p>Delaunay triangulations do not include facets that are
+coplanar with the convex hull of the input sites.  A facet is
+coplanar if the last coefficient of its normal is
+nearly zero (see <a href="../src/user.h#ZEROdelaunay">qh_ZEROdelaunay</a>).
+
+<p>See <a href=qh-impre.htm#delaunay>Imprecision issues :: Delaunay triangulations</a>
+for a discussion of precision issues.  Deleted vertices indicate
+highly degenerate input.  They are listed in the summary output and
+option '<a href="qh-optf.htm#Fs">Fs</a>'.</p>
+
 <p>To compute the Delaunay triangulation of points on a sphere,
 compute their convex hull. If the sphere is the unit sphere at
 the origin, the facet normals are the Voronoi vertices of the
@@ -378,7 +403,7 @@ spiral (e.g., 'rbox 100 l | qhull d') has quadratic size, while the Delaunay tri
 of random 3-d points is 
 approximately linear for reasonably sized point sets.
 
-<p>With the <a href="index.htm#library">Qhull library</a>, you
+<p>With the <a href="qh-in.htm#library">Qhull library</a>, you
 can use <tt>qh_findbestfacet</tt> in <tt>poly2.c</tt> to locate the facet
 that contains a point. You should first lift the point to the
 paraboloid (i.e., the last coordinate is the sum of the squares
@@ -391,11 +416,11 @@ coordinate. </p>
 <p>If a point is interior to the convex hull of the input set, it
 is interior to the adjacent vertices of the Delaunay
 triangulation. This is demonstrated by the following pipe for
-point 0: </p>
+point 0:
 
-<blockquote>
-    <p>qdelaunay &lt;data s FQ QV0 p | qconvex s Qb3:0B3:0 p </p>
-</blockquote>
+<pre>
+    qdelaunay &lt;data s FQ QV0 p | qconvex s Qb3:0B3:0 p
+</pre>
 
 <p>The first call to qdelaunay returns the neighboring points of
 point 0 in the Delaunay triangulation. The second call to qconvex
@@ -411,7 +436,7 @@ original point set, it is interior to the reduced point set. </p>
 in Qhull for dimension <i>d</i>. The underlying structure is the
 lower facets of a convex hull in dimension <i>d+1</i>. For
 further information, see <a href="index.htm#structure">data
-structures</a> and <a href="qconvex#conventions">convex hull
+structures</a> and <a href="qconvex.htm#conventions">convex hull
 conventions</a>.</p>
 <blockquote>
 <ul>
@@ -421,17 +446,18 @@ conventions</a>.</p>
         last coordinate is the sum of the squares of the input
         site's coordinates</li>
     <li><em>coplanar point</em> - a <em>coincident</em>
-        input site</li>
+        input site or a deleted vertex.  Deleted vertices
+	indicate highly degenerate input.</li>
     <li><em>vertex</em> - a point on the paraboloid. It
         corresponds to a unique input site. </li>
     <li><em>point-at-infinity</em> - a point added above the
         paraboloid by option '<a href="qh-optq.htm#Qz">Qz</a>'</li>
     <li><em>lower facet</em> - a facet corresponding to a
         Delaunay region. The last coefficient of its normal is
-        negative.</li>
+        clearly negative.</li>
     <li><em>upper facet</em> - a facet corresponding to a
         furthest-site Delaunay region. The last coefficient of
-        its normal is non-negative. </li>
+        its normal is clearly positive. </li>
     <li><em>Delaunay region</em> - a
         lower facet projected to the input sites</li>
     <li><em>upper Delaunay region</em> - an upper facet projected
@@ -455,8 +481,9 @@ input (stdin):
     comments:    start with a non-numeric character
 
 options:
-    Qu   - compute furthest-site Delaunay triangulation
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
+    Qu   - compute furthest-site Delaunay triangulation
 
 Qhull control options:
     QJn  - randomly joggle input in range [-n,n]
@@ -472,6 +499,7 @@ Trace options:
     Tv   - verify result: structure, convexity, and in-circle test
     Tz   - send all output to stdout
     TFn  - report summary when n or more facets created
+    TI file - input data from file, no spaces or single quotes
     TO file - output results to file, may be enclosed in single quotes
     TPn  - turn on tracing when point n added to hull
      TMn - turn on tracing at merge n
@@ -515,7 +543,6 @@ More formats:
                     #real (2), max outer plane, min vertex
     FS   - sizes:   #int (0)
                     #real(2) tot area, 0
-    Ft   - Delaunay triangulation with centrums for non-simplicial (OFF)
     Fv   - count plus vertices for each Delaunay region
     Fx   - extreme points of Delaunay triangulation (on convex hull)
 
@@ -534,7 +561,7 @@ Geomview options (2-d and 3-d)
 
 Print options:
     PAn  - keep n largest Delaunay regions by area
-    Pdk:n - drop facet if normal[k] <= n (default 0.0)
+    Pdk:n - drop facet if normal[k] &lt;= n (default 0.0)
     PDk:n - drop facet if normal[k] >= n
     Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')
     PFn  - keep Delaunay regions whose area is at least n
@@ -553,7 +580,7 @@ Print options:
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -564,7 +591,7 @@ Print options:
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 <!-- GC common information -->
 <hr>
diff --git a/html/qh-eg.htm b/html/qh-eg.htm
index 7b83e87..e3b8e69 100644
--- a/html/qh-eg.htm
+++ b/html/qh-eg.htm
@@ -7,11 +7,11 @@
 
 <body>
 <!-- Navigation links -->
-<p><a name=TOP><b>Up:</b></a> <a href="http://www.geom.umn.edu/locate/qhull">Home
+<p><a name="TOP"><b>Up:</b></a> <a href="http://www.geom.umn.edu/locate/qhull">Home
 page</a> for Qhull <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -48,7 +48,7 @@ test examples, and <tt>eg/q_test</tt> exercises the code. If you
 find yourself viewing the inside of a 3-d example, use Geomview's
 normalization option on the 'obscure' menu.</p>
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -58,7 +58,7 @@ Contents </a></h2>
 <ul>
     <li><a href="#2d">2-d and 3-d examples</a></li>
     <li><a href="#how">How Qhull adds a point</a></li>
-    <li><a href="#joggle">Joggled input</a></li>
+    <li><a href="#joggle">Joggled input and triangulated output</a></li>
     <li><a href="#delaunay">Delaunay and Voronoi diagrams</a></li>
     <li><a href="#merge">Facet merging for imprecision</a></li>
     <li><a href="#4d">4-d objects</a></li>
@@ -89,9 +89,11 @@ Contents </a></h2>
             <li><a href="#14">eg.14.sphere.corner</a></li>
         </ul>
     </li>
-    <li><a href="#TOC">»</a> <a name="joggle">Joggled input</a></li>
+    <li><a href="#TOC">»</a> <a name="joggle">Joggled input and triangulated output</a>
     	<ul>
-            <li><a href="#15">eg.15.joggle</a></li>
+            <li><a href="#15a">eg.15a.surface</a></li>
+            <li><a href="#15b">eg.15b.triangle</a></li>
+            <li><a href="#15c">eg.15c.joggle</a></li>
         </ul>
     <li><a href="#TOC">»</a><a name="delaunay"> Delaunay and
         Voronoi diagrams</a><ul>
@@ -241,7 +243,7 @@ than a sphere centered at the test point. </p>
 <p>To prevent this problem, Qhull does not use directed search
 all the time. When Qhull processes a point on the edge of the
 lens, it partitions the remaining points with an exhaustive
-search instead of a directed search (see qh_findbest_sharp in <tt>geom2.c</tt>).
+search instead of a directed search (see qh_findbestnew in <tt>geom2.c</tt>).
 </p>
 
 <h2><a href="#TOC">»</a>How Qhull adds a point</h2>
@@ -297,9 +299,32 @@ tells Qhull to only build facets that might be part of a good
 facet. This technique reduces output size in low dimensions. It
 does not work with facet merging.</p>
 
-<h2><a href="#TOC">»</a>Joggled input</h2>
+<h2><a href="#TOC">»</a>Joggled input and triangulated output</h2>
 
-<h3><a href="#joggle">»</a><a name="15">rbox 500 W0 | qconvex QR0 QJ5e-2 Qc Gvp &gt;eg.15.joggle</a></h3>
+<h3><a href="#joggle">»</a><a name="15a">rbox 500 W0 | qconvex QR0 Qc Gvp &gt;eg.15a.surface</a></h3>
+
+<p>This is the convex hull of 500 points on the surface of
+a cube.  Note the large, non-simplicial facet for each face. 
+Qhull merges non-convex facets.
+
+<p>If the facets were not merged, Qhull
+would report precision problems.  For example, turn off facet merging
+with option '<a href="qh-optq.htm#Q0">Q0</a>'.  Qhull may report concave
+facets, flipped facets, or other precision errors:
+<blockquote>
+rbox 500 W0 | qhull QR0 Q0
+</blockquote>
+
+<p>
+<h3><a href="#joggle">»</a><a name="15b">rbox 500 W0 | qconvex QR0 Qt Qc Gvp &gt;eg.15b.triangle</a></h3>
+
+<p>Like the previous examples, this is the convex hull of 500 points on the 
+surface of a cube.  Option '<a href="qh-optq.htm#Qt">Qt</a>' triangulates the
+non-simplicial facets.  Triangulated output is  
+particularly helpful for Delaunay triangulations.
+
+<p>
+<h3><a href="#joggle">»</a><a name="15c">rbox 500 W0 | qconvex QR0 QJ5e-2 Qc Gvp &gt;eg.15c.joggle</a></h3>
 
 <p>This is the convex hull of 500 joggled points on the surface of
 a cube.  The option '<a href="qh-optq.htm#QJn">QJ5e-2</a>'
@@ -315,21 +340,12 @@ this process until no precision problems occur.
 <p>
 Joggled input is a simple solution to precision problems in
 computational geometry.  Qhull can also merge facets to handle
-precision problems.  See the <a href="#merge">examples</a> below
-or read <a href="qh-impre.htm#joggle">Joggled input
-or merged facets</a>.  Joggled input is particularly helpful for
-Delaunay triangulations.
-<p>
-If the points are not joggled and the facets are not merged, Qhull
-reports precision problems.  For example, turn off facet merging
-with option '<a href="qh-optq.htm#Q0">Q0</a>':
-<blockquote>
-rbox 500 W0 | qhull QR0 Q0
-</blockquote>
+precision problems.  See <a href="qh-impre.htm#joggle">Joggled input
+or merged facets</a>.  
 
 <h2><a href="#TOC">»</a>Delaunay and Voronoi diagrams</h2>
 
-<h3><a href="#delaunay">»</a><a name="17a">qdelaunay QJ
+<h3><a href="#delaunay">»</a><a name="17a">qdelaunay Qt
 &lt;eg.data.17 GnraD2 &gt;eg.17a.delaunay.2</a></h3>
 
 <p>
@@ -340,15 +356,13 @@ points centered on the square.
 <p>The Delaunay triangulation is the triangulation with empty
 circumcircles.  The input for this example is unusual because it
 includes six co-circular points.  Every triangular subset of these 
-points has the same circumcircle.  Option '<a href="qh-optq.htm#QJn">QJ</a>'
-joggles the input by a small amount.  This removes the points from
-the circle.  qdelaunay returns a triangulation.</p>
+points has the same circumcircle.  Option '<a href="qh-optq.htm#Qt">Qt</a>'
+triangulates the co-circular facet.</p>
 
 <h3><a href="#delaunay">»</a><a name="17b">qdelaunay &lt;eg.data.17
 GnraD2 &gt;eg.17b.delaunay.2i</a></h3>
 
-<p>This is the same example without joggle ('<a href="qh-optq.htm#QJn">QJ</a>').
-The co-circular points do not have a unique Delaunay triangle.  qdelaunay
+<p>This is the same example without triangulated output ('<a href="qh-optq.htm#Qt">Qt</a>').  qdelaunay
 merges the non-unique Delaunay triangles into a hexagon.</p>
 
 <h3><a href="#delaunay">»</a><a name="17c">qdelaunay &lt;eg.data.17
@@ -369,7 +383,8 @@ the Z-axis, you'll see that points and edges coincide.</p>
 &lt;eg.data.17 Gna &gt;eg.17d.voronoi.2</a></h3>
 
 <p>The Voronoi diagram is the dual of the Delaunay triangulation.
-Here you see the original sites and the Voronoi vertices. Each
+Here you see the original sites and the Voronoi vertices.   
+Notice the each
 vertex is equidistant from three sites. The edges indicate the
 Voronoi region for a site. Qhull does not draw the unbounded
 edges. Instead, it draws extra edges to close the unbounded
@@ -378,14 +393,29 @@ points in a square.  You can compute the unbounded
 rays from option '<a href="qh-optf.htm#Fo2">Fo</a>'.
 </p>
 
+<p>Instead
+of triangulated output ('<a href="qh-optq.htm#Qt">Qt</a>'), this 
+example uses joggled input ('<a href="qh-optq.htm#QJn">QJ</a>').  
+Normally, you should use neither 'QJ' nor 'Qt' for Voronoi diagrams.
+
 <h3><a href="#delaunay">»</a><a name="17e">qvoronoi &lt;eg.data.17
 Gna &gt;eg.17e.voronoi.2i </a></h3>
 
-<p>This looks the same as the previous diagram. But take a look
-at the output files. You'll see that the previous example (with '<a
-href="qh-optq.htm#QJ">QJ</a>') contains four Voronoi vertices
-that are almost the same. These vertices corresponding to the
-co-circular sites. They are merged in this example.</p>
+<p>This looks the same as the previous diagrams, but take a look
+at the data.  Run 'qvoronoi p &lt;eg/eg.data.17'.  This prints
+the Voronoi vertices.  
+
+<p>With 'QJ', there are four nearly identical Voronoi vertices
+within 10^-11 of the origin.  Option 'QJ' joggled the input.  After the joggle,
+the cocircular 
+input sites are no longer cocircular.  The corresponding Voronoi vertices are 
+similar but not identical.
+
+<p>This example does not use options 'Qt' or 'QJ'.  The cocircular
+input sites define one Voronoi vertex near the origin. </p>
+
+<p>Option 'Qt' would triangulate the corresponding Delaunay region into
+four triangles.  Each triangle is assigned the same Voronoi vertex.</p>
 
 <h3><a href="#delaunay">»</a><a name="17f"> rbox c G0.1 d |
 qdelaunay Gt Qz &lt;eg.17f.delaunay.3 </a></h3>
@@ -638,7 +668,7 @@ third picture is a duplicate of the first. </p>
 page for Qhull</a> <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual: Table of Contents</a><br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qh-faq.htm b/html/qh-faq.htm
index 1c25fdc..1a39722 100644
--- a/html/qh-faq.htm
+++ b/html/qh-faq.htm
@@ -15,42 +15,39 @@ NOTE -- verify all links by 'grep href=' 'grep name=' add # 'sort /+7'
 <body>
 
 <p><a name="TOP"><b>Up:</b></a> <a
-href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull
+ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull
 (http://www.geom.umn.edu/locate/qhull)<br>
-<b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
-<b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
-&#149; <a href="qh-opto.htm#output">Output</a> 
-&#149; <a href="qh-optf.htm#format">Formats</a> 
-&#149; <a href="qh-optg.htm#geomview">Geomview</a> 
-&#149; <a href="qh-optp.htm#print">Print</a>
-&#149; <a href="qh-optq.htm#qhull">Qhull</a> 
-&#149; <a href="qh-optc.htm#prec">Precision</a> 
-&#149; <a href="qh-optt.htm#trace">Trace</a> <br>
-<b>To:</b> <a href="#TOC">FAQ: Table of Contents</a> (please
+<b>Up:</b> <A href="index.htm#TOC">Qhull manual</A>: Table of Contents<br>
+<b>To:</b> <A href="qh-quick.htm#programs">Programs</A>
+&#149; <A href="qh-quick.htm#options">Options</A> 
+&#149; <A href="qh-opto.htm#output">Output</A> 
+&#149; <A href="qh-optf.htm#format">Formats</A> 
+&#149; <A href="qh-optg.htm#geomview">Geomview</A> 
+&#149; <A href="qh-optp.htm#print">Print</A>
+&#149; <A href="qh-optq.htm#qhull">Qhull</A> 
+&#149; <A href="qh-optc.htm#prec">Precision</A> 
+&#149; <A href="qh-optt.htm#trace">Trace</A> <br>
+<b>To:</b> <A href="#TOC">FAQ: Table of Contents</A> (please
 wait while loading) <br>
 
 <hr>
 <!-- Main text of document -->
 <h1><a
-href="http://www.geom.umn.edu/graphics/pix/Special_Topics/Computational_Geometry/4dcube.html"><img
-src="qh--4d.gif" alt="[4-d cube]" align="middle" width="100"
-height="100"></a> Frequently Asked Questions about Qhull</h1>
-<!--
+ href="http://www.geom.umn.edu/graphics/pix/Special_Topics/Computational_Geometry/4dcube.html"><IMG
+ align=middle alt ="[4-d cube]"
+ height=100 src="qh--4d.gif" width=100 ></a> Frequently Asked Questions about Qhull</h1><!--
 <p><i>This is the most recent FAQ. It was updated Sept. 13, 1999.</i>
 -->
 <p>If your question does not appear here, see: </p>
 
 <ul>
-    <li><a href="http://www.geom.umn.edu/~bradb/qhull-news.html">News</a>
-        about Qhull </li>
-    <li><a href="index.htm#TOC">Qhull manual:</a> table of
-        contents </li>
-    <li><a href="../README.txt">Installation</a> instructions for
-        Qhull and rbox</li>
-    <li><a href="mailto:qhull@geom.umn.edu">Send e-mail</a> to
-        qhull@geom.umn.edu </li>
-    <li><a href="mailto:qhull_bug@geom.umn.edu">Report bugs</a>
+    <li><a href="http://www.geom.umn.edu/~bradb/qhull-news.html">News</a> about Qhull 
+    <li><A href="index.htm#TOC">Qhull manual:</A> table of contents 
+    <li><A href="../README.txt">Installation</A> instructions for Qhull and rbox 
+
+    <li><A href="mailto:qhull@geom.umn.edu">Send e-mail</A> to 
+  qhull@geom.umn.edu 
+    <li><A href="mailto:qhull_bug@geom.umn.edu">Report bugs</A>
         to qhull_bug@geom.umn.edu </li>
 </ul>
 
@@ -59,8 +56,8 @@ Delaunay triangulations, halfspace intersections about a point,
 Voronoi diagrams, furthest-site Delaunay triangulations, and
 furthest-site Voronoi diagrams. These structures have
 applications in science, engineering, statistics, and
-mathematics. For a detailed introduction, see O'Rourke [<a
-href="index.htm#orou94">'94</a>], <i>Computational Geometry in C</i>.
+mathematics. For a detailed introduction, see O'Rourke [<A
+ href="index.htm#orou94" >'94</A>], <i>Computational Geometry in C</i>.
 </p>
 
 <p>There are separate programs for each application of
@@ -68,99 +65,96 @@ Qhull.  These programs disable experimental and inappropriate
 options.  If you prefer, you may use Qhull directly.  All programs
 run the same code.
 
-<p><i>Brad Barber, Cambridge MA, February 11, 2001 <!--
+<p>Version 3.1 added triangulated output ('<A href="qh-optq.htm#Qt">Qt</A>').
+It should be used for Delaunay triangulations instead of
+using joggled input ('<A href="qh-optq.htm#QJn">QJ</A>').
+
+<p><i>Brad Barber, Cambridge MA, 
+October 4, 2001 <!--
 --> </i></p>
 
-<p><b>Copyright © 1998-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1998-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
-<h2><a href="#TOP">»</a><a name="TOC">FAQ: Table of Contents </a></h2>
+<h2><A href="#TOP">»</A><a name="TOC">FAQ: Table of Contents </a></h2>
 
 <p>Within each category, the most recently asked questions are
 first. 
 <ul>
     <li>Startup questions <ul>
-            <li><a href="#console">How</a> do I run Qhull from
-                Windows?</li>
-            <li><a href="#input">How</a> do I enter points for
-                Qhull?</li>
-            <li><a href="#learn">How</a> do I learn to use Qhull?</li>
+            <li><A href="#console">How</A> do I run Qhull from Windows? 
+            <li><A href="#input">How</A> do I enter points for Qhull? 
+            <li><A href="#learn">How</A> do I learn to use Qhull?</li>
         </ul>
-    </li>
     <li>Convex hull questions<ul>
-        <li><a href="#area">How</a> do I report just the area
-		    and volume of a convex hull?</li>
-        <li><a href="#extra">Why</a> are there extra points
-            in a 4-d or higher convex hull? </li>
-        <li><a href="#dup">How</a> do I report duplicate
+        <li><A href="#area">How</A> do I report just the area and volume of a 
+    convex hull? 
+        <li><A href="#extra">Why</A> are there extra points in a 4-d or higher 
+    convex hull? 
+        <li><A href="#dup">How</A> do I report duplicate
             vertices? </li>
         </ul>
-    </li>
     <li>Delaunay and Voronoi diagram questions<ul>
-		<li><a href="#flat">How</a> do I get rid of 
-			nearly flat Delaunay triangles?</li>
-		<li><a href="#square">What</a> is the Voronoi diagram
-					of a square?</li>
-		<li><a href="#vclosest">How</a> do I find the
-		Delaunay triangle or Voronoi region that is closest to a point?</li>
-		<li><a href="#mesh">How</a> do I compute
-			the Delaunay triangulation of a non-convex object?</li>
-		<li><a href="#mesh">How</a> do I mesh a volume from a set of 
-			triangulated surface points?" </li>
-			<li><a href="#constrained">Can</a> Qhull produce a
-				triangular mesh for an object?</li>
-		<li><a href="#dridges">For</a> 3-d Delaunay
-				triangulations, how do I report the triangles of
-				each tetrahedron?</li>
-        <li><a href="#vsphere">How</a> do I construct the
-            Voronoi diagram of cospherical points?</li>
-        <li><a href="#3dd">How</a> do I construct a 3-d
-            Delaunay triangulation?</li>
-        <li><a href="#2d">How</a> do I get the triangles for
-            a 2-d Delaunay triangulation and the vertices of
-            its Voronoi diagram?</li>
-        <li><a href="#rays">Can</a> Qhull compute the
-            unbounded rays of the Voronoi diagram?</li>
-        <li><a href="#big">Can </a>Qhull triangulate a
+		<li><A href="#flat">How</A> do I get rid of nearly flat Delaunay 
+    triangles? 
+    
+		<li><A href="#square">What</A> is the Voronoi diagram of a square? 
+    
+		<li><A href="#vclosest">How</A> do I find the Delaunay triangle or Voronoi 
+    region that is closest to a point? 
+    
+		<li><A href="#mesh">How</A> do I compute the Delaunay triangulation of a 
+    non-convex object? 
+    
+		<li><A href="#mesh">How</A> do I mesh a volume from a set of triangulated 
+    surface points? 
+    
+			<li><A href="#constrained">Can</A> Qhull produce a triangular mesh for an 
+    object? 
+    
+		<li><A href="#dridges">For</A> 3-d Delaunay triangulations, how do I 
+    report the triangles of each tetrahedron? 
+        <li><A href="#vsphere">How</A> do I construct the Voronoi diagram of 
+    cospherical points? 
+        <li><A href="#3dd">How</A> do I construct a 3-d Delaunay triangulation? 
+        <li><A href="#2d">How</A> do I get the triangles for a 2-d Delaunay 
+    triangulation and the vertices of its Voronoi diagram? 
+        <li><A href="#rays">Can</A> Qhull compute the unbounded rays of the 
+    Voronoi diagram? 
+        <li><A href="#big">Can </A>Qhull triangulate a
             hundred 16-d points?</li>
         </ul>
-    </li>
     <li>Approximation questions<ul>
-        <li><a href="#simplex">How</a> do I approximate data
+        <li><A href="#simplex">How</A> do I approximate data
             with a simplex?</li>
         </ul>
-    </li>
     <li>Halfspace questions<ul>
-        <li><a href="#halfspace">How</a> do I compute the
+        <li><A href="#halfspace">How</A> do I compute the
 			intersection of halfspaces with Qhull?</li>
         </ul>
-    </li>
     <li><a name="library">Qhull library</a> questions<ul>
-	<li><a href="#math">Is</a> Qhull available for Mathematica, Matlab, or Maple?</li>
-	<li><a href="#ridges">Why</a> are there too few ridges?</li>
-        <li><a href="#call">Can</a> Qhull use coordinates without placing
-		    them in a data file?</li>
-        <li><a href="#size">How</a> large are Qhull's data structures?</li>
-        <li><a href="#inc">Can</a> Qhull construct convex
-            hulls and Delaunay triangulations one point at a
-            time?</li>
-        <li><a href="#ridges2">How</a> do I visit the ridges
-            of a Delaunay triangulation?</li>
-        <li><a href="#listd">How</a> do I visit the Delaunay
-            facets?</li>
-        <li><a href="#outside">When</a> is a point outside or
-            inside a facet?</li>
-        <li><a href="#closest">How</a> do I find the facet
-            that is closest to a point?</li>
-        <li><a href="#vclosest">How</a> do I find the
-            Delaunay triangle or Voronoi region that is
-            closest to a point?</li>
-        <li><a href="#vertices">How</a> do I list the
-            vertices?</li>
-        <li><a href="#test">How</a> do I test code that uses
-            the Qhull library?</li>
-        <li><a href="#orient">When</a> I compute a plane
+	<li><A href="#math">Is</A> Qhull available for Mathematica, Matlab, or 
+    Maple? 
+    
+	<li><A href="#ridges">Why</A> are there too few ridges? 
+        <li><A href="#call">Can</A> Qhull use coordinates without placing them in 
+    a data file? 
+        <li><A href="#size">How</A> large are Qhull's data structures? 
+        <li><A href="#inc">Can</A> Qhull construct convex hulls and Delaunay 
+    triangulations one point at a time? 
+        <li><A href="#ridges2">How</A> do I visit the ridges of a Delaunay 
+    triangulation? 
+        <li><A href="#listd">How</A> do I visit the Delaunay facets? 
+    <LI><A 
+    href="#outside">When</A> is a point outside or inside a facet? 
+        <li><A href="#closest">How</A> do I find the facet that is closest to a 
+    point? 
+        <li><A href="#vclosest">How</A> do I find the Delaunay triangle or Voronoi 
+    region that is closest to a point? 
+        <li><A href="#vertices">How</A> do I list the vertices? 
+        <li><A href="#test">How</A> do I test code that uses the Qhull library? 
+        <li><A href="#orient">When</A> I compute a plane
             equation from a facet, I sometimes get an
             outward-pointing normal and sometimes an
             inward-pointing normal</li>
@@ -170,34 +164,40 @@ first.
 
 <hr>
 
-<h2><a href="#TOC">»</a><a name="startup">Startup</a> questions</h2>
+<h2><A href="#TOC">»</A><a name="startup">Startup</a> questions</h2>
 
-<h4><a href="#TOC">»</a><a name="console">How</a> do I run Qhull
-from Windows?</h4><dir>
+<h4><A href="#TOC">»</A><a name="console">How</a> do I run Qhull
+from Windows?</h4><blockquote>
 
 <p>Qhull is a console program. You will first need a DOS window
-(i.e., a &quot;DOS prompt&quot;). You can double click on
+(i.e., a "DOS prompt"). You can double click on
 'eg\Qhull-go.bat'. It loads 'doskey' to simplify rerunning qhull 
 and rbox. </p>
 
-<dir><ul>
-    <li>Type 'qconvex', 'qdelaunay', 'qhalf', 'qvoronoi, 'qhull', and 'rbox' for 
-	a synopsis of each program. </li>
-    <li>Type 'rbox c D2 | qconvex s i' to compute the convex hull
-        of a square. </li>
-    <li>Type 'rbox c D2 | qconvex s i TO results.txt' to write the
-        results to the file 'results.txt'. A summary is still
-        printed on the the console. </li>
-    <li>Type 'rbox c D2' to see the input format for qconvex. </li>
-    <li>Type 'qconvex &lt; data.txt s i TO results.txt' to read
-        input data from 'data.txt'. </li>
+<blockquote><ul>
+    <li>Type 'qconvex', 'qdelaunay', 'qhalf', 'qvoronoi, 
+      'qhull', and 'rbox' for a synopsis of each program. 
+ 
+    <li>Type 'rbox c D2 | qconvex s i' to compute the 
+      convex hull of a square. 
+ 
+    <li>Type 'rbox c D2 | qconvex s i TO results.txt' to 
+      write the results to the file 'results.txt'. A summary is still printed on 
+      the the console. 
+ 
+    <li>Type 'rbox c D2' to see the input format for 
+      qconvex. 
+ 
+    <li>Type 'qconvex &lt; data.txt s i TO results.txt' to 
+      read input data from 'data.txt'. 
+ 
     <li>If you want to enter data by hand, type 'qconvex s i TO
         results.txt' to read input data from the console. Type in
         the numbers and end with a ctrl-D. </li>
-</ul></dir>
+</ul></blockquote>
 
-</dir><h4><a href="#TOC">»</a><a name="input">How</a> do I enter
-points for Qhull?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="input">How</a> do I enter
+points for Qhull?</h4><blockquote>
 
 <p>Qhull takes its data from standard input. For example, create
 a file named 'data.txt' with the following contents: </p>
@@ -216,8 +216,8 @@ a file named 'data.txt' with the following contents: </p>
 
 <p>Then call qconvex with 'qconvex &lt; data.txt'. It will print a
 summary of the convex hull. Use 'qconvex &lt; data.txt o' to print
-the vertices and edges. See also <a href="index.htm#input">input
-format</a>. </p>
+the vertices and edges. See also <A href="index.htm#input">input
+format</A>. </p>
 
 <p>You can generate sample data with rbox, e.g., 'rbox 10'
 generates 10 random points in 3-d. Use a pipe ('|') to run rbox
@@ -229,54 +229,57 @@ and qhull together, e.g., </p>
 
 <p>computes the convex hull of a cube. </p>
 
-</dir><h4><a href="#TOC">»</a><a name="learn">How</a> do I learn to
-use Qhull?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="learn">How</a> do I learn to
+use Qhull?</h4><blockquote>
 
 <p>First read: </p>
 
 <ul>
-    <li><a href="index.htm">Introduction</a> to Qhull</li>
-    <li><a href="index.htm#when">When</a> to use Qhull</li>
-    <li><a href="qconvex.htm">qconvex</a> -- convex hull</li>
-    <li><a href="qdelaun.htm">qdelaunay</a> -- Delaunay triangulation</li>
-    <li><a href="qhalf.htm">qhalf</a> -- half-space intersection about a point</li>
-    <li><a href="qvoronoi.htm">qvoronoi</a> -- Voronoi diagram</li>
-    <li><a href="rbox.htm">Rbox</a>, for sample inputs </li>
-    <li><a href="qh-eg.htm">Examples</a> of Qhull</li>
+    <li><A href="index.htm">Introduction</A> to Qhull 
+    <li><A href="index.htm#when">When</A> to use Qhull 
+    <li><A href="qconvex.htm">qconvex</A> -- convex hull 
+    <li><A href="qdelaun.htm">qdelaunay</A> -- Delaunay triangulation 
+    <li><A href="qhalf.htm">qhalf</A> -- half-space intersection about a point 
+
+    <li><A href="qvoronoi.htm">qvoronoi</A> -- Voronoi diagram 
+    <li><A href="rbox.htm">Rbox</A>, for sample inputs 
+    <li><A href="qh-eg.htm">Examples</A> of Qhull</li>
 </ul>
 
 <p>Look at Qhull's on-line documentation: </p>
 
 <ul>
-    <li>'qconvex' gives a synopsis of qconvex and its options </li>
-    <li>'rbox' lists all of the options for generating point sets
-    </li>
-    <li>'qconvex - | more' lists the options for qconvex</li>
-    <li>'qconvex .' gives a concise list of options </li>
+    <li>'qconvex' gives a synopsis of qconvex and its options 
+
+    <li>'rbox' lists all of the options for generating point 
+    sets 
+    <li>'qconvex - | more' lists the options for qconvex 
+    <li>'qconvex .' gives a concise list of options 
     <li>'qdelaunay', 'qhalf', 'qvoronoi', and 'qhull' also have a synopsis and option list</li>
 </ul>
 
 <p>Then try out the Qhull programs on small examples. </p>
 
 <ul>
-    <li>'rbox c' lists the vertices of a cube </li>
-    <li>'rbox c | qconvex' is the convex hull of a cube </li>
-    <li>'rbox c | qconvex o' lists the vertices and facets of a
-        cube </li>
-    <li>'rbox c | qconvex QJ o' joggles the input and triangulates
-        the cube </li>
-    <li>'rbox c D2 | qconvex' generates the convex hull of a square
-    </li>
-    <li>'rbox c D4 | qconvex' generates the convex hull of a
-        hypercube </li>
-    <li>'rbox 6 s D2 | qconvex p Fx' lists 6 random points in a
-        circle and lists the vertices of their convex hull in
-        order </li>
-    <li>'rbox c D2 c G2 | qdelaunay' computes the Delaunay
-        triangulation of two embedded squares. It merges the
-        cospherical facets. </li>
-    <li>'rbox c D2 c G2 | qvoronoi o' computes the corresponding
-        Voronoi vertices and regions. </li>
+    <li>'rbox c' lists the vertices of a cube 
+    <li>'rbox c | qconvex' is the convex hull of a cube 
+    <li>'rbox c | qconvex o' lists the vertices and facets of 
+    a cube 
+    <li>'rbox c | qconvex Qt o' triangulates the cube 
+    <li>'rbox c | qconvex QJ o' joggles the input and 
+    triangulates the cube 
+    <li>'rbox c D2 | qconvex' generates the convex hull of a 
+    square 
+    <li>'rbox c D4 | qconvex' generates the convex hull of a 
+    hypercube 
+    <li>'rbox 6 s D2 | qconvex p Fx' lists 6 random points in 
+    a circle and lists the vertices of their convex hull in order 
+    <li>'rbox c D2 c G2 | qdelaunay' computes the Delaunay 
+    triangulation of two embedded squares. It merges the cospherical facets. 
+    <li>'rbox c D2 c G2 | qdelaunay Qt' computes the Delaunay 
+    triangulation of two embedded squares. It triangulates the cospherical facets. 
+    <li>'rbox c D2 c G2 | qvoronoi o' computes the 
+    corresponding Voronoi vertices and regions. 
     <li>'rbox c D2 c G2 | qvoronio Fv' shows the Voronoi diagram
         for the previous example. Each line is one edge of the
         diagram. The first number is 4, the next two numbers list
@@ -287,7 +290,7 @@ use Qhull?</h4><dir>
 <p>Install <a href="http://www.geomview.org">Geomview</a>
 if you are running SGI Irix, Solaris, SunOS, Linux, HP, IBM
 RS/6000, DEC Alpha, or Next. You can then visualize the output of
-Qhull. Qhull comes with Geomview <a href="qh-eg.htm">examples</a>.
+Qhull. Qhull comes with Geomview <A href="qh-eg.htm">examples</A>.
 </p>
 
 <p>Then try Qhull with a small example of your application. Work
@@ -295,27 +298,31 @@ out the results by hand. Then experiment with Qhull's options to
 find the ones that you need. </p>
 
 <p>You will need to decide how Qhull should handle precision
-problems. It can either joggle the input ('<a
-href="qh-optq.htm#QJn">QJ</a>') or merge facets (the default). </p>
+problems. It can triangulate the output ('<A
+ href="qh-optq.htm#Qt" >Qt</A>'), joggle the input ('<A
+ href="qh-optq.htm#QJn" >QJ</A>'), or merge facets (the default). </p>
 
 <ul>
-    <li>With joggle, Qhull produces simplicial (i.e., triangular)
-        output. </li>
-    <li>With facet merging, Qhull produces a better approximation
-        and does not modify the input. </li>
-    <li>See <a href="qh-impre.htm#joggle">Joggled input or merged
-        facets</a>. </li>
+    <li>With joggle, Qhull produces simplicial (i.e., 
+    triangular) output by joggling the input.  After joggle,
+    no points are cocircular or cospherical.
+    <li>With facet merging, Qhull produces a better 
+    approximation and does not modify the input. 
+    <li>With triangulated output, Qhull merges facets and triangulates
+    the result.</li>
+    <li>See <A href="qh-impre.htm#joggle">Joggled input or merged
+        facets</A>. </li>
 </ul>
 
-</dir>
-<h2><a href="#TOC">»</a><a name="convex">Convex hull questions</a></h2>
+</blockquote>
+<h2><A href="#TOC">»</A><a name="convex">Convex hull questions</a></h2>
 
-<h4><a href="#TOC">»</a><a name="area">How</a> do I report just the area
-			and volume of a convex hull?</h4><dir>
+<h4><A href="#TOC">»</A><a name="area">How</a> do I report just the area
+			and volume of a convex hull?</h4><blockquote>
 
 Use option 'FS'.  For example,
 
-<dir><pre>
+<blockquote><pre>
 C:\qhull>rbox 10 | qconvex FS
 0
 2 2.192915621644613 0.2027867899638665
@@ -335,17 +342,18 @@ Statistics for: RBOX 10 | QCONVEX FA
   CPU seconds to compute hull (after input):  0
   Total facet area:   2.1929156
   Total volume:       0.20278679
-</pre></dir>
+</pre></blockquote>
 
-</dir><h4><a href="#TOC">»</a><a name="extra">Why</a> are there extra
-points in a 4-d or higher convex hull?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="extra">Why</a> are there extra
+points in a 4-d or higher convex hull?</h4><blockquote>
 
-<p>You may see extra points if you use option '<a
-href="qh-opto.htm#i">i</a>' or '<a href="qh-optf.htm#Ft">Ft</a>'.
+<p>You may see extra points if you use options '<A
+ href="qh-opto.htm#i" >i</A>' or '<A href="qh-optf.htm#Ft">Ft</A>'
+ without using triangulated output ('<A href="qh-optq.htm#Qt">Qt</A>').
 The extra points occur when a facet is non-simplicial (i.e., a
 facet with more than <i>d</i> vertices). For example, Qhull
-reports the following for the convex hull of a hypercube. It uses
-option 'Pd0:0.5' to return the facet along the positive-x axis: </p>
+reports the following for one facet of the convex hull of a hypercube. 
+Option 'Pd0:0.5' returns the facet along the positive-x axis: </p>
 
 <blockquote>
     <pre>
@@ -366,13 +374,31 @@ rbox c D4 | qconvex i Pd0:0.5
 </pre>
 </blockquote>
 
-<p>The 4-d hypercube has 16 vertices; so point &quot;17&quot; was
+<p>The 4-d hypercube has 16 vertices; so point "17" was
 added by qconvex. Qhull adds the point in order to report a
 simplicial decomposition of the facet. The point corresponds to
-the &quot;centrum&quot; which Qhull computes to test for
+the "centrum" which Qhull computes to test for
 convexity. </p>
 
-<p>Use the '<a href="qh-optf.htm#Fv">Fv</a>' option to print the
+<p>Triangulate the output ('<A href="qh-optq.htm#Qt">Qt</A>') to avoid the extra points.
+Since the hypercube is 4-d, each simplicial facet is a tetrahedron.
+<blockquote>
+<pre>
+C:\qhull3.1>rbox c D4 | qconvex i Pd0:0.5 Qt
+9
+9 13 14 15
+12 9 13 14
+9 11 13 15
+11 9 14 15
+9 10 11 14
+12 9 14 8
+9 12 13 8
+9 10 14 8
+10 9 11 8
+</pre>
+</blockquote>
+
+<p>Use the '<A href="qh-optf.htm#Fv">Fv</A>' option to print the
 vertices of simplicial and non-simplicial facets. For example,
 here is the same hypercube facet with option 'Fv' instead of 'i':
 </p>
@@ -385,8 +411,8 @@ C:\qhull&gt;rbox c D4 | qconvex Pd0:0.5 Fv
 </pre>
 </blockquote>
 
-<p>The coordinates of the extra point are printed with the '<a
-href="qh-optf.htm#Ft">Ft</a>' option. </p>
+<p>The coordinates of the extra point are printed with the '<A
+ href="qh-optf.htm#Ft" >Ft</A>' option. </p>
 
 <blockquote>
     <pre>
@@ -425,56 +451,59 @@ rbox c D4 | qconvex Pd0:0.5 Ft
 </pre>
 </blockquote>
 
-</dir><h4><a href="#TOC">»</a><a name="dup">How</a> do I report
-duplicate vertices?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="dup">How</a> do I report
+duplicate vertices?</h4><blockquote>
 
 <p>There's no direct way. You can use option 
-'<a href="qh-optf.htm#FP">FP</a>' to
+'<A href="qh-optf.htm#FP">FP</A>' to
 report the distance to the nearest vertex for coplanar input
 points. Select the minimum distance for a duplicated vertex, and
 locate all input sites less than this distance. </p>
 
 <p>For Delaunay triangulations, all coplanar points are nearly
 incident to a vertex. If you want a report of coincident input
-sites, do not use option '<a href="qh-optq.htm#QJn">QJ</a>'. By
+sites, do not use option '<A href="qh-optq.htm#QJn">QJ</A>'. By
 adding a small random quantity to each input coordinate, it
 prevents coincident input sites. </p>
 
-</dir>
-<h2><a href="#TOC">»</a><a name="delaunay">Delaunay and Voronoi
+</blockquote>
+<h2><A href="#TOC">»</A><a name="delaunay">Delaunay and Voronoi
 diagram questions</a></h2>
 
-</dir><h4><a href="#TOC">»</a><a name="flat">How</a> do I get rid of 
-nearly flat Delaunay triangles?</h4><dir>
+<h4><A href="#TOC">»</A><a name="flat">How</a> do I get rid of 
+nearly flat Delaunay triangles?</h4><blockquote>
 
 <p>Nearly flat triangles occur when boundary points are nearly
-colinear or coplanar.  They also occur for nearly coincident
+collinear or coplanar.  They also occur for nearly coincident
 points.  Both events can easily occur when using joggle.  For example
 (rbox 10 W0 D2 | qdelaunay QJ Fa) lists the areas of the Delaunay 
 triangles of 10 points on the boundary of a square.  Some of
 these triangles are nearly flat.  This occurs when one point
-is joggled inside of two other points.
+is joggled inside of two other points.  In this case, nearly flat
+triangles do not occur with triangulated output (rbox 10 W0 D2 | qdelaunay Qt Fa).
+
 
 <p>Another example, (rbox c P0 P0 D2 | qdelaunay QJ Fa), computes the
 areas of the Delaunay triangles for the unit square and two
 instances of the origin.  Four of the triangles have an area
 of 0.25 while two have an area of 2.0e-11.  The later are due to 
-the duplicated origin.
+the duplicated origin.  With triangulated output (rbox c P0 P0 D2 | qdelaunay Qt Fa)
+there are four triangles of equal area.
 
 <p>Nearly flat triangles also occur without using joggle.  For
 example, (rbox c P0 P0,0.4999999999 | qdelaunay Fa), computes
 the areas of the Delaunay triangles for the unit square, 
-a nearly colinear point, and the origin.  One triangle has an
+a nearly collinear point, and the origin.  One triangle has an
 area of 3.3e-11.
 
 <p>Unfortunately, none of Qhull's merging options remove nearly 
-flat Delaunay triangles due to nearly colinear or coplanar boundary
+flat Delaunay triangles due to nearly collinear or coplanar boundary
 points.  
 The merging options concern the empty circumsphere
 property of Delaunay triangles.  This is independent of the area of
 the Delaunay triangles.  Qhull does handle nearly coincident points.   
 
-<p>You can handle colinear or coplanar boundary points by 
+<p>You can handle collinear or coplanar boundary points by 
 enclosing the points in a box.  For example, 
 (rbox c P0 P0,0.4999999999 c G1 | qdelaunay Fa), surrounds the
 previous points with [(1,1), (1,-1), (-1,-1), (-1, 1)].
@@ -489,36 +518,18 @@ Use 'Fc' to list the coincident points (e.g.,
 rbox c P0 P0 D2 | qdelaunay Fc).
 
 <p>There is no easy way to determine coincident points with joggle.
-You can bound the maximum separation of coincident points due to
-joggle.  Using the Delaunay triangulation, you can visit the
-adjacent points and compute their separation.  If two points are nearly
-coincident, you can merge them and remove the corresponding
-triangles.  The adjacent triangles are no longer necessarily
-Delaunay.  If this is a concern, you can recompute the Delaunay
-triangulation after identifying all of the coincident points.
-
-<p>Alternatively, you can identify nearly coincident points by
-running Qhull without joggle.  You can then recompute the Delaunay
-triangulation with joggle.  Since Qhull without joggle is more precise
-than Qhull with joggle, you should use the 'Cn' or 'An' options to
-reduce Qhull's precision.
-
-<p>After removing nearly coincident points, you can identify nearly 
-colinear or coplanar boundary points.
-For each Delaunay triangle on the boundary, compute the
-boundary ridge.  In 2-d, this is a line.  Compute the distance
-from the remaining point to the ridge.  If this distance is less
-than the maximum due to joggle, the Delaunay triangle can be removed.
-
-<p>Alternatively, you can enclose the points in a box and remove
-the box and its triangles when done.
-
-<h4><a href="#TOC">»</a><a name="square">What</a> is the Voronoi diagram
-			    of a square?</h4><dir>
+Joggle removes all coincident, cocircular, and cospherical points
+before running Qhull.  Instead use facet merging (the default)
+or triangulated output ('<A href="qh-optq.htm#Qt">Qt</A>').
+
+
+</blockquote>
+<h4><A href="#TOC">»</A><a name="square">What</a> is the Voronoi diagram
+			    of a square?</h4><blockquote>
 
 <p>
 Consider a square, 
-<dir><pre>
+<blockquote><pre>
 C:\qhull&gt;rbox c D2 
 2 RBOX c D2
 4
@@ -526,13 +537,13 @@ C:\qhull&gt;rbox c D2
   -0.5    0.5
    0.5   -0.5
    0.5    0.5
-</pre></dir>
+</pre></blockquote>
 
 <p>There's two ways to compute the Voronoi diagram: with facet merging
 or with joggle.  With facet merging, the
 result is:
 
-<dir><pre>
+<blockquote><pre>
 C:\qhull&gt;rbox c D2 | qvoronoi Qz
 
 Voronoi diagram by the convex hull of 5 points in 3-d:
@@ -567,7 +578,7 @@ C:\qhull&gt;rbox c D2 | qvoronoi Qz Fv
 4 0 2 0 1
 4 1 3 0 1
 4 2 3 0 1
-</pre></dir>
+</pre></blockquote>
 
 <p>There is one Voronoi vertex at the origin and rays from the origin
 along each of the coordinate axes.  
@@ -578,25 +589,55 @@ Option 'Qz' adds an artificial point since the input is cocircular.
 Coordinates -10.101 indicate the
 vertex at infinity.  
 
-<p>With joggle, the input is no longer cocircular and the Voronoi vertex is 
-split into two:
+<p>With triangulated output, the Voronoi vertex is 
+duplicated:
 
-<dir><pre>
-C:\qhull&gt;rbox c D2 | qvoronoi QJ
+<blockquote><pre>
+C:\qhull3.1>rbox c D2 | qvoronoi Qt Qz
 
-Voronoi diagram by the convex hull of 4 points in 3-d:
+Voronoi diagram by the convex hull of 5 points in 3-d:
 
-  Number of Voronoi regions: 4
+  Number of Voronoi regions and at-infinity: 5
   Number of Voronoi vertices: 2
-  Number of facets in hull: 4
+  Number of triangulated facets: 1
 
-Statistics for: RBOX c D2 | QVORONOI QJ
+Statistics for: RBOX c D2 | QVORONOI Qt Qz
+
+  Number of points processed: 5
+  Number of hyperplanes created: 7
+  Number of facets in hull: 6
+  Number of distance tests for qhull: 8
+  Number of distance tests for merging: 33
+  Number of distance tests for checking: 30
+  Number of merged facets: 1
+  CPU seconds to compute hull (after input): 0.05
+
+C:\qhull3.1>rbox c D2 | qvoronoi Qt Qz o
+2
+3 5 1
+-10.101 -10.101
+     0      0
+     0      0
+3 2 0 1
+2 1 0
+2 2 0
+3 2 0 1
+0
+
+C:\qhull3.1>rbox c D2 | qvoronoi Qt Qz Fv
+4
+4 0 2 0 2
+4 0 1 0 1
+4 1 3 0 1
+4 2 3 0 2
+</pre></blockquote>
 
-  Number of points processed: 4
-  Number of hyperplanes created: 5
-  Number of distance tests for qhull: 1
-  CPU seconds to compute hull (after input):  0
-  Input joggled by: 4.2e-011
+
+<p>With joggle, the input is no longer cocircular and the Voronoi vertex is 
+split into two:
+
+<blockquote><pre>
+C:\qhull&gt;rbox c D2 | qvoronoi Qt Qz
 
 C:\qhull&gt;rbox c D2 | qvoronoi QJ o
 2
@@ -616,21 +657,22 @@ C:\qhull&gt;rbox c D2 | qvoronoi QJ Fv
 4 1 2 1 2
 4 1 3 0 2
 4 2 3 0 2
-</pre></dir>
+</pre></blockquote>
 
-<p>Note that the Voronoi diagram includes the same rays as before plus
-a short edge between the two vertices.
+<p>Note that the Voronoi diagram includes the same rays as 
+  before plus a short edge between the two vertices.</p>           
+      
 
-</dir><h4><a href="#TOC">»</a><a name="mesh">How</a> do I compute
-the Delaunay triangulation of a non-convex object?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="mesh">How</a> do I compute
+the Delaunay triangulation of a non-convex object?</h4><blockquote>
 
-<p>A similar question is "How do I mesh a volume from a set of triangulated 
-surface points?"
+<p>A similar question is 
+"How do I mesh a volume from a set of triangulated surface points?"
 
 <p>This is an instance of the constrained Delaunay Triangulation
 problem.  Qhull does not handle constraints.  The boundary of the
 Delaunay triangulation is always convex.  But if the input set
-contains enough points, the triangulation will include to the
+contains enough points, the triangulation will include the
 boundary.  The number of points needed depends on the input.
 
 <p>Shewchuk has developed a theory of constrained Delaunay triangulations.
@@ -644,35 +686,35 @@ offerings.  For pointers see
 <a href="http://www.andrew.cmu.edu/user/sowen/mesh.html">Owen's Meshing 
 Research Corner</a> and 
 <a href="http://www-users.informatik.rwth-aachen.de/~roberts/meshgeneration.html">Schneiders' 
-Finite Element Mesh Generation page</a>.
+Finite Element Mesh Generation page</a>.</p>
 
-</dir><h4><a href="#TOC">»</a><a name="constrained">Can</a> Qhull
-produce a triangular mesh for an object?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="constrained">Can</a> Qhull
+produce a triangular mesh for an object?</h4><blockquote>
 
 <p>Yes for convex objects, no for non-convex objects. For
 non-convex objects, it triangulates the concavities. Unless the
 object has many points on its surface, triangles may cross the
 surface. </p>
 
-</dir><h4><a href="#TOC">»</a><a name="dridges">For</a> 3-d Delaunay
+</blockquote><h4><A href="#TOC">»</A><a name="dridges">For</a> 3-d Delaunay
 triangulations, how do I report the triangles of each
-tetrahedron?</h4><dir>
+tetrahedron?</h4><blockquote>
 
 <p>For points in general position, a 3-d Delaunay triangulation
 generates tetrahedron. Each face of a tetrahedron is a triangle.
 For example, the 3-d Delaunay triangulation of random points on
 the surface of a cube, is a cellular structure of tetrahedron. </p>
 
-<p>Use 'qdelaunay QJ i' to generate the Delaunay triangulation. 
-This uses joggled input ('QJ') to guarantee tetrahedral
-output. Option 'i' reports each tetrahedron. The triangles are
+<p>Use triangulated output ('qdelaunay Qt i') or joggled input ('qdelaunay QJ i') 
+to generate the Delaunay triangulation. 
+Option 'i' reports each tetrahedron. The triangles are
 every combination of 3 vertices. Each triangle is a
-&quot;ridge&quot; of the Delaunay triangulation. </p>
+"ridge" of the Delaunay triangulation. </p>
 
 <p>For example, </p>
 
 <pre>
-	rbox 10 | qdelaunay QJ i
+	rbox 10 | qdelaunay Qt i
 	14
 	9 5 8 7
 	0 9 8 7
@@ -695,11 +737,11 @@ occurs twice. Once for tetrahedron 9 5 8 7 and the other for
 tetrahedron 2 9 5 8. </p>
 
 <p>You can also use the Qhull library to generate the triangles.
-See &quot;<a href="#ridges2">How</a> do I visit the ridges of a
-Delaunay triangulation?&quot;</p>
+See "<A href="#ridges2">How</A> do I visit the ridges of a
+Delaunay triangulation?"</p>
 
-</dir><h4><a href="#TOC">»</a><a name="vsphere">How</a> do I construct
-the Voronoi diagram of cospherical points?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="vsphere">How</a> do I construct
+the Voronoi diagram of cospherical points?</h4><blockquote>
 
 <p>Three-d terrain data can be approximated with cospherical
 points. The Delaunay triangulation of cospherical points is the
@@ -797,19 +839,18 @@ rbox d G1 | qconvex i
 vertex 0 (i.e., [-0.577, 0.577, 0.577]) is the Voronoi vertex for
 input sites {3, 1, 4} (i.e., {[0,1,0], [0,0,1], [-1,0,0]}). </p>
 
-</dir><h4><a href="#TOC">»</a><a name="3dd">How</a> do I construct a
-3-d Delaunay triangulation?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="3dd">How</a> do I construct a
+3-d Delaunay triangulation?</h4><blockquote>
 
-<p>For 3-d Delaunay triangulations with cospherical input sites
-(a 4-d convex hull), options 'i' and 'Ft' are inconvenient. They
+<p>For 3-d Delaunay triangulations with cospherical input sites, 
+use triangulated output ('<A href="qh-optq.htm#Qt">Qt</A>') or
+joggled input  ('<A href="qh-optq.htm#QJn">QJ</A>').  Otherwise
+option 'i' will
 triangulate non-simplicial facets by adding a point to the facet.
-As shown below, better choices are to prevent non-simplicial
-input sites with option 'QJ', or to report all cospherical input
-sites with options 'Fv' or 'o'. </p>
 
 <p>If you want non-simplicial output for cospherical sites, use
 option 
-'<a href="qh-optf.htm#Fv">Fv</a>' or '<a href="qh-opto.htm#o">o</a>'.
+'<A href="qh-optf.htm#Fv">Fv</A>' or '<A href="qh-opto.htm#o">o</A>'.
 For option 'o', ignore the last coordinate. It is the lifted
 coordinate for the corresponding convex hull in 4-d. 
 
@@ -857,106 +898,92 @@ C:\qhull&gt;rbox r y c G0.1 | qdelaunay Fv
 </pre>
 </blockquote>
 
-<p>If you want simplicial output use options 
-'<a href="qh-optq.htm#QJn">QJ</a> <a
-href="qh-optf.htm#Ft">i</a>' or '<a
-href="qh-optq.htm#QJn">QJ</a> <a href="qh-optf.htm#Ft">Ft</a>'.
-Option 'QJ' adds a small random quantity to the input points,
-e.g., </p>
+<p>If you want simplicial output use options
+'<A href="qh-optq.htm#Qt">Qt</A> <A
+ href="qh-optf.htm#Ft" >i</A>' or 
+'<A href="qh-optq.htm#QJn">QJ</A> <A
+ href="qh-optf.htm#Ft" >i</A>', e.g.,
+</p>
 
 <blockquote>
     <pre>
-C:\qhull&gt;rbox r y c G0.1 | qdelaunay QJ Ft
-3
-12 32 64
-0.499999999939516 -4.457283719588488e-011 3.092055050303195e-011
-3.963849488044223e-012 0.4999999999660025 -5.479396782402126e-011
-2.168946845951116e-011 5.258475653706346e-011 0.4999999999859073
--0.4999999999599631 -0.5000000000563027 -0.5000000000540177
--0.09999999997929608 -0.1000000000595537 -0.1000000000141032
--0.1000000000099817 -0.09999999997740613 0.1000000000107635
--0.09999999995812423 0.1000000000032576 -0.10000000004936
--0.1000000000101616 0.100000000024338 0.1000000000496365
-0.09999999997126396 -0.1000000000547432 -0.0999999999714412
-0.1000000000160453 -0.09999999996898205 0.1000000000594008
-0.09999999996939933 0.1000000000583741 -0.0999999999730648
-0.1000000000183292 0.09999999994830786 0.1000000000159239
-4 2 11 1 0
-4 11 7 2 1
-4 10 1 0 3
-4 11 10 1 0
-4 10 7 11 1
-4 2 9 0 3
-4 9 11 2 0
-4 7 9 11 2
-4 8 10 11 0
-4 9 8 11 0
-4 8 10 0 3
-4 9 8 0 3
-4 5 9 7 2
-4 7 5 2 3
-4 4 5 7 3
-4 5 9 2 3
-4 9 5 7 11
-4 5 8 9 3
-4 8 5 4 3
-4 8 5 9 11
-4 5 6 4 7
-4 10 6 7 1
-4 6 10 7 11
-4 5 6 7 11
-4 5 6 8 4
-4 6 7 1 3
-4 6 4 7 3
-4 10 6 1 3
-4 6 8 10 11
-4 6 5 8 11
-4 8 6 10 3
-4 6 8 4 3
+rbox r y c G0.1 | qdelaunay Qt i
+31
+2 11 1 0
+11 10 1 0
+9 11 2 0
+11 7 2 1
+8 10 0 3
+9 8 0 3
+10 6 1 3
+6 7 1 3
+5 9 2 3
+7 5 2 3
+9 8 10 11
+8 10 11 0
+9 8 11 0
+6 8 10 4
+8 6 10 3
+6 8 4 3
+6 7 10 11
+10 6 11 1
+6 7 11 1
+8 5 4 3
+5 8 9 3
+5 6 4 3
+6 5 7 3
+5 9 10 11
+8 5 9 10
+7 5 10 11
+5 6 7 10
+8 5 10 4
+5 6 10 4
+5 9 11 2
+7 5 11 2
 </pre>
 </blockquote>
 
-</dir><h4><a href="#TOC">»</a><a name="2d">How</a> do I get the
+</blockquote><h4><A href="#TOC">»</A><a name="2d">How</a> do I get the
 triangles for a 2-d Delaunay triangulation and the vertices of
-its Voronoi diagram?</h4><dir>
+its Voronoi diagram?</h4><blockquote>
 
 <p>To compute the Delaunay triangles indexed by the indices of
 the input sites, use </p>
 
 <blockquote>
-    <p>rbox 10 D2 | qdelaunay QJ i </p>
+    <p>rbox 10 D2 | qdelaunay Qt i </p>
 </blockquote>
 
 <p>To compute the Voronoi vertices and the Voronoi region for
 each input site, use </p>
 
 <blockquote>
-    <p>rbox 10 D2 | qvoronoi QJ o </p>
+    <p>rbox 10 D2 | qvoronoi o </p>
 </blockquote>
 
-<p>To compute each edge (&quot;ridge&quot;) of the Voronoi
+<p>To compute each edge ("ridge") of the Voronoi
 diagram for each pair of adjacent input sites, use</p>
 
 <blockquote>
-    <p>rbox 10 D2 | qvoronoi QJ Fv </p>
+    <p>rbox 10 D2 | qvoronoi Fv </p>
 </blockquote>
 
-<p>To compute the area of the Voronoi region for input site 5,
+<p>To compute the area and volume of the Voronoi region for input site 5,
 use </p>
 
 <blockquote>
-    <p>rbox 10 D2 | qvoronoi QJ QV5 p | qconvex s FS </p>
+    <p>rbox 10 D2 | qvoronoi QV5 p | qconvex s FS </p>
 </blockquote>
 
-<p>To compute the lines (&quot;hyperplanes&quot;) that define the
+<p>To compute the lines ("hyperplanes") that define the
 Voronoi region for input site 5, use </p>
 
 <blockquote>
-    <p>rbox 10 D2 | qvoronoi QJ QV5 p | qconvex n </p>
+    <p>rbox 10 D2 | qvoronoi QV5 p | qconvex n </p>
 </blockquote>
 or
 <blockquote>
-    <p>rbox 10 D2 | qvoronoi QJ QV5 Fi Fo</p>
+    <p>rbox 10 D2 | qvoronoi QV5 Fi Fo</p>
 </blockquote>
 
 <p>To list the extreme points of the input sites use </p>
@@ -971,10 +998,10 @@ or
     <p>rbox 10 D2 | qconvex Fx </p>
 </blockquote>
 
-</dir><h4><a href="#TOC">»</a><a name="rays">Can</a> Qhull compute the
-unbounded rays of the Voronoi diagram?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="rays">Can</a> Qhull compute the
+unbounded rays of the Voronoi diagram?</h4><blockquote>
 
-<p>Use '<a href="qh-optf.htm#Fo2">Fo</a>' to compute the separating
+<p>Use '<A href="qh-optf.htm#Fo2">Fo</A>' to compute the separating
 hyperplanes for unbounded Voronoi regions. The corresponding ray
 goes to infinity from the Voronoi vertices. If you enclose the
 input sites in a large enough box, the outermost bounded regions
@@ -982,26 +1009,26 @@ will represent the unbounded regions of the original points. </p>
 
 <p>If you do not box the input sites, you can identify the
 unbounded regions. They list '0' as a vertex. Vertex 0 represents
-&quot;infinity&quot;. Each unbounded ray includes vertex 0 in
-option '<a href="qh-optf.htm#Fv2">Fv</a>. See <a
-href="qvoronoi.htm#graphics">Voronoi graphics</a> and <a
-href="qvoronoi.htm#notes">Voronoi notes</a>. </p>
+"infinity". Each unbounded ray includes vertex 0 in
+option '<A href="qh-optf.htm#Fv2">Fv</A>. See <A
+ href="qvoronoi.htm#graphics" >Voronoi graphics</A> and <A
+ href="qvoronoi.htm#notes" >Voronoi notes</A>. </p>
 
-</dir><h4><a href="#TOC">»</a><a name="big">Can </a>Qhull triangulate
-a hundred 16-d points?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="big">Can </a>Qhull triangulate
+a hundred 16-d points?</h4><blockquote>
 
 <p>No. This is an immense structure. A triangulation of 19, 16-d
-points has 43 simplicies. If you add one point at a time, the
+points has 43 simplices. If you add one point at a time, the
 triangulation increased as follows: 43, 189, 523, 1289, 2830,
 6071, 11410, 20487. The last triangulation for 26 points used 13
 megabytes of memory. When Qhull uses virtual memory, it becomes
 too slow to use. </p>
 
-</dir>
-<h2><a href="#TOC">»</a>Approximation questions</h2>
+</blockquote>
+<h2><A href="#TOC">»</A>Approximation questions</h2>
 
-<h4><a href="#TOC">»</a><a name="simplex">How</a> do I
-approximate data with a simplex</h4><dir>
+<h4><A href="#TOC">»</A><a name="simplex">How</a> do I
+approximate data with a simplex</h4><blockquote>
 
 <p>Qhull may be used to help select a simplex that approximates a
 data set. It will take experimentation. Geomview will help to
@@ -1042,11 +1069,11 @@ rbox 1000 | qconvex W0.05 C0.05 PA6 Fo
 </pre>
 </blockquote>
 
-</dir>
-<h2><a href="#TOC">»</a>Halfspace questions</h2>
+</blockquote>
+<h2><A href="#TOC">»</A>Halfspace questions</h2>
 
-<h4><a href="#TOC">»</a><a name="halfspace">How</a> do I compute the
-			    intersection of halfspaces with Qhull?</h4><dir>
+<h4><A href="#TOC">»</A><a name="halfspace">How</a> do I compute the
+			    intersection of halfspaces with Qhull?</h4><blockquote>
 
 <p>Qhull computes the halfspace intersection about a point.  The
 point must be inside all of the halfspaces.  Given a point, a
@@ -1055,38 +1082,48 @@ hull problem.
 
 <p>Use linear programming if you
 do not know a point in the interior of the halfspaces.
-See the <a href="qhalf.htm#notes">manual</a>.  You will
-need a linear programming code.  This may require a fair
-amount of work to implement.
+See the <A href="qhalf.htm#notes">manual</A>. You will need 
+  a linear programming code. This may require a fair amount of work to 
+  implement.</p>   
+          
+    
 
-</dir>
-<h2><a href="#TOC">»</a><a name="library">Qhull library
+</blockquote>
+<h2><A href="#TOC">»</A><a name="library">Qhull library
 questions</a></h2>
 
-<h4><a href="#TOC">»</a><a name="math">Is</a> Qhull available for Mathematica, Matlab, or Maple?</h4><dir>
-
-<p>Z. You of <a href="www.mathworks.com">MathWorks</a> added qhull to MATLAB 6.  
-See functions <a href=http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/convhulln.shtml>convhulln</a>,
-	<a href=http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/delaunayn.shtml>delaunayn</a>,
-	<a href=http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/griddata3.shtml>griddata3</a>,
-	<a href=http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/griddatan.shtml>griddatan</a>,
-	<a href=http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/tsearch.shtml>tsearch</a>,
-	<a href=http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/tsearchn.shtml>tsearchn</a>, and
-    <a href=http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/voronoin.shtml>voronoin</a>.
-
-<p>See <a href=http://www.mathsource.com/Content/Enhancements/Geometry/0211-251>qh-math</a>
+<h4><A href="#TOC">»</A><a name="math">Is</a> Qhull available for Mathematica, Matlab, or Maple?</h4><blockquote>
+
+<p>Z. You of <a href="http://www.mathworks.com">MathWorks</a> added qhull to MATLAB 6.  
+See functions <a href="http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/convhulln.shtml" 
+ >convhulln</a>,
+	<a href="http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/delaunayn.shtml" 
+ >delaunayn</a>,
+	<a href="http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/griddata3.shtml" 
+ >griddata3</a>,
+	<a href="http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/griddatan.shtml" 
+ >griddatan</a>,
+	<a href="http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/tsearch.shtml" 
+ >tsearch</a>,
+	<a href="http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/tsearchn.shtml" 
+ >tsearchn</a>, and
+    <a href="http://www.mathworks.com/access/helpdesk/jhelp/techdoc/ref/voronoin.shtml" 
+ >voronoin</a>.
+
+<p>See <a href="http://www.mathsource.com/Content/Enhancements/Geometry/0211-251" 
+ >qh-math</a>
 for a Delaunay interface to Mathematica.  It includes projects for CodeWarrior 
 on the Macintosh and Visual C++ on Win32 PCs.
 
 <p>If you write in interface for Maple, please send
-a note to <a href=mailto:bradb@geom.umn.edu>bradb@geom.umn.edu</a>.
+a note to <A href="mailto:bradb@geom.umn.edu" >bradb@geom.umn.edu</A>.
 
-<p>
-</dir><h4><a href="#TOC">»</a><a name="ridges">Why</a> are there too few ridges?</h4><dir>
+<p></p>
+</blockquote><h4><A href="#TOC">»</A><a name="ridges">Why</a> are there too few ridges?</h4><blockquote>
 
 The following sample code may produce fewer ridges than expected:
 
-<dir><pre>
+<blockquote><pre>
   facetT *facetp;
   ridgeT *ridge, **ridgep;
 
@@ -1096,14 +1133,14 @@ The following sample code may produce fewer ridges than expected:
       printf("   ridge r%d between f%d and f%d\n", ridge->id, ridge->top->id, ridge->bottom->id);
     }
   }
-</pre></dir>
+</pre></blockquote>
 
-<p>Qhull does not create ridges for simplicial facets.  Instead it
-computes ridges from facet->neighbors.  To make ridges for a simplicial
-facet, use qh_makeridges() in merge.c.  Use facet->visit_id to visit
+<p>  Qhull does not create ridges for  simplicial facets.
+Instead it computes ridges from  facet-&gt;neighbors. To make ridges for a
+simplicial facet, use qh_makeridges() in  merge.c. Usefacet-&gt;visit_id to visit
 each ridge once (instead of twice).  For example,
 
-<dir><pre>
+<blockquote><pre>
   facetT *facet, *neighbor;
   ridgeT *ridge, **ridgep;
 
@@ -1118,24 +1155,27 @@ each ridge once (instead of twice).  For example,
             printf("   ridge r%d between f%d and f%d\n", ridge->id, ridge->top->id, ridge->bottom->id);
     }
   }
-</pre></dir>
+</pre></blockquote>
 
-</dir><h4><a href="#TOC">»</a><a name="call">Can</a> Qhull use coordinates without placing
-			them in a data file?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="call">Can</a> Qhull use coordinates without placing
+			them in a data file?</h4><blockquote>
 
 <p>Use qh_call_qhull().  See user_eg.c for an example.
-See the manual for an intro to the Qhull library.
+See the manual for an introduction to the Qhull library.
 
-<p>Start with a small example for which you know the
-answer.
+<p>Start with a small example for which you know the 
+  answer.</p>         
 
-</dir><h4><a href="#TOC">»</a><a name="size">How</a> large are Qhull's data structures?</h4><dir>
 
+</blockquote><h4><A href="#TOC">»</A><a name="size">How</a> large are Qhull's data structures?</h4><blockquote>
+
+<p>Qhull uses a general-dimension data structure.  
 The size depends on the dimension.  Use option 'Ts' to print
 out the memory statistics [e.g., 'rbox D2 10 | qconvex Ts'].
 
-</dir><h4><a href="#TOC">»</a><a name="inc">Can</a> Qhull construct
-convex hulls and Delaunay triangulations one point at a time?</h4><dir>
+
+</blockquote><h4><A href="#TOC">»</A><a name="inc">Can</a> Qhull construct
+convex hulls and Delaunay triangulations one point at a time?</h4><blockquote>
 
 <p>The Qhull library may be used to construct convex hulls and
 Delaunay triangulations one point at a time. It may not be used
@@ -1155,8 +1195,17 @@ used on-line for n points, Clarkson may take O(n) times as much
 memory as the average off-line case, while Qhull's space
 requirement does not change. </p>
 
-</dir><h4><a href="#TOC">»</a><a name="ridges2">How</a> do I visit the
-ridges of a Delaunay triangulation?</h4><dir>
+<p>If you triangulate the output before adding all the points
+(option 'Qt' and procedure qh_triangulate), you must set
+option '<A href="qh-optq.htm#Q11">Q11</A>'.  It duplicates the
+normals of triangulated facets and recomputes the centrums.
+This should be avoided for regular use since triangulated facets
+are not clearly convex with their neighbors.  It appears to
+work most of the time, but fails for cases that Qhull normally
+handles well [see the test call to qh_triangulate in qh_addpoint].
+
+</blockquote><h4><A href="#TOC">»</A><a name="ridges2">How</a> do I visit the
+ridges of a Delaunay triangulation?</h4><blockquote>
 
 <p>To visit the ridges of a Delaunay triangulation, visit each
 facet. Each ridge will appear twice since it belongs to two
@@ -1182,16 +1231,16 @@ facets. In pseudo-code: </p>
 		neighbor= otherfacet_(ridge, facet);
 		if (neighbor-&gt;visitid != qh visit_id) {
 		    /* Print ridge here with facet-id and neighbor-id */
-		    /*fprintf(fp, &quot;f%d\tf%d\t&quot;,facet-&gt;id,neighbor-&gt;ID);*/
+		    /*fprintf(fp, "f%d\tf%d\t",facet-&gt;id,neighbor-&gt;ID);*/
 		    FOREACHvertex_(ridge-&gt;vertices)
-			fprintf(fp,&quot;%d &quot;,qh_pointid (vertex-&gt;point) );
+			fprintf(fp,"%d ",qh_pointid (vertex-&gt;point) );
 		    qh_printfacetNvertex_simplicial (fp, facet, format);
-		    fprintf(fp,&quot; &quot;);
+		    fprintf(fp," ");
 		    if(neighbor-&gt;upperdelaunay)
-			fprintf(fp,&quot; -1 -1 -1 -1 &quot;);
+			fprintf(fp," -1 -1 -1 -1 ");
 		    else
 			qh_printfacetNvertex_simplicial (fp, neighbor, format);
-		    fprintf(fp,&quot;\n&quot;);
+		    fprintf(fp,"\n");
 		}
 	    }
 	}
@@ -1203,10 +1252,10 @@ an API. It currently provides everything needed, but the
 programmer has to do a lot of work. Hopefully someone will write
 C++ wrapper classes or a Python module for Qhull. </p>
 
-</dir><h4><a href="#TOC">»</a><a name="listd">How</a> do I visit the
-Delaunay regions?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="listd">How</a> do I visit the
+Delaunay regions?</h4><blockquote>
 
-<p>Qhull constructs a Delaunay triangulation but lifting the
+<p>Qhull constructs a Delaunay triangulation by lifting the
 input sites to a paraboloid. The Delaunay triangulation
 corresponds to the lower convex hull of the lifted points. To
 visit each facet of the lower convex hull, use: </p>
@@ -1222,8 +1271,8 @@ visit each facet of the lower convex hull, use: </p>
     }
 </pre>
 
-</dir><h4><a href="#TOC">»</a><a name="outside">When</a> is a point
-outside or inside a facet?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="outside">When</a> is a point
+outside or inside a facet?</h4><blockquote>
 
 <p>A point is outside of a facet if it is clearly outside the
 facet's outer plane. The outer plane is defined by an offset
@@ -1264,8 +1313,8 @@ of the furthest point from a facet may be off by qh.DISTround and
 the computation of the current distance to the facet may be off
 by qh.DISTround. </p>
 
-</dir><h4><a href="#TOC">»</a><a name="closest">How</a> do I find the
-facet that is closest to a point?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="closest">How</a> do I find the
+facet that is closest to a point?</h4><blockquote>
 
 <p>Use qh_findbestfacet(). For example, </p>
 
@@ -1290,12 +1339,12 @@ side of a lens-shaped distribution may be closer to a point than
 all of the facet's neighbors. The exhaustive search may be
 skipped for spherical distributions. </p>
 
-<p>Also see, &quot;<a href="#vclosest">How</a> do I find the
+<p>Also see, "<A href="#vclosest">How</A> do I find the
 Delaunay triangle that is closest to a
-point?&quot; </p>
+point?" </p>
 
-</dir><h4><a href="#TOC">»</a><a name="vclosest">How</a> do I find the
-Delaunay triangle or Voronoi region that is closest to a point?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="vclosest">How</a> do I find the
+Delaunay triangle or Voronoi region that is closest to a point?</h4><blockquote>
 
 <p>A Delaunay triangulation subdivides the plane, or in general
 dimension, subdivides space.  Given a point, how do you determine
@@ -1309,9 +1358,9 @@ Lift the point to the paraboloid by summing the squares of the
 coordinates. Use qh_findbestfacet() [poly2.c] to find the closest Delaunay
 triangle. Determine the closest vertex to find the corresponding
 Voronoi region.  Do not use options
-'<a href="qh-optq.htm#Qbb">Qbb</a>', '<a href="qh-optq.htm#QbB">QbB</a>',
-'<a href="qh-optq.htm#Qbk">Qbk:n</a>', or '<a
-href="qh-optq.htm#QBk">QBk:n</a>' since these scale the last
+'<A href="qh-optq.htm#Qbb">Qbb</A>', '<A href="qh-optq.htm#QbB">QbB</A>',
+'<A href="qh-optq.htm#Qbk">Qbk:n</A>', or '<A
+ href="qh-optq.htm#QBk" >QBk:n</A>' since these scale the last
 coordinate.  Optimizations of qh_findbestfacet() should 
 be possible for Delaunay triangulations.</p>
 
@@ -1339,14 +1388,14 @@ user_eg.c. </p>
 closest Delaunay triangle along the convex hull of the input set.
 
 <p>Point location is an active research area in Computational 
-Geometry.  For a practical approach, see Mucke, et al, &quot;Fast randomized
+Geometry.  For a practical approach, see Mucke, et al, "Fast randomized
 point location without preprocessing in two- and
-three-dimensional Delaunay triangulations,&quot; <i>Computational
+three-dimensional Delaunay triangulations," <i>Computational
 Geometry '96</i>, p. 274-283, May 1996.  
 For an introduction to planar point location see [O'Rourke '93].  
-Also see, &quot;<a
-href="#closest">How</a> do I find the facet that is closest to a
-point?&quot; </p>
+Also see, "<A
+ href="#closest" >How</A> do I find the facet that is closest to a
+point?" </p>
 
 <p>To locate the closest Voronoi region, determine the closest
 vertex of the closest Delaunay triangle. </p>
@@ -1368,8 +1417,8 @@ vertex of the closest Delaunay triangle. </p>
        input site is 'bestvertex-&gt;point' */
 </pre>
 
-</dir><h4><a href="#TOC">»</a><a name="vertices">How</a> do I list the
-vertices?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="vertices">How</a> do I list the
+vertices?</h4><blockquote>
 
 <p>To list the vertices (i.e., extreme points) of the convex hull
 use </p>
@@ -1387,8 +1436,8 @@ use </p>
     </pre>
 </blockquote>
 
-</dir><h4><a href="#TOC">»</a><a name="test">How</a> do I test code
-that uses the Qhull library?</h4><dir>
+</blockquote><h4><A href="#TOC">»</A><a name="test">How</a> do I test code
+that uses the Qhull library?</h4><blockquote>
 
 <p>Compare the output from your program with the output from the
 Qhull program. Use option 'T1' or 'T4' to trace what Qhull is
@@ -1398,45 +1447,46 @@ Compare the trace outputs. If you do everything right, the two
 trace outputs should be almost the same. The trace output will
 also guide you to the functions that you need to review. </p>
 
-</dir><h4><a href="#TOC">»</a><a name="orient">When</a> I compute a
+</blockquote><h4><A href="#TOC">»</A><a name="orient">When</a> I compute a
 plane equation from a facet, I sometimes get an outward-pointing
-normal and sometimes an inward-pointing normal</h4><dir>
+normal and sometimes an inward-pointing normal</h4><blockquote>
 
-<p><a>Qhull orients simplicial facets, and prints oriented output
+<p>Qhull orients simplicial facets, and prints oriented output
 for 'i', 'Ft', and other options. The orientation depends on <i>both</i>
-the vertex order and the flag facet-&gt;toporient. </a></p>
+the vertex order and the flag facet-&gt;toporient.</p>
 
-<p><a>Qhull does not orient non-simplicial facets. Instead it
-orients the facet's ridges. These are printed with the 'Ft'
-option. The facet's hyperplane is oriented. <!-- Navigation links --> </a></p>
+<p>Qhull does not orient 
+  non-simplicial facets. Instead it orients the facet's ridges. These are 
+  printed with the 'Qt' and 'Ft' option. The facet's hyperplane is oriented.  </p>
 
-</dir>
-<hr>
+</blockquote>
+<hr><!-- Navigation links -->
 
 <p><a><b>Up:</b> </a><a
-href="http://www.geom.umn.edu/locate/qhull">Home page for Qhull</a><br>
-<b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
-&#149; <a href="qh-opto.htm#output">Output</a> 
-&#149; <a href="qh-optf.htm#format">Formats</a> 
-&#149; <a href="qh-optg.htm#geomview">Geomview</a> 
-&#149; <a href="qh-optp.htm#print">Print</a>
-&#149; <a href="qh-optq.htm#qhull">Qhull</a> 
-&#149; <a href="qh-optc.htm#prec">Precision</a> 
-&#149; <a href="qh-optt.htm#trace">Trace</a> <br>
-<b>To:</b> <a href="#TOC">FAQ: Table of Contents</a><br>
-<!-- GC common information --></p>
+ href="http://www.geom.umn.edu/locate/qhull">Home page for Qhull</a><br>
+<b>Up:</b> <A href="index.htm#TOC">Qhull manual</A>: Table of Contents <br>
+<b>To:</b> <A href="qh-quick.htm#programs">Programs</A>
+&#149; <A href="qh-quick.htm#options">Options</A> 
+&#149; <A href="qh-opto.htm#output">Output</A> 
+&#149; <A href="qh-optf.htm#format">Formats</A> 
+&#149; <A href="qh-optg.htm#geomview">Geomview</A> 
+&#149; <A href="qh-optp.htm#print">Print</A>
+&#149; <A href="qh-optq.htm#qhull">Qhull</A> 
+&#149; <A href="qh-optc.htm#prec">Precision</A> 
+&#149; <A href="qh-optt.htm#trace">Trace</A> <br>
+<b>To:</b> <A href="#TOC">FAQ: Table of Contents</A><br><!-- GC common information -->
 
 <hr>
 
-<p><a href="http://www.geom.umn.edu/"><img src="qh--geom.gif"
-align="middle" width="40" height="40"></a><i>The Geometry Center
+<p><a href="http://www.geom.umn.edu/"><IMG align=middle
+ height=40 src="qh--geom.gif" width=40 ></a><i>The Geometry Center
 Home Page </i></p>
 
 <p>Comments to: <a
-href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
+ href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
-Created: Sept. 25, 1995 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
+Created: 
+Sept. 25, 1995 --- <!-- hhmts start -->Last modified: see top 
+<!-- hhmts end --> </p>
 </body>
 </html>
diff --git a/html/qh-home.htm b/html/qh-home.htm
index 2cf7782..d46bac3 100644
--- a/html/qh-home.htm
+++ b/html/qh-home.htm
@@ -27,6 +27,7 @@ algorithm for computing the convex hull. Qhull handles roundoff
 errors from floating point arithmetic. It computes volumes,
 surface areas, and approximations to the convex hull.</p>
 
+<!-- duplicated in qh-home.htm and html/index.htm -->
 <p>Qhull does <i>not</i> support constrained Delaunay
 triangulations, triangulation of non-convex surfaces, mesh
 generation of non-convex objects, or medium-sized inputs in 9-D
@@ -81,35 +82,37 @@ and higher. </p>
 </ul>
 
 <ul>
+	<li><a href=http://www.boost.org/libs/graph/doc/table_of_contents.html>BGL</a> 
+	Boost Graph Library provides C++ classes for graph data structures
+and algorithms,
     <li><a
         href="http://netlib.bell-labs.com/netlib/voronoi/hull.html">Clarkson's
         hull </a>program with exact arithmetic </li>
     <li><a
         href="http://www.ifor.math.ethz.ch/ifor/staff/fukuda/cdd_home/cdd.html">Fukuda's
         cdd</a> program for halfspace intersection and convex hulls</li>
-    <li><a href="http://www.cs.cmu.edu/~quake/triangle.html">Shewchuk's
-        triangle </a>program for 2-d Delaunay</li>
     <li><a href=http://www.algorithmic-solutions.com/as_html/research/research.html>Leda</a>  
 and CGAL libraries for writing computational
 geometry programs and other combinatorial algorithms
-	<li><a href=http://www.boost.org/libs/graph/doc/table_of_contents.html>BGL</a> 
-	Boost Graph Library provides C++ classes for graph data structures
-and algorithms,
+    <li><a href="http://www.cs.cmu.edu/~quake/triangle.html">Shewchuk's
+        triangle </a>program for 2-d Delaunay</li>
 </ul>
 
 <ul>
     <li><a href="http://www.geom.umn.edu/locate/cglist">Amenta's directory</a> of
         computational geometry software </li>
-    <li><a
-        href="http://www.inria.fr/prisme/personnel/bronnimann/cgt/WWW.html">Bronnimann's
-        Computational</a> Geometry Tribune</li>
 	<li><a href="http://compgeom.cs.uiuc.edu/~jeffe/compgeom/compgeom.html">Erickson's 
 	    Computational</a> Geometry Pages and 
 		<a href="http://compgeom.cs.uiuc.edu/~jeffe/compgeom/code.html">Software</a>
+	<li><a href=http://www.magic-software.com>Magic Software</a> source code for computer
+	graphics, image analysis, and numerical methods
     <li><a href="http://www.andrew.cmu.edu/user/sowen/mesh.html">Owen's Meshing</a> Research Corner
     <li><a
         href="http://www-users.informatik.rwth-aachen.de/~roberts/meshgeneration.html">Schneiders'
         Finite Element</a> Mesh Generation page</li>
+	<li><a href=ftp://ftp.zib.de/pub/Packages/mathprog/index.html>Skorobohatyj's Mathprog@ZIB</a> for  
+	mathematical software
+	<li><a href=http://www.voronoi.com>Voronoi Web Site</a> for all things Voronoi
 </ul>
 
 <ul>
@@ -137,7 +140,8 @@ statistics. The program can be called from within your
 application. </p>
 
 <p>You can view the results in 2-d, 3-d and 4-d with <a
-href="http://www.geomview.org">Geomview</a>. </p>
+href="http://www.geomview.org">Geomview</a>.   An alternative
+is <a href=http://www.kitware.com/vtk.html>VTK</a>.</p>
 
 <p>For an article about Qhull, download <a
 href="ftp://geom.umn.edu/pub/software/qhull-96.ps.Z">qhull-96.ps.Z</a>:
diff --git a/html/qh-impre.htm b/html/qh-impre.htm
index 4d1cb02..2c45998 100644
--- a/html/qh-impre.htm
+++ b/html/qh-impre.htm
@@ -7,12 +7,12 @@
 
 <body>
 <!-- Navigation links -->
-<p><a name=TOP><b>Up:</b></a> <a href="http://www.geom.umn.edu/locate/qhull">Home
+<p><a name="TOP"><b>Up:</b></a> <a href="http://www.geom.umn.edu/locate/qhull">Home
 page</a> for Qhull <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of
 Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -20,8 +20,8 @@ Contents<br>
 &#149; <a href="qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
 &#149; <a href="qh-optt.htm#trace">Trace</a><br>
-<b>To: </b><a href="#TOC">Qhull imprecision: Table of Contents</a>
-(please wait while loading)</p>
+<b>To: </b><a href="#TOC">Qhull imprecision</a>: Table of Contents
+(please wait while loading)
 
 <hr>
 <!-- Main text of document -->
@@ -35,8 +35,9 @@ by coplanar points and why Qhull uses options '<a
 href="qh-optc.htm#C0">C-0</a>' or '<a href="qh-optq.htm#Qx">Qx</a>'
 by default. If you ignore precision issues with option '<a
 href="qh-optq.htm#Q0">Q0</a>', the output from Qhull can be
-arbitrarily bad. If you joggle the input with option '<a
-href="qh-optq.htm#QJn">QJ</a>', Qhull avoids precision problems. </p>
+arbitrarily bad. Qhull avoids precision problems if you merge facets (the default) or joggle
+the input ('<a
+href="qh-optq.htm#QJn">QJ</a>'). </p>
 
 <p>Use option '<a href="qh-optt.htm#Tv">Tv</a>' to verify the
 output from Qhull. It verifies that adjacent facets are clearly
@@ -45,7 +46,7 @@ convex. It verifies that all points are on or below all facets. </p>
 <p>Qhull automatically tests for convexity if it detects
 precision errors while constructing the hull. </p>
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -55,11 +56,12 @@ imprecision: Table of Contents </a></h2>
 <ul>
     <li><a href="#prec">Precision problems</a></li>
     <li><a href="#joggle">Joggled input or merged facets</a></li>
-    <li><a href="#limit">Limitations of merged facets</a></li>
-    <li><a href="#exact">Exact arithmetic</a></li>
     <li><a href="#delaunay">Delaunay triangulations</a></li>
-    <li><a href="#imprecise">Imprecise convex hulls</a></li>
+    <li><a href="#imprecise">Merged facets</a></li>
     <li><a href="#how">How Qhull merges facets</a></li>
+    <li><a href="#limit">Limitations of merged facets</a></li>
+    <li><a href="#injoggle">Joggled input</a></li>
+    <li><a href="#exact">Exact arithmetic</a></li>
     <li><a href="#approximate">Approximating a convex hull</a></li>
 </ul>
 
@@ -68,10 +70,10 @@ imprecision: Table of Contents </a></h2>
 <h2><a href="#TOC">»</a><a name="prec">Precision problems</a></h2>
 
 <p>Since Qhull uses floating point arithmetic, roundoff error
-occurs with each calculation. This causes problems for most
+occurs with each calculation. This causes problems for 
 geometric algorithms. Other floating point codes for convex
 hulls, Delaunay triangulations, and Voronoi diagrams also suffer
-from these problems. </p>
+from these problems.  Qhull handles most of them.</p>
 
 <p>There are several kinds of precision errors:</p>
 
@@ -106,16 +108,23 @@ set of vertices.</p>
 machine round-off. Option '<a href="qh-optc.htm#C0">C-0</a>' or '<a
 href="qh-optq.htm#Qx">Qx</a>' is set by default. In 5-d and
 higher, the output is clearly convex but an input point could be
-outside of the hull. This is corrected by using option '<a
+outside of the hull. This may be corrected by using option '<a
 href="qh-optc.htm#C0">C-0</a>', but then the output may contain
 wide facets.</p>
 
 <p>Qhull 2.5 and later provides option '<a href="qh-optq.htm#QJn">QJ</a>'
-to joggle the input. Each input coordinate is modified by a
+to joggled input. Each input coordinate is modified by a
 small, random quantity. If a precision error occurs, a larger
 modification is tried. When no precision errors occur, Qhull is
 done. </p>
 
+<p>Qhull 3.1 and later provides option '<a href="qh-optq.htm#Qt">Qt</a>'
+for triangulated output.  This removes the need for 
+joggled input ('<a href="qh-optq.htm#QJn">QJ</a>').  
+Non-simplicial facets are triangulated.
+The facets may have zero area.
+Triangulated output is particularly useful for Delaunay triangulations.</p>
+
 <p>By handling round-off errors, Qhull can provide a variety of
 output formats. For example, it can return the halfspace that
 defines each facet ('<a href="qh-opto.htm#n">n</a>'). The
@@ -141,13 +150,368 @@ facets</a></h2>
 <p>This section discusses the choice between joggled input and
 merged facets. By default, Qhull uses merged facets to handle
 precision problems. With option '<a href="qh-optq.htm#QJn">QJ</a>',
-the input is joggled. Use joggle when you need simplicial output
-(e.g., triangles for a Delaunay triangulation). Use merged facets
-when you want non-simplicial output (e.g., the faces of a cube). </p>
+the input is joggled. See <a href="qh-eg.htm#joggle">examples</a>
+of joggled input and triangulated output.
+<ul>
+<li>Use merged facets (the default)
+when you want non-simplicial output (e.g., the faces of a cube). 
+<li>Use merged facets and triangulated output ('<a href="qh-optq.htm#Qt">Qt</a>') when
+you want simplicial output and coplanar facets (e.g., triangles for a Delaunay triangulation).
+<li>Use joggled input ('<a href="qh-optq.htm#QJn">QJ</a>') when you need clearly-convex, 
+simplicial output
+(e.g., triangles for a Delaunay triangulation). 
+</ul>
+
+<p>The choice between joggled input and merged facets depends on
+the application. Both run about the same speed. Joggled input may
+be faster if the initial joggle is sufficiently large to avoid
+precision errors.  Most applications should used merged facets
+with triangulated output.</p>
+
+<p>Use merged facets (the
+default, '<a href="qh-optc.htm#C0">C-0</a>') 
+or triangulated output ('<a href="qh-optq.htm#Qt">Qt</a>') if </p>
+
+<ul>
+    <li>Your application supports non-simplicial facets, or
+    it allows degenerate, simplicial facets (option '<a href="qh-optq.htm#Qt">Qt</a>'). </li>
+    <li>You do not want the input modified. </li>
+    <li>You want to set additional options for approximating the
+        hull. </li>
+    <li>You use single precision arithmetic (<a href="../src/user.h#realT">realT</a>).
+    </li>
+</ul>
+
+<p>Use joggled input ('<a href="qh-optq.htm#QJn">QJ</a>') if </p>
+
+<ul>
+    <li>Your application needs clearly convex, simplicial output</li>
+    <li>Your application supports perturbed input points and narrow triangles.</li>
+    <li>Seven significant digits is sufficient accuracy. </li>
+</ul>
+
+<p>You may use both techniques or combine joggle with
+post-merging ('<a href="qh-optc.htm#Cn2">Cn</a>'). </p>
+
+<p>Other researchers have used techniques similar to joggled
+input. Sullivan and Beichel [ref?] randomly perturb the input
+before computing the Delaunay triangulation. Corkum and Wyllie
+[news://comp.graphics, 1990] randomly rotate a polytope before
+testing point inclusion. Edelsbrunner and Mucke [Symp. Comp.
+Geo., 1988] and Yap [J. Comp. Sys. Sci., 1990] symbolically
+perturb the input to remove singularities. </p>
+
+<p>Merged facets ('<a href="qh-optc.htm#C0">C-0</a>') handles
+precision problems directly. If a precision problem occurs, Qhull
+merges one of the offending facets into one of its neighbors.
+Since all precision problems in Qhull are associated with one or
+more facets, Qhull will either fix the problem or attempt to merge the
+last remaining facets. </p>
+
+<h2><a href="#TOC">»</a><a name="delaunay">Delaunay
+triangulations </a></h2>
+
+<p>Programs that use Delaunay triangulations traditionally assume
+a triangulated input. By default, <a href=qdelaun.htm>qdelaunay</a>
+merges regions with cocircular or cospherical input sites.
+If you want a simplicial triangulation
+use triangulated output ('<a href="qh-optq.htm#Qt">Qt</a>') or joggled
+input ('<a href="qh-optq.htm#QJn">QJ</a>'). 
+
+<p>For Delaunay triangulations, triangulated
+output should produce good results.  All points are within roundoff error of
+a paraboloid.  If two points are nearly incident, one will be a
+coplanar point.  So all points are clearly separated and convex.  
+If qhull reports deleted vertices, the triangulation
+may contain serious precision faults.  Deleted vertices are reported
+in the summary ('<a href="qh-opto.htm#s">s</a>', '<a href="qh-optf.htm#Fs">Fs</a>'</p>
+
+<p>You should use option '<a href="qh-optq.htm#Qbb">Qbb</a>' with Delaunay
+triangulations. It scales the last coordinate and may reduce
+roundoff error. It is automatically set for <a href=qdelaun.htm>qdelaunay</a>, 
+<a href=qvoronoi.htm>qvoronoi</a>, and option '<a
+href="qh-optq.htm#QJn">QJ</a>'.</p>
+
+<h2><a href="#TOC">»</a><a name="imprecise">Merged facets </a></h2>
+
+<p>Qhull detects precision
+problems when computing distances. A precision problem occurs if
+the distance computation is less than the maximum roundoff error.
+Qhull treats the result of a hyperplane computation as if it
+were exact.</p>
+
+<p>Qhull handles precision problems by merging non-convex facets.
+The result of merging two facets is a thick facet defined by an <i>inner
+plane</i> and an <i>outer plane</i>. The inner and outer planes
+are offsets from the facet's hyperplane. The inner plane is
+clearly below the facet's vertices. At the end of Qhull, the
+outer planes are clearly above all input points. Any exact convex
+hull must lie between the inner and outer planes.</p>
+
+<p>Qhull tests for convexity by computing a point for each facet.
+This point is called the facet's <i>centrum</i>. It is the
+arithmetic center of the facet's vertices projected to the
+facet's hyperplane. For simplicial facets with <em>d</em>
+vertices, the centrum is equivalent to the centroid or center of
+gravity. </p>
+
+<p>Two neighboring facets are convex if each centrum is clearly
+below the other hyperplane. The '<a href="qh-optc.htm#Cn2">Cn</a>'
+or '<a href="qh-optc.htm#Cn">C-n</a>' options sets the centrum's
+radius to <i>n </i>. A centrum is clearly below a hyperplane if
+the computed distance from the centrum to the hyperplane is
+greater than the centrum's radius plus two maximum roundoff
+errors. Two are required because the centrum can be the maximum
+roundoff error above its hyperplane and the distance computation
+can be high by the maximum roundoff error.</p>
+
+<p>With the '<a href="qh-optc.htm#Cn">C-n</a>' or '<a
+href="qh-optc.htm#An">A-n </a>' options, Qhull merges non-convex
+facets while constructing the hull. The remaining facets are
+clearly convex. With the '<a href="qh-optq.htm#Qx">Qx </a>'
+option, Qhull merges coplanar facets after constructing the hull.
+While constructing the hull, it merges coplanar horizon facets,
+flipped facets, concave facets and duplicated ridges. With '<a
+href="qh-optq.htm#Qx">Qx</a>', coplanar points may be missed, but
+it appears to be unlikely.</p>
+
+<p>If the user sets the '<a href="qh-optc.htm#An2">An</a>' or '<a
+href="qh-optc.htm#An">A-n</a>' option, then all neighboring
+facets are clearly convex and the maximum (exact) cosine of an
+angle is <i>n</i>.</p>
+
+<p>If '<a href="qh-optc.htm#C0">C-0</a>' or '<a
+href="qh-optq.htm#Qx">Qx</a>' is used without other precision
+options (default), Qhull tests vertices instead of centrums for
+adjacent simplices. In 3-d, if simplex <i>abc</i> is adjacent to
+simplex <i>bcd</i>, Qhull tests that vertex <i>a</i> is clearly
+below simplex <i>bcd </i>, and vertex <i>d</i> is clearly below
+simplex <i>abc</i>. When building the hull, Qhull tests vertices
+if the horizon is simplicial and no merges occur. </p>
+
+<h2><a href="#TOC">»</a><a name="how">How Qhull merges facets</a></h2>
+
+<p>If two facets are not clearly convex, then Qhull removes one
+or the other facet by merging the facet into a neighbor. It
+selects the merge which minimizes the distance from the
+neighboring hyperplane to the facet's vertices. Qhull also
+performs merges when a facet has fewer than <i>d</i> neighbors (called a
+degenerate facet), when a facet's vertices are included in a
+neighboring facet's vertices (called a redundant facet), when a
+facet's orientation is flipped, or when a ridge occurs between
+more than two facets.</p>
+
+<p>Qhull performs merges in a series of passes sorted by merge
+angle. Each pass merges those facets which haven't already been
+merged in that pass. After a pass, Qhull checks for redundant
+vertices. For example, if a vertex has only two neighbors in 3-d,
+the vertex is redundant and Qhull merges it into an adjacent
+vertex.</p>
+
+<p>Merging two simplicial facets creates a non-simplicial facet
+of <em>d+1</em> vertices. Additional merges create larger facets.
+When merging facet A into facet B, Qhull retains facet B's
+hyperplane. It merges the vertices, neighbors, and ridges of both
+facets. It recomputes the centrum if a wide merge has not
+occurred (qh_WIDEcoplanar) and the number of extra vertices is
+smaller than a constant (qh_MAXnewcentrum).</p>
+
+
+<h2><a href="#TOC">»</a><a name="limit">Limitations of merged
+facets</a></h2>
+
+<ul>
+<li><b>Uneven dimensions</b> --
+If one coordinate has a larger absolute value than other
+coordinates, it may dominate the effect of roundoff errors on
+distance computations. You may use option '<a
+href="qh-optq.htm#QbB">QbB</a>' to scale points to the unit cube.
+For Delaunay triangulations and Voronoi diagrams, <a href=qdelaun.htm>qdelaunay</a>
+and <a href=qvoronoi.htm>qvoronoi</a> always set
+option '<a href="qh-optq.htm#Qbb">Qbb</a>'.  It scales the last
+coordinate to [0,m] where <i>m</i> is the maximum width of the
+other coordinates.  Option '<a href="qh-optq.htm#Qbb">Qbb</a>' is
+needed for Delaunay triangulations of integer coordinates
+and nearly cocircular points.
+
+<p>For example, compare
+<pre>
+	rbox 1000 W0 t | qconvex Qb2:-1e-14B2:1e-14
+</pre>
+with
+<pre>
+	rbox 1000 W0 t | qconvex
+</pre>
+The distributions are the same but the first is compressed to a 2e-14 slab.
+<p>
+<li><b>Post-merging of coplanar facets</b> -- In 5-d and higher, option '<a href="qh-optq.htm#Qx">Qx</a>'
+(default) delays merging of coplanar facets until post-merging.
+This may allow &quot;dents&quot; to occur in the intermediate
+convex hulls. A point may be poorly partitioned and force a poor
+approximation. See option '<a href="qh-optq.htm#Qx">Qx</a>' for
+further discussion.</p>
+
+<p>This is difficult to produce in 5-d and higher.  Option '<a href="qh-optq.htm#Q6">Q6</a>' turns off merging of concave
+facets.  This is similar to 'Qx'.  It may lead to serious precision errors,
+for example,
+<pre>
+	rbox 10000 W1e-13  | qhull Q6  Tv
+</pre>
+
+<p>
+<li><b>Maximum facet width</b> --
+Qhull reports the maximum outer plane and inner planes (if
+more than roundoff error apart). There is no upper bound
+for either figure. This is an area for further research. Qhull
+does a good job of post-merging in all dimensions. Qhull does a
+good job of pre-merging in 2-d, 3-d, and 4-d. With the '<a
+href="qh-optq.htm#Qx">Qx</a>' option, it does a good job in
+higher dimensions. In 5-d and higher, Qhull does poorly at
+detecting redundant vertices. </p>
+
+<p>In the summary ('<a href="qh-opto.htm#s">s</a>'), look at the
+ratio between the maximum facet width and the maximum width of a
+single merge, e.g., &quot;(3.4x)&quot;. Qhull usually reports a
+ratio of four or lower in 3-d and six or lower in 4-d. If it
+reports a ratio greater than 10, this may indicate an
+implementation error.  Narrow distributions (see following) may
+produce wide facets.
+
+<p>For example, if special processing for narrow distributions is
+turned off ('<a href="qh-optq.htm#Q10">Q10</a>'), qhull may produce
+a wide facet:</p>
+<pre>
+	 RBOX 1000 L100000 s G1e-16 t1002074964 | QHULL Tv Q10
+</pre>
+
+<p>
+<li><b>Narrow distribution</b> -- In 3-d, a narrow distribution may result in a poor
+approximation. For example, if you do not use qdelaunay nor option 
+'<a href="qh-optq.htm#Qbb">Qbb</a>', the furthest-site
+Delaunay triangulation of nearly cocircular points may produce a poor
+approximation:
+<pre>
+	 RBOX s 5000 W1e-13 D2 t1002151341 | QHULL d Qt
+	 RBOX 1000 s W1e-13 t1002231672 | QHULL d Tv
+</pre>
+
+<p>During
+construction of the hull, a point may be above two
+facets with opposite orientations that span the input
+set.  Even though the point may be nearly coplanar with both
+facets, and can be distant from the precise convex
+hull of the input sites.  Additional facets leave the point distant from
+a facet.  To fix this problem, add option '<a href="qh-optq.htm#Qbb">Qbb</a>'
+(it scales the last coordinate).  Option '<a href="qh-optq.htm#Qbb">Qbb</a>'
+is automatically set for <a href=qdelaun.htm>qdelaunay</a> and <a href=qvoronoi.htm>qvoronoi</a>.
+
+<p>Qhull generates a warning if the initial simplex is narrow.
+For narrow distributions, Qhull changes how it processes coplanar
+points -- it does not make a point coplanar until the hull is
+finished.  
+Use option '<a href="qh-optq.htm#Q10">Q10</a>' to try Qhull without
+special processing for narrow distributions.
+For example, special processing is needed for:
+<pre>
+	 RBOX 1000 L100000 s G1e-16 t1002074964 | QHULL Tv Q10
+</pre>
+
+<p>You may turn off the warning message by reducing
+qh_WARNnarrow in <tt>user.h</tt> or by setting option 
+'<a href="qh-optp.htm#Pp">Pp</a>'. </p>
+
+<p>Similar problems occur for distributions with a large flat facet surrounded
+with many small facet at a sharp angle to the large facet.  
+Qhull 3.1 fixes most of these problems, but a poor approximation can occur.
+A point may be left outside of the convex hull ('<a href="qh-optt.htm#Tv">Tv</a>').
+Examples include
+the furthest-site Delaunay triangulation of nearly cocircular points plus the origin, and the convex hull of a cone of nearly cocircular points. The width of the band is 10^-13.
+<pre>
+	rbox s 1000 W1e-13 P0 D2 t996799242 | qhull d Tv
+	rbox 1000 s Z1 G1e-13 t1002152123 | qhull Tv
+	RBOX 1000 s Z1 G1e-13 t1002231668 | QHULL Tv
+</pre>
+
+<p>
+<li><b>Quadratic running time</b> -- If the output contains large, non-simplicial
+facets, the running time for Qhull may be quadratic in the size of the triangulated
+output.   For example, <tt>RBOX 1000 s W1e-13 c G2 | QHULL d</tt> is 4 times 
+faster for 500 points.  The convex hull contains two large nearly spherical facets and
+many nearly coplanar facets.  Each new point retriangulates the spherical facet and repartitions the remaining points into all of the nearly coplanar facets.
+In this case, quadratic running time is avoided if you use qdelaunay, 
+add option '<a href="qh-optq.htm#Qbb">Qbb</a>',
+or add the origin ('P0') to the input.
+<p>
+<li><b>Facet with zero-area</b> --
+It is possible for a zero-area facet to be convex with its
+neighbors. This can occur if the hyperplanes of neighboring
+facets are above the facet's centrum, and the facet's hyperplane
+is above the neighboring centrums. Qhull computes the facet's
+hyperplane so that it passes through the facet's vertices. The
+vertices can be collinear. </p>
+
+<p>
+<li><b>No more facets</b> -- Qhull reports an error if there are <em>d+1</em> facets left
+and two of the facets are not clearly convex. This typically
+occurs when the convexity constraints are too strong or the input
+points are degenerate. The former is more likely in 5-d and
+higher -- especially with option '<a href="qh-optc.htm#Cn">C-n</a>'.</p>
+
+<p>
+<li><b>Deleted cone</b> -- Lots of merging can end up deleting all
+of the new facets for a point.  This is a rare event that has
+only been seen while debugging the code.
+
+<p>
+<li><b>Triangulated output leads to precision problems</b> -- With sufficient
+merging, the ridges of a non-simplicial facet may have serious topological
+and geometric problems.  A ridge may be between more than two 
+neighboring facets.  If so, their triangulation ('<a href="qh-optq.htm#Qt">Qt</a>')
+will fail since two facets have the same vertex set.  Furthermore,
+a triangulated facet may have flipped orientation compared to its
+neighbors.</li>
+
+<p>The triangulation process detects degenerate facets with
+only two neighbors.  These are marked degenerate.  They have
+zero area.
+
+<p>
+<li><b>Coplanar points</b> --
+Option '<a href="qh-optq.htm#Qc">Qc</a>' is determined by
+qh_check_maxout() after constructing the hull. Qhull needs to
+retain all possible coplanar points in the facets' coplanar sets.
+This depends on qh_RATIOnearInside in <tt>user.h.</tt>
+Furthermore, the cutoff for a coplanar point is arbitrarily set
+at the minimum vertex. If coplanar points are important to your
+application, remove the interior points by hand (set '<a
+href="qh-optq.htm#Qc">Qc</a> <a href="qh-optq.htm#Qi">Qi</a>') or
+make qh_RATIOnearInside sufficiently large.</p>
+
+<p>
+<li><b>Maximum roundoff error</b> -- Qhull computes the maximum roundoff error from the maximum
+coordinates of the point set. Usually the maximum roundoff error
+is a reasonable choice for all distance computations. The maximum
+roundoff error could be computed separately for each point or for
+each distance computation. This is expensive and it conflicts
+with option '<a href="qh-optc.htm#Cn">C-n</a>'.
+
+<p>
+<li><b>All flipped or upper Delaunay</b> -- When a lot of merging occurs for 
+Delaunay triangulations, a new point may lead to no good facets.  For example,
+try a strong convexity constraint:
+<pre>
+	rbox 1000 s t993602376 | qdelaunay C-1e-3
+</pre>
+
+</ul>
+
+<h2><a href="#TOC">»</a><a name="injoggle">Joggled input</a></h2>
 
 <p>Joggled input is a simple work-around for precision problems
 in computational geometry [&quot;joggle: to shake or jar
-slightly,&quot; Amer. Heritage Dictionary]. Qhull joggles the
+slightly,&quot; Amer. Heritage Dictionary].  Other names are
+<i>jostled input</i> or <i>random perturbation</i>.  
+Qhull joggles the
 input by modifying each coordinate by a small random quantity. If
 a precision problem occurs, Qhull joggles the input with a larger
 quantity and the algorithm is restarted. This process continues
@@ -155,14 +519,7 @@ until no precision problems occur. Unless all inputs incur
 precision problems, Qhull will terminate. Qhull adjusts the inner
 and outer planes to account for the joggled input. </p>
 
-<p>Merged facets ('<a href="qh-optc.htm#C0">C-0</a>') handles
-precision problems directly. If a precision problem occurs, Qhull
-merges one of the offending facets into one of its neighbors.
-Since all precision problems in Qhull are associated with one or
-more facets, Qhull will either terminate or attempt to merge the
-last remaining facets. </p>
-
-<p>Neither method has an upper bound for the width of the output
+<p>Neither joggle nor merged facets has an upper bound for the width of the output
 facets, but both methods work well in practice. Joggled input is
 easier to justify. Precision errors occur when the points are
 nearly singular. For example, four points may be coplanar or
@@ -177,9 +534,9 @@ joggle will halve the probability of a precision error. </p>
 
 <p>With actual data, an analysis would need to account for each
 point changing independently and other computations. It is easier
-to determine the probabilities empirically. For example, consider
+to determine the probabilities empirically ('<a href="qh-optt.htm#TRn">TRn</a>') . For example, consider
 computing the convex hull of the unit cube centered on the
-origin. The arithmetic has 16 significant, decimal digits. </p>
+origin. The arithmetic has 16 significant decimal digits. </p>
 
 <blockquote>
     <p><b>Convex hull of unit cube</b> </p>
@@ -320,135 +677,6 @@ distance computation. This is about 2,000 times better than
 joggled input. Most applications though will not notice the
 difference. </p>
 
-<p>The choice between joggled input and merged facets depends on
-the application. Both run about the same speed. Joggled input may
-be faster if the initial joggle is sufficiently large to avoid
-precision errors. </p>
-
-<p>Use joggled input ('<a href="qh-optq.htm#QJn">QJ</a>') if </p>
-
-<ul>
-    <li>Your application needs simplicial output (e.g., Delaunay
-        triangulations). </li>
-    <li>Seven significant digits is sufficient accuracy. </li>
-</ul>
-
-<p>Use merged facets ('<a href="qh-optc.htm#C0">C-0</a>', the
-default) if </p>
-
-<ul>
-    <li>Your application supports non-simplicial facets. </li>
-    <li>You do not want the input modified. </li>
-    <li>You want to set additional options for approximating the
-        hull. </li>
-    <li>You use single precision numbers (<a href="user.h#realT">realT</a>).
-    </li>
-</ul>
-
-<p>You may use both techniques or combine joggle with
-post-merging ('<a href="qh-optc.htm#Cn2">Cn</a>'). </p>
-
-<p>Other researchers have used techniques similar to joggled
-input. Sullivan and Beichel [ref?] randomly perturb the input
-before computing the Delaunay triangulation. Corkum and Wyllie
-[news://comp.graphics, 1990] randomly rotate a polytope before
-testing point inclusion. Edelsbrunner and Mucke [Symp. Comp.
-Geo., 1988] and Yap [J. Comp. Sys. Sci., 1990] symbolically
-perturb the input to remove singularities. </p>
-
-<h2><a href="#TOC">»</a><a name="limit">Limitations of merged
-facets</a></h2>
-
-<p>If one coordinate has a larger absolute value than other
-coordinates, it may dominate the effect of roundoff errors on
-distance computations. You may use option '<a
-href="qh-optq.htm#QbB">QbB</a>' to scale points to the unit cube.
-For Delaunay triangulations and Voronoi diagrams, you may use
-option '<a href="qh-optq.htm#Qbb">Qbb</a>' to scale the last
-coordinate to [0,m] where <i>m</i> is the maximum width of the
-other coordinates. Option '<a href="qh-optq.htm#Qbb">Qbb</a>' is
-recommended for Delaunay triangulations of integer coordinates
-and <a href=qdelaun.htm>Delaunay triangulations</a> of
-nearly cocircular points. The programs 
-<a href=qdelaun.htm>qdelaunay</a>
-and <a href=qvoronoi.htm>qvoronoi</a> always set '<a href="qh-optq.htm#Qbb">Qbb</a>'.</p>
-
-<p>Qhull computes the maximum roundoff error from the maximum
-coordinates of the point set. Usually the maximum roundoff error
-is a reasonable choice for all distance computations. The maximum
-roundoff error could be computed separately for each point or for
-each distance computation. This is expensive and it conflicts
-with option '<a href="qh-optc.htm#Cn">C-n</a>'. </p>
-
-<p>In 5-d and higher, option '<a href="qh-optq.htm#Qx">Qx</a>'
-(default) delays merging of coplanar facets until post-merging.
-This may allow &quot;dents&quot; to occur in the intermediate
-convex hulls. A point may be poorly partitioned and force a poor
-approximation. See option '<a href="qh-optq.htm#Qx">Qx</a>' for
-further discussion.</p>
-
-<p>Option '<a href="qh-optq.htm#Qc">Qc</a>' is determined by
-qh_check_maxout() after constructing the hull. Qhull needs to
-retain all possible coplanar points in the facets' coplanar sets.
-This depends on qh_RATIOnearInside in <tt>user.h.</tt>
-Furthermore, the cutoff for a coplanar point is arbitrarily set
-at the minimum vertex. If coplanar points are important to your
-application, remove the interior points by hand (set '<a
-href="qh-optq.htm#Qc">Qc</a> <a href="qh-optq.htm#Qi">Qi</a>') or
-make qh_RATIOnearInside sufficiently large.</p>
-
-<p>In 3-d, a narrow distribution may result in a poor
-approximation. For example, <tt>rbox s 5000 W1e-13 D2 | qhull d
-Qu</tt> produces a poor approximation. This is the furthest-site
-Delaunay triangulation of nearly cocircular points. During
-construction of the hull, a coplanar point is just above two
-facets with opposite orientations. These facets span the input
-set and the coplanar point is distant from the precise convex
-hull. One of the facets is replaced with a facet of the opposite
-orientation. This places the coplanar point clearly above the new
-facet. To fix this problem, add option '<a href="qh-optq.htm#Qbb">Qbb</a>'
-(it scales the last coordinate).  Option '<a href="qh-optq.htm#Qbb">Qbb</a>'
-is automatically set for <a href=qdelaun.htm>qdelaunay</a> and <a href=qvoronoi.htm>qvoronoi</a>.
-
-<p>Qhull generates a warning if the initial simplex is narrow.
-For narrow distributions, Qhull changes how it processes coplanar
-points -- it does not make a point coplanar until the hull is
-finished. If a precision problem occurs under facet merging,
-Qhull will report a wide facet (i.e., a large maximum distance
-for a point above a facet). This is unlikely for most
-distributions. You may turn off the warning message by reducing
-qh_WARNnarrow in <tt>user.h</tt> or by setting option 
-'<a href="qh-optp.htm#Pp">Pp</a>'. </p>
-
-<p>Qhull reports an error if there are <em>d+1</em> facets left
-and two of the facets are not clearly convex. This typically
-occurs when the convexity constraints are too strong or the input
-points are degenerate. The former is more likely in 5-d and
-higher -- especially with option '<a href="qh-optc.htm#Cn">C-n</a>'.</p>
-
-<p>Qhull reports the maximum outer plane and inner planes (if
-more than roundoff error apart). We do not know an upper bound
-for either figure. This is an area for further research. Qhull
-does a good job of post-merging in all dimensions. Qhull does a
-good job of pre-merging in 2-d, 3-d, and 4-d. With the '<a
-href="qh-optq.htm#Qx">Qx</a>' option, it does a good job in
-higher dimensions. In 5-d and higher, Qhull does poorly at
-detecting redundant vertices. </p>
-
-<p>In the summary ('<a href="qh-opto.htm#s">s</a>'), look at the
-ratio between the maximum facet width and the maximum width of a
-single merge, e.g., &quot;(3.4x)&quot;. Qhull usually reports a
-ratio of four or lower in 3-d and six or lower in 4-d. If it
-reports a ratio greater than 10, this probably indicates an
-implementation error. </p>
-
-<p>It is possible for a zero-area facet to be convex with its
-neighbors. This can occur if the hyperplanes of neighboring
-facets are above the facet's centrum, and the facet's hyperplane
-is above the neighboring centrums. Qhull computes the facet's
-hyperplane so that it passes through the facet's vertices. The
-vertices can be collinear. </p>
-
 <h2><a href="#TOC">»</a><a name="exact">Exact arithmetic</a></h2>
 
 <p>Exact arithmetic may be used instead of floating point.
@@ -457,8 +685,7 @@ directly or the input can be symbolically perturbed. Using exact
 arithmetic is slower than using floating point arithmetic and the
 output may take more space. Chaining a sequence of operations
 increases the time and space required. Some operations are
-difficult to do; for example, computing the hyperplane through <i>d</i>
-points.</p>
+difficult to do.</p>
 
 <p>Clarkson's <a
 href="http://netlib.bell-labs.com/netlib/voronoi/hull.html">hull
@@ -471,116 +698,6 @@ This reduces the number of nearly singular computations. When a
 determinant is nearly singular, he uses exact arithmetic to
 compute a precise result.</p>
 
-<h2><a href="#TOC">»</a><a name="delaunay">Delaunay
-triangulations </a></h2>
-
-<p>Programs that use Delaunay triangulations traditionally assume
-a triangulated input. By default, <a href=qdelaun.htm>qdelaunay</a>
-merges regions with cocircular or cospherical input sites.
-If you want triangulated output from Qhull
-use the joggle option '<a href="qh-optq.htm#QJn">QJ</a>'. 
-
-<p>Option '<a href="qh-optf.htm#Ft">Ft</a>' adds points to
-triangulate non-simplicial facets. The points are the facets'
-centrums. Except for large facets, the centrum is the arithmetic
-average of the vertices projected to the facet's hyperplane. The
-triangles are not clearly convex with their neighbors. Some
-triangles may have flipped orientation.</p>
-
-<p>Try option '<a href="qh-optq.htm#Qbb">Qbb</a>' with Delaunay
-triangulations. It scales the last coordinate and may reduce
-roundoff error. It is automatically set for option '<a
-href="qh-optq.htm#QJn">QJ</a>', <a href=qdelaun.htm>qdelaunay</a>, 
-and <a href=qvoronoi.htm>qvoronoi</a>.</p>
-
-<h2><a href="#TOC">»</a><a name="imprecise">Imprecise convex
-hulls </a></h2>
-
-<p>Qhull computes the distance from a point to a hyperplane and
-the hyperplane through <i>d+1</i> points. Qhull detects precision
-problems when computing distances. A precision problem occurs if
-the distance computation is less than the maximum roundoff error.
-Qhull treats the result of a hyperplane computation as an exact
-result and allows the corresponding points to be near the
-hyperplane. Precision problems do not occur for hyperplane
-computations. </p>
-
-<p>Qhull handles precision problems by merging non-convex facets.
-The result of merging two facets is a thick facet defined by an <i>inner
-plane</i> and an <i>outer plane</i>. The inner and outer planes
-are offsets from the facet's hyperplane. The inner plane is
-clearly below the facet's vertices. At the end of Qhull, the
-outer planes are clearly above all input points. Any exact convex
-hull must lie between the inner and outer planes.</p>
-
-<p>Qhull tests for convexity by computing a point for each facet.
-This point is called the facet's <i>centrum</i>. It is the
-arithmetic center of the facet's vertices projected to the
-facet's hyperplane. For simplicial facets with <em>d</em>
-vertices, the centrum is equivalent to the centroid or center of
-gravity. </p>
-
-<p>Two neighboring facets are convex if each centrum is clearly
-below the other hyperplane. The '<a href="qh-optc.htm#Cn2">Cn</a>'
-or '<a href="qh-optc.htm#Cn">C-n</a>' options sets the centrum's
-radius to <i>n </i>. A centrum is clearly below a hyperplane if
-the computed distance from the centrum to the hyperplane is
-greater than the centrum's radius plus two maximum roundoff
-errors. Two are required because the centrum can be the maximum
-roundoff error above its hyperplane and the distance computation
-can be high by the maximum roundoff error.</p>
-
-<p>With the '<a href="qh-optc.htm#Cn">C-n</a>' or '<a
-href="qh-optc.htm#An">A-n </a>' options, Qhull merges non-convex
-facets while constructing the hull. The remaining facets are
-clearly convex. With the '<a href="qh-optq.htm#Qx">Qx </a>'
-option, Qhull merges coplanar facets after constructing the hull.
-While constructing the hull, it merges coplanar horizon facets,
-flipped facets, concave facets and duplicated ridges. With '<a
-href="qh-optq.htm#Qx">Qx</a>', coplanar points may be missed, but
-it appears to be unlikely.</p>
-
-<p>If the user sets the '<a href="qh-optc.htm#An2">An</a>' or '<a
-href="qh-optc.htm#An">A-n</a>' option, then all neighboring
-facets are clearly convex and the maximum (exact) cosine of an
-angle is <i>n</i>.</p>
-
-<p>If '<a href="qh-optc.htm#C0">C-0</a>' or '<a
-href="qh-optq.htm#Qx">Qx</a>' is used without other precision
-options (default), Qhull tests vertices instead of centrums for
-adjacent simplicies. In 3-d, if simplex <i>abc</i> is adjacent to
-simplex <i>bcd</i>, Qhull tests that vertex <i>a</i> is clearly
-below simplex <i>bcd </i>, and vertex <i>d</i> is clearly below
-simplex <i>abc</i>. When building the hull, Qhull tests vertices
-if the horizon is simplicial and no merges occur. </p>
-
-<h2><a href="#TOC">»</a><a name="how">How Qhull merges facets</a></h2>
-
-<p>If two facets are not clearly convex, then Qhull removes one
-or the other facet by merging the facet into a neighbor. It
-selects the merge which minimizes the distance from the
-neighboring hyperplane to the facet's vertices. Qhull also
-performs merges when a facet has fewer than d neighbors (called a
-degenerate facet), when a facet's vertices are included in a
-neighboring facet's vertices (called a redundant facet), when a
-facet's orientation is flipped, or when a ridge occurs between
-more than two facets.</p>
-
-<p>Qhull performs merges in a series of passes sorted by merge
-angle. Each pass merges those facets which haven't already been
-merged in that pass. After a pass, Qhull checks for redundant
-vertices. For example, if a vertex has only two neighbors in 3-d,
-the vertex is redundant and Qhull merges it into an adjacent
-vertex.</p>
-
-<p>Merging two simplicial facets creates a non-simplicial facet
-of <em>d+1</em> vertices. Additional merges create larger facets.
-When merging facet A into facet B, Qhull retains facet B's
-hyperplane. It merges the vertices, neighbors, and ridges of both
-facets. It recomputes the centrum if a wide merge has not
-occurred (qh_WIDEcoplanar) and the number of extra vertices is
-smaller than a constant (qh_MAXnewcentrum).</p>
-
 <h2><a href="#TOC">»</a><a name="approximate">Approximating a
 convex hull</a></h2>
 
@@ -619,7 +736,7 @@ page</a> for Qhull <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of
 Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -628,7 +745,7 @@ Contents<br>
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
 &#149; <a href="qh-optt.htm#trace">Trace</a><br>
 <b>To:</b> <a href="#TOC">Qhull imprecision: Table of Contents</a>
-</p>
+
 <!-- GC common information -->
 <hr>
 
diff --git a/html/qh-in.htm b/html/qh-in.htm
index 51ba747..a8c6c3c 100644
--- a/html/qh-in.htm
+++ b/html/qh-in.htm
@@ -14,7 +14,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page for Qhull</a>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual: Table of
 Contents</a><br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -22,10 +22,11 @@ Contents</a><br>
 &#149; <a href="qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
 &#149; <a href="qh-optt.htm#trace">Trace</a><br>
-<b>To:</b> <a href="#TOC">Qhull internals: Table of Contents</a>
+<b>To:</b> <a href="#TOC">Qhull internals</a>: Table of Contents
 (please wait while loading) <br>
-<b>Dn:</b> <a href="../src/index.htm">Qhull functions, macros, and data
-structures</a> </p>
+<b>Dn:</b> <a href="../src/index.htm">Qhull functions</a>, macros, and data
+structures
+</p>
 
 <hr>
 <!-- Main text of document -->
@@ -36,7 +37,7 @@ height="100"></a> Qhull internals</h1>
 
 <p>This section discusses the internals of Qhull. </p>
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -44,26 +45,26 @@ height="100"></a> Qhull internals</h1>
 Contents </a></h2>
 
 <ul>
-    <li><a href="#performance">Performance of Qhull</a></li>
-    <li><a href="#library">Calling Qhull from your program</a></li>
+    <li><a href="#performance">Performance</a> of Qhull</li>
+    <li><a href="#library">Calling Qhull</a> from your program
     <ul>
-            <li><a href="#mem">sets and quick memory allocation</a></li>
-            <li><a href="#dids">print point indices for Delaunay
-                triangles</a></li>
-            <li><a href="#findfacet">locate a facet with
-                qh_findbestfacet()</a></li>
-            <li><a href="#inc">on-line construction with
-                qh_addpoint()</a></li>
-            <li><a href="#constrained">Constrained Delaunay
-                triangulation</a></li>
-            <li><a href="#vertices">Voronoi vertices of a region</a></li>
-            <li><a href="#ridge">Voronoi vertices of a ridge</a></li>
-            <li><a href="#vneighbor">vertex neighbors of a vertex</a></li>
+            <li><a href="#constrained">Constrained Delaunay</a>
+                triangulation</li>
+            <li><a href="#dids">Delaunay triangulations</a> and point indices</li>
+            <li><a href="#findfacet">Locate facet</a> with
+                qh_findbestfacet()</li>
+            <li><a href="#inc">On-line construction</a> with
+                qh_addpoint()</li>
+            <li><a href="#mem">Sets and quick memory</a> allocation</li>
+	<li><a href="#tricoplanar">Tricoplanar facets</a> and option 'Qt'</li>
+            <li><a href="#vneighbor">Vertex neighbors</a> of a vertex</li>
+            <li><a href="#vertices">Voronoi vertices</a> of a region</li>
+            <li><a href="#ridge">Voronoi vertices</a> of a ridge</li>
         </ul>
     </li>
-    <li><a href="#enhance">Enhancements to Qhull</a></li>
-    <li><a href="../src/index.htm">Qhull functions, macros, and data
-        structures</a> </li>
+    <li><a href="#enhance">Enhancements</a> to Qhull</li>
+    <li><a href="../src/index.htm">Qhull functions</a>, macros, and data
+        structures </li>
 </ul>
 
 <hr>
@@ -94,7 +95,7 @@ arithmetic. They are optimized for simplicial outputs. </p>
 performance with the '<a href="qh-optt.htm#TFn">TFn</a>' option.
 The time per facet is approximately constant. In high-d with many
 merged facets, the size of the ridge sets grows rapidly. For
-example the product of 8-d simplicies contains 18 facets and
+example the product of 8-d simplices contains 18 facets and
 500,000 ridges. This will increase the time needed per facet. </p>
 
 <p>As dimension increases, the number of facets and ridges in a
@@ -121,6 +122,10 @@ you may be able to use a smaller qh_MEMalign. Setting
 qh_COMPUTEfurthest saves a small amount of memory, as does
 clearing qh_MAXoutside (both in <tt>user.h</tt>).</p>
 
+<p>Shewchuk is working on a 3-d version of his triangle
+program.  It is optimized for 3-d simplicial Delaunay triangulation
+and uses less memory than Qhull.</p>
+
 <p>To reduce the size of the Qhull executable, consider
 qh_NOtrace and qh_KEEPstatistics 0 in <tt>user.h</tt>. By
 changing <tt>user.c </tt>you can also remove the input/output
@@ -171,6 +176,13 @@ constants. Changes may improve Qhull performance on your data
 sets. To understand their effect on performance, you will need to
 read the corresponding code. </p>
 
+<p>GNU <tt>gprof</tt> reports that the dominate cost for 3-d
+convex hull of cosperical points is qh_distplane(), mainly called
+from qh_findbestnew().  The dominate cost for 3-d Delaunay triangulation
+is creating new facets in qh_addpoint(), while qh_distplane() remains
+the most expensive function.
+
+</p>
 <h2><a href="#TOC">»</a><a name="library">Calling Qhull from
 your program</a></h2>
 
@@ -203,7 +215,7 @@ an application template. You can use <tt>user_eg.c</tt>
 as an example. It also shows how to reduce memory requirements by
 not loading <tt>io.o</tt>. If you use joggled input ('<a
 href="qh-optq.htm#QJn">QJ</a>'), you may also remove <tt>merge.o</tt>
-with <a href="user.h#NOmerge">qh_NOmerge</a>'. </p>
+with <a href="../src/user.h#NOmerge">qh_NOmerge</a>'. </p>
 
 <p>The <a href=http://www.boost.org/libs/graph/doc/table_of_contents.html>BGL</a>
 Boost Graph Library [aka GGCL] provides C++ classes for graph data structures
@@ -240,8 +252,8 @@ the inner loop of Qhull, so speed is more important than
 abstraction. Set iteration is particularly fast. <tt>qset.c</tt>
 just includes the functions needed for Qhull. </p>
 
-<h3><a href="#TOC">»</a><a name="dids">print point indices for
-Delaunay triangles</a></h3>
+<h3><a href="#TOC">»</a><a name="dids">Delaunay triangulations
+and point indices</a></h3>
 
 <p>Here some unchecked code to print the point indices of each
 Delaunay triangle. Use option 'QJ' if you want to avoid
@@ -315,7 +327,7 @@ For the on-line construction of convex hulls and halfspace
 intersections, Qhull may use an exhaustive search
 (qh_findbestfacet). </p>
 
-<p>You may use qh_addpoint in <tt>qhull.c</tt> to add a point to
+<p>You may use qh_findbestfacet and qh_addpoint (<tt>qhull.c</tt>) to add a point to
 a convex hull. Do not modify the point's coordinates since
 qh_addpoint does not make a copy of the coordinates. For Delaunay
 triangulations, you need to lift the point to a paraboloid by
@@ -373,6 +385,27 @@ the minimum feature separation. You will need an independent
 check of the constraint in the output since the minimum feature
 separation may be incorrect. [H. Geron] </p>
 
+<h3><A href="#TOC">»</A><a name="tricoplanar">Tricoplanar facets and option 'Qt'</h3>
+
+<p>Option '<a href=qh_optq.htm#Qt>Qt</a>' triangulates non-simplicial
+facets (e.g., a square facet in 3-d or a cubical facet in 4-d).  
+All facets share the same apex (i.e., the first vertex in facet->vertices).
+For each triangulated facet, Qhull
+sets facet->tricoplanar true and copies facet->center, facet->normal, facet->offset, and facet->maxoutside.  One of
+the facets owns facet->normal; its facet->keepcentrum is true.
+If facet->isarea is false, facet->triowner points to the owning
+facet.
+
+<p>Qhull sets facet->degenerate if the facet's vertices belong
+to the same ridge of the non-simplicial facet.
+
+<p>To visit each tricoplanar facet of a non-simplicial facet,
+either visit all neighbors of the apex or recursively visit
+all neighbors of a tricoplanar facet.  The tricoplanar facets
+will have the same facet->center.</p>
+
+<p>See <a href=../src/io.c#detvridge>qh_detvridge</a> for an example of ignoring tricoplanar facets.</p>
+
 <h3><a href="#TOC">»</a><a name="vertices">Voronoi vertices of a
 region</a></h3>
 
@@ -455,17 +488,13 @@ graph of the convex hull. </p>
 <p>There are many ways in which Qhull can be improved. </p>
 
 <pre>Here is a partial list:
- - write a BGL interface to Qhull 
+ - write a BGL, C++ interface to Qhull 
      http://www.boost.org/libs/graph/doc/table_of_contents.html
  - rewrite Qhull in C++ to make it easier to use Qhull in a program
  - change qh_save_qhull to swap the qhT structure instead of using pointers
  - change error handling and tracing to be independent of 'qh ferr'
- - produce a custom version and documentation for Delaunay triangulations
-     The convex hull code/documentation is confusing for Delaunay triangulations
  - determine the maximum width for a given set of parameters
  - prove that directed search locates all coplanar facets
- -   improve and speed up directed search (qh_findbest)
- -   for Delaunay triangulations, remove potential exhaustive search in qh_findbestfacet()
  - in high-d merging, can a loop of facets become disconnected?
  - find a way to improve inner hulls in 5-d and higher
  - determine the best policy for facet visibility ('<a
@@ -486,10 +515,11 @@ Precision improvements:
  - improve facet width for very narrow distributions
 
 New features:
+ - compute volume of Voronoi regions.  You need to determine the dual face
+   graph in all dimensions [see Clarkson's hull program]
  - implement deletion of Delaunay vertices 
       see Devillers, ACM Symposium on Computational Geometry, Minneapolis 1999.
  - compute largest empty circle [see O'Rourke, chapter 5.5.3] [Hase]
- - compute volume of Voronoi regions [see Clarkson's hull program]
  - list redundant (i.e., coincident) vertices [Spitz]
  - implement Mucke, et al, ['96] for point location in Delaunay triangulations
  - implement convex hull of moving points
@@ -533,7 +563,7 @@ page for Qhull</a> <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual: Table of
 Contents</a><br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -541,9 +571,9 @@ Contents</a><br>
 &#149; <a href="qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
 &#149; <a href="qh-optt.htm#trace">Trace</a><br>
-<b>To:</b> <a href="#TOC">Qhull internals: Table of Contents</a> <br>
-<b>Dn:</b> <a href="../src/index.htm">Qhull functions, macros, and data
-structures</a> <!-- GC common information --> </p>
+<b>To:</b> <a href="#TOC">Qhull internals</a>: Table of Contents <br>
+<b>Dn:</b> <a href="../src/index.htm">Qhull functions</a>, macros, and data
+structures <!-- GC common information --> 
 
 <hr>
 
diff --git a/html/qh-optc.htm b/html/qh-optc.htm
index 28c71cb..85c18ce 100644
--- a/html/qh-optc.htm
+++ b/html/qh-optc.htm
@@ -10,7 +10,7 @@
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -29,7 +29,7 @@ height="100"></a> Qhull precision options</h1>
 This section lists the precision options for Qhull. These options are
 indicated by an upper-case letter followed by a number.
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -144,7 +144,7 @@ Use '<a
 href="qh-optq.htm#Q0">Q0</a>' to turn both options off.</p>
 
 <p>Qhull optimizes 'C-0' (&quot;_zero-centrum&quot;) by testing
-vertices instead of centrums for adjacent simplicies. This may be
+vertices instead of centrums for adjacent simplices. This may be
 slower in higher dimensions if merges decrease the number of
 processed points. The optimization may be turned off by setting a
 small value such as 'C-1e-30'. See <a href="qh-impre.htm">How
@@ -267,7 +267,7 @@ distinguish coplanar points from interior points.</p>
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qh-optf.htm b/html/qh-optf.htm
index 43f5578..6246745 100644
--- a/html/qh-optf.htm
+++ b/html/qh-optf.htm
@@ -5,137 +5,138 @@
 <title>Qhull format options (F)</title>
 </head>
 
-<body>
-<!-- Navigation links -->
+<body><!-- Navigation links -->
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
-<b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
-<b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
-&#149; <a href="qh-opto.htm#output">Output</a> 
-&#149; <a href="qh-optf.htm#format">Formats</a> 
-&#149; <a href="qh-optg.htm#geomview">Geomview</a> 
-&#149; <a href="qh-optp.htm#print">Print</a>
-&#149; <a href="qh-optq.htm#qhull">Qhull</a> 
-&#149; <a href="qh-optc.htm#prec">Precision</a> 
-&#149; <a href="qh-optt.htm#trace">Trace</a></p>
+<b>Up:</b> <A href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
+<b>To:</b> <A href="qh-quick.htm#programs">Programs</a>
+&#149; <A href="qh-quick.htm#options">Options</a> 
+&#149; <A href="qh-opto.htm#output">Output</a> 
+&#149; <A href="qh-optf.htm#format">Formats</a> 
+&#149; <A href="qh-optg.htm#geomview">Geomview</a> 
+&#149; <A href="qh-optp.htm#print">Print</a>
+&#149; <A href="qh-optq.htm#qhull">Qhull</a> 
+&#149; <A href="qh-optc.htm#prec">Precision</a> 
+&#149; <A href="qh-optt.htm#trace">Trace</a></p>
 <hr>
 <!-- Main text of document -->
 <h1><a
-href="http://www.geom.umn.edu/graphics/pix/Special_Topics/Computational_Geometry/delaunay.html"><img
-src="qh--dt.gif" alt="[delaunay]" align="middle" width="100"
-height="100"></a> Qhull format options (F)</h1>
+ href="http://www.geom.umn.edu/graphics/pix/Special_Topics/Computational_Geometry/delaunay.html"><IMG
+ align=middle alt=[delaunay] height=100
+ src="qh--dt.gif" width=100 ></a> Qhull format options (F)</h1>
 
 <p>This section lists the format options for Qhull. These options
-are indicated by 'F' followed by a letter. See <a
-href="qh-opto.htm#output">Output</a>, <a href="qh-optp.htm#print">Print</a>,
-and <a href="qh-optg.htm#geomview">Geomview</a> for other output
+are indicated by 'F' followed by a letter. See <A
+ href="qh-opto.htm#output" >Output</a>, <A href="qh-optp.htm#print">Print</a>,
+and <A href="qh-optg.htm#geomview">Geomview</a> for other output
 options. </p>
 
 <p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
-<p><a href="index.htm#TOC">»</a> <a href="qh-quick.htm#programs">Programs</a>
-<a name="format">&#149;</a> <a href="qh-quick.htm#options">Options</a> 
-&#149; <a href="qh-opto.htm#output">Output</a> 
-&#149; <a href="qh-optf.htm#format">Formats</a> 
-&#149; <a href="qh-optg.htm#geomview">Geomview</a> 
-&#149; <a href="qh-optp.htm#print">Print</a>
-&#149; <a href="qh-optq.htm#qhull">Qhull</a> 
-&#149; <a href="qh-optc.htm#prec">Precision</a> 
-&#149; <a href="qh-optt.htm#trace">Trace</a></p>
+<p><A href="index.htm#TOC">»</a> <A href="qh-quick.htm#programs">Programs</a>
+<a name="format">&#149;</a> <A href="qh-quick.htm#options">Options</a> 
+&#149; <A href="qh-opto.htm#output">Output</a> 
+&#149; <A href="qh-optf.htm#format">Formats</a> 
+&#149; <A href="qh-optg.htm#geomview">Geomview</a> 
+&#149; <A href="qh-optp.htm#print">Print</a>
+&#149; <A href="qh-optq.htm#qhull">Qhull</a> 
+&#149; <A href="qh-optc.htm#prec">Precision</a> 
+&#149; <A href="qh-optt.htm#trace">Trace</a></p>
 
 <h2>Additional input &amp; output formats</h2>
 
 <p>These options allow for automatic processing of Qhull output.
-Options '<a href="qh-opto.htm#i">i</a>', '<a href="qh-opto.htm#o">o</a>',
-'<a href="qh-opto.htm#n">n</a>', and '<a href="qh-opto.htm#p">p</a>'
+Options '<A href="qh-opto.htm#i">i</a>', '<A href="qh-opto.htm#o">o</a>',
+'<A href="qh-opto.htm#n">n</a>', and '<A href="qh-opto.htm#p">p</a>'
 may also be used.</p>
 
 <dl compact>
-    <dt>&nbsp;</dt>
-    <dd><b>Summary and control</b></dd>
-    <dt><a href="#FA">FA</a></dt>
-    <dd>compute total area and volume for option '<a
-        href="qh-opto.htm#s">s</a>'</dd>
-    <dt><a href="#FV">FV</a></dt>
-    <dd>print average vertex (interior point for '<a
-        href="qhalf.htm">qhalf</a>')</dd>
-    <dt><a href="#FQ">FQ</a></dt>
-    <dd>print command for qhull and input</dd>
-    <dt><a href="#FO">FO</a></dt>
-    <dd>print options to stderr or stdout</dd>
-    <dt><a href="#FS">FS</a></dt>
-    <dd>print sizes: total area and volume </dd>
-    <dt><a href="#Fs">Fs</a></dt>
-    <dd>print summary: dim, #points, total vertices and facets,
-        #vertices, #facets, max outer and inner plane</dd>
-    <dt><a href="#Fd">Fd</a></dt>
-    <dd>use cdd format for input (offset first)</dd>
-    <dt><a href="#FD">FD</a></dt>
-    <dd>use cdd format for normals (offset first) </dd>
-    <dt>&nbsp;</dt>
-    <dt>&nbsp;</dt>
-    <dd><b>Facets, points, and vertices</b></dd>
-    <dt><a href="#Fa">Fa</a></dt>
-    <dd>print area for each facet</dd>
-    <dt><a href="#FC">FC</a></dt>
-    <dd>print centrum for each facet</dd>
-    <dt><a href="#Fc">Fc</a></dt>
-    <dd>print coplanar points for each facet </dd>
-    <dt><a href="#Fx">Fx</a></dt>
-    <dd>print extreme points (i.e., vertices) of convex hull.</dd>
-    <dt><a href="#FF">FF</a></dt>
-    <dd>print facets w/o ridges</dd>
-    <dt><a href="#FI">FI</a></dt>
-    <dd>print ID for each facet </dd>
-    <dt><a href="#Fi">Fi</a></dt>
-    <dd>print inner planes for each facet</dd>
-    <dt><a href="#Fm">Fm</a></dt>
-    <dd>print merge count for each facet (511 max)</dd>
-    <dt><a href="#FP">FP</a></dt>
-    <dd>print nearest vertex for coplanar points </dd>
-    <dt><a href="#Fn">Fn</a></dt>
-    <dd>print neighboring facets for each facet</dd>
-    <dt><a href="#FN">FN</a></dt>
-    <dd>print neighboring facets for each point</dd>
-    <dt><a href="#Fo">Fo</a></dt>
-    <dd>print outer planes for each facet</dd>
-    <dt><a href="#Ft">Ft</a></dt>
-    <dd>print triangulation with added points</dd>
-    <dt><a href="#Fv">Fv</a></dt>
-    <dd>print vertices for each facet</dd>
-    <dt>&nbsp;</dt>
-    <dt>&nbsp;</dt>
-    <dd><b>Delaunay, Voronoi, and halfspace</b></dd>
-    <dt><a href="#Fx">Fx</a></dt>
-    <dd>print extreme input sites of Delaunay triangulation or
-        Voronoi diagram.</dd>
-    <dt><a href="#Fp">Fp</a></dt>
-    <dd>print points at halfspace intersections</dd>
-    <dt><a href="#Fi2">Fi</a></dt>
-    <dd>print separating hyperplanes for inner, bounded Voronoi
-        regions</dd>
-    <dt><a href="#Fo2">Fo</a></dt>
-    <dd>print separating hyperplanes for outer, unbounded Voronoi
-        regions</dd>
-    <dt><a href="#Fv2">Fv</a></dt>
-    <dd>print Voronoi diagram as ridges for each input pair</dd>
-    <dt><a href="#FC">FC</a></dt>
-    <dd>print Voronoi vertex (&quot;center&quot;) for each facet</dd>
+    <dt>
+    <dd><b>Summary and control</b>
+    <dt><A href="#FA">FA</a>
+    <dd>compute total area and volume for option '<A
+        href="qh-opto.htm#s">s</a>' 
+
+    <dt><A href="#FV">FV</a>
+    <dd>print average vertex (interior point for '<A
+        href="qhalf.htm">qhalf</a>') 
+    <dt><A href="#FQ">FQ</a>
+    <dd>print command for qhull and input 
+    <dt><A href="#FO">FO</a>
+    <dd>print options to stderr or stdout 
+    <dt><A href="#FS">FS</a>
+    <dd>print sizes: total area and volume 
+    <dt><A href="#Fs">Fs</a>
+    <dd>print summary: dim, #points, total vertices and 
+  facets, #vertices, #facets, max outer and inner plane 
+    <dt><A href="#Fd">Fd</a>
+    <dd>use cdd format for input (offset first) 
+    <dt><A href="#FD">FD</a>
+    <dd>use cdd format for normals (offset first) 
+    <dt>
+    <dt>
+    <dd><b>Facets, points, and vertices</b>
+    <dt><A href="#Fa">Fa</a>
+    <dd>print area for each facet 
+    <dt><A href="#FC">FC</a>
+    <dd>print centrum for each facet 
+    <dt><A href="#Fc">Fc</a>
+    <dd>print coplanar points for each facet 
+    <dt><A href="#Fx">Fx</a>
+    <dd>print extreme points (i.e., vertices) of convex hull. 
+
+    <dt><A href="#FF">FF</a>
+    <dd>print facets w/o ridges 
+    <dt><A href="#FI">FI</a>
+    <dd>print ID for each facet 
+    <dt><A href="#Fi">Fi</a>
+    <dd>print inner planes for each facet 
+    <dt><A href="#Fm">Fm</a>
+    <dd>print merge count for each facet (511 max) 
+    <dt><A href="#FP">FP</a>
+    <dd>print nearest vertex for coplanar points 
+    <dt><A href="#Fn">Fn</a>
+    <dd>print neighboring facets for each facet 
+    <dt><A href="#FN">FN</a>
+    <dd>print neighboring facets for each point 
+    <dt><A href="#Fo">Fo</a>
+    <dd>print outer planes for each facet 
+    <dt><A href="#Ft">Ft</a>
+    <dd>print triangulation with added points 
+    <dt><A href="#Fv">Fv</a>
+    <dd>print vertices for each facet 
+    <dt>
+    <dt>
+    <dd><b>Delaunay, Voronoi, and halfspace</b>
+    <dt><A href="#Fx">Fx</a>
+    <dd>print extreme input sites of Delaunay triangulation 
+  or Voronoi diagram. 
+    <dt><A href="#Fp">Fp</a>
+    <dd>print points at halfspace intersections 
+    <dt><A href="#Fi2">Fi</a>
+    <dd>print separating hyperplanes for inner, bounded 
+  Voronoi regions 
+    <dt><A href="#Fo2">Fo</a>
+    <dd>print separating hyperplanes for outer, unbounded 
+  Voronoi regions 
+    <dt><A href="#Fv2">Fv</a>
+    <dd>print Voronoi diagram as ridges for each input pair 
+    <dt><A href="#FC">FC</a>
+    <dd>print Voronoi vertex ("center") for each facet</dd>
 </dl>
 
 <hr>
 
-<h3><a href="#format">»</a><a name="Fa">Fa - print area for each
+<h3><A href="#format">»</a><a name="Fa">Fa - print area for each
 facet </a></h3>
 
 <p>The first line is the number of facets. The remaining lines
-are the area for each facet, one facet per line. See '<a
-href="#FA">FA</a>' for computing the total area and volume.</p>
+are the area for each facet, one facet per line. See '<A
+ href="#FA" >FA</a>' for computing the total area and volume.</p>
 
-<p>Use '<a href="qh-optp.htm#PAn">PAn</a>' for printing the n
-largest facets. Use option '<a href="qh-optp.htm#PFn">PFn</a>'
+<p>Use '<A href="qh-optp.htm#PAn">PAn</a>' for printing the n
+largest facets. Use option '<A href="qh-optp.htm#PFn">PFn</a>'
 for printing facets larger than <i>n</i>.</p>
 
 <p>For Delaunay triangulations, the area is the area of each
@@ -153,27 +154,27 @@ the corresponding triangles are ignored.</p>
 facet's hyperplane. If so, the approximation is less than the
 actual value and it may be significantly less. </p>
 
-<h3><a href="#format">»</a><a name="FA">FA - compute total area
+<h3><A href="#format">»</a><a name="FA">FA - compute total area
 and volume for option 's' </a></h3>
 
 <p>With option 'FA', Qhull includes the total area and volume in
-the summary ('<a href="qh-opto.htm#s">s</a>'). If facets are
+the summary ('<A href="qh-opto.htm#s">s</a>'). If facets are
 merged, the area and volume are approximations. Option 'FA' is
-automatically set for options '<a href="#Fa">Fa </a>', '<a
-href="qh-optp.htm#PAn">PAn</a>', and '<a href="qh-optp.htm#PFn">PFn</a>'.
+automatically set for options '<A href="#Fa">Fa </a>', '<A
+ href="qh-optp.htm#PAn" >PAn</a>', and '<A href="qh-optp.htm#PFn">PFn</a>'.
 </p>
 
-<p>With '<a href="qdelaun.htm">qdelaunay</a> <a
-href="qh-opto.htm#s">s</a> FA', Qhull computes the total area of
+<p>With '<A href="qdelaun.htm">qdelaunay</a> <A
+ href="qh-opto.htm#s" >s</a> FA', Qhull computes the total area of
 the Delaunay triangulation. This equals the volume of the convex
-hull of the data points. With options '<a href="qdelau_f.htm">qdelaunay Qu</a> 
-<a href="qh-opto.htm#s">s</a> FA', Qhull computes the
+hull of the data points. With options '<A href="qdelau_f.htm">qdelaunay Qu</a> 
+<A href="qh-opto.htm#s">s</a> FA', Qhull computes the
 total area of the furthest-site Delaunay triangulation. This
 equals of the total area of the Delaunay triangulation. </p>
 
-<p>See '<a href="#Fa">Fa</a>' for further details. </p>
+<p>See '<A href="#Fa">Fa</a>' for further details. </p>
 
-<h3><a href="#format">»</a><a name="Fc">Fc - print coplanar
+<h3><A href="#format">»</a><a name="Fc">Fc - print coplanar
 points for each facet </a></h3>
 
 <p>The output starts with the number of facets. Then each facet
@@ -181,99 +182,99 @@ is printed one per line. Each line is the number of coplanar
 points followed by the point ids. </p>
 
 <p>By default, option 'Fc' reports coplanar points 
-('<a href="qh-optq.htm#Qc">Qc</a>').  You may also use
-option '<a href="qh-optq.htm#Qi">Qi</a>'. Options 'Qi Fc' prints
+('<A href="qh-optq.htm#Qc">Qc</a>').  You may also use
+option '<A href="qh-optq.htm#Qi">Qi</a>'. Options 'Qi Fc' prints
 interior points while 'Qci Fc' prints both coplanar and interior
 points.
 
 <p>Each coplanar point or interior point is assigned to the
 facet it is furthest above (resp., least below). </p>
 
-<p>Use 'Qc <a href="qh-opto.htm#p">p</a>' to print vertex and
-coplanar point coordinates. Use '<a href="qh-optf.htm#Fv">Fv</a>'
+<p>Use 'Qc <A href="qh-opto.htm#p">p</a>' to print vertex and
+coplanar point coordinates. Use '<A href="qh-optf.htm#Fv">Fv</a>'
 to print vertices. </p>
 
-<h3><a href="#format">»</a><a name="FC">FC - print centrum or
+<h3><A href="#format">»</a><a name="FC">FC - print centrum or
 Voronoi vertex for each facet </a></h3>
 
 <p>The output starts with the dimension followed by the number of
 facets. Then each facet centrum is printed, one per line. For
-<a href="qvoronoi.htm">qvoronoi</a>, Voronoi vertices are
+<A href="qvoronoi.htm">qvoronoi</a>, Voronoi vertices are
 printed instead. </p>
 
-<h3><a href="#format">»</a><a name="Fd">Fd - use cdd format for
+<h3><A href="#format">»</a><a name="Fd">Fd - use cdd format for
 input </a></h3>
 
 <p>The input starts with comments. The first comment is reported
-in the summary. Data starts after a &quot;begin&quot; line. The
+in the summary. Data starts after a "begin" line. The
 next line is the number of points followed by the dimension plus
-one and &quot;real&quot; or &quot;integer&quot;. Then the points
-are listed with a leading &quot;1&quot; or &quot;1.0&quot;. The
-data ends with an &quot;end&quot; line.</p>
+one and "real" or "integer". Then the points
+are listed with a leading "1" or "1.0". The
+data ends with an "end" line.</p>
 
-<p>For halfspaces ('<a href="qhalf.htm">qhalf</a> Fd'),
+<p>For halfspaces ('<A href="qhalf.htm">qhalf</a> Fd'),
 the input format is the same. Each halfspace starts with its
 offset. The sign of the offset is the opposite of Qhull's
 convention. The first two lines of the input may be an interior
-point in '<a href="#FV">FV</a>' format.</p>
+point in '<A href="#FV">FV</a>' format.</p>
 
-<h3><a href="#format">»</a><a name="FD">FD - use cdd format for
+<h3><A href="#format">»</a><a name="FD">FD - use cdd format for
 normals </a></h3>
 
-<p>Option 'FD' prints normals ('<a href="qh-opto.htm#n">n</a>', '<a
-href="#Fo">Fo</a>', '<a href="#Fi">Fi</a>') or points ('<a
-href="qh-opto.htm#p">p</a>') in cdd format. The first line is the
+<p>Option 'FD' prints normals ('<A href="qh-opto.htm#n">n</a>', '<A
+ href="#Fo" >Fo</a>', '<A href="#Fi">Fi</a>') or points ('<A
+ href="qh-opto.htm#p" >p</a>') in cdd format. The first line is the
 command line that invoked Qhull. Data starts with a
-&quot;begin&quot; line. The next line is the number of normals or
-points followed by the dimension plus one and &quot;real&quot;.
+"begin" line. The next line is the number of normals or
+points followed by the dimension plus one and "real".
 Then the normals or points are listed with the offset before the
 coefficients. The offset for points is 1.0. The offset for
 normals has the opposite sign. The data ends with an
-&quot;end&quot; line.</p>
+"end" line.</p>
 
-<h3><a href="#format">»</a><a name="FF">FF - print facets w/o
+<h3><A href="#format">»</a><a name="FF">FF - print facets w/o
 ridges </a></h3>
 
-<p>Option 'FF' prints all fields of all facets (as in '<a
-href="qh-opto.htm#f">f</a>') without printing the ridges. This is
+<p>Option 'FF' prints all fields of all facets (as in '<A
+ href="qh-opto.htm#f" >f</a>') without printing the ridges. This is
 useful in higher dimensions where a facet may have many ridges.
-For simplicial facets, options 'FF' and '<a href="qh-opto.htm#f">f
+For simplicial facets, options 'FF' and '<A href="qh-opto.htm#f">f
 </a>' are equivalent.</p>
 
-<h3><a href="#format">»</a><a name="Fi">Fi - print inner planes
+<h3><A href="#format">»</a><a name="Fi">Fi - print inner planes
 for each facet </a></h3>
 
 <p>The first line is the dimension plus one. The second line is
 the number of facets. The remainder is one inner plane per line.
-The format is the same as option '<a href="qh-opto.htm#n">n</a>'.</p>
+The format is the same as option '<A href="qh-opto.htm#n">n</a>'.</p>
 
 <p>The inner plane is a plane that is below the facet's vertices.
 It is an offset from the facet's hyperplane. It includes a
 roundoff error for computing the vertex distance.</p>
 
-<p>Note that the inner planes for Geomview output ('<a
-href="qh-optg.htm#Gi">Gi</a>') include an additional offset for
+<p>Note that the inner planes for Geomview output ('<A
+ href="qh-optg.htm#Gi" >Gi</a>') include an additional offset for
 vertex visualization and roundoff error. </p>
 
-<h3><a href="#format">»</a><a name="Fi2">Fi - print separating
+<h3><A href="#format">»</a><a name="Fi2">Fi - print separating
 hyperplanes for inner, bounded Voronoi regions</a></h3>
 
-<p>With <a href=qvoronoi.htm>qvoronoi</a>, 'Fi' prints the
+<p>With <A href="qvoronoi.htm" >qvoronoi</a>, 'Fi' prints the
 separating hyperplanes for inner, bounded regions of the Voronoi
 diagram. The first line is the number of ridges. Then each
 hyperplane is printed, one per line. A line starts with the
 number of indices and floats. The first pair of indices indicates
 an adjacent pair of input sites. The next <i>d</i> floats are the
 normalized coefficients for the hyperplane, and the last float is
-the offset. The hyperplane is oriented toward '<a
-href="qh-optq.htm#QVn">QVn</a>' (if defined), or the first input
+the offset. The hyperplane is oriented toward '<A
+ href="qh-optq.htm#QVn" >QVn</a>' (if defined), or the first input
 site of the pair. </p>
 
-<p>Use '<a href="qh-optf.htm#Fo2">Fo</a>' for unbounded regions,
-and '<a href="qh-optf.htm#Fv2">Fv</a>' for the corresponding
+<p>Use '<A href="qh-optf.htm#Fo2">Fo</a>' for unbounded regions,
+and '<A href="qh-optf.htm#Fv2">Fv</a>' for the corresponding
 Voronoi vertices. </p>
 
-<p>Use '<a href="qh-optt.htm#Tv">Tv</a>' to verify that the
+<p>Use '<A href="qh-optt.htm#Tv">Tv</a>' to verify that the
 hyperplanes are perpendicular bisectors. It will list relevant
 statistics to stderr. The hyperplane is a perpendicular bisector
 if the midpoint of the input sites lies on the plane, all Voronoi
@@ -284,23 +285,23 @@ non-zero. The deviations appear to be largest when the
 corresponding Delaunay triangles are large and thin; for example,
 the Voronoi diagram of nearly cospherical points. </p>
 
-<h3><a href="#format">»</a><a name="FI">FI - print ID for each
+<h3><A href="#format">»</a><a name="FI">FI - print ID for each
 facet </a></h3>
 
 <p>Print facet identifiers. These are used internally and listed
-with options '<a href="qh-opto.htm#f">f</a>' and '<a href="#FF">FF</a>'.
-Options '<a href="#Fn">Fn </a>' and '<a href="#FN">FN</a>' use
+with options '<A href="qh-opto.htm#f">f</a>' and '<A href="#FF">FF</a>'.
+Options '<A href="#Fn">Fn </a>' and '<A href="#FN">FN</a>' use
 facet identifiers for negative indices. </p>
 
-<h3><a href="#format">»</a><a name="Fm">Fm - print merge count
+<h3><A href="#format">»</a><a name="Fm">Fm - print merge count
 for each facet </a></h3>
 
 <p>The first line is the number of facets. The remainder is the
 number of merges for each facet, one per line. At most 511 merges
-are reported for a facet. See '<a href="qh-optp.htm#PMn">PMn</a>'
+are reported for a facet. See '<A href="qh-optp.htm#PMn">PMn</a>'
 for printing the facets with the most merges. </p>
 
-<h3><a href="#format">»</a><a name="Fn">Fn - print neighboring
+<h3><A href="#format">»</a><a name="Fn">Fn - print neighboring
 facets for each facet </a></h3>
 
 <p>The output starts with the number of facets. Then each facet
@@ -309,85 +310,85 @@ followed by an index for each neighbor. The indices match the
 other facet output formats.</p>
 
 <p>A negative index indicates an unprinted facet due to printing
-only good facets ('<a href="qh-optp.htm#Pg">Pg</a>', <a href=qdelaun.htm>qdelaunay</a>, 
-<a href=qvoronoi.htm>qvoronoi</a>). It
-is the negation of the facet's ID (option '<a href="#FI">FI</a>').
-For example, negative indices are used for facets &quot;at
-infinity&quot; in the Delaunay triangulation.</p>
+only good facets ('<A href="qh-optp.htm#Pg">Pg</a>', <A href="qdelaun.htm" >qdelaunay</a>, 
+<A href="qvoronoi.htm" >qvoronoi</a>). It
+is the negation of the facet's ID (option '<A href="#FI">FI</a>').
+For example, negative indices are used for facets "at
+infinity" in the Delaunay triangulation.</p>
 
-<h3><a href="#format">»</a><a name="FN">FN - print neighboring
+<h3><A href="#format">»</a><a name="FN">FN - print neighboring
 facets for each point </a></h3>
 
 <p>The first line is the number of points. Then each point is
 printed, one per line. For unassigned points (either interior or
-coplanar), the line is &quot;0&quot;. For assigned coplanar
-points ('<a href="qh-optq.htm#Qc">Qc</a>'), the line is
-&quot;1&quot; followed by the index of the facet that is furthest
-below the point. For assigned interior points ('<a
-href="qh-optq.htm#Qi">Qi</a>'), the line is &quot;1&quot;
+coplanar), the line is "0". For assigned coplanar
+points ('<A href="qh-optq.htm#Qc">Qc</a>'), the line is
+"1" followed by the index of the facet that is furthest
+below the point. For assigned interior points ('<A
+ href="qh-optq.htm#Qi" >Qi</a>'), the line is "1"
 followed by the index of the facet that is least above the point.
 For vertices that do not belong to good facet, the line is
-&quot;0&quot;</p>
+"0"</p>
 
 <p>For vertices of good facets, the line is the number of
 neighboring facets followed by the facet indices. The indices
-correspond to the other '<a href="#format">F</a>' formats. In 4-d
+correspond to the other '<A href="#format">F</a>' formats. In 4-d
 and higher, the facets are sorted by index. In 3-d, the facets
 are in adjacency order (not oriented).</p>
 
 <p>A negative index indicates an unprinted facet due to printing
-only good facets (<a href=qdelaun.htm>qdelaunay</a>, 
-<a href=qvoronoi.htm>qvoronoi</a>, '<a href="qh-optp.htm#Pdk">Pdk</a>',
-'<a href="qh-optp.htm#Pg">Pg</a>'). It is the negation of the
-facet's ID ('<a href="#FI"> FI</a>'). For example, negative
-indices are used for facets &quot;at infinity&quot; in the
+only good facets (<A href="qdelaun.htm" >qdelaunay</a>, 
+<A href="qvoronoi.htm" >qvoronoi</a>, '<A href="qh-optp.htm#Pdk">Pdk</a>',
+'<A href="qh-optp.htm#Pg">Pg</a>'). It is the negation of the
+facet's ID ('<A href="#FI"> FI</a>'). For example, negative
+indices are used for facets "at infinity" in the
 Delaunay triangulation.</p>
 
 <p>For Voronoi vertices, option 'FN' lists the vertices of the
 Voronoi region for each input site. Option 'FN' lists the regions
 in site ID order. Option 'FN' corresponds to the second half of
-option '<a href="qh-opto.htm#o">o</a>'. To convert from 'FN' to '<a
-href="qh-opto.htm#o">o</a>', replace negative indices with zero
+option '<A href="qh-opto.htm#o">o</a>'. To convert from 'FN' to '<A
+ href="qh-opto.htm#o" >o</a>', replace negative indices with zero
 and increment non-negative indices by one. </p>
 
-<p>If you are using the <a href="index.htm#library">Qhull
+<p>If you are using the <A href="index.htm#library">Qhull
 library</a>, option 'FN' has the side effect of reordering the
 neighbors for a vertex </p>
 
-<h3><a href="#format">»</a><a name="Fo">Fo - print outer planes
+<h3><A href="#format">»</a><a name="Fo">Fo - print outer planes
 for each facet </a></h3>
 
 <p>The first line is the dimension plus one. The second line is
 the number of facets. The remainder is one outer plane per line.
-The format is the same as option '<a href="qh-opto.htm#n">n</a>'.</p>
+The format is the same as option '<A href="qh-opto.htm#n">n</a>'.</p>
 
 <p>The outer plane is a plane that is above all points. It is an
 offset from the facet's hyperplane. It includes a roundoff error
 for computing the point distance. When testing the outer plane
-(e.g., '<a href="qh-optt.htm#Tv">Tv</a>'), another roundoff error
+(e.g., '<A href="qh-optt.htm#Tv">Tv</a>'), another roundoff error
 should be added for the tested point.</p>
 
-<p>If outer planes are not checked ('<a href="qh-optq.htm#Q5">Q5</a>')
+<p>If outer planes are not checked ('<A href="qh-optq.htm#Q5">Q5</a>')
 or not computed (!qh_MAXoutside), the maximum, computed outside
 distance is used instead. This can be much larger than the actual
 outer planes.</p>
 
-<p>Note that the outer planes for Geomview output ('<a
-href="qh-optg.htm#G">G</a>') include an additional offset for
+<p>Note that the outer planes for Geomview output ('<A
+ href="qh-optg.htm#G" >G</a>') include an additional offset for
 vertex/point visualization, 'lines closer,' and roundoff error.</p>
 
-<h3><a href="#format">»</a><a name="Fo2">Fo - print separating
+<h3><A href="#format">»</a><a name="Fo2">Fo - print separating
 hyperplanes for outer, unbounded Voronoi regions</a></h3>
 
-<p>With <a href=qvoronoi.htm>qvoronoi</a>, 'Fo' prints the
+<p>With <A href="qvoronoi.htm" >qvoronoi</a>, 'Fo' prints the
 separating hyperplanes for outer, unbounded regions of the
 Voronoi diagram. The first line is the number of ridges. Then
 each hyperplane is printed, one per line. A line starts with the
 number of indices and floats. The first pair of indices indicates
 an adjacent pair of input sites. The next <i>d</i> floats are the
 normalized coefficients for the hyperplane, and the last float is
-the offset. The hyperplane is oriented toward '<a
-href="qh-optq.htm#QVn">QVn</a>' (if defined), or the first input
+the offset. The hyperplane is oriented toward '<A
+ href="qh-optq.htm#QVn" >QVn</a>' (if defined), or the first input
 site of the pair. </p>
 
 <p>Option 'Fo' gives the hyperplanes for the unbounded rays of
@@ -395,25 +396,25 @@ the unbounded regions of the Voronoi diagram. Each hyperplane
 goes through the midpoint of the corresponding input sites. The
 rays are directed away from the input sites. </p>
 
-<p>Use '<a href="qh-optf.htm#Fi2">Fi</a>' for bounded regions,
-and '<a href="qh-optf.htm#Fv2">Fv</a>' for the corresponding
-Voronoi vertices. Use '<a href="qh-optt.htm#Tv">Tv</a>' to verify
+<p>Use '<A href="qh-optf.htm#Fi2">Fi</a>' for bounded regions,
+and '<A href="qh-optf.htm#Fv2">Fv</a>' for the corresponding
+Voronoi vertices. Use '<A href="qh-optt.htm#Tv">Tv</a>' to verify
 that the corresponding Voronoi vertices lie on the hyperplane. </p>
 
-<h3><a href="#format">»</a><a name="FO">FO - print list of
+<h3><A href="#format">»</a><a name="FO">FO - print list of
 selected options </a></h3>
 
 <p>Lists selected options and default values to stderr.
 Additional 'FO's are printed to stdout. </p>
 
-<h3><a href="#format">»</a><a name="Fp">Fp - print points at
+<h3><A href="#format">»</a><a name="Fp">Fp - print points at
 halfspace intersections</a></h3>
 
 <p>The first line is the number of intersection points. The
 remainder is one intersection point per line. A intersection
 point is the intersection of <i>d</i> or more halfspaces from
-'<a href="qhalf.htm">qhalf</a>'. It corresponds to a
-facet of the dual polytope. The &quot;infinity&quot; point
+'<A href="qhalf.htm">qhalf</a>'. It corresponds to a
+facet of the dual polytope. The "infinity" point
 [-10.101,-10.101,...] indicates an unbounded intersection.</p>
 
 <p>If [x,y,z] are the dual facet's normal coefficients and <i>b&lt;0</i>
@@ -421,7 +422,7 @@ is its offset, the halfspace intersection occurs at
 [x/-b,y/-b,z/-b] plus the interior point. If <i>b&gt;=0</i>, the
 halfspace intersection is unbounded. </p>
 
-<h3><a href="#format">»</a><a name="FP">FP - print nearest
+<h3><A href="#format">»</a><a name="FP">FP - print nearest
 vertex for coplanar points </a></h3>
 
 <p>The output starts with the number of coplanar points. Then
@@ -430,26 +431,35 @@ point ID of the closest vertex, the point ID of the coplanar
 point, the corresponding facet ID, and the distance. Sort the
 lines to list the coplanar points nearest to each vertex. </p>
 
-<p>Use options '<a href="qh-optq.htm#Qc">Qc</a>' and/or '<a
-href="qh-optq.htm#Qi">Qi</a>' with 'FP'. Options 'Qc FP' prints
+<p>Use options '<A href="qh-optq.htm#Qc">Qc</a>' and/or '<A
+ href="qh-optq.htm#Qi" >Qi</a>' with 'FP'. Options 'Qc FP' prints
 coplanar points while 'Qci FP' prints coplanar and interior
 points.  Option 'Qc' is automatically selected if 'Qi' is not
 selected.
 
-<p>For Delaunay triangulations (<a href=qdelaun.htm>qdelaunay</a>
-or <a href=qvoronoi.htm>qvoronoi</a>), a coplanar point is nearly
+<p>For Delaunay triangulations (<A href="qdelaun.htm" >qdelaunay</a>
+or <A href="qvoronoi.htm" >qvoronoi</a>), a coplanar point is nearly
 incident to a vertex. The distance is the distance in the
 original point set.</p>
 
-<h3><a href="#format">»</a><a name="FQ">FQ - print command for
+<p>If imprecision problems are severe, Qhull will delete input
+sites when constructing the Delaunay triangulation.  Option 'FP' will
+list these points along with coincident points.</p>
+
+<p>If there are many coplanar or coincident points and non-simplicial 
+facets are triangulated ('<A href="qh-optq.htm#Qt">Qt</a>'), option
+'FP' may be inefficient.  It redetermines the original vertex set
+for each coplanar point.</p>
+
+<h3><A href="#format">»</a><a name="FQ">FQ - print command for
 qhull and input </a></h3>
 
-<p>Prints qhull and input command, e.g., &quot;rbox 10 s | qhull
-FQ&quot;. </p>
+<p>Prints qhull and input command, e.g., "rbox 10 s | qhull
+FQ".   Option 'FQ' may be repeated multiple times.</p>
 
-<h3><a href="#format">»</a><a name="Fs">Fs - print summary</a></h3>
+<h3><A href="#format">»</a><a name="Fs">Fs - print summary</a></h3>
 
-<p>The first line consists of number of integers (&quot;8&quot;)
+<p>The first line consists of number of integers ("10")
 followed by the:
 <ul>
 <li>dimension
@@ -459,86 +469,99 @@ followed by the:
 <li>number of vertices selected for output
 <li>number of facets selected for output
 <li>number of coplanar points for selected facets
-<li>number of nonsimplicial or merged facets selected for output
+<li>number of nonsimplicial or merged facets selected for 
+  output 
+<LI>number of deleted vertices</LI>        
+<LI>number of triangulated facets ('<A href="qh-optq.htm#t">Qt</a>')</LI>        
 </ul>
-</p>
 
 <p>The second line consists of the number of reals
-(&quot;2&quot;) followed by the:
+("2") followed by the:
 <ul>
 <li>maximum offset to an outer plane
-<li>minimum offset to an inner plane. 
+<li>minimum offset to an inner plane.</li>      
 </ul>
-Roundoff and joggle are
-included.</p>
+Roundoff and joggle are included.
+<P></P>
 
-<p>Later versions of Qhull may produce additional integers or
-reals.</p>
+<p>For Delaunay triangulations and Voronoi diagrams, the 
+number of deleted vertices should be zero. If greater than zero, then the 
+input is highly degenerate and coplanar points are not necessarily coincident
+points.  For example, <tt>'RBOX 1000 s W1e-13 t995138628 | QHULL d'</tt> reports
+deleted vertices; the input is nearly cospherical.</p>
 
-<h3><a href="#format">»</a><a name="FS">FS - print sizes</a></h3>
+<P>Later versions of Qhull may produce additional integers or reals.</P>
+
+<h3><A href="#format">»</a><a name="FS">FS - print sizes</a></h3>
 
 <p>The first line consists of the number of integers
-(&quot;0&quot;). The second line consists of the number of reals
-(&quot;2&quot;), followed by the total facet area, and the total
+("0"). The second line consists of the number of reals
+("2"), followed by the total facet area, and the total
 volume. Later versions of Qhull may produce additional integers
 or reals.</p>
 
 <p>The total volume measures the volume of the intersection of
 the halfspaces defined by each facet. It is computed from the
 facet area. Both area and volume are approximations for
-non-simplicial facets. See option '<a href="#Fa">Fa </a>' for
+non-simplicial facets. See option '<A href="#Fa">Fa </a>' for
 further notes. </p>
 
-<h3><a href="#format">»</a><a name="Ft">Ft - print triangulation</a></h3>
+<h3><A href="#format">»</a><a name="Ft">Ft - print triangulation</a></h3>
 
 <p>Prints a triangulation with added points for non-simplicial
 facets. The output is </p>
 
 <ul>
-    <li>The first line is the dimension </li>
-    <li>The second line is the number of points, the number of
-        facets, and the number of ridges. </li>
-    <li>All of the input points follow, one per line. </li>
-    <li>The centrums follow, one per non-simplicial facet </li>
+    <li>The first line is the dimension 
+    <li>The second line is the number of points, the number 
+  of facets, and the number of ridges. 
+    <li>All of the input points follow, one per line. 
+    <li>The centrums follow, one per non-simplicial facet 
     <li>Then the facets follow as a list of point indices
-        preceded by the number of points. The simplicies are
+        preceded by the number of points. The simplices are
         oriented. </li>
 </ul>
 
 <p>For convex hulls with simplicial facets, the output is the
-same as option '<a href="qh-opto.htm#o">o</a>'.</p>
+same as option '<A href="qh-opto.htm#o">o</a>'.</p>
 
 <p>The added points are the centrums of the non-simplicial
 facets. Except for large facets, the centrum is the average
 vertex coordinate projected to the facet's hyperplane. Large
 facets may use an old centrum to avoid recomputing the centrum
 after each merge. In either case, the centrum is clearly below
-neighboring facets. See <a href="qh-impre.htm">Precision issues</a>.
+neighboring facets. See <A href="qh-impre.htm">Precision issues</a>.
 </p>
 
-<p>The new simplicies will not be clearly convex with their
+<p>The new simplices will not be clearly convex with their
 neighbors and they will not satisfy the Delaunay property. They
-may even have a flipped orientation. Use joggled input ('<a
-href="qh-optq.htm#QJn">QJ</a>') to produce a clearly convex
-triangulation.</p>
+may even have a flipped orientation. Use triangulated input ('<A
+ href="qh-optq.htm#Qt">Qt</a>') for Delaunay triangulations.
+
+<p>For Delaunay triangulations with simplicial facets, the output is the
+same as option '<A href="qh-opto.htm#o">o</a>' without the lifted
+coordinate.  Since 'Ft' is invalid for merged Delaunay facets, option 
+'Ft' is not available for qdelaunay or qvoronoi.  It may be used with
+joggled input ('<A  href="qh-optq.htm#QJn" >QJ</a>') or triangulated output ('<A
+ href="qh-optq.htm#Qt" >Qt</a>'), for example, rbox 10 c G 0.01 | qhull d QJ Ft</p>
 
-<p>If you add a point-at-infinity with '<a href="qh-optq.htm#Qz">Qz</a>',
+<p>If you add a point-at-infinity with '<A href="qh-optq.htm#Qz">Qz</a>',
 it is printed after the input sites and before any centrums. It
 will not be used in a Delaunay facet.</p>
 
-<h3><a href="#format">»</a><a name="Fv">Fv - print vertices for
+<h3><A href="#format">»</a><a name="Fv">Fv - print vertices for
 each facet</a></h3>
 
 <p>The first line is the number of facets. Then each facet is
 printed, one per line. Each line is the number of vertices
 followed by the corresponding point ids. Vertices are listed in
 the order they were added to the hull (the last one added is the
-first listed). Similar to option '<a href="qh-opto.htm#i">i</a>'.</p>
+first listed). Similar to option '<A href="qh-opto.htm#i">i</a>'.</p>
 
-<h3><a href="#format">»</a><a name="Fv2">Fv - print Voronoi
+<h3><A href="#format">»</a><a name="Fv2">Fv - print Voronoi
 diagram</a></h3>
 
-<p>With <a href=qvoronoi.htm>qvoronoi</a>, 'Fv' prints the
+<p>With <A href="qvoronoi.htm" >qvoronoi</a>, 'Fv' prints the
 Voronoi diagram or furthest-site Voronoi diagram. The first line
 is the number of ridges. Then each ridge is printed, one per
 line. The first number is the count of indices. The second pair
@@ -550,9 +573,9 @@ vertex-at-infinity. It indicates an unbounded ray. </p>
 unbounded, add the midpoint of the pair of input sites. The
 unbounded ray is directed from the Voronoi vertices to infinity. </p>
 
-<p>Use '<a href="qh-optf.htm#Fo2">Fo</a>' for separating
-hyperplanes of outer, unbounded regions. Use '<a
-href="qh-optf.htm#Fi2">Fi</a>' for separating hyperplanes of
+<p>Use '<A href="qh-optf.htm#Fo2">Fo</a>' for separating
+hyperplanes of outer, unbounded regions. Use '<A
+ href="qh-optf.htm#Fi2" >Fi</a>' for separating hyperplanes of
 inner, bounded regions. </p>
 
 <p>Option 'Fv' does not list ridges that require more than one
@@ -567,26 +590,26 @@ To determine these ridges, surround the points with a
 large cube (e.g., 'rbox 10 s c G2.0 | qvoronoi Fv Qz').
 Please report any other cases that are missed. If you
 can formally describe these cases or 
-write code to handle them, please send email to <a
-href="mailto:qhull@geom.umn.edu">qhull@geom.umn.edu</a>. </p>
+write code to handle them, please send email to <A
+ href="mailto:qhull@geom.umn.edu" >qhull@geom.umn.edu</a>. </p>
 
-<h3><a href="#format">»</a><a name="FV">FV - print average
+<h3><A href="#format">»</a><a name="FV">FV - print average
 vertex </a></h3>
 
 <p>The average vertex is the average of all vertex coordinates.
 It is an interior point for halfspace intersection. The first
-line is the dimension and &quot;1&quot;; the second line is the
+line is the dimension and "1"; the second line is the
 coordinates. For example,</p>
 
 <blockquote>
-    <p>qconvex FV <a
-    href="qh-opto.htm#n">n</a> | qhalf <a href="#Fp">Fp</a></p>
+    <p>qconvex FV <A
+    href="qh-opto.htm#n">n</a> | qhalf <A href="#Fp">Fp</a></p>
 </blockquote>
 
 <p>prints the extreme points of the original point set (roundoff
 included). </p>
 
-<h3><a href="#format">»</a><a name="Fx">Fx - print extreme
+<h3><A href="#format">»</a><a name="Fx">Fx - print extreme
 points (vertices) of convex hulls and Delaunay triangulations</a></h3>
 
 <p>The first line is the number of points. The following lines
@@ -594,40 +617,41 @@ give the index of the corresponding points. The first point is
 '0'. </p>
 
 <p>In 2-d, the extreme points (vertices) are listed in
-counter-clockwise order (by qh_ORIENTclock in user.h). </p>
+counterclockwise order (by qh_ORIENTclock in user.h). </p>
 
 <p>In 3-d and higher convex hulls, the extreme points (vertices)
-are sorted by index. This is the same order as option '<a
-href="qh-opto.htm#p">p</a>' when it doesn't include coplanar or
+are sorted by index. This is the same order as option '<A
+ href="qh-opto.htm#p" >p</a>' when it doesn't include coplanar or
 interior points. </p>
 
-<p>For Delaunay triangulations, 'Fx' lists the extreme points of
-the input sites (i.e., the vertices of their convex hull). The
-points are unordered. <!-- Navigation links --> </p>
+<p>For Delaunay triangulations, 'Fx' lists the extreme 
+points of the input sites (i.e., the vertices of their convex hull). The points 
+are unordered. <!-- Navigation links --> </p>
 
 <hr>
 
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
-<b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
-<b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
-&#149; <a href="qh-opto.htm#output">Output</a> 
-&#149; <a href="qh-optf.htm#format">Formats</a> 
-&#149; <a href="qh-optg.htm#geomview">Geomview</a> 
-&#149; <a href="qh-optp.htm#print">Print</a>
-&#149; <a href="qh-optq.htm#qhull">Qhull</a> 
-&#149; <a href="qh-optc.htm#prec">Precision</a> 
-&#149; <a href="qh-optt.htm#trace">Trace</a></p>
-<!-- GC common information -->
+<b>Up:</b> <A href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
+<b>To:</b> <A href="qh-quick.htm#programs">Programs</a>
+&#149; <A href="qh-quick.htm#options">Options</a> 
+&#149; <A href="qh-opto.htm#output">Output</a> 
+&#149; <A href="qh-optf.htm#format">Formats</a> 
+&#149; <A href="qh-optg.htm#geomview">Geomview</a> 
+&#149; <A href="qh-optp.htm#print">Print</a>
+&#149; <A href="qh-optq.htm#qhull">Qhull</a> 
+&#149; <A href="qh-optc.htm#prec">Precision</a> 
+&#149; <A href="qh-optt.htm#trace">Trace</a></p><!-- GC common information -->
 <hr>
 
-<p><a href="http://www.geom.umn.edu/"><img src="qh--geom.gif"
-align="middle" width="40" height="40"></a><i>The Geometry Center
+<p><a href="http://www.geom.umn.edu/"><IMG align=middle
+ height=40 src="qh--geom.gif" width=40 ></a><i>The Geometry Center
 Home Page </i></p>
 
 <p>Comments to: <a
-href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
+ href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
-Created: Sept. 25, 1995 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
+Created: 
+Sept. 25, 1995 --- <!-- hhmts start -->Last modified: see top 
+<!-- hhmts end --> </p>
 </body>
 </html>
diff --git a/html/qh-optg.htm b/html/qh-optg.htm
index 59fe89e..0b3ddf2 100644
--- a/html/qh-optg.htm
+++ b/html/qh-optg.htm
@@ -10,7 +10,7 @@
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -33,7 +33,7 @@ indicated by 'G' followed by a letter.  See
 and <a href="qh-optf.htm#format">Format</a> for other output options.
 
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -248,7 +248,7 @@ data. See '<a href="#Gp">Gp</a>' for determining the radius.</p>
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qh-opto.htm b/html/qh-opto.htm
index cd5d50f..868051f 100644
--- a/html/qh-opto.htm
+++ b/html/qh-opto.htm
@@ -10,7 +10,7 @@
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -33,7 +33,7 @@ href="qh-optp.htm#print">Print</a>, and <a
 href="qh-optg.htm#geomview">Geomview</a> for other output
 options. </p>
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -87,11 +87,15 @@ Other outputs may be specified as follows. </p>
 <h3><a href="#output">»</a><a name="f">f - print all fields of
 all facets </a></h3>
 
-<p>Print all fields of all facets. This is primarily for
+<p>Print <a href=../src/qhull.h#facetT>all fields</a> of all facets.
+The facet is the primary <a href=index.htm#structure>data structure</a> for
+Qhull.  
+
+<p>Option 'f' is for
 debugging. Most of the fields are available via the '<a
 href="qh-optf.htm#format">F</a>' options. If you need specialized
-information from Qhull, you can use the (<a
-href="qh-in.htm#library">Qhull library</a>).</p>
+information from Qhull, you can use the <a
+href="qh-in.htm#library">Qhull library</a>.</p>
 
 <p>Use the '<a href="qh-optf.htm#FF">FF</a>' option to print the
 facets but not the ridges. </p>
@@ -146,7 +150,7 @@ you can slowly rotate objects. </p>
 <p>For halfspace intersections, Qhull produces the dual
 convex hull.
 
-<p>See "<a href="qh-faq.htm#math">Is Qhull available for Mathematica?</a>
+<p>See <a href="qh-faq.htm#math">Is Qhull available for Mathematica?</a>
 for URLs.
  
 <h3><a href="#output">»</a><a name="n">n - print hyperplane
@@ -190,7 +194,8 @@ the output with the keyword &quot;end&quot;. </p>
 information with added points for non-simplicial facets.</p>
 
 <p>Option '<a href="qh-opto.htm#i">i</a>' displays vertices
-without the point coordinates. </p>
+without the point coordinates. Option '<a href="qh-opto.htm#p">p</a>'
+displays the point coordinates without vertex and facet information.</p>
 
 <p>In 3-d, Geomview can load the file directly if you delete the
 first line (e.g., by piping through '<tt>tail +2</tt>').</p>
@@ -223,6 +228,11 @@ coplanar and interior points respectively.</p>
 <p>For <a href=qvoronoi.htm>qvoronoi</a>, it prints the
 coordinates of each Voronoi vertex.</p>
 
+<p>For <a href=qdelaun.htm>qdelaunay</a>, it prints the
+input sites as lifted to a paraboloid.  For <a href=qhalf.htm>qhalf</a>
+it prints the dual points.  For both, option 'p' is the same as the first 
+section of option '<a href="qh-opto.htm#o">o</a>'.</p>
+
 <p>Use '<a href="qh-optf.htm#Fx">Fx</a>' to list the point ids of
 the extreme points (i.e., vertices). </p>
 
@@ -240,9 +250,11 @@ with &quot;end&quot;. </p>
 <h3><a href="#output">»</a><a name="s">s - print summary to
 stderr </a></h3>
 
-<p>The default output of Qhull is a summary to stdout. Options '<a
+<p>The default output of Qhull is a summary to stderr. Options '<a
 href="qh-optf.htm#FS">FS</a>' and '<a href="qh-optf.htm#Fs">Fs</a>'
-produce the same information for programs.</p>
+produce the same information for programs.  <b>Note</b>: Windows 95 and 98
+treats stderr the same as stdout.  Use option '<a href="qh-optt.htm#TO">TO file</a>' to separate
+stderr and stdout.</p>
 
 <p>The summary lists the number of input points, the dimension,
 the number of vertices in the convex hull, and the number of
@@ -309,7 +321,7 @@ than 0.05. </p>
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qh-optp.htm b/html/qh-optp.htm
index 5e495aa..78dcbbc 100644
--- a/html/qh-optp.htm
+++ b/html/qh-optp.htm
@@ -10,7 +10,7 @@
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -32,7 +32,7 @@ indicated by 'P' followed by a letter.  See
 and <a href="qh-optf.htm#format">Format</a> for other output options.
 
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -164,12 +164,18 @@ printing. This may be useful for <a
 href="qh-impre.htm#approximate">approximating a hull</a>. Unless
 '<a href="#PG">PG</a>' is set, '<a href="#Pg">Pg</a>' is
 automatically set. </p>
+
+<p>Use option '<a href="qh-optf.htm#Fm">Fm</a>' to print merges
+per facet.
+
 <h3><a href="#print">»</a><a name="Po">Po - force output despite
 precision problems</a></h3>
 
 <p>Use options 'Po' and '<a href="qh-optq.htm#Q0">Q0</a>' if you
-can not merge facets or use joggled input. 
-Option 'Po' can not force output when
+can not merge facets, triangulate the output ('<a href="qh-optq.htm#Qt">Qt</a>'), 
+or joggle the input (<a href="qh-optq.htm#QJn">QJ</a>). 
+
+<p>Option 'Po' can not force output when
 duplicate ridges or duplicate facets occur. It may produce
 erroneous results. For these reasons, merged facets, joggled input, or <a
 href="qh-impre.htm#exact">exact arithmetic</a> are better.</p>
@@ -183,13 +189,14 @@ href="qh-optf.htm#Ft">Ft</a>'.
 to remove some steps from Qhull or to output the neighborhood of
 an error.</p>
 
+<p>Option 'Po' may be used with option '<a href="qh-optq.htm#Q5">Q5</a>')
+to skip qh_check_maxout (i.e., do not determine the maximum outside distance).
+This can save a significant amount of time.
+
 <p>If option 'Po' is used,</p>
 
 <ul>
     <li>most precision errors allow Qhull to continue. </li>
-    <li>the maximum outside distance is not determined
-        (qh_check_maxout and option '<a href="qh-optq.htm#Q5">Q5</a>').
-        This can save a significant amount of time.</li>
     <li>verify ('<a href="qh-optt.htm#Tv">Tv</a>') does not check
         coplanar points.</li>
     <li>points are not partitioned into flipped facets and a
@@ -204,6 +211,9 @@ neighborhood of facet</a></h3>
 is not active, 'Po' outputs a neighborhood of the erroneous
 facets (if any). It uses the current output options.</p>
 
+<p>See '<a href="qh-optp.htm#Po">Po</a>' - force output despite
+precision problems.
+
 <h3><a href="#print">»</a><a name="Pp">Pp - do not report
 precision problems </a></h3>
 
@@ -217,7 +227,7 @@ removes the narrow hull warning.</p>
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qh-optq.htm b/html/qh-optq.htm
index ccf565c..9a72a6d 100644
--- a/html/qh-optq.htm
+++ b/html/qh-optq.htm
@@ -10,7 +10,7 @@
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -29,7 +29,7 @@ height="100"></a> Qhull control options (Q)</h1>
 <p>This section lists the control options for Qhull. These
 options are indicated by 'Q' followed by a letter. </p>
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -55,6 +55,10 @@ options are indicated by 'Q' followed by a letter. </p>
     <dd>keep coplanar points with nearest facet</dd>
     <dt><a href="#Qi">Qi</a></dt>
     <dd>keep interior points with nearest facet</dd>
+    <dt><a href="#QJn">QJ</a></dt>
+    <dd>joggled input to avoid precision problems</dd>
+    <dt><a href="#Qt">Qt</a></dt>
+    <dd>triangulated output</dd>
     <dt>&nbsp;</dt>
     <dt>&nbsp;</dt>
     <dd><b>Precision handling</b></dd>
@@ -62,8 +66,6 @@ options are indicated by 'Q' followed by a letter. </p>
     <dd>add a point-at-infinity for Delaunay triangulations</dd>
     <dt><a href="#Qx">Qx</a></dt>
     <dd>exact pre-merges (allows coplanar facets)</dd>
-    <dt><a href="#QJn">QJ</a></dt>
-    <dd>joggled input to avoid precision problems</dd>
     <dt><a href="#Qs">Qs</a></dt>
     <dd>search all points for the initial simplex</dd>
     <dt><a href="#Qbb">Qbb</a></dt>
@@ -102,7 +104,7 @@ options are indicated by 'Q' followed by a letter. </p>
     <dd>do not correct outer planes at end of qhull</dd>
     <dt><a href="#Q3">Q3</a></dt>
     <dd>do not merge redundant vertices</dd>
-    <dt><a href="#Q6" name="Q6">Q6</a></dt>
+    <dt><a href="#Q6">Q6</a></dt>
     <dd>do not pre-merge concave or coplanar facets</dd>
     <dt><a href="#Q0">Q0</a></dt>
     <dd>do not pre-merge facets with 'C-0' or 'Qx'</dd>
@@ -116,6 +118,10 @@ options are indicated by 'Q' followed by a letter. </p>
     <dd>process facets depth-first instead of breadth-first</dd>
     <dt><a href="#Q9">Q9</a></dt>
     <dd>process furthest of furthest points</dd>
+    <dt><a href="#Q10">Q10</a></dt>
+    <dd>no special processing for narrow distributions</dd>
+    <dt><a href="#Q11">Q11</a></dt>
+    <dd>copy normals and recompute centrums for tricoplanar facets</dd>
     <dt><a href="#Qm">Qm</a></dt>
     <dd>process points only if they would increase the max. outer
         plane </dd>
@@ -297,7 +303,7 @@ random number in the range [-n,n]. If a precision error occurs,
 It tries again. If precision errors still occur, Qhull increases <i>n</i>
 ten-fold and tries again. The maximum value for increasing <i>n</i>
 is 0.01 times the maximum width of the input. Option 'QJ' selects
-a default value for <i>n</i>. <a href="user.h#JOGGLEdefault">User.h</a>
+a default value for <i>n</i>. <a href="../src/user.h#JOGGLEdefault">User.h</a>
 defines these parameters and a maximum number of retries. See <a
 href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 
@@ -308,8 +314,8 @@ href="qh-optq.htm#QBk">QBk:n</a>' are set. </p>
 
 <p>If 'QJn' is set, Qhull does not merge facets unless requested
 to. All facets are simplicial (triangular in 2-d). This may be
-important for your application. Option '<a href="qh-optf.htm#Ft">Ft</a>'
-also produces triangulated output. </p>
+important for your application.  You may also use triangulated output
+('<a href="qh-optq.htm#Qt">Qt</a>') or Option '<a href="qh-optf.htm#Ft">Ft</a>'.
 
 <p>Qhull adjusts the outer and inner planes for 'QJn' ('<a
 href="qh-optf.htm#Fs">Fs</a>'). They are increased by <i>sqrt(d)*n</i>
@@ -320,16 +326,15 @@ since vertices and coplanar points may be joggled in opposite
 directions. </p>
 
 <p>For Delaunay triangulations (<a href=qdelaun.htm>qdelaunay</a>)
-or Voronoi diagrams (<a href=qvoronoi.htm>qvoronoi</a>), option
-'QJ' may retain coplanar points on the convex hull of the input
-sites. The area of the corresponding Delaunay triangles will be
-small but non-zero. In other words, the joggled coplanar point
-will be inside the convex hull of the joggled input sites.</p>
+and Voronoi diagrams (<a href=qvoronoi.htm>qvoronoi</a>), joggle
+happens before lifting the input sites to a paraboloid.  Instead of
+'QJ', you may use triangulated output ('<a
+href="qh-optq.htm#Qt">Qt</a>')</p>
 
 <p>By default, 'QJn' uses a fixed random number seed. To use time
 as the random number seed, select '<a href="qh-optq.htm#QRn">QR-1</a>'.
 The summary ('<a href="qh-opto.htm#s">s</a>') will show the
-selected seed as 'QR-n'. </p>
+selected seed as 'QR-n'.  
 
 <p>With 'QJn', Qhull does not error on degenerate hyperplane
 computations. Except for Delaunay and Voronoi computations, Qhull
@@ -340,7 +345,7 @@ selected options. Option 'FO' displays the joggle and the joggle
 seed. If Qhull restarts, it will redisplay the options. </p>
 
 <p>Use option '<a href="qh-optt.htm#TRn">TRn</a>' to estimate the
-probability that Qhull will fail for a given 'QJn'. </p>
+probability that Qhull will fail for a given 'QJn'.  
 
 <h3><a href="#qhull">»</a><a name="Qm">Qm - only process points
 that increase the maximum outer plane </a></h3>
@@ -400,6 +405,25 @@ or more dimensions should be removed ('<a href="#Qb0">Qbk:0Bk:0</a>').
 If not, use option 'Qs'. It performs an exhaustive search for the
 best initial simplex. This is expensive is high dimensions. </p>
 
+<h3><a href="#qhull">»</a><a name="Qt">Qt - triangulated output</a></h3>
+
+<p>By default, qhull merges facets to handle precision errors.  This
+produces non-simplicial facets (e.g., the convex hull of a cube has 6 square
+facets.  Each facet is non-simplicial because it has four vertices.
+
+<p>Use option 'Qt' to triangulate all non-simplicial facets before generating
+results.  Alternatively, use joggled input ('<a href="#QJn">QJ</a>') to
+prevent non-simplical facets.  Unless '<a href="qh-optp.htm#Pp">Pp</a>' is set,
+qhull produces a warning if 'QJ' and 'Qt' are used together.
+
+<p>Option 'Qt' may produce degenerate facets with zero area.</p>
+
+<p>Facet area and hull volumes may differ with and without
+'Qt'.  The triangulations are different and different triangles
+may be ignored due to precision errors.
+
+<p>With sufficient merging, the ridges of a non-simplicial facet may share more than two neighboring facets. If so, their triangulation ('<a href="#Qt">Qt</a>') will fail since two facets have the same vertex set. </p>
+
 <h3><a href="#qhull">»</a><a name="Qu">Qu - compute upper hull
 for furthest-site Delaunay triangulation </a></h3>
 
@@ -445,11 +469,11 @@ is automatically set.
 </p>
 
 <p>Option 'QVn' behaves oddly with options '<a href="qh-optf.htm#Fx">Fx</a>'
-and '<a href=qvoronoi.htm>qvoronoi</a> <a href="qh-optp.htm#Fv2">Fv</a>'.
+and '<a href=qvoronoi.htm>qvoronoi</a> <a href="qh-optf.htm#Fv2">Fv</a>'.
 
 <p>If used with option '<a href="#Qg">Qg</a>' (only process good facets), point n is 
 either in the initial simplex or it is the first
-point added to the hull. Options 'QVn Qg' require either '<a href="#QJ">QJ</a>' or 
+point added to the hull. Options 'QVn Qg' require either '<a href="#QJn">QJ</a>' or 
 '<a href="#Q0">Q0</a>' (no merging).</p>
 
 <h3><a href="#qhull">»</a><a name="Qx">Qx - exact pre-merges
@@ -614,13 +638,43 @@ furthest points </a></h3>
 sets. This may reduce precision problems. The furthest point of
 all outside sets is not necessarily the furthest point from the
 convex hull.</p>
+
+<h3><a href="#qhull">»</a><a name="Q10">Q10 - no special processing
+for narrow distributions</a></h3>
+
+<p>With 'Q10', Qhull does not special-case narrow distributions.
+See <a href=qh-impre.htm#limit>Limitations of merged facets</a> for
+more information.
+
+<h3><a href="#qhull">»</a><a name="Q11">Q11 - copy normals and recompute
+centrums for
+tricoplanar facets</a></h3>
+
+Option '<a href="#Qt">Qt</a>' triangulates non-simplicial facets
+into "tricoplanar" facets.
+Normally tricoplanar facets share the same normal, centrum, and
+Voronoi vertex.  They can not be merged or replaced.  With
+option 'Q11', Qhull duplicates the normal and Voronoi vertex.  
+It recomputes the centrum.  
+
+<p>Use 'Q11' if you use the Qhull library to add points
+incrementally and call qh_triangulate() after each point.  
+Otherwise, Qhull will report an error when it tries to
+merge and replace a tricoplanar facet.
+
+<p>With sufficient merging and new points, option 'Q11' may 
+lead to precision problems such
+as duplicate ridges and concave facets.  For example, if qh_triangulate()
+is added to qh_addpoint(), RBOX 1000 s W1e-12 t1001813667 P0 | QHULL d Q11 Tv,
+reports an error due to a duplicate ridge.
+
 <!-- Navigation links -->
 <hr>
 
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qh-optt.htm b/html/qh-optt.htm
index b11ac20..544e493 100644
--- a/html/qh-optt.htm
+++ b/html/qh-optt.htm
@@ -10,7 +10,7 @@
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -29,7 +29,7 @@ height="100"></a> Qhull trace options (T)</h1>
 This section lists the trace options for Qhull. These options are
 indicated by 'T' followed by a letter.
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -50,6 +50,8 @@ indicated by 'T' followed by a letter.
     <dd><b>General</b></dd>
     <dt><a href="#Tz">Tz</a></dt>
     <dd>output error information to stdout instead of stderr</dd>
+    <dt><a href="#TI">TI file</a></dt>
+    <dd>input data from a file</dd>
     <dt><a href="#TO">TO file</a></dt>
     <dd>output results to a file</dd>
     <dt><a href="#Ts">Ts</a></dt>
@@ -108,6 +110,13 @@ created. The test occurs just before adding a new point to the
 hull. During post-merging, 'TFn' reports progress after more than
 <i>n/2</i> merges. </p>
 
+<h3><a href="#trace">»</a><a name="TI">TI file - input data from file</a></h3>
+
+<p>Input data from 'file' instead of stdin.  The filename may not
+contain spaces or use single quotes.  
+You may use I/O redirection
+instead (e.g., 'rbox 10 | qdelaunay >results').</P>
+
 <h3><a href="#trace">»</a><a name="TMn">TMn - turn on tracing at
 merge n </a></h3>
 
@@ -123,7 +132,7 @@ allocation and Gaussian elimination. 'T1' is useful for logging
 progress of Qhull in high dimensions.</p>
 
 <p>Option 'Tn' can produce large amounts of output. Use options '<a
-href="#TPn">TPn</a>' and '<a href="#TMn">TMn</a>' to selectively
+href="#TPn">TPn</a>', '<a href="#TWn">TWn</a>', and '<a href="#TMn">TMn</a>' to selectively
 turn on tracing. Since all errors report the last processed
 point, option '<a href="#TPn">TPn</a>' is particularly useful.</p>
 
@@ -142,15 +151,26 @@ instead (e.g., 'rbox 10 | qdelaunay >results').</P>
 Windows95 users should always use 'TO file'.  If they use I/O redirection, 
 error output is not sent to the console.  Qhull uses single quotes instead
 of double quotes because a missing double quote can 
-freeze Windows95 (e.g., do not run, rbox 10 | qhull TO "x)</p>
+freeze Windows95 (e.g., do not run, rbox 10 | qhull TO &quot;x)</p>
 <p>
 
 <h3><a href="#trace">»</a><a name="TPn">TPn - turn on tracing
 when point n added to hull </a></h3>
 
-<p>This reduces the output size when tracing. It is the normal
+<p>Option 'TPn' turns on tracing when point n is added to
+the hull.  It also traces partitions of point n.  This option 
+reduces the output size when tracing.  It is the normal
 method to determine the cause of a Qhull error. All Qhull errors
-report the last point added. </p>
+report the last point added. 
+
+<p>Use options 'TPn <a href="qh-optt.htm#TVn">TVn</a>' to 
+trace the addition of point n to the convex hull and stop when done.</p>
+
+<p>If used with option '<a href="qh-optt.htm#TWn">TWn</a>', 
+'TPn' turns off tracing after adding point n to the hull.
+Use options 'TPn TWn' to 
+trace the addition of point n to the convex hull, partitions
+of point n, and wide merges.</p>
 
 <h3><a href="#trace">»</a><a name="TRn">TRn - rerun qhull n times</a></h3>
 
@@ -163,6 +183,10 @@ Option '<a href="#Ts">Ts</a>' will report statistics for
 all of the runs.  Trace and output options only apply to the last
 run.  An event trace, '<a href="#Tn">T-1</a>' reports events for all runs.
 
+<p>Tracing applies to the last run of Qhull.  If an error
+is reported, the options list the run number as "_run".  
+To trace this run, set 'TRn' to the same value.</p>
+
 <h3><a href="#trace">»</a><a name="Ts">Ts - print statistics </a></h3>
 
 <p>Option 'Ts' collects statistics and prints them to stderr. For
@@ -229,7 +253,7 @@ stdout </a></h3>
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qh-quick.htm b/html/qh-quick.htm
index c629c72..872852e 100644
--- a/html/qh-quick.htm
+++ b/html/qh-quick.htm
@@ -7,11 +7,11 @@
 
 <body>
 <!-- Navigation links -->
-<p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home
+<p><a name="TOC"><b>Up:</b></a> <a href="http://www.geom.umn.edu/locate/qhull">Home
 page for Qhull</a> <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a> <br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -19,6 +19,15 @@ page for Qhull</a> <br>
 &#149; <a href="qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
 &#149; <a href="qh-optt.htm#trace">Trace</a> <br>
+<b>To:</b> <a href="qh-in.htm#TOC">Qhull internals</a><br>
+<b>To:</b> <a href="../src/index.htm">Qhull functions</a>, macros, and data structures<br>
+<b>To:</b> <a href="../src/index.htm#TOC">Qhull files</a><br>
+<b>To:</b> <a href="../src/qh-geom.htm">Geom</a> &#149; <a href="../src/qh-globa.htm">Global</a>
+&#149; <a href="../src/qh-io.htm">Io</a> &#149; <a href="../src/qh-mem.htm">Mem</a>
+&#149; <a href="../src/qh-merge.htm">Merge</a> &#149; <a href="../src/qh-poly.htm">Poly</a>
+&#149; <a href="../src/qh-qhull.htm">Qhull</a> &#149; <a href="../src/qh-set.htm">Set</a>
+&#149; <a href="../src/qh-stat.htm">Stat</a> &#149; <a href="../src/qh-user.htm">User</a>
+</p>
 
 <hr>
 <!-- Main text of document -->
@@ -29,14 +38,14 @@ height="100"></a> Qhull quick reference</h1>
 
 This section lists all programs and options in Qhull.
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <p>
-<a name=programs>&nbsp;</a>
+<a name="programs">&nbsp;</a>
 <hr>
 <b>Qhull programs</b>
-<p><a href="index.htm#TOC">»</a> <a href="qh-quick.htm#programs">Programs</a>
-<a name="print">&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+<p><a href="#TOC">»</a> <a href="qh-quick.htm#programs">Programs</a>
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -45,7 +54,7 @@ This section lists all programs and options in Qhull.
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
 &#149; <a href="qh-optt.htm#trace">Trace</a></p>
 
-	<dl>
+<dl>
     <dt><a href="qconvex.htm">qconvex</a> -- convex hull</dt>
     <dd><a href="qconvex.htm#synopsis">sy</a>nopsis &#149; <a
 	    href="qconvex.htm#input">in</a>put &#149; <a
@@ -53,7 +62,7 @@ This section lists all programs and options in Qhull.
         href="qconvex.htm#controls">co</a>ntrols &#149; <a
         href="qconvex.htm#graphics">gr</a>aphics &#149; <a 
         href="qconvex.htm#notes">no</a>tes &#149; <a 
-        href="qconvex.htm#conventions" <a>co</a>nventions &#149; <a
+        href="qconvex.htm#conventions">co</a>nventions &#149; <a
 		href="qconvex.htm#options">op</a>tions</dd>
     <dt>&nbsp;</dt>
     <dt><a href="qdelaun.htm">qdelaunay</a> -- Delaunay triangulation</dt>
@@ -83,7 +92,7 @@ This section lists all programs and options in Qhull.
         href="qhalf.htm#controls">co</a>ntrols &#149; <a
         href="qhalf.htm#graphics">gr</a>aphics &#149; <a 
         href="qhalf.htm#notes">no</a>tes &#149; <a 
-        href="qhalf.htm#conventions" <a>co</a>nventions &#149; <a
+        href="qhalf.htm#conventions">co</a>nventions &#149; <a
 		href="qhalf.htm#options">op</a>tions</dd>
     <dt>&nbsp;</dt>
     <dt><a href="qvoronoi.htm">qvoronoi</a> -- Voronoi diagram</dt>
@@ -120,12 +129,12 @@ This section lists all programs and options in Qhull.
         href="qhull.htm#controls">co</a>ntrols &#149; <a
 		href="qhull.htm#options">op</a>tions</dd>
     </dl>
-<a name=options>&nbsp;</a>
+<a name="options">&nbsp;</a>
 <hr>
 <b>Qhull options</b>
 
-<p><a href="index.htm#TOC">»</a> <a href="qh-quick.htm#programs">Programs</a>
-<a name="print">&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+<p><a href="#TOC">»</a> <a href="qh-quick.htm#programs">Programs</a>
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -135,9 +144,9 @@ This section lists all programs and options in Qhull.
 &#149; <a href="qh-optt.htm#trace">Trace</a></p>
 
 <p><table>
-
+<!-- Note: keep all lines the same for easy reorganization -->
 <tr>
-</nobr></td><td><nobr>'<a href=qh-optf.htm#Fa>Fa</a>'
+<td><nobr>'<a href=qh-optf.htm#Fa>Fa</a>'
 Farea
 </nobr></td><td><nobr>'<a href=qh-optf.htm#FA>FA</a>'
 FArea-total
@@ -147,7 +156,7 @@ Fcoplanars
 FCentrums
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optf.htm#Fd>Fd</a>'
+<td><nobr>'<a href=qh-optf.htm#Fd>Fd</a>'
 Fd-cdd-in
 </nobr></td><td><nobr>'<a href=qh-optf.htm#FD>FD</a>'
 FD-cdd-out
@@ -157,7 +166,7 @@ FF-dump-xridge
 Finner
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optf.htm#Fi2>Fi</a>'
+<td><nobr>'<a href=qh-optf.htm#Fi2>Fi</a>'
 Finner_bounded
 </nobr></td><td><nobr>'<a href=qh-optf.htm#FI>FI</a>'
 FIDs
@@ -167,7 +176,7 @@ Fmerges
 Fneighbors
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optf.htm#FN>FN</a>'
+<td><nobr>'<a href=qh-optf.htm#FN>FN</a>'
 FNeigh-vertex
 </nobr></td><td><nobr>'<a href=qh-optf.htm#Fo>Fo</a>'
 Fouter
@@ -177,7 +186,7 @@ Fouter_unbounded
 FOptions
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optf.htm#Fp>Fp</a>'
+<td><nobr>'<a href=qh-optf.htm#Fp>Fp</a>'
 Fpoint-intersect
 </nobr></td><td><nobr>'<a href=qh-optf.htm#FP>FP</a>'
 FPoint_near
@@ -187,7 +196,7 @@ FQhull
 Fsummary
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optf.htm#FS>FS</a>'
+<td><nobr>'<a href=qh-optf.htm#FS>FS</a>'
 FSize
 </nobr></td><td><nobr>'<a href=qh-optf.htm#Ft>Ft</a>'
 Ftriangles
@@ -197,16 +206,16 @@ Fvertices
 Fvoronoi
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optf.htm#FV>FV</a>'
+<td><nobr>'<a href=qh-optf.htm#FV>FV</a>'
 FVertex-ave
 </nobr></td><td><nobr>'<a href=qh-optf.htm#Fx>Fx</a>'
 Fxtremes
 </nobr></td><td colspan=2><nobr>
-<a href=qh-in.htm#joggle>Joggled input<a/> or merged facets
+<a href=qh-impre.htm#joggle>Joggled input</a> or merged facets
 
 </nobr></td></tr>
 <tr><td>&nbsp;</td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optp.htm#PAn>PAn</a>'
+<td><nobr>'<a href=qh-optp.htm#PAn>PAn</a>'
 PArea-keep
 </nobr></td><td><nobr>'<a href=qh-optp.htm#Pdk>Pdk:n</a>'
 Pdrop_low 
@@ -216,7 +225,7 @@ Pdrop_high
 Pgood
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optp.htm#PFn>PFn</a>'
+<td><nobr>'<a href=qh-optp.htm#PFn>PFn</a>'
 PFacet_area_keep
 </nobr></td><td><nobr>'<a href=qh-optp.htm#PG>PG</a>'
 PGood_neighbors
@@ -226,7 +235,7 @@ PMerge-keep
 Poutput_forced
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optp.htm#Po2>Po</a>'
+<td><nobr>'<a href=qh-optp.htm#Po2>Po</a>'
 Poutput_error
 </nobr></td><td><nobr>'<a href=qh-optp.htm#Pp>Pp</a>'
 Pprecision_not
@@ -243,7 +252,7 @@ Geomview
 Halfspace
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-opto.htm#f>f</a>'
+<td><nobr>'<a href=qh-opto.htm#f>f</a>'
 facet_dump
 </nobr></td><td><nobr>'<a href=qh-opto.htm#i>i</a>'
 incidences
@@ -253,7 +262,7 @@ mathematica
 normals
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-opto.htm#o>o</a>'
+<td><nobr>'<a href=qh-opto.htm#o>o</a>'
 OFF_format
 </nobr></td><td><nobr>'<a href=qh-opto.htm#p>p</a>'
 points
@@ -262,7 +271,7 @@ summary
 
 </nobr></td></tr>
 <tr><td>&nbsp;</td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optg.htm#Gv>Gv</a>'
+<td><nobr>'<a href=qh-optg.htm#Gv>Gv</a>'
 Gvertices
 </nobr></td><td><nobr>'<a href=qh-optg.htm#Gp>Gp</a>'
 Gpoints
@@ -272,7 +281,7 @@ Gall_points
 Gno_planes
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optg.htm#Gi>Gi</a>'
+<td><nobr>'<a href=qh-optg.htm#Gi>Gi</a>'
 Ginner
 </nobr></td><td><nobr>'<a href=qh-optg.htm#Gc>Gc</a>'
 Gcentrums
@@ -282,7 +291,7 @@ Ghyperplanes
 Gridges
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optg.htm#Go>Go</a>'
+<td><nobr>'<a href=qh-optg.htm#Go>Go</a>'
 Gouter
 </nobr></td><td><nobr>'<a href=qh-optg.htm#GDn>GDn</a>'
 GDrop_dim
@@ -291,7 +300,7 @@ Gtransparent
 
 </nobr></td></tr>
 <tr><td>&nbsp;</td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optt.htm#Tn>T4</a>'
+<td><nobr>'<a href=qh-optt.htm#Tn>T4</a>'
 T4_trace
 </nobr></td><td><nobr>'<a href=qh-optt.htm#Tc>Tc</a>'
 Tcheck_often
@@ -301,34 +310,37 @@ Tstatistics
 Tverify
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optt.htm#Tz>Tz</a>'
+<td><nobr>'<a href=qh-optt.htm#Tz>Tz</a>'
 Tz_stdout
 </nobr></td><td><nobr>'<a href=qh-optt.htm#TFn>TFn</a>'
 TFacet_log
+<td><nobr>'<a href=qh-optt.htm#TI>TI file</a>'
+TInput_file
 </nobr></td><td><nobr>'<a href=qh-optt.htm#TPn>TPn</a>'
 TPoint_trace
-</nobr></td><td><nobr>'<a href=qh-optt.htm#TMn>TMn</a>'
-TMerge_trace
 
 </nobr></td></tr><tr>
+<td><nobr>'<a href=qh-optt.htm#TMn>TMn</a>'
+TMerge_trace
 </nobr></td><td><nobr>'<a href=qh-optt.htm#TO>TO file</a>'
 TOutput_file
 </nobr></td><td><nobr>'<a href=qh-optt.htm#TRn>TRn</a>'
 TRerun
 </nobr></td><td><nobr>'<a href=qh-optt.htm#TWn>TWn</a>'
 TWide_trace
-</nobr></td><td><nobr>'<a href=qh-optt.htm#TVn>TV-n</a>'
-TVertex_stop_before
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optt.htm#TVn2>TVn</a>'
+<td><nobr>'<a href=qh-optt.htm#TVn>TV-n</a>'
+TVertex_stop_before
+</nobr></td></tr><tr>
+<td><nobr>'<a href=qh-optt.htm#TVn2>TVn</a>'
 TVertex_stop_after
 </nobr></td><td><nobr>'<a href=qh-optt.htm#TCn>TCn</a>'
 TCone_stop_after
 
 </nobr></td></tr>
 <tr><td>&nbsp;</td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optc.htm#An>A-n</a>'
+<td><nobr>'<a href=qh-optc.htm#An>A-n</a>'
 Angle_max_pre
 </nobr></td><td><nobr>'<a href=qh-optc.htm#An2>An</a>'
 Angle_max_post
@@ -338,7 +350,7 @@ Centrum_roundoff
 Centrum_size_pre
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optc.htm#Cn2>Cn</a>'
+<td><nobr>'<a href=qh-optc.htm#Cn2>Cn</a>'
 Centrum_size_post
 </nobr></td><td><nobr>'<a href=qh-optc.htm#En>En</a>'
 Error_round
@@ -348,14 +360,14 @@ Random_dist
 Visible_min
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optc.htm#Un>Un</a>'
+<td><nobr>'<a href=qh-optc.htm#Un>Un</a>'
 Ucoplanar_max
 </nobr></td><td><nobr>'<a href=qh-optc.htm#Wn>Wn</a>'
 Wide_outside
 
 </nobr></td></tr>
 <tr><td>&nbsp;</td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Qbk>Qbk:n</a>'
+<td><nobr>'<a href=qh-optq.htm#Qbk>Qbk:n</a>'
 Qbound_low
 </nobr></td><td><nobr>'<a href=qh-optq.htm#QBk>QBk:n</a>'
 QBound_high
@@ -365,7 +377,7 @@ Qbound_drop
 QbB-scale-box
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Qbb>Qbb</a>'
+<td><nobr>'<a href=qh-optq.htm#Qbb>Qbb</a>'
 Qbb-scale-last
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Qc>Qc</a>'
 Qcoplanar
@@ -375,7 +387,7 @@ Qfurthest
 Qgood_only
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#QGn>QGn</a>'
+<td><nobr>'<a href=qh-optq.htm#QGn>QGn</a>'
 QGood_point
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Qi>Qi</a>'
 Qinterior
@@ -385,27 +397,32 @@ Qmax_out
 QJoggle
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Qr>Qr</a>'
+<td><nobr>'<a href=qh-optq.htm#Qr>Qr</a>'
 Qrandom
 </nobr></td><td><nobr>'<a href=qh-optq.htm#QRn>QRn</a>'
 QRotate
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Qs>Qs</a>'
 Qsearch_1st
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Qu>Qu</a>'
-QupperDelaunay
+</nobr></td><td><nobr>'<a href=qh-optq.htm#Qt>Qt</a>'
+Qtriangulate
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#QVn>QVn</a>'
+<td><nobr>'<a href=qh-optq.htm#Qu>Qu</a>'
+QupperDelaunay
+</nobr><td><nobr>'<a href=qh-optq.htm#QVn>QVn</a>'
 QVertex_good
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Qv>Qv</a>'
 Qvneighbors
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Qx>Qx</a>'
 Qxact_merge
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Qz>Qz</a>'
-Qzinfinite
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Q0>Q0</a>'
+<td><nobr>'<a href=qh-optq.htm#Qz>Qz</a>'
+Qzinfinite
+
+</nobr></td></tr>
+<tr><td>&nbsp;</td></tr><tr>
+<td><nobr>'<a href=qh-optq.htm#Q0>Q0</a>'
 Q0_no_premerge
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Q1>Q1</a>'
 Q1_no_angle
@@ -415,7 +432,7 @@ Q2_no_independ
 Q3_no_redundant
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Q4>Q4</a>'
+<td><nobr>'<a href=qh-optq.htm#Q4>Q4</a>'
 Q4_no_old
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Q5>Q5</a>'
 Q5_no_check_out
@@ -425,10 +442,14 @@ Q6_no_concave
 Q7_depth_first
 
 </nobr></td></tr><tr>
-</nobr></td><td><nobr>'<a href=qh-optq.htm#Q8>Q8</a>'
+<td><nobr>'<a href=qh-optq.htm#Q8>Q8</a>'
 Q8_no_near_in
 </nobr></td><td><nobr>'<a href=qh-optq.htm#Q9>Q9</a>'
 Q9_pick_furthest
+</nobr></td><td><nobr>'<a href=qh-optq.htm#Q10>Q10</a>'
+Q10_no_narrow
+</nobr></td><td><nobr>'<a href=qh-optq.htm#Q11>Q11</a>'
+Q11_trinormals
 </td></tr></table>
 
 <!-- Navigation links -->
@@ -438,14 +459,22 @@ Q9_pick_furthest
 page for Qhull</a> <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a> <br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
 &#149; <a href="qh-optp.htm#print">Print</a>
 &#149; <a href="qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="qh-optc.htm#prec">Precision</a> 
-&#149; <a href="qh-optt.htm#trace">Trace</a></p>
+&#149; <a href="qh-optt.htm#trace">Trace</a><br>
+<b>To:</b> <a href="qh-in.htm#TOC">Qhull internals</a><br>
+<b>To:</b> <a href="../src/index.htm">Qhull functions</a>, macros, and data structures<br>
+<b>To:</b> <a href="../src/index.htm#TOC">Qhull files</a><br>
+<b>To:</b> <a href="../src/qh-geom.htm">Geom</a> &#149; <a href="../src/qh-globa.htm">Global</a>
+&#149; <a href="../src/qh-io.htm">Io</a> &#149; <a href="../src/qh-mem.htm">Mem</a>
+&#149; <a href="../src/qh-merge.htm">Merge</a> &#149; <a href="../src/qh-poly.htm">Poly</a>
+&#149; <a href="../src/qh-qhull.htm">Qhull</a> &#149; <a href="../src/qh-set.htm">Set</a>
+&#149; <a href="../src/qh-stat.htm">Stat</a> &#149; <a href="../src/qh-user.htm">User</a><br>
 <!-- GC common information -->
 <hr>
 
diff --git a/html/qhalf.htm b/html/qhalf.htm
index 90e6082..bcd05ca 100644
--- a/html/qhalf.htm
+++ b/html/qhalf.htm
@@ -10,7 +10,7 @@
 <p><a name="TOP"><b>Up</b></a><b>:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -21,7 +21,7 @@
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 
 <hr>
@@ -57,9 +57,14 @@ See <a href="qh-eg.htm#half">halfspace examples</a>,
 <a href="#notes">qhalf notes</a>, and
 option 'p' of <a href="#outputs">qhalf outputs</a>. </p>
 
-<p>If you use '<a href="qh-optq.htm#QJn">QJ</a>' (joggle), all halfspace 
-intersections are simplicial (e.g., three halfspaces per 
-intersection in 3-d).  Coincident intersections will be 
+<p>If you use '<a href="qh-optq.htm#Qt">Qt</a>' (triangulated output), all
+halfspace intersections are simplicial (e.g., three halfspaces per 
+intersection in 3-d).  In 3-d, if more than three halfspaces intersect
+at the same point, option '<a href="qh-optq.htm#Qt">Qt</a>' will produce 
+duplicate intersections, one for each additional halfspace.</p>
+
+<p>If you use '<a href="qh-optq.htm#QJn">QJ</a>' (joggled input), all halfspace 
+intersections are simplicial.  Coincident intersections will be 
 joggled apart. If you do not use
 'QJ', <tt>qhalf</tt> merges coincident intersections.  This is more accurate
 than joggled input.  See <a
@@ -70,13 +75,13 @@ href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 '<a href=qhull.htm#outputs>qhull H</a> <a href=qh-optq.htm#Qx>Qx</a>' 
 in 5-d and higher.  It disables the following Qhull
 <a href=qh-quick.htm#options>options</a>: <i>d n v Qbb QbB Qf Qg Qm 
-Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9</i>.
+Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc</i>.
 
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 
-<h3><a href="#TOP">»</a><a name="synopsis">qhalf synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">qhalf synopsis</a></h3>
 <pre>
 qhalf- halfspace intersection about a point.
     input (stdin): [dim, 1, interior point]
@@ -86,6 +91,7 @@ qhalf- halfspace intersection about a point.
 
 options (qhalf.htm):
     Hn,n - specify coordinates of interior point
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
     Tv   - verify result: structure, convexity, and redundancy
     .    - concise list of all options
@@ -112,7 +118,7 @@ examples:
 
 <blockquote>
 <p>The input data on <tt>stdin</tt> consists of:</p>
-<ul compact="COMPACT">
+<ul>
     <li>[optional] interior point
 	   <ul>
 	   <li>dimension
@@ -217,7 +223,7 @@ intersection.</p>
 		starts with the number of neighboring intersections.  For the cube
 		example, each intersection point has three neighboring intersections.
 		In 3-d, a non-simplicial intersection has more than three neighboring
-		intersections.  Use option '<a href="qh-optq.htm#QJ">QJ</a>' to 
+		intersections.  Use option '<a href="qh-optq.htm#QJn">QJ</a>' to 
 		avoid non-simplicial intersections.
 	     </dd>
     <dt><a href="qh-optf.htm#Fp">Fp</a></dt>
@@ -294,6 +300,10 @@ intersection.</p>
 
 <blockquote>
 <dl compact>
+    <dt><a href="qh-optq.htm#Qt">Qt</a></dt>
+    <dd>triangulated output.  If a 3-d intersection is defined by more than
+      three hyperplanes, Qhull produces duplicate intersections -- one for
+      each extra hyperplane.</dd>
     <dt><a href="qh-optq.htm#QJn">QJ</a></dt>
     <dd>joggle the input instead of merging facets.  In 3-d, this guarantees that
 	each intersection is defined by three hyperplanes.</dd>
@@ -312,11 +322,13 @@ intersection.</p>
 	<dt><a href="qh-optq.htm#Qb0">Qbk:0Bk:0</a></dt>
     <dd>remove the k-th coordinate from the input.  This computes the
 	halfspace intersection in one lower dimension.</dd>
+    <dt><a href="qh-optt.htm#Tv">Tv</a></dt>
+    <dd>verify result</dd>
+    <dt><a href="qh-optt.htm#TO">TI file</a></dt>
+    <dd>input data from file.  The filename may not use spaces or quotes.</dd>
     <dt><a href="qh-optt.htm#TO">TO file</a></dt>
     <dd>output results to file.  Use single quotes if the filename
 	contains spaces (e.g., <tt>TO 'file with spaces.txt'</tt></dd>
-    <dt><a href="qh-optt.htm#Tv">Tv</a></dt>
-    <dd>verify result</dd>
     <dt><a href="qh-optq.htm#Qs">Qs</a></dt>
     <dd>search all points for the initial simplex.  If Qhull can 
 	not construct an initial simplex, it reports a
@@ -384,7 +396,7 @@ conventions</a></h3>
 in Qhull. This is the hardest structure to understand. The
 underlying structure is a convex hull with one vertex per
 non-redundant halfspace. See <a href="#conventions">convex hull
-conventions</a>.</p>
+conventions</a> and <a href="index.htm#structure">Qhull's data structures</a>.</p>
 
 <ul>
     <li><em>interior point</em> - a point in the intersection of
@@ -427,6 +439,7 @@ input (stdin):
 
 options:
     Hn,n - specify coordinates of interior point
+    Qt   - triangulated ouput
     QJ   - joggle input instead of merging facets
     Qc   - keep coplanar halfspaces
     Qi   - keep other redundant halfspaces
@@ -445,6 +458,7 @@ Trace options:
     Tv   - verify result: structure, convexity, and redundancy
     Tz   - send all output to stdout
     TFn  - report summary when n or more facets created
+    TI file - input data from file, no spaces or single quotes
     TO file - output results to file, may be enclosed in single quotes
     TPn  - turn on tracing when halfspace n added to intersection
     TMn  - turn on tracing at merge n
@@ -503,7 +517,7 @@ Geomview output (2-d, 3-d and 4-d; dual convex hull)
 
 Print options:
     PAn  - keep n largest facets (i.e., intersections) by area
-    Pdk:n- drop facet if normal[k] <= n (default 0.0)
+    Pdk:n- drop facet if normal[k] &lt;= n (default 0.0)
     PDk:n- drop facet if normal[k] >= n
     Pg   - print good facets (needs 'QGn' or 'QVn')
     PFn  - keep facets whose area is at least n
@@ -522,7 +536,7 @@ Print options:
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -533,7 +547,7 @@ Print options:
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 <!-- GC common information -->
 <hr>
diff --git a/html/qhull.htm b/html/qhull.htm
index 76dbb41..05e31ed 100644
--- a/html/qhull.htm
+++ b/html/qhull.htm
@@ -10,7 +10,7 @@
 <p><b><a name="TOP">Up</a></b><b>:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -39,7 +39,7 @@ structures and to experiment with the process.  Use the
 <a href=qconvex.htm>qconvex</a>,
 <a href=qdelaun.htm>qdelaunay</a>, <a href=qhalf.htm>qhalf</a>, 
 and <a href=qvoronoi.htm>qvoronoi</a> programs
-to build specific structures.  You can use <tt>qhull</tt> instead.
+to build specific structures.  You may use <tt>qhull</tt> instead.
 It takes the same options and uses the same code.  
 <blockquote>
 <dl>
@@ -95,12 +95,16 @@ Delaunay triangulation is a 5-d convex hull):
 </blockquote>
 
 
-<p>If you use '<a href="qh-optq.htm#QJn">QJ</a>' (joggle), all facets 
-will be simplicial (e.g., triangles in 3-d).  Duplicate points will 
-be joggled apart. If you do not use
-'QJ' or '<a href="qh-optq.htm#Q0">Q0</a>', 
-<tt>qhull</tt> merges coplanar facets.  This is more accurate
-than joggled input.  See <a
+<p>If you use '<a href="qh-optq.htm#Qt">Qt</a>' (triangulated output), 
+all furthest-site Delaunay regions 
+will be simplicial (e.g., triangles in 2-d).  Some regions may be
+degenerate and have zero area.  Qhull can identify coincident
+points.  With facet merging, cocircular and cospherical extreme points will lead
+to non-simplicial output (e.g., a square).
+
+<p>If you use '<a href="qh-optq.htm#QJn">QJ</a>' (joggle), all furthest-site 
+Delaunay regions will be simplicial (e.g., triangles in 2-d).  Duplicate points will 
+create small regions since the points are joggled apart.  See <a
 href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 
 <p>The output for 4-d convex hulls may be confusing if the convex
@@ -109,11 +113,11 @@ hull contains non-simplicial facets (e.g., a hypercube). See
 are there extra points in a 4-d or higher convex hull?</a><br>
 </p>
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
-<h3><a href="#TOP">»</a><a name="synopsis">qhull synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">qhull synopsis</a></h3>
 <pre>
 qhull- compute convex hulls and related structures. 
     input (stdin): dimension, n, point coordinates
@@ -126,6 +130,7 @@ options (qh-quick.htm):
     v    - Voronoi diagram as the dual of the Delaunay triangulation
     v Qu - furthest-site Voronoi diagram
     H1,1 - Halfspace intersection about [1,1,0,...] via polar duality
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
     Tv   - verify result: structure, convexity, and point inclusion
     .    - concise list of all options
@@ -148,7 +153,7 @@ Output options (subset):
 
 examples:
     rbox c d D2 | qhull Qc s f Fx | more      rbox 1000 s | qhull Tv s FA
-    rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v QJ p
+    rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v Qt p
     rbox 10 D2 | qhull d Qu QJ m              rbox 10 D2 | qhull v Qu QJ o
     rbox c | qhull n                          rbox c | qhull FV n | qhull H Fp
     rbox d D12 | qhull QR0 FA                 rbox c D7 | qhull FA TF1000
@@ -159,7 +164,7 @@ examples:
 <blockquote>
 
 <p>The input data on <tt>stdin</tt> consists of:</p>
-<ul compact="COMPACT">
+<ul>
     <li>dimension
     <li>number of points</li>
     <li>point coordinates</li>
@@ -277,7 +282,7 @@ input (stdin):
     other lines: point coordinates, best if one point per line
     comments:    start with a non-numeric character
     halfspaces:  use dim plus one and put offset after coefficients.
-                 May be preceeded by a single interior point ('H').
+                 May be preceded by a single interior point ('H').
 
 options:
     d    - Delaunay triangulation by lifting points to a paraboloid
@@ -285,6 +290,7 @@ options:
     v    - Voronoi diagram (dual of the Delaunay triangulation)
     v Qu - furthest-site Voronoi diagram
     Hn,n,... - halfspace intersection about point [n,n,0,...]
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
     Qc   - keep coplanar points with nearest facet
     Qi   - keep interior points with nearest facet
@@ -305,28 +311,31 @@ Qhull control options:
     Qu   - for 'd' or 'v', compute upper hull without point at-infinity
               returns furthest-site Delaunay triangulation
     Qv   - test vertex neighbors for convexity
-    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)
+    Qx   - exact pre-merges (skips coplanar and anglomaniacs facets)
     Qz   - add point-at-infinity to Delaunay triangulation
     QGn  - good facet if visible from point n, -n for not visible
     QVn  - good facet if it includes point n, -n if not
-    Q0   - turn off default premerge with 'C-0'/'Qx'
+    Q0   - turn off default p remerge with 'C-0'/'Qx'
     Q1	   - sort merges by type instead of angle
     Q2   - merge all non-convex at once instead of independent sets
     Q3   - do not merge redundant vertices
-    Q4   - avoid old->new merges
+    Q4   - avoid old>new merges
     Q5   - do not correct outer planes at end of qhull
     Q6   - do not pre-merge concave or coplanar facets
     Q7   - depth-first processing instead of breadth-first
     Q8   - do not process near-inside points
     Q9   - process furthest of furthest points
+    Q10  - no special processing for narrow distributions
+	Q11  - copy normals and recompute centrums for tricoplanar facets
 
-Topts- Trace options:
+Towpaths Trace options:
     T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
     Tc   - check frequently during execution
     Ts   - print statistics
     Tv   - verify result: structure, convexity, and point inclusion
     Tz   - send all output to stdout
     TFn  - report summary when n or more facets created
+    TI file - input data from file, no spaces or single quotes
     TO file - output results to file, may be enclosed in single quotes
     TPn  - turn on tracing when point n added to hull
      TMn - turn on tracing at merge n
@@ -402,7 +411,7 @@ Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)
 
 Print options:
     PAn  - keep n largest facets by area
-    Pdk:n - drop facet if normal[k] <= n (default 0.0)
+    Pdk:n - drop facet if normal[k] &lt;= n (default 0.0)
     PDk:n - drop facet if normal[k] >= n
     Pg   - print good facets (needs 'QGn' or 'QVn')
     PFn  - keep facets whose area is at least n
@@ -421,7 +430,7 @@ Print options:
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/html/qhull.man b/html/qhull.man
index 57a0dea..a4fcaf2 100644
--- a/html/qhull.man
+++ b/html/qhull.man
@@ -12,7 +12,7 @@
 ./"
 ./"  Warning: a leading quote "'" or dot "." will not format correctly
 ./"
-.TH qhull 1 "February 11, 2001" "Geometry Center"
+.TH qhull 1 "October 4, 2001" "Geometry Center"
 .SH NAME
 qhull \- convex hull, Delaunay triangulation, Voronoi diagram, 
 halfspace intersection about a point, hull volume, facet area
@@ -29,6 +29,7 @@ options (qh-quick.htm):
     H1,1   - Halfspace intersection about [1,1,0,...]
     d Qu   - Furthest-site Delaunay triangulation (upper convex hull)
     v Qu   - Furthest-site Voronoi diagram
+    Qt     - triangulated output
     QJ     - Joggle the input to avoid precision problems
     .      - concise list of all options
     -      - one-line description of all options
@@ -666,9 +667,7 @@ Only the n facets with the most merges are marked good for printing.
 Unless 'PG' is set, 'Pg' is automatically set. 
 .TP
 Po
-Force output despite precision problems.  The maximum outside distance
-is not determined (qh_check_maxout).
-Verify ('Tv') does not check
+Force output despite precision problems.  Verify ('Tv') does not check
 coplanar points.
 Flipped facets are reported and concave facets are counted.  
 If 'Po' is used, points are not 
@@ -744,7 +743,7 @@ not increase n beyond a certain value, and it stops after a certain number
 of attempts [see user.h].  Option 'QJ'
 selects a default value for n.  The output will be simplicial.  For
 Delaunay triangulations, 'QJn' sets 'Qbb' to scale the last coordinate
-(not if 'Qbk:n' or 'QBk:n' is set).
+(not if 'Qbk:n' or 'QBk:n' is set).  See also 'Qt'.
 .TP
 Qm
 Only process points that would otherwise increase max_outside.  Other
@@ -764,6 +763,9 @@ rotate about the last axis.
 Qs
 Search all points for the initial simplex.
 .TP
+Qt
+Triangulated output.  Triangulate all non-simplicial facets.  See also 'QJ'.
+.TP
 Qv
 Test vertex neighbors for convexity after post-merging.
 To use the 'Qv' option, you also need to set a merge option
@@ -833,6 +835,12 @@ all points that adjust outer planes.
 .TP
 Q9
 With 'Q9', Qhull processes the furthest of all outside sets at each iteration.
+.TP
+Q10
+With 'Q10', Qhull does not use special processing for narrow distributions.
+.TP
+Q11
+With 'Q11', Qhull copies normals and recompute centrums for tricoplanar facets.
 .PP
 .TP
 Trace options
@@ -859,12 +867,18 @@ Report progress whenever more than n facets are created
 During post-merging, 'TFn' 
 reports progress after more than n/2 merges.
 .TP
+TI file
+Input data from 'file'.  The filename may not include spaces or
+quotes.
+.TP
 TO file
 Output results to 'file'.  The name may be enclosed in single
 quotes.
 .TP
 TPn
-Turn on tracing when point n is added to the hull. 
+Turn on tracing when point n is added to the hull.  Trace
+partitions of point n.  If used with TWn, turn off
+tracing after adding point n to the hull.
 .TP
 TRn
 Rerun qhull n times.  Usually used with 'QJn' to determine the
diff --git a/html/qhull.txt b/html/qhull.txt
index c133c48..5b59629 100644
--- a/html/qhull.txt
+++ b/html/qhull.txt
@@ -60,7 +60,7 @@ SYNOPSIS
 
 
 
-Geometry Center		February 11, 2001			1
+Geometry Center		October 4, 2001			1
 
 
 
@@ -126,7 +126,7 @@ DESCRIPTION
 
 
 
-Geometry Center		February 11, 2001			2
+Geometry Center		October 4, 2001			2
 
 
 
@@ -192,7 +192,7 @@ OPTIONS
 
 
 
-Geometry Center		February 11, 2001			3
+Geometry Center		October 4, 2001			3
 
 
 
@@ -258,7 +258,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001			4
+Geometry Center		October 4, 2001			4
 
 
 
@@ -274,6 +274,8 @@ qhull(1)						 qhull(1)
 	      indicates	 unbounded Voronoi regions and degenerate
 	      Delaunay triangles.
 
+       Qt     Triangulated output.
+
 
        Input/Output options:
 
@@ -324,7 +326,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001			5
+Geometry Center		October 4, 2001			5
 
 
 
@@ -390,7 +392,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001			6
+Geometry Center		October 4, 2001			6
 
 
 
@@ -456,7 +458,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001			7
+Geometry Center		October 4, 2001			7
 
 
 
@@ -522,7 +524,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001			8
+Geometry Center		October 4, 2001			8
 
 
 
@@ -588,7 +590,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001			9
+Geometry Center		October 4, 2001			9
 
 
 
@@ -654,7 +656,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       10
+Geometry Center		October 4, 2001		       10
 
 
 
@@ -720,7 +722,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       11
+Geometry Center		October 4, 2001		       11
 
 
 
@@ -786,7 +788,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       12
+Geometry Center		October 4, 2001		       12
 
 
 
@@ -808,9 +810,7 @@ qhull(1)						 qhull(1)
 	      good for printing.  Unless 'PG'  is  set,	 'Pg'  is
 	      automatically set.
 
-       Po     Force output despite precision problems.	The maxi-
-	      mum   outside   distance	  is	not    determined
-	      (qh_check_maxout).   Verify  ('Tv')  does	not check
+       Po     Force output despite precision problems.	Verify  ('Tv')  does	not check
 	      coplanar points.	Flipped	facets are  reported  and
 	      concave  facets  are  counted.   If  'Po'	 is used,
 	      points are not partitioned into flipped facets  and
@@ -852,7 +852,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       13
+Geometry Center		October 4, 2001		       13
 
 
 
@@ -897,7 +897,8 @@ qhull(1)						 qhull(1)
 	      Option 'QJ' selects a default  value  for	 n.   The
 	      output will be simplicial.  For Delaunay triangula-
 	      tions, 'QJn' sets	'Qbb' to scale the  last  coordi-
-	      nate (not	if 'Qbk:n' or 'QBk:n' is set).
+	      nate (not	if 'Qbk:n' or 'QBk:n' is set).  See also
+	      'Qt'.
 
        Qm     Only  process  points that would otherwise increase
 	      max_outside.  Other points are treated as	 coplanar
@@ -918,7 +919,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       14
+Geometry Center		October 4, 2001		       14
 
 
 
@@ -929,6 +930,9 @@ qhull(1)						 qhull(1)
 
        Qs     Search all points	for the	initial	simplex.
 
+       Qt     Triangulated output.  Triangulate non-simplicial 
+              facets.
+
        Qv     Test  vertex  neighbors  for  convexity after post-
 	      merging.	To use the 'Qv'	option,	you also need  to
 	      set a merge option (e.g.,	'Qx' or	'C-0').
@@ -984,7 +988,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       15
+Geometry Center		October 4, 2001		       15
 
 
 
@@ -1007,6 +1011,11 @@ qhull(1)						 qhull(1)
        Q9     With 'Q9', Qhull processes the furthest of all out-
 	      side sets	at each	iteration.
 
+       Q10    With 'Q10', Qhull does not use special processing 
+	      for narrow distributions.
+
+       Q11    With 'Q11', Qhull copies normals and recomputes 
+	      centrums for tricoplanar facets.
 
        Trace options
 
@@ -1029,11 +1038,17 @@ qhull(1)						 qhull(1)
 	      created During post-merging, 'TFn' reports progress
 	      after more than n/2 merges.
 
+       TI file
+	      Input data from 'file'.  The filename may not include 
+		  spaces or quotes.
+
        TO file
 	      Output results to	'file'.	 The name may be enclosed
 	      in single	quotes.
 
        TPn    Turn on tracing when point n is added to the  hull.
+          Trace partitions of point n. If used with TWn, turn off
+          tracing after adding point n to the hull.
 
        TRn    Rerun  qhull  n  times.  Usually used with 'QJn' to
 	      determine	the probability	that a given joggle  will
@@ -1050,7 +1065,7 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       16
+Geometry Center		October 4, 2001		       16
 
 
 
@@ -1116,7 +1131,7 @@ BUGS
 
 
 
-Geometry Center		February 11, 2001		       17
+Geometry Center		October 4, 2001		       17
 
 
 
@@ -1182,7 +1197,7 @@ ACKNOWLEDGEMENTS
 
 
 
-Geometry Center		February 11, 2001		       18
+Geometry Center		October 4, 2001		       18
 
 
 
@@ -1248,6 +1263,6 @@ qhull(1)						 qhull(1)
 
 
 
-Geometry Center		February 11, 2001		       19
+Geometry Center		October 4, 2001		       19
 
 
diff --git a/html/qvoron_f.htm b/html/qvoron_f.htm
index d2fe927..b483b0d 100644
--- a/html/qvoron_f.htm
+++ b/html/qvoron_f.htm
@@ -7,10 +7,11 @@
 
 <body>
 <!-- Navigation links -->
-<p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
+<a name="TOP"><b>Up</b></a><b>:</b> 
+<a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -21,7 +22,7 @@
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 
 <hr>
@@ -43,13 +44,11 @@ href="qdelau_f.htm">furthest-site Delaunay triangulation</a>.
 <blockquote>
 <dl>
     <dt><b>Example:</b> rbox 10 D2 | qvoronoi <a
-        href="qh-optq.htm#Qu">Qu</a> <a
-        href="qh-optq.htm#QJn">QJ</a> <a href="qh-opto.htm#s">s</a>
+        href="qh-optq.htm#Qu">Qu</a>  <a href="qh-opto.htm#s">s</a>
         <a href="qh-opto.htm#o">o</a> <a href="qh-optt.htm#TO">TO
         result</a></dt>
     <dd>Compute the 2-d, furthest-site Voronoi diagram of 10
-        random points. Joggle the input to guarantee triangular
-        output. Write a summary to the console and the Voronoi
+        random points. Write a summary to the console and the Voronoi
         regions and vertices to 'result'. The first vertex of the
         result indicates unbounded regions. Almost all regions
         are unbounded.</dd>
@@ -80,28 +79,24 @@ region corresponds to a vertex of the Delaunay triangulation
 <p>See <a href="qh-faq.htm#TOC">Qhull FAQ</a> - Delaunay and
 Voronoi diagram questions.</p>
 
-<p>If you use option '<a href="qh-optq.htm#QJn">QJ</a>' (joggle),
-coincident points will create small triangles and cocircular or
-cospherical input sites create multiple Voronoi vertices. If you
-do not use 'QJ', <tt>qvoronoi</tt>
-reports one Voronoi vertex for cocircular or cospherical input
-sites.  This is more accurate
-than joggled input. 
-See <a href="qh-impre.htm#joggle">Joggled input or merged
-facets</a>. </p>
+<p>Options '<a href="qh-optq.htm#Qt">Qt</a>' (triangulated output)
+and '<a href="qh-optq.htm#QJn">QJ</a>' (joggled input), may produce
+unexpected results.   Cocircular and cospherical input sites will
+produce duplicate or nearly duplicate furthest-site Voronoi vertices.  See also <a
+href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 
 <p>The 'qvonoroi' program is equivalent to 
 '<a href=qhull.htm#outputs>qhull v</a> <a href=qh-optq.htm#Qbb>Qbb</a>' in 2-d to 3-d, and
 '<a href=qhull.htm#outputs>qhull v</a> <a href=qh-optq.htm#Qbb>Qbb</a> <a href=qh-optq.htm#Qx>Qx</a>' 
 in 4-d and higher.  It disables the following Qhull
 <a href=qh-quick.htm#options>options</a>: <i>d n m v H U Qb 
-QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9</i>.
+QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Gt Q0,etc</i>.
 
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
-<h3><a href="#TOP">»</a><a name="synopsis">furthest-site qvoronoi synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">furthest-site qvoronoi synopsis</a></h3>
 <blockquote>
 
 See <a href="qvoronoi.htm#synopsis">qvoronoi synopsis</a>.  The same
@@ -114,7 +109,7 @@ for furthest-site Voronoi diagrams.
 input</a></h3>
 <blockquote>
 <p>The input data on <tt>stdin</tt> consists of:</p>
-<ul compact="COMPACT">
+<ul>
     <li>dimension 
     <li>number of points</li>
     <li>point coordinates</li>
@@ -272,6 +267,10 @@ controls</a></h3>
 <dl compact>
    <dt><a href="qh-optq.htm#Qu">Qu</a></dt>
     <dd>must be used.</dd>
+    <dt><a href="qh-optq.htm#Qt">Qt</a></dt>
+    <dd>triangulated output.  If a furthest-site Voronoi vertex is defined by cospherical data, Qhull
+    duplicates the vertex.  For example, if 2-d data is contained in a square, the output
+    will contain two, identical furthest-site Voronoi vertices.</dd>
     <dt><a href="qh-optq.htm#QJn">QJ</a></dt>
     <dd>joggle the input to avoid furthest-site Voronoi vertices defined by more
 	than <i>dim+1</i> points.
@@ -280,11 +279,16 @@ controls</a></h3>
     <dd>select furthest-site Voronoi vertices for input site <em>n</em> </dd>
     <dt><a href="qh-optt.htm#Tv">Tv</a></dt>
     <dd>verify result</dd>
+    <dt><a href="qh-optt.htm#TO">TI file</a></dt>
+    <dd>input data from file.  The filename may not use spaces or quotes.</dd>
+    <dt><a href="qh-optt.htm#TO">TO file</a></dt>
+    <dd>output results to file.  Use single quotes if the filename
+	contains spaces (e.g., <tt>TO 'file with spaces.txt'</tt></dd>
     <dt><a href="qh-optt.htm#TFn">TFn</a></dt>
     <dd>report progress after constructing <em>n</em> facets</dd>
     <dt><a href="qh-optp.htm#PDk">PDk:1</a></dt>
     <dd>include upper and lower facets in the output.  Set <em>k</em>
-        to the last dimension (e.g., 2 for 2-d inputs). </dd>
+        to the last dimension (e.g., 'PD2:1' for 2-d inputs). </dd>
     <dt><a href="qh-opto.htm#f">f </a></dt>
     <dd>facet dump.  Print the data structure for each facet (i.e., 
 	furthest-site Voronoi vertex).</dd>
@@ -326,9 +330,9 @@ to vertices of the furthest-site Voronoi diagram. Vertices of the
 furthest-site Delaunay triangulation correspond to input sites.
 They also define regions of the furthest-site Voronoi diagram.
 All vertices are extreme points of the input sites. See <a
-href="qconvex.htm#conventions">qconvex conventions</a> and <a
+href="qconvex.htm#conventions">qconvex conventions</a>, <a
 href="qdelau_f.htm#conventions">furthest-site delaunay
-conventions</a>.</p>
+conventions</a>, and <a href="index.htm#structure">Qhull's data structures</a>.</p>
 
 <ul>
     <li><em>input site</em> - a point in the input (one dimension
@@ -338,6 +342,9 @@ conventions</a>.</p>
         site's coordinates</li>
     <li><em>vertex</em> - a point on the upper facets of the
         paraboloid. It corresponds to a unique input site. </li>
+    <li><em>furthest-site Delaunay facet</em> - an upper facet of the
+        paraboloid. The last coefficient of its normal is
+		clearly positive.</li>
     <li><em>furthest-site Voronoi vertex</em> - the circumcenter
         of a furthest-site Delaunay facet</li>
     <li><em>furthest-site Voronoi region</em> - the region of
@@ -356,7 +363,6 @@ conventions</a>.</p>
         etc.</li>
 </ul>
 
-</blockquote>
 </blockquote>
 <h3><a href="#TOP">»</a><a name="options">furthest-site qvoronoi options</a></h3>
 <blockquote>
@@ -372,7 +378,7 @@ for furthest-site Voronoi diagrams.
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -383,7 +389,7 @@ for furthest-site Voronoi diagrams.
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 <!-- GC common information -->
 <hr>
diff --git a/html/qvoronoi.htm b/html/qvoronoi.htm
index ade0de6..6240bfe 100644
--- a/html/qvoronoi.htm
+++ b/html/qvoronoi.htm
@@ -7,10 +7,11 @@
 
 <body>
 <!-- Navigation links -->
-<p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
+<a name="TOP"><b>Up</b></a><b>:</b> 
+<a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -21,7 +22,7 @@
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 
 <hr>
@@ -41,12 +42,10 @@ dual of the <a href=qdelaun.htm>Delaunay triangulation</a>. </p>
 
 <blockquote>
 <dl>
-    <dt><b>Example:</b> rbox 10 D3 | qvoronoi <a
-        href="qh-optq.htm#QJn">QJ</a> <a href="qh-opto.htm#s">s</a>
+    <dt><b>Example:</b> rbox 10 D3 | qvoronoi <a href="qh-opto.htm#s">s</a>
         <a href="qh-opto.htm#o">o</a> <a href="qh-optt.htm#TO">TO
         result</a></dt>
-    <dd>Compute the 3-d Voronoi diagram of 10 random points.
-        Joggle the input to guarantee triangular output. Write a
+    <dd>Compute the 3-d Voronoi diagram of 10 random points. Write a
         summary to the console and the Voronoi vertices and
         regions to 'result'. The first vertex of the result
         indicates unbounded regions.</dd>
@@ -103,27 +102,23 @@ for further processing [see <a href="#graphics">graphics</a>].</p>
 <p>See <a href="qh-faq.htm#TOC">Qhull FAQ</a> - Delaunay and
 Voronoi diagram questions.</p>
 
-<p>If you use option '<a href="qh-optq.htm#QJn">QJ</a>' (joggle),
-coincident points will create small triangles and cocircular or
-cospherical input sites create multiple Voronoi vertices. If you
-do not use 'QJ', <tt>qvoronoi</tt>
-reports one Voronoi vertex for cocircular or cospherical input
-sites.  This is more accurate
-than joggled input.  It can identify coincident input sites.
-See <a href="qh-impre.htm#joggle">Joggled input or merged
-facets</a>. </p>
+<p>Options '<a href="qh-optq.htm#Qt">Qt</a>' (triangulated output)
+and '<a href="qh-optq.htm#QJn">QJ</a>' (joggled input) may produce
+unexpected results.   Cocircular and cospherical input sites will
+produce duplicate or nearly duplicate Voronoi vertices.  See also <a
+href="qh-impre.htm#joggle">Joggled input or merged facets</a>. </p>
 
 <p>The 'qvonoroi' program is equivalent to 
 '<a href=qhull.htm#outputs>qhull v</a> <a href=qh-optq.htm#Qbb>Qbb</a>' in 2-d to 3-d, and
 '<a href=qhull.htm#outputs>qhull v</a> <a href=qh-optq.htm#Qbb>Qbb</a> <a href=qh-optq.htm#Qx>Qx</a>' 
 in 4-d and higher.  It disables the following Qhull
 <a href=qh-quick.htm#options>options</a>: <i>d n v Qbb QbB Qf Qg Qm 
-Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9</i>.
+Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc</i>.
 
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
-<h3><a href="#TOP">»</a><a name="synopsis">qvoronoi synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">qvoronoi synopsis</a></h3>
 
 <pre>
 qvoronoi- compute the Voronoi diagram.
@@ -131,8 +126,9 @@ qvoronoi- compute the Voronoi diagram.
     comments start with a non-numeric character
 
 options (qh-voron.htm):
-    QJ   - joggle input instead of merging facets
     Qu   - compute furthest-site Voronoi diagram
+    Qt   - triangulated output
+    QJ   - joggle input instead of merging facets
     Tv   - verify result: structure, convexity, and in-circle test
     .    - concise list of all options
     -    - one-line description of all options
@@ -152,13 +148,14 @@ examples:
 rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi
 rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv
 rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo
-rbox c G1 d D2 | qvoronoi s p       rbox c G1 d D2 | qvoronoi QJ s p
+rbox c G1 d D2 | qvoronoi s p       rbox c G1 d D2 | qvoronoi Qt s p
 rbox c P0 D2 | qvoronoi s Fv QV0
+</pre>
 
 <h3><a href="#TOP">»</a><a name="input">qvoronoi input</a></h3>
 <blockquote>
 The input data on <tt>stdin</tt> consists of:
-<ul compact="COMPACT">
+<ul>
     <li>dimension 
     <li>number of points</li>
     <li>point coordinates</li>
@@ -300,7 +297,9 @@ statistics to stderr,</dd>
     <dt><a href="qh-optf.htm#Fc">Fc</a></dt>
     <dd>list coincident input sites for each Voronoi vertex.
 	The first line is the number of vertices.  The remaining lines start with 
-	the number of coincident sites.  A coincident site is assigned to one Voronoi
+	the number of coincident sites and deleted vertices.  Deleted vertices
+	indicate highly degenerate input (see'<A href="qh-optf.htm#Fs">Fs</a>').
+	A coincident site is assigned to one Voronoi
 	vertex.  Do not use '<a href="qh-optq.htm#QJn">QJ</a>' with 'Fc'; the joggle will separate
 	coincident sites.</dd>
     <dt><a href="qh-optf.htm#FP">FP</a></dt>
@@ -308,7 +307,9 @@ statistics to stderr,</dd>
         nearest site (i.e., vertex). The first line is the 
 	number of coincident sites.  Each remaining line starts with the point ID of
 	an input site, followed by the point ID of a coincident point, its vertex, and distance.
-		Do not use '<a href="qh-optq.htm#QJn">QJ</a>' with 'FP'; the joggle will separate
+        Includes deleted vertices which
+	indicate highly degenerate input (see'<A href="qh-optf.htm#Fs">Fs</a>').  
+	Do not use '<a href="qh-optq.htm#QJn">QJ</a>' with 'FP'; the joggle will separate
 	coincident sites.</dd>
     <dt>&nbsp;</dt>
     <dt>&nbsp;</dt>
@@ -336,6 +337,10 @@ controls</a></h3>
 <blockquote>
 
 <dl compact>
+    <dt><a href="qh-optq.htm#Qt">Qt</a></dt>
+    <dd>triangulated output.  If a Voronoi vertex is defined by cospherical data, Qhull
+    duplicates the vertex.  For example, if the data contains a square, the output
+    will contain two copies of the Voronoi vertex.</dd>
     <dt><a href="qh-optq.htm#QJn">QJ</a></dt>
     <dd>joggle the input to avoid Voronoi vertices defined by more
 	than <i>dim+1</i> points.
@@ -350,11 +355,16 @@ controls</a></h3>
         (e.g., 'rbox c | qvoronoi Qz').</dd>
     <dt><a href="qh-optt.htm#Tv">Tv</a></dt>
     <dd>verify result</dd>
+    <dt><a href="qh-optt.htm#TO">TI file</a></dt>
+    <dd>input data from file.  The filename may not use spaces or quotes.</dd>
+    <dt><a href="qh-optt.htm#TO">TO file</a></dt>
+    <dd>output results to file.  Use single quotes if the filename
+	contains spaces (e.g., <tt>TO 'file with spaces.txt'</tt></dd>
     <dt><a href="qh-optt.htm#TFn">TFn</a></dt>
     <dd>report progress after constructing <em>n</em> facets</dd>
     <dt><a href="qh-optp.htm#PDk">PDk:1</a></dt>
     <dd>include upper and lower facets in the output.  Set <em>k</em>
-        to the last dimension (e.g., 2 for 2-d inputs). </dd>
+        to the last dimension (e.g., 'PD2:1' for 2-d inputs). </dd>
     <dt><a href="qh-opto.htm#f">f </a></dt>
     <dd>facet dump.  Print the data structure for each facet (i.e., 
 	Voronoi vertex).</dd>
@@ -397,11 +407,17 @@ notes</a></h3>
 <blockquote>
 
 <p>You can simplify the Voronoi diagram by enclosing the input
-sites in a large square or cube. </p>
+sites in a large square or cube.  This is particularly recommended
+for cocircular or cospherical input data.</p>
 
 <p>See <a href="#graphics">Voronoi graphics</a> for computing
 the convex hull of a Voronoi region. </p>
 
+<p>Voronoi diagrams do not include facets that are
+coplanar with the convex hull of the input sites.  A facet is
+coplanar if the last coefficient of its normal is
+nearly zero (see <a href="../src/user.h#ZEROdelaunay">qh_ZEROdelaunay</a>).
+
 <p>Unbounded regions can be confusing. For example, '<tt>rbox c |
 qvoronoi Qz o</tt>' produces the Voronoi regions for the vertices
 of a cube centered at the origin. All regions are unbounded. The
@@ -483,8 +499,9 @@ a convex hull in one higher dimension. Facets of the Delaunay
 triangulation correspond to vertices of the Voronoi diagram.
 Vertices of the Delaunay triangulation correspond to input sites.
 They also correspond to regions of the Voronoi diagram. See <a
-href="qconvex.htm#conventions">convex hull conventions</a> and <a
-href="qdelaun.htm#conventions">Delaunay conventions</a>.</p>
+href="qconvex.htm#conventions">convex hull conventions</a>, <a
+href="qdelaun.htm#conventions">Delaunay conventions</a>, and
+<a href="index.htm#structure">Qhull's data structures</a>.</p>
 <blockquote>
 
 <ul>
@@ -500,7 +517,8 @@ href="qdelaun.htm#conventions">Delaunay conventions</a>.</p>
     <li><em>point-at-infinity</em> - a point added above the
         paraboloid by option '<a href="qh-optq.htm#Qz">Qz</a>'</li>
     <li><em>Delaunay facet</em> - a lower facet of the
-        paraboloid. It is projected to the input sites</li>
+        paraboloid. The last coefficient of its normal is
+		clearly negative.</li>
     <li><em>Voronoi vertex</em> - the circumcenter of a Delaunay
         facet</li>
     <li><em>Voronoi region</em> - the Voronoi vertices for an
@@ -532,6 +550,7 @@ input (stdin):
 
 options:
     Qu   - compute furthest-site Voronoi diagram
+    Qt   - triangulated output
     QJ   - joggle input instead of merging facets
 
 Qhull control options:
@@ -548,6 +567,7 @@ Trace options:
     Tv   - verify result: structure, convexity, and in-circle test
     Tz   - send all output to stdout
     TFn  - report summary when n or more facets created
+    TI file - input data from file, no spaces or single quotes
     TO file - output results to file, may be enclosed in single quotes
     TPn  - turn on tracing when point n added to hull
      TMn - turn on tracing at merge n
@@ -604,7 +624,7 @@ Geomview options (2-d only)
 
 Print options:
     PAn  - keep n largest Voronoi vertices by 'area'
-    Pdk:n - drop facet if normal[k] <= n (default 0.0)
+    Pdk:n - drop facet if normal[k] &lt;= n (default 0.0)
     PDk:n - drop facet if normal[k] >= n
     Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')
     PFn  - keep Voronoi vertices whose 'area' is at least n
@@ -623,7 +643,7 @@ Print options:
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -634,7 +654,7 @@ Print options:
 <b>To:</b> <a href="#synopsis">sy</a>nopsis 
 &#149; <a href="#input">in</a>put &#149; <a href="#outputs">ou</a>tputs 
 &#149; <a href="#controls">co</a>ntrols &#149; <a href="#graphics">gr</a>aphics 
-&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions" <a>co</a>nventions 
+&#149; <a href="#notes">no</a>tes &#149; <a href="#conventions">co</a>nventions 
 &#149; <a href="#options">op</a>tions
 <!-- GC common information -->
 <hr>
diff --git a/html/rbox.htm b/html/rbox.htm
index 318e5c8..4161d84 100644
--- a/html/rbox.htm
+++ b/html/rbox.htm
@@ -7,10 +7,10 @@
 
 <body>
 <!-- Navigation links -->
-<p><b><a name=TOP>Up:</a></b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
+<p><b><a name="TOP">Up:</a></b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
@@ -35,7 +35,7 @@ height="100"></a>rbox -- generate point distributions</h1>
 	   are given. 
 
 </blockquote>
-<h3><a href="#TOP">»</a><a name="synopsis">rbox synopsis</h3>
+<h3><a href="#TOP">»</a><a name="synopsis">rbox synopsis</a></h3>
 <pre>
 rbox- generate various point distributions.  Default is random in cube.
 
@@ -67,7 +67,7 @@ args (any order, space separated):
   z       print integer coordinates, default 'Bn' is 1e+06
 </pre>
 
-<h3><a href="#TOP">»</a><a name="outputs">rbox outputs</h3>
+<h3><a href="#TOP">»</a><a name="outputs">rbox outputs</a></h3>
 <blockquote>
 
 The format of the output is the following: first line contains
@@ -99,7 +99,7 @@ The format of the output is the following: first line contains
 </blockquote>
 
 </blockquote>
-<h3><a href="#TOP">»</a><a name="examples">rbox examples</h3>
+<h3><a href="#TOP">»</a><a name="examples">rbox examples</a></h3>
 
 <pre>
        rbox 10
@@ -137,6 +137,9 @@ The format of the output is the following: first line contains
        rbox 1000 L10000 D4 s
 	      1000 random points on the surface of a narrow lens.
 
+	   rbox 1000 L100000 s G1e-6
+		  1000 random points near the edge of a narrow lens
+
        rbox c G2 d G3
 	      a cube with coordinates +2/-2 and  a  diamond  with
 	      coordinates +3/-3.
@@ -160,12 +163,12 @@ The format of the output is the following: first line contains
 	      a narrow cone of points with many precision errors.
 </pre>
 
-<h3><a href="#TOP">»</a><a name="notes">rbox notes</h3>
+<h3><a href="#TOP">»</a><a name="notes">rbox notes</a></h3>
 <blockquote>
 Some combinations of arguments generate odd results.
 
 </blockquote>
-<h3><a href="#TOP">»</a><a name="options">rbox options</h3>
+<h3><a href="#TOP">»</a><a name="options">rbox options</a></h3>
 
 <pre>
        n      number of points
@@ -244,7 +247,7 @@ Some combinations of arguments generate odd results.
 <p><b>Up:</b> <a href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual</a>: Table of Contents<br>
 <b>To:</b> <a href="qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="qh-quick.htm#options">Options</a> 
+&#149; <a href="qh-quick.htm#options">Options</a> 
 &#149; <a href="qh-opto.htm#output">Output</a> 
 &#149; <a href="qh-optf.htm#format">Formats</a> 
 &#149; <a href="qh-optg.htm#geomview">Geomview</a> 
diff --git a/src/Changes.txt b/src/Changes.txt
index fbb10f1..c5ff469 100644
--- a/src/Changes.txt
+++ b/src/Changes.txt
@@ -1,6 +1,116 @@
 
 .............This file lists all changes to qhull and rbox.....................
 
+qhull 3.1 2001/10/04
+
+New features
+ - Added option 'Qt' to triangulate non-simplicial facets
+ - Added option 'TI file' to input data from file
+ - Added option 'Q10' to prevent special processing for narrow distributions
+        e.g., RBOX 1000 L100000 s G1e-6 t1001803691 | QHULL Tv Q10
+ - Tried to compute Voronoi volumes ('Pv'). Requires dual face graph--not easy
+        See Clarkson's hull program for code.
+
+Changes to options
+ - Added numtricoplanars to 'Fs'. Number of good, triangulated facets for 'Qt'
+ - Added Zdelvertextot to 'Fs'.  If non-zero and Delaunay, input is degenerate
+ - Qhull command ('FQ') may be repeated.
+ - If 'TPn' and 'TWn' defined, trace the addition of point 'n'
+     otherwise continue tracing (previously it stopped in 4-d)
+ - Removed 'Ft' from qdelaunay.  Use 'Qt o' or 'qhull d QJ Qt' instead.
+     For non-simplicial regions, 'Ft' does not satisify the Delaunay property.
+ - If 'Po' or 'TVn', qhull checks outer planes.  Use 'Q5' to turn off.
+ - If 'T4', print facet lists and check polygon after adding each point
+ 
+Corrections to code
+ - rbox: allow 'c' and 'd' with 's r', meshes, etc.
+ - qh_findbest: redesigned as directed search plus qh_findbesthorizon for coplanarset
+      qh_findbest is faster for many distributions
+ - qh_findbestnew: redesigned to search horizon of coplanar best newfacets
+      needed for distributions with a sharp edge, 
+	  e.g., rbox 1000 s Z1 G1e-13 | qhull Tv
+ - qh_findbest/qh_findbestnew: search neighbors of better horizon facets
+      was needed for RBOX 1000 s Z1 G1e-13 t996564279 | qhull Tv  
+      and RBOX 1000 s W1e-13 P0 t996547055 | QHULL d Qbb Qc Tv
+ - qh_findbest with noupper: could return an upperdelaunay facet if dist>qh.MINoutside.
+ - qh_findbestnew: allow facet->upperdelaunay if dist > qh.MINoutside
+ - qh_partitioncoplanar: call qh_partitionpoint if outside and perpendicular
+      for distributions with a sharp edge
+ - qh_partitionvisible: report precision error if all newfacets degenerate.
+      was needed for RBOX 1000 s W1e-13 t995138628 | QHULL d
+ - qh_createsimplex: clears qh.num_visible, may be non-zero with 'TRn QJ'
+
+Changes to prompts, warnings, and statistics
+ - For Delaunay & Voronoi, 's' reports deleted vertices due to facet merging.
+   They were incorrectly reported as nearly incident points.
+ - Warn if recompute centrum after constructing hull
+ - Simplified narrow hull warning and print all digits of cosine.  
+     A narrow hull may lead to a point outside of the hull.
+ - Print total vertices deleted instead of ave. per iteration (Zdelvertextot)
+ - Improved tracing for qh_partitionpoint and qh_partitioncoplanar
+ - Added number of distance tests for checking outer planes (qh_check_maxout)
+ - Simplified "qhull precision error: Only n facets remain."
+ - Included 'TRn' in the causes of a premature exit
+
+Changes to documentation
+ - README.txt: Added quickstart instructions for Visual C++
+ - rbox: Added example of edge of narrow lens, rbox 1000 L100000 s G1e-6
+ - Added cross references between options 'o' and 'p'.
+ - qh-eg.html: added examples comparing 'Qt', 'QJ', and neither 'Qt' nor 'QJ' 
+	eg.15a.surface, eg.15b.triangle, eg.17a.delaunay.2, etc.
+ - Reorganized and enhanced discussion of precision problems in qh_impre.htm
+ - Fixed spelling errors [K. Briggs]
+ - Fixed link errors, validated HTML, and spell checked [HomeSite]
+ - Removed unnecessary #TOP links
+ - Added source links to the qh-quick.htm's header and footer
+ - qh-geom.htm, qh-poly.htm: add links to Voronoi functions in io.c
+ - src/index.htm: Added how to search qhull.h for qhull options
+ - qvoronoi.htm/qdelaun.htm: 'Fc' and 'FN' includes deleted vertices
+
+Changes to URLs
+ - Added http://www.voronoi.com and http://www.magic-software.com
+
+Changes to code
+ - qh_qhull: if 'TVn' or 'TCn' do not call qh_check_maxout and qh_nearcoplanar
+ - reviewed time profile.  Qhull is slower.  Optimized qh_findbestnew()
+ - qh_addpoint: Added warning note about avoiding a local minimum
+ - qh_checkpolygon: report qh.facet_next error if NARROWhull & dist>MINoutside
+ - qh_findbest: renamed "newfacets" parameter to "isnewfacets" since it is boolT
+ - qh_findbest/qh_findbestnew: testhorizon even if !MERGING
+        Otherwise qhull c D6 | qhull Q0 Tv assigns coplanar points 
+ - qh_resetlists: add qh_RESETvisible for qh_triangulate
+ - qh_findbest: search better facets first.  Rewritten.
+ - qh_findbest: increased minminsearch, always check coplanar facets.  
+        See: RBOX 1000 s Z1 G1e-13 t996564279 | QHULL Tv
+ - qh_findbestnew: report precision error for deleted cones [rare event]
+        e.g.:  RBOX 1000 s W1e-13 P0 t1001034076 | QHULL d Qbb Qc Tv
+ - qh_findbesthorizon: search horizon of qh.coplanarset.  New.
+ - qh_findbestsharp: replaced with qh_sharpnewfacets followed by qh_findbestnew
+ - qh_partitionpoint, Delaunay sites can not be inside.  Otherwise points may
+       be outside upperDelaunay facets yet not near-inside Delaunay facets
+       See: RBOX s 1000 t993602376 | QHULL C-1e-3 d  Qbb FA Tv
+ - qh_partitioncoplanar: call qh_findbest/qh_findbestnew with qh DELAUNAY 
+ - qh_printlists: format long lines 
+ - qh_printvertex: format long lines
+ - user.h: tightened qh_WARNnarrow and qh_MAXnarrow.  Do not see problems 
+       until they are -1.0.
+ - user.h: defined qh_DISToutside, qh_SEARCHdist, and qh_USEfindbestnew 
+ - qh_checkfacet: in 3-d, allow #ridges > #vertices.  Can get a vertex twice
+   in a ridge list, e.g,  RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv 
+
+Changes to FAQ
+ - Recommended use of triangulated output ('Qt')
+
+Changes to distribution
+ - Recompiled in Visual C++ 5.0 with optimization (as was version 2.6)
+ - q_test: Added bad cases for Qhull and tests for new features
+
+Changes to Qhull library
+ - Added qh_triangulate() to poly2.c.  It triangulates the output.
+ - Added option 'Q11' to copy normals and recompute centrums for tricoplanar facets 
+        'FP' may not print the nearest vertex for coplanar points
+        Use option 'Q11' when adding points after qh_triangulate()
+
 qhull 3.0 2001/02/11
 
 Changes to distribution
@@ -126,6 +236,8 @@ qhull 2.6 1998/8/12
  - added note that 'o' and 'FN' list Voronoi regions in site id order [Arvind]
  - added links to Fukuda's introduction to convex hulls, etc. [H. Hase]
  - added .c and .h source files to web distribution and qh-c.htm [J. Sands]
+ - documented qh_ZEROdelaunay.  Delaunay and Voronoi diagrams do not include
+   facets that are coplanar with the convex hull of the input sites.
   
  modified code
  - replaced computed minnorm in qh_sethyperplane_det with distance test
@@ -367,6 +479,7 @@ qhull V2.2 96/2/15
  - detect narrow initial hulls (cosine of min angle < qh_MAXnarrow in user.h).
    Write warning if cosine < qh_WARNnarrow in user.h.  If narrow (qh NARROWhull), 
    partition coplanar points as outside points and delay coplanar test to end.
+   Needed for  RBOX 1000 L100000 s G1e-6 t995127886 | QHULL Tv
    See 'limitations' in qh-impre.html for further discussion.
  - corrected some confusions between 'FV' and 'Fv' in qh-opt.html
  - fixed initialization error for small Voronoi diagrams (e.g., [0,0], [1,0], [0,1]) [J. Velez]
diff --git a/src/Makefile b/src/Makefile
deleted file mode 100644
index 6c572f6..0000000
--- a/src/Makefile
+++ /dev/null
@@ -1,189 +0,0 @@
-# Unix Makefile for qhull and rbox
-#
-#       see README.txt
-#
-#       make           to produce qhull qconvex qdelaunay qhalf qvoronoi rbox
-#       make qvoronoi  to produce qvoronoi (etc.)
-#       make qhullx    to produce qhull qconvex etc.  w/o using libqhull.a
-#       make doc       to print documentation
-#       make install   to copy qhull, rbox, qhull.1, rbox.1 to BINDIR, MANDIR
-#       make new       to rebuild qhull and rbox from source
-#
-#       make printall  to print all files
-#       make user_eg   to produce user_eg
-#       make user_eg2  to produce user_eg2
-#       make clean     to remove object files and core
-#       make cleanall  to remove all generated files
-#
-#       PRINTMAN --  command for printing manual pages
-#       PRINTC --  command for printing C files
-#       BINDIR -- directory where to copy executables
-#       MANDIR -- directory where to copy manual pages
-#       CC --     ANSI C or C++ compiler
-#       CCOPTS1 - options used to compile .c files
-#       CCOPTS2 -- options used to link .o files
-#
-#       CFILES -- .c files for printing
-#       HFILES -- .h files for printing
-#       DFILES -- documentation files
-#       MFILES -- man pages and html files
-#       TFILES -- .txt versions of html html files
-#       FILES -- all other files
-#       OBJS -- specifies the object files of libqhull.a
-#
-BINDIR  = /usr/local/bin
-MANDIR  = /usr/local/man/man1
-
-# if you do not have enscript, try a2ps or just use lpr.  The files are text.
-PRINTMAN = enscript -2rl
-PRINTC = enscript -2r
-# PRINTMAN = lpr
-# PRINTC = lpr
-
-#for Gnu's gcc compiler -O2 for optimization, -g for debugging, -Wall for check
-#
-CC     = gcc
-CCOPTS1 = -O2 -ansi 
-
-# for Sun's cc compiler, -fast or O2 for optimization, -g for debugging, -Xc for ANSI
-#CC = cc
-#CCOPTS1 = -Xc -v -fast
-
-# for Silicon Graphics cc compiler, -O2 for optimization, -g for debugging
-#CC = cc
-#CCOPTS1 = -ansi -O2
-
-# for Next cc compiler with fat executable
-#CC = cc
-#CCOPTS1 = -ansi -O2 -arch m68k -arch i386 -arch hppa
-
-# for loader, ld
-CCOPTS2 = $(CCOPTS1)
-
-# OBJS in execution frequency order.  CFILES after qhull.c are alphabetical
-OBJS = user.o global.o stat.o io.o geom2.o poly2.o \
-       merge.o qhull.o geom.o poly.o qset.o mem.o
-
-CFILES= unix.c qhull.c geom.c geom2.c global.c io.c mem.c merge.c poly.c \
-        poly2.c qset.c stat.c user.c qconvex.c qdelaun.c qhalf.c qvoronoi.c
-HFILES= user.h qhull.h qhull_a.h geom.h io.h mem.h merge.h poly.h qset.h stat.h
-TXTFILES= ../Announce.txt ../REGISTER.txt ../COPYING.txt ../README.txt Changes.txt
-DOCFILES= ../html/rbox.txt ../html/qhull.txt
-FILES=  Makefile rbox.c user_eg.c ../eg/q_test ../eg/q_egtest ../eg/q_eg
-HTMFILES= qhull.man rbox.man qh-in.htm qh-optg.htm qh-optt.htm qh-optp.htm \
-        index.htm qh-quick.htm qh-impre.htm qh-eg.htm \
-        qh-optc.htm qh-opto.htm qh-optf.htm qh-optq.htm \
-	    qh-c.htm qh-faq.htm qhull.htm qconvex.htm qdelaun.htm \
-		qh-geom.htm qh-globa.htm qh-io.htm qh-mem.htm qh-merge.htm \
-		qh-poly.htm qh-qhull.htm qh-set.htm qh-stat.htm qh-user.htm \
-		qdelau_f.htm qhalf.htm qvoronoi.htm qvoron_f.htm rbox.htm 
-
-all: rbox qconvex qdelaunay qhalf qvoronoi qhull
-
-unix.o:   qhull.h user.h mem.h
-qconvex.o:   qhull.h user.h mem.h
-qdelaun.o:   qhull.h user.h mem.h
-qhalf.o:   qhull.h user.h mem.h
-qvoronoi.o:   qhull.h user.h mem.h
-qhull.o:  $(HFILES)
-geom.o:   $(HFILES)
-geom2.o:  $(HFILES)
-global.o: $(HFILES)
-io.o:     $(HFILES)
-mem.o:    mem.h 
-merge.o:  $(HFILES)
-poly.o:   $(HFILES)
-poly2.o:  $(HFILES)
-qset.o:   qset.h mem.h 
-stat.o:   $(HFILES)
-user.o:   $(HFILES)
-
-.c.o:
-	$(CC) -c $(CCOPTS1) $<
-
-clean:
-	rm -f *.o ../core qconvex qdelaunay qhalf qvoronoi qhull 
-
-cleanall: clean
-	rm -f *~ ../rbox ../qhull ../qhalf ../qconvex ../qdelaunay ../qhalf\
-	   ../qvoronoi ../user_eg ../user_eg2 ../*.exe >/dev/null
-
-doc: 
-	$(PRINTMAN) $(TXTFILES) $(DOCFILES)
-
-install: all 
-	cp ../qconvex $(BINDIR)/qconvex
-	cp ../qdelaunay $(BINDIR)/qdelaunay
-	cp ../qhalf $(BINDIR)/qhalf
-	cp ../qhull $(BINDIR)/qhull
-	cp ../qvoronoi $(BINDIR)/qvoronoi
-	cp ../rbox $(BINDIR)/rbox
-	cp ../html/qhull.man $(MANDIR)/qhull.1
-	cp ../html/rbox.man $(MANDIR)/rbox.1
-
-new:    cleanall all
-
-printall: doc printh printc printf
-
-printh:
-	$(PRINTC) $(HFILES)
-
-printc:
-	$(PRINTC) $(CFILES)
-
-printf:
-	$(PRINTC) $(FILES) 
-
-libqhull.a: $(OBJS)
-	@echo if 'ar' or 'ranlib' fails, try 'make qhullx'
-	ar r libqhull.a $(OBJS)
-	@echo the next line may need to be removed.
-	-test -x /bin/ranlib -o -x /usr/bin/ranlib && ranlib libqhull.a
-
-# don't use ../qconvex.  Does not work on Red Hat Linux
-qconvex: qconvex.o libqhull.a
-	$(CC) -o qconvex $(CCOPTS2) qconvex.o -L. -lqhull -lm 
-	cp qconvex ..
-
-qdelaunay: qdelaun.o libqhull.a
-	$(CC) -o qdelaunay $(CCOPTS2) qdelaun.o -L. -lqhull -lm 
-	cp qdelaunay ..
-
-qhalf: qhalf.o libqhull.a
-	$(CC) -o qhalf $(CCOPTS2) qhalf.o -L. -lqhull -lm 
-	cp qhalf ..
-
-qvoronoi: qvoronoi.o libqhull.a
-	$(CC) -o qvoronoi $(CCOPTS2) qvoronoi.o -L. -lqhull -lm 
-	cp qvoronoi ..
-
-qhull: unix.o libqhull.a
-	$(CC) -o qhull $(CCOPTS2) unix.o -L. -lqhull -lm 
-	cp qhull ..
-	-chmod +x ../eg/q_test ../eg/q_eg ../eg/q_egtest
-	-cd ..; ./rbox D4 | ./qhull
-
-# compile qhull without using libqhull.a
-qhullx: qconvex.o qdelaun.o qhalf.o qvoronoi.o unix.o $(OBJS)
-	$(CC) -o qconvex $(CCOPTS2) qconvex.o $(OBJS) -lm 
-	$(CC) -o qdelaunay $(CCOPTS2) qdelaun.o $(OBJS) -lm 
-	$(CC) -o qhalf $(CCOPTS2) qhalf.o $(OBJS) -lm 
-	$(CC) -o qvoronoi $(CCOPTS2) qvoronoi.o $(OBJS) -lm 
-	$(CC) -o qhull $(CCOPTS2) unix.o $(OBJS) -lm 
-	cp qconvex qdelaunay qhalf qvoronoi qhull ..
-	-chmod +x ../eq/q_test ../eq/q_eg ../eq/q_egtest
-	-cd ..; ./rbox D4 | ./qhull
-
-rbox: rbox.o
-	$(CC) -o rbox rbox.o $(CCOPTS2) -lm
-	cp rbox ..
-
-user_eg: user_eg.o libqhull.a 
-	$(CC)  -o user_eg $(CCOPTS2) user_eg.o  -L. -lqhull -lm 
-	cp user_eg ..
-
-user_eg2: user_eg2.o libqhull.a 
-	$(CC)  -o user_eg2 $(CCOPTS2) user_eg2.o  -L. -lqhull -lm 
-	cp user_eg2 ..
-
-# end of Makefile
diff --git a/src/geom.c b/src/geom.c
index 1fb9719..f25d171 100644
--- a/src/geom.c
+++ b/src/geom.c
@@ -13,82 +13,6 @@
    
 #include "qhull_a.h"
    
-/*-<a                             href="qh-geom.htm#TOC"
-  >-------------------------------</a><a name="backnormal">-</a>
-  
-  qh_backnormal( rows, numrow, numcol, sign, normal, nearzero )
-    given an upper-triangular rows array and a sign,
-    solve for normal equation x using back substitution over rows U
-
-  returns:
-     normal= x
-      
-     if will not be able to divzero() when normalized (qh.MINdenom_2 and qh.MINdenom_1_2),
-       if fails on last row
-         this means that the hyperplane intersects [0,..,1]
-         sets last coordinate of normal to sign
-       otherwise
-         sets tail of normal to [...,sign,0,...], i.e., solves for b= [0...0]
-         sets nearzero
-
-  notes:
-     assumes numrow == numcol-1
-
-     see Golub & van Loan 4.4-9 for back substitution
-
-     solves Ux=b where Ax=b and PA=LU
-     b= [0,...,0,sign or 0]  (sign is either -1 or +1)
-     last row of A= [0,...,0,1]
-
-     1) Ly=Pb == y=b since P only permutes the 0's of   b
-     
-  design:
-    for each row from end
-      perform back substitution
-      if near zero
-        use qh_divzero for division
-        if zero divide and not last row
-          set tail of normal to 0
-*/
-void qh_backnormal (realT **rows, int numrow, int numcol, boolT sign,
-  	coordT *normal, boolT *nearzero) {
-  int i, j;
-  coordT *normalp, *normal_tail, *ai, *ak;
-  realT diagonal;
-  boolT waszero;
-  int zerocol= -1;
-  
-  normalp= normal + numcol - 1;
-  *normalp--= (sign ? -1.0 : 1.0);
-  for(i= numrow; i--; ) {
-    *normalp= 0.0;
-    ai= rows[i] + i + 1;
-    ak= normalp+1;
-    for(j= i+1; j < numcol; j++)
-      *normalp -= *ai++ * *ak++;
-    diagonal= (rows[i])[i];
-    if (fabs_(diagonal) > qh MINdenom_2)
-      *(normalp--) /= diagonal;
-    else {
-      waszero= False;
-      *normalp= qh_divzero (*normalp, diagonal, qh MINdenom_1_2, &waszero);
-      if (waszero) {
-        zerocol= i;
-	*(normalp--)= (sign ? -1.0 : 1.0);
-	for (normal_tail= normalp+2; normal_tail < normal + numcol; normal_tail++)
-	  *normal_tail= 0.0;
-      }else
-	normalp--;
-    }
-  }
-  if (zerocol != -1) {
-    zzinc_(Zback0);
-    *nearzero= True;
-    trace4((qh ferr, "qh_backnormal: zero diagonal at column %d.\n", i));
-    qh_precision ("zero diagonal on back substitution");
-  }
-} /* backnormal */
-
 /*-<a                             href="qh-geom.htm#TOC"
   >-------------------------------</a><a name="distplane">-</a>
   
@@ -159,19 +83,18 @@ void qh_distplane (pointT *point, facetT *facet, realT *dist) {
 /*-<a                             href="qh-geom.htm#TOC"
   >-------------------------------</a><a name="findbest">-</a>
   
-  qh_findbest( point, startfacet, bestoutside, newfacts, dist, isoutside, numpart )
+  qh_findbest( point, startfacet, bestoutside, qh_ISnewfacets, qh_NOupper, dist, isoutside, numpart )
     find facet that is furthest below a point 
-    searches neighbors of coplanar and most flipped facets
     for upperDelaunay facets
-      searches if coplanar (within searchdist)
-      returns facet only if !noupper and clearly above
+      returns facet only if !qh_NOupper and clearly above
 
   input:
     starts search at 'startfacet' (can not be flipped)
-    if !bestoutside, stops at qh.MINoutside (DISTround if precise)
+    if !bestoutside (qh_ALL), stops at qh.MINoutside
 
   returns:
-    best facet
+    best facet (reports error if NULL)
+    early out if isoutside defined and bestdist > qh.MINoutside
     dist is distance to facet
     isoutside is true if point is outside of facet
     numpart counts the number of distance tests
@@ -180,333 +103,457 @@ void qh_distplane (pointT *point, facetT *facet, realT *dist) {
     qh_findbestnew()
     
   notes:
-    uses qh.visit_id, qh.searchset
-    caller traces the results
+    If merging (testhorizon), searches horizon facets of coplanar best facets because
     after qh_distplane, this and qh_partitionpoint are the most expensive in 3-d
-      avoid calls to distplane, function calls and real number operations.
+      avoid calls to distplane, function calls, and real number operations.
+    caller traces result
+    Optimized for outside points.   Tried recording a search set for qh_findhorizon.
+    Made code more complicated.
 
   when called by qh_partitionvisible():
-    indicated by newfacets and isoutside defined
+    indicated by qh_ISnewfacets
     qh.newfacet_list is list of simplicial, new facets
-    qh_findbestnew set if qh_findbestsharp returns True (to use qh_findbestnew)
-    qh.bestfacet_notsharp set if qh_findbestsharp returns False
-    searches horizon of best facet unless "exact" and !bestoutside
-    searchdist is 2 * DISTround
-
-  when called by qh_check_maxout()
-    indicated by bestoutside and !newfacets and isoutside == NULL
-    startfacet must be closest to the point
-    updates facet->maxoutside for good, visited facets
-    may return NULL
-
-    searchdist is qh.max_outside + 2 * DISTround
-      + max( MINvisible('Vn'), MAXcoplanar('Un'));
-    This setting is a guess.  It must be at least max_outside + 2*DISTround 
-    because a facet may have a geometric neighbor across a vertex
+    qh_findbestnew set if qh_sharpnewfacets returns True (to use qh_findbestnew)
+    qh.bestfacet_notsharp set if qh_sharpnewfacets returns False
 
-  when called by findfacet() and check_bestdist()
-    indicated by !newfacets and isoutside defined
-    searchdist is same as qh_check_maxout()
+  when called by qh_findfacet(), qh_partitionpoint(), qh_partitioncoplanar(), 
+                 qh_check_bestdist(), qh_addpoint()
+    indicated by !qh_ISnewfacets
     returns best facet in neighborhood of given facet
       this is best facet overall if dist > -   qh.MAXcoplanar 
         or hull has at least a "spherical" curvature
 
   design:
     initialize and test for early exit
-    repeat while there are facets to search (searchset)
+    repeat while there are better facets
       for each neighbor of facet
         exit if outside facet found
-        restart searchset if neighbor is much better
-        append flipped and nearby facets to searchset
+	test for better facet
     if point is inside and partitioning
       test for new facets with a "sharp" intersection
-      if so, future calls go to qh_findbestsharp
-    if testhorizon
-      also test facet's horizon facet
+      if so, future calls go to qh_findbestnew()
+    test horizon facets
 */
 facetT *qh_findbest (pointT *point, facetT *startfacet, 
-		     boolT bestoutside, boolT newfacets, boolT noupper,
+		     boolT bestoutside, boolT isnewfacets, boolT noupper,
 		     realT *dist, boolT *isoutside, int *numpart) {
-  realT bestdist= -REALmax/2 /* avoid underflow */, searchdist;
-  realT cutoff, mincutoff;  /* skip facets that are too far from point */
+  realT bestdist= -REALmax/2 /* avoid underflow */;
   facetT *facet, *neighbor, **neighborp, *bestfacet= NULL;
+  facetT *bestfacet_all= startfacet;
   int oldtrace= qh IStracing;
-  int searchsize= 0; /* non-zero if searchset defined */
-  boolT newbest;
-  boolT ischeckmax= bestoutside && !newfacets && !isoutside;
-  boolT ispartition= newfacets && isoutside;
-  boolT isfindfacet= !newfacets && isoutside;
-  boolT testhorizon = ispartition && (bestoutside || qh APPROXhull || qh MERGING);
-
-  if (!ischeckmax && !ispartition && !isfindfacet) {
-    fprintf (qh ferr, "qhull internal error (qh_findbest): unknown combination of arguments\n");
-    qh_errexit (qh_ERRqhull, startfacet, NULL);
-  }
-  if (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid (point)) {
-    qh IStracing= qh TRACElevel;
-    fprintf (qh ferr, "qh_findbest: point p%d starting at f%d bestoutside? %d newfacets %d\n",
-	     qh TRACEpoint, startfacet->id, bestoutside, newfacets);
-    fprintf(qh ferr, "  ischeckmax %d ispartition %d isfindfacet %d testhorizon %d\n", 
-              ischeckmax, ispartition, isfindfacet, testhorizon);
-    fprintf (qh ferr, "  Last point added to hull was p%d.", qh furthest_id);
-    fprintf(qh ferr, "  Last merge was #%d.\n", zzval_(Ztotmerge));
+  unsigned int visitid= ++qh visit_id;
+  int numpartnew=0;
+  boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */
+
+  zinc_(Zfindbest);
+  if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid (point))) {
+    if (qh TRACElevel > qh IStracing)
+      qh IStracing= qh TRACElevel;
+    fprintf (qh ferr, "qh_findbest: point p%d starting at f%d isnewfacets? %d, unless %d exit if > %2.2g\n",
+	     qh_pointid(point), startfacet->id, isnewfacets, bestoutside, qh MINoutside);
+    fprintf(qh ferr, "  testhorizon? %d noupper? %d", testhorizon, noupper);
+    fprintf (qh ferr, "  Last point added was p%d.", qh furthest_id);
+    fprintf(qh ferr, "  Last merge was #%d.  max_outside %2.2g\n", zzval_(Ztotmerge), qh max_outside);
   }
   if (isoutside)
     *isoutside= True;
-
-  if (!startfacet->flipped) {
-    *numpart= 1;           
+  if (!startfacet->flipped) {  /* test startfacet */
+    *numpart= 1;
     qh_distplane (point, startfacet, dist);  /* this code is duplicated below */
-    if (!startfacet->upperdelaunay || (!noupper && *dist >= qh MINoutside)) {
-      bestdist= *dist;
+    if (!bestoutside && *dist >= qh MINoutside 
+    && (!startfacet->upperdelaunay || !noupper)) {
       bestfacet= startfacet;
-      if (!bestoutside && *dist >= qh MINoutside) 
-	goto LABELreturn_best;
+      goto LABELreturn_best;
     }
-#if qh_MAXoutside
-    if (ischeckmax && (!qh ONLYgood || startfacet->good) && *dist > startfacet->maxoutside)
-      startfacet->maxoutside= *dist;
-#endif
-  }
-  if (ispartition)
-    searchdist= 2 * qh DISTround;
-  else 
-    searchdist= qh max_outside + 2 * qh DISTround
-                + fmax_( qh MINvisible, qh MAXcoplanar);
-  cutoff= bestdist - searchdist;
-  mincutoff= 0;
-  if (ischeckmax) {
-    mincutoff= -(qh DISTround - fmax_(qh MINvisible, qh MAXcoplanar));
-    minimize_(cutoff, mincutoff);
-  }
-  startfacet->visitid= ++qh visit_id;
+    bestdist= *dist;
+    if (!startfacet->upperdelaunay) {
+      bestfacet= startfacet;
+    } 
+  }else 
+    *numpart= 0;
+  startfacet->visitid= visitid;
   facet= startfacet;
-  do {  /* search neighbors of coplanar, upperdelaunay, and flipped facets */
-    if (True) {
- LABELrestart:  /* directed search whenever improvement > searchdist */
-      newbest= False;
-      trace4((qh ferr, "qh_findbest: neighbors of f%d, bestdist %2.2g cutoff %2.2g searchdist %2.2g\n", 
-                  facet->id, bestdist, cutoff, searchdist));
-      FOREACHneighbor_(facet) {
-        if (ispartition && !neighbor->newfacet)
-          continue;
-        if (!neighbor->flipped) {
-	  if (neighbor->visitid == qh visit_id)
-	    continue;
-	  neighbor->visitid= qh visit_id;
-	  (*numpart)++;
-	  qh_distplane (point, neighbor, dist);
+  while (facet) {
+    trace4((qh ferr, "qh_findbest: neighbors of f%d, bestdist %2.2g f%d\n", 
+                facet->id, bestdist, getid_(bestfacet)));
+    FOREACHneighbor_(facet) {
+      if (!neighbor->newfacet && isnewfacets)
+        continue;
+      if (neighbor->visitid == visitid)
+	continue;
+      neighbor->visitid= visitid;
+      if (!neighbor->flipped) {  /* code duplicated above */
+	(*numpart)++;
+	qh_distplane (point, neighbor, dist);
+	if (*dist > bestdist) {
 	  if (!bestoutside && *dist >= qh MINoutside 
-          && (!noupper || !facet->upperdelaunay)) {
+	  && (!neighbor->upperdelaunay || !noupper)) {
 	    bestfacet= neighbor;
 	    goto LABELreturn_best;
 	  }
-#if qh_MAXoutside
-	  if (ischeckmax) {
-	    if ((!qh ONLYgood || neighbor->good) 
-	    && *dist > neighbor->maxoutside)
-	      neighbor->maxoutside= *dist;
-	    else if (bestfacet && *dist < cutoff)
-	      continue;
-	  }else 
-#endif      /* dangling else! */
-	  if (bestfacet && *dist < cutoff)
-	    continue;
-	  if (*dist > bestdist) {
-	    if (!neighbor->upperdelaunay 
-	    || (bestoutside && !noupper && *dist >= qh MINoutside)) {
-	      if (ischeckmax && qh_MAXoutside) {
-	        bestdist= *dist;
-		bestfacet= neighbor;
-		cutoff= bestdist - searchdist;
-		minimize_(cutoff, mincutoff);
-	      }else if (*dist > bestdist + searchdist) {
-	        bestdist= *dist;
-		bestfacet= neighbor;
-		cutoff= bestdist - searchdist;
-		searchsize= 0;
-		facet= neighbor;
-		if (newbest) /* newbest may be coplanar with facet */
-		  facet->visitid= ++qh visit_id;
-		goto LABELrestart; /* repeat with a new facet */
-	      }else {
-	        bestdist= *dist;
-		bestfacet= neighbor;
-		cutoff= bestdist - searchdist;
-	      }
-	      newbest= True;
-	    }
+	  if (!neighbor->upperdelaunay) {
+	    bestfacet= neighbor;
+	    bestdist= *dist;
 	  }
-	}
-	if (!searchsize++) {
-	  SETfirst_(qh searchset) = neighbor;
-	  qh_settruncate (qh searchset, 1);
-	}else
-	  qh_setappend (&qh searchset, neighbor);
-      } /* FOREACHneighbor */
-    } /* while (restart) */
-  }while
-    (searchsize && (facet= (facetT*)qh_setdellast (qh searchset)));
-  if (!ischeckmax) {
+	  break; /* switch to neighor */
+	} /* end of *dist>bestdist */
+      } /* end of !flipped */
+    } /* end of FOREACHneighbor */
+    facet= neighbor;  /* non-NULL only if *dist>bestdist */
+  } /* end of while facet (directed search) */
+  if (isnewfacets) { 
     if (!bestfacet) {
-      fprintf (qh ferr, "qh_findbest: point p%d starting at f%d bestoutside? %d newfacets %d\n",
-	       qh TRACEpoint, startfacet->id, bestoutside, newfacets);
-      fprintf(qh ferr, "\n\
-qh_findbest: all neighbors of facet %d are flipped or upper Delaunay.\n\
-Please report this error to qhull_bug@geom.umn.edu with the input and all of the output.\n",
-	 startfacet->id);
-      qh FORCEoutput= True;
-      qh_errexit (qh_ERRqhull, startfacet, NULL);
-    }
-    if (ispartition && !qh findbest_notsharp && bestdist < - qh DISTround) {
-      if (qh_findbestsharp ( point, &bestfacet, &bestdist, numpart)) 
+      bestdist= -REALmax/2; 
+      bestfacet= qh_findbestnew (point, startfacet->next, &bestdist, bestoutside, isoutside, &numpartnew);
+      testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */
+    }else if (!qh findbest_notsharp && bestdist < - qh DISTround) {
+      if (qh_sharpnewfacets()) { 
+	/* seldom used, qh_findbestnew will retest all facets */
+	zinc_(Zfindnewsharp);
+	bestfacet= qh_findbestnew (point, bestfacet, &bestdist, bestoutside, isoutside, &numpartnew);
+	testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */
 	qh findbestnew= True;
-      else
+      }else
 	qh findbest_notsharp= True;
     }
-    if (testhorizon) {
-      facet= SETfirstt_(bestfacet->neighbors, facetT);
-      trace4((qh ferr, "qh_findbest: horizon facet f%d\n", facet->id));
-      (*numpart)++;
-      qh_distplane (point, facet, dist);
-      if (*dist > bestdist 
-      && (!facet->upperdelaunay || (!noupper && *dist >= qh MINoutside))) {
-	bestdist= *dist;
-	bestfacet= facet;
-      }
-    }
   }
+  if (!bestfacet) {
+    fprintf(qh ferr, "\n\
+qh_findbest: all neighbors of facet %d are flipped or upper Delaunay.\n\
+Please report this error to qhull_bug@geom.umn.edu with the input and all of the output.\n",
+       startfacet->id);
+    qh_errexit (qh_ERRqhull, startfacet, NULL);
+  }
+  if (testhorizon) 
+    bestfacet= qh_findbesthorizon (!qh_IScheckmax, point, bestfacet, noupper, &bestdist, &numpartnew);
   *dist= bestdist;
   if (isoutside && bestdist < qh MINoutside)
     *isoutside= False;
 LABELreturn_best:
+  zadd_(Zfindbesttot, *numpart);
+  zmax_(Zfindbestmax, *numpart);
+  (*numpart) += numpartnew;
   qh IStracing= oldtrace;
   return bestfacet;
 }  /* findbest */
 
 
+/*-<a                             href="qh-geom.htm#TOC"
+  >-------------------------------</a><a name="findbesthorizon">-</a>
+  
+  qh_findbesthorizon( qh_IScheckmax, point, startfacet, qh_NOupper, &bestdist, &numpart )
+    search coplanar and better horizon facets from startfacet/bestdist
+    ischeckmax turns off statistics and minsearch update
+    all arguments must be initialized
+  returns (ischeckmax):
+    best facet
+  returns (!ischeckmax):
+    best facet that is not upperdelaunay
+    allows upperdelaunay that is clearly outside
+  returns:
+    bestdist is distance to bestfacet
+    numpart -- updates number of distance tests
+
+  notes:
+    no early out -- use qh_findbest() or qh_findbestnew()
+    Searches coplanar or better horizon facets
+
+  when called by qh_check_maxout() (qh_IScheckmax)
+    startfacet must be closest to the point
+      Otherwise, if point is beyond and below startfacet, startfacet may be a local minimum
+      even though other facets are below the point.
+    updates facet->maxoutside for good, visited facets
+    may return NULL
+
+    searchdist is qh.max_outside + 2 * DISTround
+      + max( MINvisible('Vn'), MAXcoplanar('Un'));
+    This setting is a guess.  It must be at least max_outside + 2*DISTround 
+    because a facet may have a geometric neighbor across a vertex
+
+  design:
+    for each horizon facet of coplanar best facets
+      continue if clearly inside
+      unless upperdelaunay or clearly outside
+         update best facet
+*/
+facetT *qh_findbesthorizon (boolT ischeckmax, pointT* point, facetT *startfacet, boolT noupper, realT *bestdist, int *numpart) {
+  facetT *bestfacet= startfacet;
+  realT dist;
+  facetT *neighbor, **neighborp, *facet;
+  facetT *nextfacet= NULL; /* optimize last facet of coplanarset */
+  int numpartinit= *numpart, coplanarset_size;
+  unsigned int visitid= ++qh visit_id;
+  boolT newbest= False; /* for tracing */
+  realT minsearch, searchdist;  /* skip facets that are too far from point */
+
+  if (!ischeckmax) {
+    zinc_(Zfindhorizon);
+  }else {
+#if qh_MAXoutside
+    if ((!qh ONLYgood || startfacet->good) && *bestdist > startfacet->maxoutside)
+      startfacet->maxoutside= *bestdist;
+#endif
+  }
+  searchdist= qh_SEARCHdist; /* multiple of qh.max_outside and precision constants */
+  minsearch= *bestdist - searchdist;
+  if (ischeckmax) {
+    /* Always check coplanar facets.  Needed for RBOX 1000 s Z1 G1e-13 t996564279 | QHULL Tv */
+    minimize_(minsearch, -searchdist);
+  }
+  coplanarset_size= 0;
+  facet= startfacet;
+  while (True) {
+    trace4((qh ferr, "qh_findbesthorizon: neighbors of f%d bestdist %2.2g f%d ischeckmax? %d noupper? %d minsearch %2.2g searchdist %2.2g\n", 
+		facet->id, *bestdist, getid_(bestfacet), ischeckmax, noupper,
+		minsearch, searchdist));
+    FOREACHneighbor_(facet) {
+      if (neighbor->visitid == visitid) 
+	continue;
+      neighbor->visitid= visitid;
+      if (!neighbor->flipped) { 
+	qh_distplane (point, neighbor, &dist);
+	(*numpart)++;
+	if (dist > *bestdist) {
+	  if (!neighbor->upperdelaunay || ischeckmax || (!noupper && dist >= qh MINoutside)) {
+	    bestfacet= neighbor;
+	    *bestdist= dist;
+	    newbest= True;
+	    if (!ischeckmax) {
+	      minsearch= dist - searchdist;
+	      if (dist > *bestdist + searchdist) {
+		zinc_(Zfindjump);  /* everything in qh.coplanarset at least searchdist below */
+		coplanarset_size= 0;
+	      }
+	    }
+	  }
+	}else if (dist < minsearch) 
+	  continue;  /* if ischeckmax, dist can't be positive */
+#if qh_MAXoutside
+	if (ischeckmax && dist > neighbor->maxoutside)
+	  neighbor->maxoutside= dist;
+#endif      
+      } /* end of !flipped */
+      if (nextfacet) {
+	if (!coplanarset_size++) {
+	  SETfirst_(qh coplanarset)= nextfacet;
+	  SETtruncate_(qh coplanarset, 1);
+	}else
+  	  qh_setappend (&qh coplanarset, nextfacet); /* Was needed for RBOX 1000 s W1e-13 P0 t996547055 | QHULL d Qbb Qc Tv
+						 and RBOX 1000 s Z1 G1e-13 t996564279 | qhull Tv  */
+      }
+      nextfacet= neighbor;
+    } /* end of EACHneighbor */
+    facet= nextfacet;
+    if (facet) 
+      nextfacet= NULL;
+    else if (!coplanarset_size)
+      break; 
+    else if (!--coplanarset_size) {
+      facet= SETfirst_(qh coplanarset);
+      SETtruncate_(qh coplanarset, 0);
+    }else
+      facet= (facetT*)qh_setdellast (qh coplanarset);
+  } /* while True, for each facet in qh.coplanarset */
+  if (!ischeckmax) {
+    zadd_(Zfindhorizontot, *numpart - numpartinit);
+    zmax_(Zfindhorizonmax, *numpart - numpartinit);
+    if (newbest)
+      zinc_(Zparthorizon);
+  }
+  trace4((qh ferr, "qh_findbesthorizon: newbest? %d bestfacet f%d bestdist %2.2g\n", newbest, getid_(bestfacet), *bestdist));
+  return bestfacet;
+}  /* findbesthorizon */
+
 /*-<a                             href="qh-geom.htm#TOC"
   >-------------------------------</a><a name="findbestnew">-</a>
   
   qh_findbestnew( point, startfacet, dist, isoutside, numpart )
     find best newfacet for point
-    searches new facets starting at startfacet
-
+    searches all of qh.newfacet_list starting at startfacet
+    searches horizon facets of coplanar best newfacets
+    searches all facets if startfacet == qh.facet_list
   returns:
+    best new or horizon facet that is not upperdelaunay
+    early out if isoutside and not 'Qf'
     dist is distance to facet
     isoutside is true if point is outside of facet
     numpart is number of distance tests
 
   notes:
-    if qh.BESToutside or !isoutside
-       stops at furthest facet
-    if qh.MERGING 
-       stops when distance > qh_DISToutside (max(4*MINoutside, 2*max_outside))
-    else 
-       stops when distance > MINoutside (DISTround in precise case)
-    searches newfacets then searchs neighbors of best facet.
-    avoids upperdelaunay facet unless none other or (isoutside and outside)
-
-    uses visit_id and seen flags
-    caller traces the results
-  
+    Always used for merged new facets (see qh_USEfindbestnew)
+    Avoids upperdelaunay facet unless (isoutside and outside)
+
+    Uses qh.visit_id, qh.coplanarset.  
+    If share visit_id with qh_findbest, coplanarset is incorrect.
+
+    If merging (testhorizon), searches horizon facets of coplanar best facets because
+    a point maybe coplanar to the bestfacet, below its horizon facet,
+    and above a horizon facet of a coplanar newfacet.  For example,
+      rbox 1000 s Z1 G1e-13 | qhull
+      rbox 1000 s W1e-13 P0 t992110337 | QHULL d Qbb Qc
+
+    qh_findbestnew() used if
+       qh_sharpnewfacets -- newfacets contains a sharp angle
+       if many merges, qh_premerge found a merge, or 'Qf' (qh.findbestnew)
+
   see also:
     qh_partitionall() and qh_findbest()
 
   design:
-    for each new facet
+    for each new facet starting from startfacet
       test distance from point to facet
-      select best facet
-    test each horizon facet of best facet
-    return best facet 
+      return facet if clearly outside
+      unless upperdelaunay and a lowerdelaunay exists
+         update best facet
+    test horizon facets
 */
 facetT *qh_findbestnew (pointT *point, facetT *startfacet,
-	   realT *dist, boolT *isoutside, int *numpart) {
-  realT bestdist= -REALmax, bestdist2= -REALmax;
-  facetT *neighbor, **neighborp, *bestfacet= NULL, *newfacet, *facet;
-  facetT *bestfacet2= NULL;
+	   realT *dist, boolT bestoutside, boolT *isoutside, int *numpart) {
+  realT bestdist= -REALmax/2, minsearch= -REALmax/2;
+  facetT *bestfacet= NULL, *facet;
   int oldtrace= qh IStracing, i;
-  realT distoutside;
+  unsigned int visitid= ++qh visit_id;
+  realT distoutside= 0.0;
+  boolT isdistoutside; /* True if distoutside is defined */
+  boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */
 
   if (!startfacet) {
     if (qh MERGING)
-      fprintf(qh ferr, "qhull precision error (qh_findbestnew): merging has formed and deleted an independent cycle of facets.  Can not continue.\n");
+      fprintf(qh ferr, "qhull precision error (qh_findbestnew): merging has formed and deleted a cone of new facets.  Can not continue.\n");
     else
       fprintf(qh ferr, "qhull internal error (qh_findbestnew): no new facets for point p%d\n",
       	      qh furthest_id);      
     qh_errexit (qh_ERRqhull, NULL, NULL);
   }
-  if (qh BESToutside || !isoutside)
-    distoutside= REALmax;
-  else if (qh MERGING)
-    distoutside= qh_DISToutside; /* defined in user.h */
-  else
-    distoutside= qh MINoutside;
-  if (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid (point)) {
-    qh IStracing= qh TRACElevel;
-    fprintf(qh ferr, "qh_findbestnew: point p%d facet f%d. Stop if dist > %2.2g\n",
-	     qh TRACEpoint, startfacet->id, distoutside);
-    fprintf(qh ferr, "  Last point added to hull was p%d.", qh furthest_id);
-    fprintf(qh ferr, "  Last merge was #%d.\n", zzval_(Ztotmerge));
+  zinc_(Zfindnew);
+  if (qh BESToutside || bestoutside)
+    isdistoutside= False;
+  else {
+    isdistoutside= True;
+    distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */
   }
   if (isoutside)
     *isoutside= True;
   *numpart= 0;
-
-  /* visit all new facets starting with startfacet */
+  if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid (point))) {
+    if (qh TRACElevel > qh IStracing)
+      qh IStracing= qh TRACElevel;
+    fprintf(qh ferr, "qh_findbestnew: point p%d facet f%d. Stop? %d if dist > %2.2g\n",
+	     qh_pointid(point), startfacet->id, isdistoutside, distoutside);
+    fprintf(qh ferr, "  Last point added p%d visitid %d.",  qh furthest_id, visitid);
+    fprintf(qh ferr, "  Last merge was #%d.\n", zzval_(Ztotmerge));
+  }
+  /* visit all new facets starting with startfacet, maybe qh facet_list */
   for (i= 0, facet= startfacet; i < 2; i++, facet= qh newfacet_list) {
     FORALLfacet_(facet) {
       if (facet == startfacet && i)
 	break;
-      qh_distplane (point, facet, dist);
-      (*numpart)++;
-      if (facet->upperdelaunay) {
-	if (*dist > bestdist2) {
-	  bestdist2= *dist;
-	  bestfacet2= facet;
-	  if (*dist >= distoutside) {
+      facet->visitid= visitid;
+      if (!facet->flipped) {
+	qh_distplane (point, facet, dist);
+	(*numpart)++;
+	if (*dist > bestdist) {
+	  if (!facet->upperdelaunay || *dist >= qh MINoutside) {
 	    bestfacet= facet;
-	    goto LABELreturn_bestnew;
-	  }
+	    if (isdistoutside && *dist >= distoutside)
+	      goto LABELreturn_bestnew;
+	    bestdist= *dist;
+  	  }
 	}
-      }else if (*dist > bestdist) {
-	bestdist= *dist;
-	bestfacet= facet;
-	if (*dist >= distoutside) 
-	  goto LABELreturn_bestnew;
-      }
-    }
-  }
-  newfacet= bestfacet ? bestfacet : bestfacet2;
-  	/* !bestfacet only occurs if 'd' creates incorrect upper-delaunay facets */
-  FOREACHneighbor_(newfacet) {
-    if (!neighbor->newfacet) {
-      qh_distplane (point, neighbor, dist);
-      (*numpart)++;
-      if (neighbor->upperdelaunay) {
-	if (*dist > bestdist2) {
-	  bestdist2= *dist;
-	  bestfacet2= neighbor;
-	}
-      }else if (*dist > bestdist) {
-	bestdist= *dist;
-	bestfacet= neighbor;
-      }
-    }
+      } /* end of !flipped */
+    } /* FORALLfacet from startfacet or qh newfacet_list */
   }
-  if (!bestfacet  
-  || (isoutside && bestdist2 >= qh MINoutside && bestdist2 > bestdist)) {
-    *dist= bestdist2;
-    bestfacet= bestfacet2;
-  }else 
-    *dist= bestdist;
+  if (testhorizon || !bestfacet)
+    bestfacet= qh_findbesthorizon (!qh_IScheckmax, point, bestfacet ? bestfacet : startfacet, 
+	                                !qh_NOupper, &bestdist, numpart);  
+  *dist= bestdist;
   if (isoutside && *dist < qh MINoutside)
     *isoutside= False;
 LABELreturn_bestnew:
+  zadd_(Zfindnewtot, *numpart);
+  zmax_(Zfindnewmax, *numpart);
+  trace4((qh ferr, "qh_findbestnew: bestfacet f%d bestdist %2.2g\n", getid_(bestfacet), *dist));
   qh IStracing= oldtrace;
   return bestfacet;
 }  /* findbestnew */
 
+/* ============ hyperplane functions -- keep code together [?] ============ */
+
+/*-<a                             href="qh-geom.htm#TOC"
+  >-------------------------------</a><a name="backnormal">-</a>
+  
+  qh_backnormal( rows, numrow, numcol, sign, normal, nearzero )
+    given an upper-triangular rows array and a sign,
+    solve for normal equation x using back substitution over rows U
+
+  returns:
+     normal= x
+      
+     if will not be able to divzero() when normalized (qh.MINdenom_2 and qh.MINdenom_1_2),
+       if fails on last row
+         this means that the hyperplane intersects [0,..,1]
+         sets last coordinate of normal to sign
+       otherwise
+         sets tail of normal to [...,sign,0,...], i.e., solves for b= [0...0]
+         sets nearzero
+
+  notes:
+     assumes numrow == numcol-1
+
+     see Golub & van Loan 4.4-9 for back substitution
+
+     solves Ux=b where Ax=b and PA=LU
+     b= [0,...,0,sign or 0]  (sign is either -1 or +1)
+     last row of A= [0,...,0,1]
+
+     1) Ly=Pb == y=b since P only permutes the 0's of   b
+     
+  design:
+    for each row from end
+      perform back substitution
+      if near zero
+        use qh_divzero for division
+        if zero divide and not last row
+          set tail of normal to 0
+*/
+void qh_backnormal (realT **rows, int numrow, int numcol, boolT sign,
+  	coordT *normal, boolT *nearzero) {
+  int i, j;
+  coordT *normalp, *normal_tail, *ai, *ak;
+  realT diagonal;
+  boolT waszero;
+  int zerocol= -1;
+  
+  normalp= normal + numcol - 1;
+  *normalp--= (sign ? -1.0 : 1.0);
+  for(i= numrow; i--; ) {
+    *normalp= 0.0;
+    ai= rows[i] + i + 1;
+    ak= normalp+1;
+    for(j= i+1; j < numcol; j++)
+      *normalp -= *ai++ * *ak++;
+    diagonal= (rows[i])[i];
+    if (fabs_(diagonal) > qh MINdenom_2)
+      *(normalp--) /= diagonal;
+    else {
+      waszero= False;
+      *normalp= qh_divzero (*normalp, diagonal, qh MINdenom_1_2, &waszero);
+      if (waszero) {
+        zerocol= i;
+	*(normalp--)= (sign ? -1.0 : 1.0);
+	for (normal_tail= normalp+2; normal_tail < normal + numcol; normal_tail++)
+	  *normal_tail= 0.0;
+      }else
+	normalp--;
+    }
+  }
+  if (zerocol != -1) {
+    zzinc_(Zback0);
+    *nearzero= True;
+    trace4((qh ferr, "qh_backnormal: zero diagonal at column %d.\n", i));
+    qh_precision ("zero diagonal on back substitution");
+  }
+} /* backnormal */
 
 /*-<a                             href="qh-geom.htm#TOC"
   >-------------------------------</a><a name="gausselim">-</a>
@@ -585,7 +632,7 @@ void qh_gausselim(realT **rows, int numrow, int numcol, boolT *sign, boolT *near
   >-------------------------------</a><a name="getangle">-</a>
   
   qh_getangle( vect1, vect2 )
-    returns the dot product of two, DIM3 vectors
+    returns the dot product of two vectors
     if qh.RANDOMdist, joggles result
 
   notes:
@@ -956,7 +1003,7 @@ void qh_setfacetplane(facetT *facet) {
   }
   facet->upperdelaunay= False;
   if (qh DELAUNAY) {
-    if (qh UPPERdelaunay) {     /* matches qh.lower_threshold in qh_initbuild */
+    if (qh UPPERdelaunay) {     /* matches qh_triangulate_facet and qh.lower_threshold in qh_initbuild */
       if (facet->normal[qh hull_dim -1] >= qh ANGLEround * qh_ZEROdelaunay)
         facet->upperdelaunay= True;
     }else {
@@ -1179,4 +1226,5 @@ void qh_sethyperplane_gauss (int dim, coordT **rows, pointT *point0,
     *offset -= *pointcoord++ * *normalcoef++;
 } /* sethyperplane_gauss */
 
+  
 
diff --git a/src/geom.h b/src/geom.h
index cc7afa8..4233e56 100644
--- a/src/geom.h
+++ b/src/geom.h
@@ -97,10 +97,12 @@
 void    qh_backnormal (realT **rows, int numrow, int numcol, boolT sign, coordT *normal, boolT *nearzero);
 void	qh_distplane (pointT *point, facetT *facet, realT *dist);
 facetT *qh_findbest (pointT *point, facetT *startfacet,
-		     boolT bestoutside, boolT newfacets, boolT noupper,
+		     boolT bestoutside, boolT isnewfacets, boolT noupper,
 		     realT *dist, boolT *isoutside, int *numpart);
-facetT *qh_findbestnew (pointT *point, facetT *startfacet,
-	   realT *dist, boolT *isoutside, int *numpart);
+facetT *qh_findbesthorizon (boolT ischeckmax, pointT *point, 
+	             facetT *startfacet, boolT noupper, realT *bestdist, int *numpart);
+facetT *qh_findbestnew (pointT *point, facetT *startfacet, realT *dist, 
+		     boolT bestoutside, boolT *isoutside, int *numpart);
 void 	qh_gausselim(realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero);
 realT   qh_getangle(pointT *vect1, pointT *vect2);
 pointT *qh_getcenter(setT *vertices);
@@ -116,6 +118,7 @@ void 	qh_sethyperplane_det (int dim, coordT **rows, coordT *point0,
               boolT toporient, coordT *normal, realT *offset, boolT *nearzero);
 void 	qh_sethyperplane_gauss (int dim, coordT **rows, pointT *point0, 
 	     boolT toporient, coordT *normal, coordT *offset, boolT *nearzero);
+boolT   qh_sharpnewfacets (void);
 
 /*========= infrequently used code in geom2.c =============*/
 
@@ -133,8 +136,6 @@ realT   qh_facetarea (facetT *facet);
 realT   qh_facetarea_simplex (int dim, coordT *apex, setT *vertices, 
           vertexT *notvertex,  boolT toporient, coordT *normal, realT *offset);
 pointT *qh_facetcenter (setT *vertices);
-boolT   qh_findbestsharp (pointT *point, facetT **bestfacet, 
-           realT *bestdist, int *numpart);
 facetT *qh_findgooddist (pointT *point, facetT *facetA, realT *distp, facetT **facetlist);
 void    qh_getarea (facetT *facetlist);
 boolT   qh_gram_schmidt(int dim, realT **rows);
diff --git a/src/geom2.c b/src/geom2.c
index f2263f4..19c8185 100644
--- a/src/geom2.c
+++ b/src/geom2.c
@@ -234,11 +234,10 @@ void qh_detroundoff (void) {
   }
   qh NEARinside= qh ONEmerge * qh_RATIOnearinside; /* only used if qh KEEPnearinside */
   if (qh JOGGLEmax < REALmax/2 && (qh KEEPcoplanar || qh KEEPinside)) {
-    realT maxdist;
-    
-    qh KEEPnearinside= True;
+    realT maxdist;	       /* adjust qh.NEARinside for joggle */
+    qh KEEPnearinside= True;   
     maxdist= sqrt (qh hull_dim) * qh JOGGLEmax + qh DISTround;
-    maxdist= 2*maxdist;  /* vertex and coplanar point can joggle in opposite directions */
+    maxdist= 2*maxdist;        /* vertex and coplanar point can joggle in opposite directions */
     maximize_(qh NEARinside, maxdist);  /* must agree with qh_nearcoplanar() */
   }
   if (qh KEEPnearinside)
@@ -442,6 +441,7 @@ realT qh_divzero (realT numer, realT denom, realT mindenom1, boolT *zerodiv) {
     if (qh DELAUNAY),
       computes projected area instead for last coordinate
     assumes facet->normal exists
+    projecting tricoplanar facets to the hyperplane does not appear to make a difference
   
   design:
     if simplicial
@@ -484,12 +484,13 @@ realT qh_facetarea (facetT *facet) {
   qh_facetarea_simplex( dim, apex, vertices, notvertex, toporient, normal, offset )
     return area for a simplex defined by 
       an apex, a base of vertices, an orientation, and a unit normal
-    if simplicial facet, 
+    if simplicial or tricoplanar facet, 
       notvertex is defined and it is skipped in vertices
   
   returns:
     computes area of simplex projected to plane [normal,offset]
     returns 0 if vertex too far below plane (qh WIDEfacet)
+      vertex can't be apex of tricoplanar facet
   
   notes:
     if (qh DELAUNAY),
@@ -596,64 +597,6 @@ pointT *qh_facetcenter (setT *vertices) {
   return center;
 } /* facetcenter */
 
-/*-<a                             href="qh-geom.htm#TOC"
-  >-------------------------------</a><a name="findbestsharp">-</a>
-  
-  qh_findbestsharp( point, bestfacet, bestdist, numpart )
-    find best facet on newfacet_list
-    skips already visited facets (qh.visit_id) on qh.newfacet_list
-    skips upperdelaunay facets unless point is outside
-
-  returns:
-    true if could be an acute angle (facets in different quadrants)
-    returns bestfacet and distance to facet
-    increments numpart by number of distance tests
- 
-  notes:
-    for qh_findbest
-
-  design:
-    for all facets on qh.newfacet_list
-      if two facets are in different quadrants
-        set issharp
-      compute distance from point to facet
-      update best facet
-*/
-boolT qh_findbestsharp (pointT *point, facetT **bestfacet, 
-           realT *bestdist, int *numpart) {
-  facetT *facet;
-  realT dist;
-  boolT issharp = False;
-  int *quadrant, k;
-  
-  quadrant= (int*)qh_memalloc (qh hull_dim * sizeof(int));
-  FORALLfacet_(qh newfacet_list) {
-    if (facet == qh newfacet_list) {
-      for (k= qh hull_dim; k--; )
-      	quadrant[ k]= (facet->normal[ k] > 0);
-    }else if (!issharp) {
-      for (k= qh hull_dim; k--; ) {
-        if (quadrant[ k] != (facet->normal[ k] > 0)) {
-          issharp= True;
-          break;
-        }
-      }
-    }
-    if (facet->visitid != qh visit_id) {
-      qh_distplane (point, facet, &dist);
-      (*numpart)++;
-      if (dist > *bestdist) {
-      	if (!facet->upperdelaunay || dist > qh MINoutside) {
- 	  *bestdist= dist;
-	  *bestfacet= facet;
-	}
-      }
-    }
-  }
-  qh_memfree( quadrant, qh hull_dim * sizeof(int));
-  return issharp;
-} /* findbestsharp */
-  
 /*-<a                             href="qh-geom.htm#TOC"
   >-------------------------------</a><a name="findgooddist">-</a>
   
@@ -847,6 +790,10 @@ boolT qh_gram_schmidt(int dim, realT **row) {
   notes:
     invalid if qh.SPLITthresholds
 
+  see:
+    qh.lower_threshold in qh_initbuild()
+    qh_initthresholds()
+
   design:
     for each dimension
       test threshold
@@ -950,6 +897,7 @@ void qh_joggleinput (void) {
 	        qh JOGGLEmax);
       qh_errexit (qh_ERRqhull, NULL, NULL);
   }
+  /* for some reason, using qh ROTATErandom and qh_RANDOMseed does not repeat the run. Use 'TRn' instead */
   seed= qh_RANDOMint;
   qh_option ("_joggle-seed", &seed, NULL);
   trace0((qh ferr, "qh_joggleinput: joggle input by %2.2g with seed %d\n", 
@@ -1146,7 +1094,6 @@ void qh_maxsimplex (int dim, setT *maxpoints, pointT *points, int numpoints, set
   if (sizinit < 2) {
     if (qh_setsize (maxpoints) >= 2) {
       FOREACHpoint_(maxpoints) {
-	
         if (maxcoord < point[0]) {
           maxcoord= point[0];
           maxx= point;
@@ -1301,9 +1248,8 @@ boolT qh_orientoutside (facetT *facet) {
   >-------------------------------</a><a name="outerinner">-</a>
   
   qh_outerinner( facet, outerplane, innerplane  )
-    if facet
+    if facet and qh.maxoutdone (i.e., qh_check_maxout)
       returns outer and inner plane for facet
-      requires qh.maxoutdone, i.e., qh_check_maxout()
     else
       returns maximum outer and inner plane
     accounts for qh.JOGGLEmax
@@ -1315,7 +1261,7 @@ boolT qh_orientoutside (facetT *facet) {
     outerplaner or innerplane may be NULL
     
     includes qh.DISTround for actual points
-    add another qh.DISTround if testing with floating point arithmetic
+    adds another qh.DISTround if testing with floating point arithmetic
 */
 void qh_outerinner (facetT *facet, realT *outerplane, realT *innerplane) {
   realT dist, mindist;
@@ -2065,6 +2011,48 @@ coordT *qh_sethalfspace_all (int dim, int count, coordT *halfspaces, pointT *fea
 } /* sethalfspace_all */
 
   
+/*-<a                             href="qh-geom.htm#TOC"
+  >-------------------------------</a><a name="sharpnewfacets">-</a>
+  
+  qh_sharpnewfacets()
+
+  returns:
+    true if could be an acute angle (facets in different quadrants)
+ 
+  notes:
+    for qh_findbest
+
+  design:
+    for all facets on qh.newfacet_list
+      if two facets are in different quadrants
+        set issharp
+*/
+boolT qh_sharpnewfacets () {
+  facetT *facet;
+  boolT issharp = False;
+  int *quadrant, k;
+  
+  quadrant= (int*)qh_memalloc (qh hull_dim * sizeof(int));
+  FORALLfacet_(qh newfacet_list) {
+    if (facet == qh newfacet_list) {
+      for (k= qh hull_dim; k--; )
+      	quadrant[ k]= (facet->normal[ k] > 0);
+    }else {
+      for (k= qh hull_dim; k--; ) {
+        if (quadrant[ k] != (facet->normal[ k] > 0)) {
+          issharp= True;
+          break;
+        }
+      }
+    }
+    if (issharp)
+      break;
+  }
+  qh_memfree( quadrant, qh hull_dim * sizeof(int));
+  trace3((qh ferr, "qh_sharpnewfacets: %d\n", issharp));
+  return issharp;
+} /* sharpnewfacets */
+
 /*-<a                             href="qh-geom.htm#TOC"
   >-------------------------------</a><a name="voronoi_center">-</a>
   
diff --git a/src/global.c b/src/global.c
index 19c3535..260e8d7 100644
--- a/src/global.c
+++ b/src/global.c
@@ -35,7 +35,7 @@ void qh_appendprint (qh_PRINT format) {
   int i;
 
   for (i=0; i < qh_PRINTEND; i++) {
-    if (qh PRINTout[i] == format)
+    if (qh PRINTout[i] == format && format != qh_PRINTqhull)
       break;
     if (!qh PRINTout[i]) {
       qh PRINTout[i]= format;
@@ -199,7 +199,7 @@ void qh_freebuffers (void) {
   qh gm_row= NULL;
   qh_setfree (&qh other_points);
   qh_setfree (&qh del_vertices);
-  qh_setfree (&qh searchset);
+  qh_setfree (&qh coplanarset);
   if (qh line)                /* allocated by qh_readinput, freed if no error */
     free (qh line);
   if (qh half_space)
@@ -1004,6 +1004,10 @@ void qh_initflags(char *command) {
 	  qh_option ("Qsearch-initial-simplex", NULL, NULL);
 	  qh ALLpoints= True;
 	  break;
+	case 't':
+	  qh_option ("Qtriangulate", NULL, NULL);
+	  qh TRIangulate= True;
+	  break;
 	case 'u':
 	  qh_option ("QupperDelaunay", NULL, NULL);
 	  qh UPPERdelaunay= True;
@@ -1025,10 +1029,28 @@ void qh_initflags(char *command) {
 	  qh NOpremerge= True;
 	  break; 
 	case '1':
-	  qh_option ("Q1-no-angle-sort", NULL, NULL);
-	  qh ANGLEmerge= False;
-	  goto LABELcheckdigit;
-	  break; /* no warnings */
+	  if (!isdigit(*s)) {
+	    qh_option ("Q1-no-angle-sort", NULL, NULL);
+	    qh ANGLEmerge= False;
+	    break; 
+	  }
+	  switch(*s++) {
+  	  case '0':
+	    qh_option ("Q10-no-narrow", NULL, NULL);
+	    qh NOnarrow= True;
+	    break; 
+  	  case '1':
+	    qh_option ("Q11-trinormals Qtriangulate", NULL, NULL);
+	    qh TRInormals= True;
+	    qh TRIangulate= True;
+	    break; 
+	  default:
+	    s--;
+	    fprintf (qh ferr, "qhull warning: unknown 'Q' qhull option 1%c, rest ignored\n", (int)s[0]);
+	    while (*++s && !isspace(*s));
+	    break;
+	  }
+	  break;
 	case '2':
 	  qh_option ("Q2-no-merge-independent", NULL, NULL);
 	  qh MERGEindependent= False;
@@ -1167,6 +1189,33 @@ void qh_initflags(char *command) {
 	    qh REPORTfreq2= qh REPORTfreq/2;  /* for tracemerging() */
 	  }
 	  break;
+	case 'I':
+	  if (s[0] != ' ' || s[1] == '\"' || s[1] == '\'' ||isspace (s[1])) {
+	    s++;
+	    fprintf (qh ferr, "qhull warning: option 'TI' mistyped.\nUse 'TI', one space, file name, and space or end-of-line.\nDo not use quotes.  Option 'FI' ignored.\n");
+	  }else {  /* not a procedure because of qh_option (filename, NULL, NULL); */
+	    char filename[500], *t= filename;
+
+	    s++;
+	    while (*s) {
+	      if (t - filename >= sizeof (filename)-2) {
+		fprintf (qh ferr, "qhull error: filename for 'TI' too long.\n");
+		qh_errexit (qh_ERRinput, NULL, NULL);
+	      }
+	      if (isspace (*s))
+		break;
+	      *(t++)= *s++;
+	    }
+	    *t= '\0';
+	    if (!freopen (filename, "r", stdin)) {
+	      fprintf (qh ferr, "qhull error: could not open file \"%s\".", filename);
+	      qh_errexit (qh_ERRinput, NULL, NULL);
+	    }else {
+	      qh_option ("TInput-file", NULL, NULL);
+	      qh_option (filename, NULL, NULL);
+	    }
+	  }
+	  break;
 	case 'O':
 	  if (s[0] != ' ' || s[1] == '\"' || isspace (s[1])) {
 	    s++;
@@ -1295,7 +1344,7 @@ void qh_initqhull_buffers (void) {
     qh TEMPsize= 8;  /* e.g., if qh_NOmem */
   qh other_points= qh_setnew (qh TEMPsize);
   qh del_vertices= qh_setnew (qh TEMPsize);
-  qh searchset= qh_setnew (qh TEMPsize);
+  qh coplanarset= qh_setnew (qh TEMPsize);
   qh NEARzero= (realT *)qh_memalloc(qh hull_dim * sizeof(realT));
   qh lower_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT));
   qh upper_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT));
@@ -1372,6 +1421,8 @@ void qh_initqhull_globals (coordT *points, int numpoints, int dim, boolT ismallo
     qh JOGGLEmax= 0.0;
 #endif
   }
+  if (qh TRIangulate && qh JOGGLEmax < REALmax/2 && qh PRINTprecision)
+    fprintf(qh ferr, "qhull warning: joggle ('QJ') always produces simplicial output.  Triangulated output ('Qt') does nothing.\n");
   if (qh JOGGLEmax < REALmax/2 && qh DELAUNAY && !qh SCALEinput && !qh SCALElast) {
     qh SCALElast= True;
     qh_option ("Qbbound-last-qj", NULL, NULL);
@@ -1416,7 +1467,7 @@ void qh_initqhull_globals (coordT *points, int numpoints, int dim, boolT ismallo
   }
   if (qh SCALElast && !qh DELAUNAY && qh PRINTprecision)
     fprintf (qh ferr, "qhull input warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v'\n");
-  qh DOcheckmax= (!qh FORCEoutput && !qh SKIPcheckmax && qh MERGING );
+  qh DOcheckmax= (!qh SKIPcheckmax && qh MERGING );
   qh KEEPnearinside= (qh DOcheckmax && !(qh KEEPinside && qh KEEPcoplanar) 
                           && !qh NOnearinside);
   if (qh MERGING)
@@ -1500,7 +1551,7 @@ qhull configuration error (qh_RANDOMmax in user.h):\n\
     fprintf (qh ferr, "\
 qhull configuration warning (qh_RANDOMmax in user.h):\n\
    average of 1000 random integers (%.2g) is much different than expected (%.2g).\n\
-   Is qh_RANDOMmax (%d) wrong?\n",
+   Is qh_RANDOMmax (%.2g) wrong?\n",
 	     randr, qh_RANDOMmax/2.0, qh_RANDOMmax);
   qh RANDOMa= 2.0 * qh RANDOMfactor/qh_RANDOMmax;
   qh RANDOMb= 1.0 - qh RANDOMfactor;
@@ -1543,7 +1594,7 @@ qhull configuration warning (qh_RANDOMmax in user.h):\n\
     }else if (qh PRINTout[i] == qh_PRINTvertices) {
       if (qh VORONOI)
         qh_option ("Fvoronoi", NULL, NULL);
-      else
+      else 
         qh_option ("Fvertices", NULL, NULL);
     }
   }
@@ -1694,7 +1745,7 @@ void qh_initqhull_start (FILE *infile, FILE *outfile, FILE *errfile) {
   qh totarea= 0.0;
   qh totvol= 0.0;
   qh TRACEdist= REALmax;
-  qh TRACEpoint= -1;  /* recompile to trace a point */
+  qh TRACEpoint= -1; /* recompile or use 'TPn' */
   qh tracefacet_id= UINT_MAX;  /* recompile to trace a facet */
   qh tracevertex_id= UINT_MAX; /* recompile to trace a vertex */
   qh_RANDOMseed_(1);
@@ -1711,7 +1762,7 @@ void qh_initqhull_start (FILE *infile, FILE *outfile, FILE *errfile) {
 
   see: 
     qh_initflags(), 'Qbk' 'QBk' 'Pdk' and 'PDk'
-    see 'prompt' in unix.c for documentation
+    qh_inthresholds()
 
   design:
     for each 'Pdn' or 'PDn' option
diff --git a/src/index.htm b/src/index.htm
index 166fe93..9d2b645 100644
--- a/src/index.htm
+++ b/src/index.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,13 +20,13 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals</a><br>
 <b>To:</b> <a href="#TOC">Qhull files</a><br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
 &#149; <a href="qh-merge.htm">Merge</a> &#149; <a href="qh-poly.htm">Poly</a>
 &#149; <a href="qh-qhull.htm">Qhull</a> &#149; <a href="qh-set.htm">Set</a>
 &#149; <a href="qh-stat.htm">Stat</a> &#149; <a href="qh-user.htm">User</a>
-</p>
 
 <hr>
 <!-- Main text of document. -->
@@ -65,23 +64,29 @@ either expands to &quot;qh_qh.&quot; or to
 &quot;qh_qh-&gt;&quot;. The later is used for
 applications which run concurrent calls to qh_qhull().
 <p>
-When reading code with an editor, a search for <i>"procedure</i> will
-locate the header of <i>qh_procedure</i>.  A search for <i>* procedure</i>
+When reading code with an editor, a search for 
+<i>&quot;procedure</i>
+will locate the header of <i>qh_procedure</i>.  A search for <i>* procedure</i>
 will locate the tail of <i>qh_procedure</i>.
 
+<p>A useful starting point is <a href="qhull.h">qhull.h</a>.  It defines most
+of Qhull data structures and top-level functions.  Search for <i>'PFn'</i> to
+determine the corresponding constant in Qhull.  Search for <i>'Fp'</i> to
+determine the corresponding <a href="qhull.h#qh_PRINT">qh_PRINT...</a> constant.
+Search <a href="io.c">io.c</a> to learn how the print function is implemented.</p>
+
 <p>If your web browser loads .c and .h files with an external application,
-change the MIME type of .c and .h files to "text/html".  Do not use the 
-Opera browser (it treats all '<' characters as HTML tags).
+change the MIME type of .c and .h files to "text/html".  
+Opera does not always work since it treats '&lt;' characters as HTML tags.
 <p>
 Please report documentation and link errors  
 to <a href="mailto:qhull-bug@geom.umn.edu">qhull-bug@geom.umn.edu</a>.
-If you have a program that checks internal links ("#..."), please send
-the results of running the program on qhull.
 <p>
-<i>Brad Barber, Cambridge MA, February 11, 2001</i>
+<i>Brad Barber, Cambridge MA, October 4, 2001</i>
+</p>
 </blockquote>
 
-<p><b>Copyright © 1997-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1997-2001 The Geometry Center, Minneapolis MN</b></p>
 
 <hr>
 
@@ -93,7 +98,7 @@ refer to these files for detailed information.</p>
 <blockquote>
 
 <dl>
-<dt><a href="qhull.h#TOP"><b>qhull.h</b></a> </dt>
+<dt><a href="qhull.h"><b>qhull.h</b></a> </dt>
 <dd>Include file for the Qhull library, <tt>qhull.a</tt>.
 Data structures are documented under <a href="qh-poly.htm">Poly</a>.
 Global variables are documented under <a href="qh-globa.htm">Global</a>.
@@ -102,9 +107,9 @@ Other data structures and variables are documented under
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-geom.htm"><b>Geom</b></a><b>, </b>
-<a href="geom.h#TOP"><b>geom.h</b></a><b>, </b>
-<a href="geom.c#TOP"><b>geom.c</b></a><b>, </b>
-<a href="geom2.c#TOP"><b>geom2.c</b></a> </dt>
+<a href="geom.h"><b>geom.h</b></a><b>, </b>
+<a href="geom.c"><b>geom.c</b></a><b>, </b>
+<a href="geom2.c"><b>geom2.c</b></a> </dt>
 <dd>Geometric routines. These routines implement mathematical
 functions such as Gaussian elimination and geometric
 routines needed for Qhull. Frequently used routines are
@@ -113,8 +118,8 @@ in <tt>geom.c</tt> while infrequent ones are in <tt>geom2.c</tt>.
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-globa.htm"><b>Global</b></a><b>, </b>
-<a href="global.c#TOP"><b>global.c</b></a><b>, </b>
-<a href="qhull.h#TOP"><b>qhull.h</b></a> </dt>
+<a href="global.c"><b>global.c</b></a><b>, </b>
+<a href="qhull.h"><b>qhull.h</b></a> </dt>
 <dd>Global routines. Qhull uses a global data structure, <tt>qh</tt>,
 to store globally defined constants, lists, sets, and
 variables.   
@@ -122,33 +127,33 @@ variables.
 structures. </dd>
 
 <dt>&nbsp;</dt>
-<dt><a href="qh-io.htm"><b>Io</b></a><b>, </b><a href="io.h#TOP"><b>io.h</b></a><b>,
-</b><a href="io.c#TOP"><b>io.c</b></a> </dt>
+<dt><a href="qh-io.htm"><b>Io</b></a><b>, </b><a href="io.h"><b>io.h</b></a><b>,
+</b><a href="io.c"><b>io.c</b></a> </dt>
 <dd>Input and output routines. Qhull provides a wide range of
 input and output options.</dd>
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-mem.htm"><b>Mem</b></a><b>, </b>
-<a href="mem.h#TOP"><b>mem.h</b></a><b>, </b>
-<a href="mem.c#TOP"><b>mem.c</b></a> </dt>
+<a href="mem.h"><b>mem.h</b></a><b>, </b>
+<a href="mem.c"><b>mem.c</b></a> </dt>
 <dd>Memory routines. Qhull provides memory allocation and
 deallocation. It uses quick-fit allocation.</dd>
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-merge.htm"><b>Merge</b></a><b>, </b>
-<a href="merge.h#TOP"><b>merge.h</b></a><b>, </b>
-<a href="merge.c#TOP"><b>merge.c</b></a> </dt>
+<a href="merge.h"><b>merge.h</b></a><b>, </b>
+<a href="merge.c"><b>merge.c</b></a> </dt>
 <dd>Merge routines. Qhull handles precision problems by
-merging facets. These routines merge simplicial facets,
+merged facets or joggled input. These routines merge simplicial facets,
 merge non-simplicial facets, merge cycles of facets, and
 rename redundant vertices.</dd>
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-poly.htm"><b>Poly</b></a><b>, </b>
-<a href="poly.h#TOP"><b>poly.h</b></a><b>, </b>
-<a href="poly.c#TOP"><b>poly.c</b></a><b>, </b>
-<a href="poly2.c#TOP"><b>poly2.c</b></a><b>, </b>
-<a href="qhull.h#TOP"><b>qhull.h</b></a> </dt>
+<a href="poly.h"><b>poly.h</b></a><b>, </b>
+<a href="poly.c"><b>poly.c</b></a><b>, </b>
+<a href="poly2.c"><b>poly2.c</b></a><b>, </b>
+<a href="qhull.h"><b>qhull.h</b></a> </dt>
 <dd>Polyhedral routines. Qhull produces a polyhedron as a
 list of facets with vertices, neighbors, ridges, and
 geometric information. <tt>Qhull.h</tt> defines the main
@@ -157,22 +162,22 @@ while infrequent ones are in <tt>poly2.c</tt>.</dd>
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-qhull.htm#TOC"><b>Qhull</b></a><b>, </b>
-<a href="qhull.c#TOP"><b>qhull.c</b></a><b>, </b>
-<a href="qhull.h#TOP"><b>qhull.h</b></a><b>, </b>
-<a href="qhull_a.h#TOP"><b>qhull_a.h</b></a><b>, </b>
-<a href="unix.c#TOP"><b>unix.c</b></a> <b>, </b>
-<a href="qconvex.c#TOP"><b>qconvex.c</b></a> <b>, </b>
-<a href="qdelaun.c#TOP"><b>qdelaun.c</b></a> <b>, </b>
-<a href="qhalf.c#TOP"><b>qhalf.c</b></a> <b>, </b>
-<a href="qvoronoi.c#TOP"><b>qvoronoi.c</b></a> </dt>
+<a href="qhull.c"><b>qhull.c</b></a><b>, </b>
+<a href="qhull.h"><b>qhull.h</b></a><b>, </b>
+<a href="qhull_a.h"><b>qhull_a.h</b></a><b>, </b>
+<a href="unix.c"><b>unix.c</b></a> <b>, </b>
+<a href="qconvex.c"><b>qconvex.c</b></a> <b>, </b>
+<a href="qdelaun.c"><b>qdelaun.c</b></a> <b>, </b>
+<a href="qhalf.c"><b>qhalf.c</b></a> <b>, </b>
+<a href="qvoronoi.c"><b>qvoronoi.c</b></a> </dt>
 <dd>Top-level routines. The Quickhull algorithm is
 implemented by <tt>qhull.c</tt>. <tt>qhull_a.h</tt>
 includes all header files. </dd>
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-set.htm"><b>Set</b></a><b>, </b>
-<a href="qset.h#TOP"><b>qset.h</b></a><b>, </b>
-<a href="qset.c#TOP"><b>qset.c</b></a> </dt>
+<a href="qset.h"><b>qset.h</b></a><b>, </b>
+<a href="qset.c"><b>qset.c</b></a> </dt>
 <dd>Set routines. Qhull implements its data structures as
 sets. A set is an array of pointers that is expanded as
 needed. This is a separate package that may be used in
@@ -180,16 +185,16 @@ other applications. </dd>
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-stat.htm"><b>Stat</b></a><b>, </b>
-<a href="stat.h#TOP"><b>stat.h</b></a><b>, </b>
-<a href="stat.c#TOP"><b>stat.c</b></a> </dt>
+<a href="stat.h"><b>stat.h</b></a><b>, </b>
+<a href="stat.c"><b>stat.c</b></a> </dt>
 <dd>Statistical routines. Qhull maintains statistics about
 its implementation. </dd>
 
 <dt>&nbsp;</dt>
 <dt><a href="qh-user.htm"><b>User</b></a><b>, </b>
-<a href="user.h#TOP"><b>user.h</b></a><b>, </b>
-<a href="user.c#TOP"><b>user.c</b></a><b>, </b>
-<a href="user_eg.c#TOP"><b>user_eg.c</b></a></dt>
+<a href="user.h"><b>user.h</b></a><b>, </b>
+<a href="user.c"><b>user.c</b></a><b>, </b>
+<a href="user_eg.c"><b>user_eg.c</b></a><b>, </b>
 <a href="qhull_interface.cpp#TOP"><b>qhull_interface.cpp</b></a></dt>
 <dd>User-defined routines. Qhull allows the user to configure
 the code with defined constants and specialized routines.
@@ -197,15 +202,15 @@ the code with defined constants and specialized routines.
 </dl>
 </blockquote>
 
+</blockquote>
 <p><!-- Navigation links --> </p>
 <hr>
 <p><b>Up:</b> 
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -213,6 +218,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="#TOC">Qhull files</a><br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -220,7 +226,7 @@ Qhull</a> <br>
 &#149; <a href="qh-poly.htm">Poly</a> &#149; <a href="qh-qhull.htm#TOC">Qhull</a>
 &#149; <a href="qh-set.htm">Set</a> &#149; <a href="qh-stat.htm">Stat</a>
 &#149; <a href="qh-user.htm">User</a><br>
-</p>
+
 <p><!-- GC common information --> </p>
 <hr>
 <p><a href="http://www.geom.umn.edu/"><img
@@ -230,7 +236,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/io.c b/src/io.c
index 7355ca7..4372a6e 100644
--- a/src/io.c
+++ b/src/io.c
@@ -46,9 +46,14 @@ void qh_produce_output(void) {
     qh_clearcenters (qh_ASvoronoi);
     qh_vertexneighbors();
   }
+  if (qh TRIangulate) {
+    qh_triangulate(); 
+    if (qh VERIFYoutput && !qh CHECKfrequently) 
+      qh_checkpolygon (qh facet_list);
+  }
+  qh_findgood_all (qh facet_list); 
   if (qh GETarea)
     qh_getarea(qh facet_list);
-  qh_findgood_all (qh facet_list); 
   if (qh KEEParea || qh KEEPmerge || qh KEEPminArea < REALmax/2)
     qh_markkeep (qh facet_list);
   if (qh PRINTsummary)
@@ -184,10 +189,13 @@ static int qh_compare_facetvisit(const void *p1, const void *p2) {
   >-------------------------------</a><a name="countfacets">-</a>
   
   qh_countfacets( facetlist, facets, printall, 
-          numfacets, numsimplicial, totneighbors, numridges, numcoplanar  )
+          numfacets, numsimplicial, totneighbors, numridges, numcoplanar, numtricoplanars  )
     count good facets for printing and set visitid
     if allfacets, ignores qh_skipfacet()
 
+  notes:
+    qh_printsummary and qh_countfacets must match counts
+
   returns:
     numfacets, numsimplicial, total neighbors, numridges, coplanars
     each facet with ->visitid indicating 1-relative position
@@ -205,9 +213,9 @@ static int qh_compare_facetvisit(const void *p1, const void *p2) {
         update counts
 */
 void qh_countfacets (facetT *facetlist, setT *facets, boolT printall,
-    int *numfacetsp, int *numsimplicialp, int *totneighborsp, int *numridgesp, int *numcoplanarsp) {
+    int *numfacetsp, int *numsimplicialp, int *totneighborsp, int *numridgesp, int *numcoplanarsp, int *numtricoplanarsp) {
   facetT *facet, **facetp;
-  int numfacets= 0, numsimplicial= 0, numridges= 0, totneighbors= 0, numcoplanars= 0;
+  int numfacets= 0, numsimplicial= 0, numridges= 0, totneighbors= 0, numcoplanars= 0, numtricoplanars= 0;
 
   FORALLfacet_(facetlist) {
     if ((facet->visible && qh NEWfacets)
@@ -216,9 +224,11 @@ void qh_countfacets (facetT *facetlist, setT *facets, boolT printall,
     else {
       facet->visitid= ++numfacets;
       totneighbors += qh_setsize (facet->neighbors);
-      if (facet->simplicial) 
+      if (facet->simplicial) {
         numsimplicial++;
-      else
+	if (facet->keepcentrum && facet->tricoplanar)
+	  numtricoplanars++;
+      }else
         numridges += qh_setsize (facet->ridges);
       if (facet->coplanarset)
         numcoplanars += qh_setsize (facet->coplanarset);
@@ -231,9 +241,11 @@ void qh_countfacets (facetT *facetlist, setT *facets, boolT printall,
     else {
       facet->visitid= ++numfacets;
       totneighbors += qh_setsize (facet->neighbors);
-      if (facet->simplicial)
+      if (facet->simplicial){
         numsimplicial++;
-      else
+	if (facet->keepcentrum && facet->tricoplanar)
+	  numtricoplanars++;
+      }else
         numridges += qh_setsize (facet->ridges);
       if (facet->coplanarset)
         numcoplanars += qh_setsize (facet->coplanarset);
@@ -245,6 +257,7 @@ void qh_countfacets (facetT *facetlist, setT *facets, boolT printall,
   *totneighborsp= totneighbors;
   *numridgesp= numridges;
   *numcoplanarsp= numcoplanars;
+  *numtricoplanarsp= numtricoplanars;
 } /* countfacets */
 
 /*-<a                             href="qh-io.htm#TOC"
@@ -433,14 +446,16 @@ pointT *qh_detvnorm (vertexT *vertex, vertexT *vertexA, setT *centers, realT *of
 */
 setT *qh_detvridge (vertexT *vertex) {
   setT *centers= qh_settemp (qh TEMPsize);
+  setT *tricenters= qh_settemp (qh TEMPsize);
   facetT *neighbor, **neighborp;
   boolT firstinf= True;
   
   FOREACHneighbor_(vertex) {
     if (neighbor->seen) {
-      if (neighbor->visitid)
-        qh_setappend (&centers, neighbor);
-      else if (firstinf) {
+      if (neighbor->visitid) {
+	if (!neighbor->tricoplanar || qh_setunique (&tricenters, neighbor->center)) 
+	  qh_setappend (&centers, neighbor);
+      }else if (firstinf) {
         firstinf= False;
         qh_setappend (&centers, neighbor);
       }
@@ -448,6 +463,7 @@ setT *qh_detvridge (vertexT *vertex) {
   }
   qsort (SETaddr_(centers, facetT), qh_setsize (centers),
              sizeof (facetT *), qh_compare_facetvisit);
+  qh_settempfree (&tricenters);
   return centers;
 } /* detvridge */      
 
@@ -472,6 +488,7 @@ setT *qh_detvridge (vertexT *vertex) {
 */
 setT *qh_detvridge3 (vertexT *atvertex, vertexT *vertex) {
   setT *centers= qh_settemp (qh TEMPsize);
+  setT *tricenters= qh_settemp (qh TEMPsize);
   facetT *neighbor, **neighborp, *facet= NULL;
   boolT firstinf= True;
   
@@ -486,9 +503,10 @@ setT *qh_detvridge3 (vertexT *atvertex, vertexT *vertex) {
   while (facet) { 
     facet->seen2= True;
     if (neighbor->seen) {
-      if (facet->visitid)
-        qh_setappend (&centers, facet);
-      else if (firstinf) {
+      if (facet->visitid) {
+	if (!facet->tricoplanar || qh_setunique (&tricenters, facet->center)) 
+	  qh_setappend (&centers, facet);
+      }else if (firstinf) {
         firstinf= False;
         qh_setappend (&centers, facet);
       }
@@ -514,6 +532,7 @@ setT *qh_detvridge3 (vertexT *atvertex, vertexT *vertex) {
   }
   FOREACHneighbor_(atvertex) 
     neighbor->seen2= True;
+  qh_settempfree (&tricenters);
   return centers;
 } /* detvridge3 */      
 
@@ -571,6 +590,8 @@ int qh_eachvoronoi (FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT
   int count;
   facetT *neighbor, **neighborp, *neighborA, **neighborAp;
   setT *centers;
+  setT *tricenters= qh_settemp (qh TEMPsize);
+
   vertexT *vertex, **vertexp;
   boolT firstinf;
   unsigned int numfacets= (unsigned int)qh num_facets;
@@ -593,11 +614,13 @@ int qh_eachvoronoi (FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT
 	  vertex->visitid= qh vertex_visit;
           count= 0;
           firstinf= True;
+	  qh_settruncate (tricenters, 0);
           FOREACHneighborA_(vertex) {
             if (neighborA->seen) {
-	      if (neighborA->visitid)
-                count++;
-              else if (firstinf) {
+	      if (neighborA->visitid) {
+		if (!neighborA->tricoplanar || qh_setunique (&tricenters, neighborA->center))
+		  count++;
+              }else if (firstinf) {
                 count++;
                 firstinf= False;
 	      }
@@ -631,6 +654,7 @@ int qh_eachvoronoi (FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT
   }
   FOREACHneighbor_(atvertex) 
     neighbor->seen= False;
+  qh_settempfree (&tricenters);
   return totridges;
 } /* eachvoronoi */
   
@@ -905,7 +929,7 @@ void qh_markkeep (facetT *facetlist) {
       facet->visitid >= qh num_facets
   
   notes:
-    ignores qh ATinfinity, if defined
+    ignores qh.ATinfinity, if defined
 */
 setT *qh_markvoronoi (facetT *facetlist, setT *facets, boolT printall, boolT *islowerp, int *numcentersp) {
   int numcenters=0;
@@ -921,7 +945,7 @@ setT *qh_markvoronoi (facetT *facetlist, setT *facets, boolT printall, boolT *is
     SETelem_(vertices, qh num_points-1)= NULL;
   qh visit_id++;
   maximize_(qh visit_id, (unsigned) qh num_facets);
-  FORALLfacet_(facetlist) {  /* FIXUP: could merge with below */
+  FORALLfacet_(facetlist) { 
     if (printall || !qh_skipfacet (facet)) {
       if (!facet->upperdelaunay) {
         islower= True;
@@ -1217,7 +1241,7 @@ void qh_printafacet(FILE *fp, int format, facetT *facet, boolT printall) {
     print header for format
 */
 void qh_printbegin (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall) {
-  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars;
+  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars;
   int i, num;
   facetT *facet, **facetp;
   vertexT *vertex, **vertexp;
@@ -1226,7 +1250,7 @@ void qh_printbegin (FILE *fp, int format, facetT *facetlist, setT *facets, boolT
 
   qh printoutnum= 0;
   qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, 
-      &totneighbors, &numridges, &numcoplanars);
+      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);
   switch (format) {
   case qh_PRINTnone:
     break;
@@ -1740,13 +1764,13 @@ void qh_printextremes (FILE *fp, facetT *facetlist, setT *facets, int printall)
     does not print coplanar points
 */
 void qh_printextremes_2d (FILE *fp, facetT *facetlist, setT *facets, int printall) {
-  int numfacets, numridges, totneighbors, numcoplanars, numsimplicial;
+  int numfacets, numridges, totneighbors, numcoplanars, numsimplicial, numtricoplanars;
   setT *vertices;
   facetT *facet, *startfacet, *nextfacet;
   vertexT *vertexA, *vertexB;
 
   qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, 
-      &totneighbors, &numridges, &numcoplanars); /* marks qh visit_id */
+      &totneighbors, &numridges, &numcoplanars, &numtricoplanars); /* marks qh visit_id */
   vertices= qh_facetvertices (facetlist, facets, printall);
   fprintf(fp, "%d\n", qh_setsize (vertices));
   qh_settempfree (&vertices);
@@ -2344,6 +2368,8 @@ void qh_printfacetheader(FILE *fp, facetT *facet) {
     fprintf(fp, " bottom");
   if (facet->simplicial)
     fprintf(fp, " simplicial");
+  if (facet->tricoplanar)
+    fprintf(fp, " tricoplanar");
   if (facet->upperdelaunay)
     fprintf(fp, " upperDelaunay");
   if (facet->visible)
@@ -2386,6 +2412,9 @@ void qh_printfacetheader(FILE *fp, facetT *facet) {
   else if (facet->newfacet) {
     if (facet->f.samecycle && facet->f.samecycle != facet)
       fprintf(fp, "    - shares same visible/horizon as f%d\n", facet->f.samecycle->id);
+  }else if (facet->tricoplanar /* !isarea */) {
+    if (facet->f.triowner)
+      fprintf(fp, "    - owner of normal & centrum is facet f%d\n", facet->f.triowner->id);
   }else if (facet->f.newcycle)
     fprintf(fp, "    - was horizon to f%d\n", facet->f.newcycle->id);
   if (facet->nummerge)
@@ -2514,7 +2543,7 @@ void qh_printfacetridges(FILE *fp, facetT *facet) {
     turns off 'Rn' option since want actual numbers
 */
 void qh_printfacets(FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall) {
-  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars;
+  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars;
   facetT *facet, **facetp;
   setT *vertices;
   coordT *center;
@@ -2553,12 +2582,14 @@ void qh_printfacets(FILE *fp, int format, facetT *facetlist, setT *facets, boolT
     fprintf (fp, "\n");
   }else if (format == qh_PRINTsummary) {
     qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, 
-      &totneighbors, &numridges, &numcoplanars);
+      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);
     vertices= qh_facetvertices (facetlist, facets, printall); 
-    fprintf (fp, "8 %d %d %d %d %d %d %d %d\n2 ", qh hull_dim, 
+    fprintf (fp, "10 %d %d %d %d %d %d %d %d %d %d\n2 ", qh hull_dim, 
                 qh num_points + qh_setsize (qh other_points),
                 qh num_vertices, qh num_facets - qh num_visible,
-                qh_setsize (vertices), numfacets, numcoplanars, numfacets - numsimplicial);
+                qh_setsize (vertices), numfacets, numcoplanars, 
+		numfacets - numsimplicial, zzval_(Zdelvertextot), 
+		numtricoplanars);
     qh_settempfree (&vertices);
     qh_outerinner (NULL, &outerplane, &innerplane);
     fprintf (fp, qh_REAL_2n, outerplane, innerplane);
@@ -2637,9 +2668,9 @@ When computing the Delaunay triangulation:\n\
     fprintf(fp, "\
 \n\
 If you need triangular output:\n\
+  - use option 'Qt' to triangulate the output\n\
   - use option 'QJ' to joggle the input points and remove precision errors\n\
-  - or use option 'Ft' instead of 'Q0'.  It triangulates non-simplicial\n\
-    facets with added points.\n\
+  - use option 'Ft'.  It triangulates non-simplicial facets with added points.\n\
 \n\
 If you must use 'Q0',\n\
 try one or more of the following options.  They can not guarantee an output.\n\
@@ -2652,6 +2683,7 @@ try one or more of the following options.  They can not guarantee an output.\n\
     fprintf(fp, "\
 \n\
 To guarantee simplicial output:\n\
+  - use option 'Qt' to triangulate the output\n\
   - use option 'QJ' to joggle the input points and remove precision errors\n\
   - use option 'Ft' to triangulate the output by adding points\n\
   - use exact arithmetic (see \"Imprecision in Qhull\", qh-impre.htm)\n\
@@ -3260,7 +3292,7 @@ int qh_printvdiagram2 (FILE *fp, printvridgeT printvridge, setT *vertices, qh_RI
 */
 void qh_printvertex(FILE *fp, vertexT *vertex) {
   pointT *point;
-  int k;
+  int k, count= 0;
   facetT *neighbor, **neighborp;
   realT r; /*bug fix*/
 
@@ -3283,8 +3315,11 @@ void qh_printvertex(FILE *fp, vertexT *vertex) {
   fprintf(fp, "\n");
   if (vertex->neighbors) {
     fprintf(fp, "  neighbors:");
-    FOREACHneighbor_(vertex)
+    FOREACHneighbor_(vertex) {
+      if (++count % 100 == 0)
+	fprintf (fp, "\n     ");
       fprintf(fp, " f%d", neighbor->id);
+    }
     fprintf(fp, "\n");
   }
 } /* printvertex */
@@ -3343,7 +3378,7 @@ void qh_printvertices(FILE *fp, char* string, setT *vertices) {
       list vertex neighbors or coplanar facet
 */
 void qh_printvneighbors (FILE *fp, facetT* facetlist, setT *facets, boolT printall) {
-  int numfacets, numsimplicial, numridges, totneighbors, numneighbors, numcoplanars;
+  int numfacets, numsimplicial, numridges, totneighbors, numneighbors, numcoplanars, numtricoplanars;
   setT *vertices, *vertex_points, *coplanar_points;
   int numpoints= qh num_points + qh_setsize (qh other_points);
   vertexT *vertex, **vertexp;
@@ -3352,7 +3387,7 @@ void qh_printvneighbors (FILE *fp, facetT* facetlist, setT *facets, boolT printa
   pointT *point, **pointp;
 
   qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, 
-      &totneighbors, &numridges, &numcoplanars);  /* sets facet->visitid */
+      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);  /* sets facet->visitid */
   fprintf (fp, "%d\n", numpoints);
   qh_vertexneighbors();
   vertices= qh_facetvertices (facetlist, facets, printall);
diff --git a/src/io.h b/src/io.h
index 1321e79..df743e9 100644
--- a/src/io.h
+++ b/src/io.h
@@ -77,7 +77,7 @@ void    dfacet( unsigned id);
 void    dvertex( unsigned id);
 void    qh_countfacets (facetT *facetlist, setT *facets, boolT printall, 
               int *numfacetsp, int *numsimplicialp, int *totneighborsp, 
-              int *numridgesp, int *numcoplanarsp);
+              int *numridgesp, int *numcoplanarsp, int *numnumtricoplanarsp);
 pointT *qh_detvnorm (vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp);
 setT   *qh_detvridge (vertexT *vertex);
 setT   *qh_detvridge3 (vertexT *atvertex, vertexT *vertex);
diff --git a/src/merge.c b/src/merge.c
index 24b532a..d0ea4e1 100644
--- a/src/merge.c
+++ b/src/merge.c
@@ -13,7 +13,7 @@
    To remove deleted facets and vertices (qhull() in qhull.c):
      qh_partitionvisible (!qh_ALL, &numoutside);  // visible_list, newfacet_list
      qh_deletevisible ();         // qh.visible_list
-     qh_resetlists (False);       // qh.visible_list newvertex_list newfacet_list 
+     qh_resetlists (False, qh_RESETvisible);       // qh.visible_list newvertex_list newfacet_list 
 
    assumes qh.CENTERtype= centrum
 
@@ -345,9 +345,23 @@ void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, rea
       qh_setappend (&(qh degen_mergeset), merge);
     else
       qh_setaddnth (&(qh degen_mergeset), 0, merge);
-  }else { /* mergetype == MRGredundant */
+  }else if (mergetype == MRGredundant) {
     facet->redundant= True;
     qh_setappend (&(qh degen_mergeset), merge);
+  }else /* mergetype == MRGmirror */ {
+    if (facet->redundant || neighbor->redundant) {
+      fprintf(qh ferr, "qhull error (qh_appendmergeset): facet f%d or f%d is already a mirrored facet\n",
+	   facet->id, neighbor->id);
+      qh_errexit2 (qh_ERRqhull, facet, neighbor);
+    }
+    if (!qh_setequal (facet->vertices, neighbor->vertices)) {
+      fprintf(qh ferr, "qhull error (qh_appendmergeset): mirrored facets f%d and f%d do not have the same vertices\n",
+	   facet->id, neighbor->id);
+      qh_errexit2 (qh_ERRqhull, facet, neighbor);
+    }
+    facet->redundant= True;
+    neighbor->redundant= True;
+    qh_setappend (&(qh degen_mergeset), merge);
   }
 } /* appendmergeset */
 
@@ -1420,7 +1434,7 @@ void qh_makeridges(facetT *facet) {
     
   notes:
     duplicate ridges occur when the horizon is pinched,
-        i.e. a subridge occurs in more than two horizon   ridges.
+        i.e. a subridge occurs in more than two horizon ridges.
     could rename vertices that pinch the horizon
     uses qh.visit_id
 
@@ -1739,6 +1753,14 @@ void qh_mergecycle (facetT *samecycle, facetT *newfacet) {
   facetT *same;
 #endif
 
+  if (newfacet->tricoplanar) {
+    if (!qh TRInormals) {
+      fprintf (qh ferr, "qh_mergecycle: does not work for tricoplanar facets.  Use option 'Q11'\n");
+      qh_errexit (qh_ERRqhull, newfacet, NULL);
+    }
+    newfacet->tricoplanar= False;
+    newfacet->keepcentrum= False;
+  }
   if (!qh VERTEXneighbors)
     qh_vertexneighbors();
   zzinc_(Ztotmerge);
@@ -2249,6 +2271,16 @@ void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdis
   vertexT *vertex, **vertexp;
   int tracerestore=0, nummerge;
 
+  if (facet1->tricoplanar || facet2->tricoplanar) {
+    if (!qh TRInormals) {
+      fprintf (qh ferr, "qh_mergefacet: does not work for tricoplanar facets.  Use option 'Q11'\n");
+      qh_errexit2 (qh_ERRqhull, facet1, facet2);
+    }
+    if (facet2->tricoplanar) {
+      facet2->tricoplanar= False;
+      facet2->keepcentrum= False;
+    }
+  }
   zzinc_(Ztotmerge);
   if (qh REPORTfreq2 && qh POSTmerging) {
     if (zzval_(Ztotmerge) > qh mergereport + qh REPORTfreq2)
@@ -2290,10 +2322,8 @@ void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdis
   if (qh num_facets - qh num_visible <= qh hull_dim + 1) {
     fprintf(qh ferr, "\n\
 qhull precision error: Only %d facets remain.  Can not merge another\n\
-pair.  The convexity constraints may be too strong.  Reduce the\n\
-magnitude of 'Cn' or increase the magnitude of 'An'.  For example,\n\
-try 'C-0.001' instead of 'C-0.1' or 'A-0.999' instead of 'A-0.9'.\n", 
-                 qh hull_dim+1);
+pair.  The input is too degenerate or the convexity constraints are\n\
+too strong.\n", qh hull_dim+1);
     if (qh hull_dim >= 5 && !qh MERGEexact)
       fprintf(qh ferr, "Option 'Qx' may avoid this problem.\n");
     qh_errexit(qh_ERRinput, NULL, NULL);
diff --git a/src/merge.h b/src/merge.h
index 97e550a..704112f 100644
--- a/src/merge.h
+++ b/src/merge.h
@@ -44,7 +44,7 @@
 #define qh_ANGLEconcave  1.5
 
 /*-<a                             href="qh-merge.htm#TOC"
-  >--------------------------------</a><a name="MRG...">-</a>
+  >--------------------------------</a><a name="MRG">-</a>
   
   MRG... (mergeType)
     indicates the type of a merge (mergeT->type)
@@ -61,6 +61,7 @@ typedef enum {	/* in sort order for facet_mergeset */
   MRGdegen,		/* degenerate facet (not enough neighbors) facet1 == facet2 */
   MRGredundant,		/* redundant facet (vertex subset) */
   			/* merge_degenredundant assumes degen < redundant */
+  MRGmirror,	        /* mirror facet from qh_triangulate */
   ENDmrg
 } mergeType;
 
diff --git a/src/poly.c b/src/poly.c
index 8dad33e..7f5f6f3 100644
--- a/src/poly.c
+++ b/src/poly.c
@@ -23,12 +23,15 @@
     appends facet to end of qh.facet_list,
 
   returns:
-    updates qh.facet_list, facet_tail, newfacet_list, facet_next
+    updates qh.newfacet_list, facet_next, facet_list
     increments qh.numfacets
   
   notes:
     assumes qh.facet_list/facet_tail is defined (createsimplex)
 
+  see:
+    qh_removefacet()
+
 */
 void qh_appendfacet(facetT *facet) {
   facetT *tail= qh facet_tail;
@@ -57,7 +60,7 @@ void qh_appendfacet(facetT *facet) {
 
   returns:
     sets vertex->newlist
-    updates qh.vertex_list, vertex_tail, newvertex_list
+    updates qh.vertex_list, newvertex_list
     increments qh.num_vertices
 
   notes:
@@ -242,17 +245,19 @@ boolT qh_checkflipped (facetT *facet, realT *distp, boolT allerror) {
 void qh_delfacet(facetT *facet) {
   void **freelistp; /* used !qh_NOmem */
 
-  trace5((qh ferr, "qh_delfacet: delete f%d\n", facet->id));
+  trace4((qh ferr, "qh_delfacet: delete f%d\n", facet->id));
   if (facet == qh tracefacet)
     qh tracefacet= NULL;
   if (facet == qh GOODclosest)
     qh GOODclosest= NULL;
   qh_removefacet(facet);
-  qh_memfree_(facet->normal, qh normal_size, freelistp);
-  if (qh CENTERtype == qh_ASvoronoi) {   /* uses macro calls */
-    qh_memfree_(facet->center, qh center_size, freelistp);
-  }else /* AScentrum */ {
-    qh_memfree_(facet->center, qh normal_size, freelistp);
+  if (!facet->tricoplanar || facet->keepcentrum) {
+    qh_memfree_(facet->normal, qh normal_size, freelistp);
+    if (qh CENTERtype == qh_ASvoronoi) {   /* uses macro calls */
+      qh_memfree_(facet->center, qh center_size, freelistp);
+    }else /* AScentrum */ {
+      qh_memfree_(facet->center, qh normal_size, freelistp);
+    }
   }
   qh_setfree(&(facet->neighbors));
   if (facet->ridges)
@@ -303,7 +308,7 @@ void qh_deletevisible (void /*qh visible_list*/) {
   qh num_visible= 0;
   zadd_(Zvisfacettot, numvisible);
   zmax_(Zvisfacetmax, numvisible);
-  zadd_(Zdelvertextot, numdel);
+  zzadd_(Zdelvertextot, numdel);
   zmax_(Zdelvertexmax, numdel);
   FOREACHvertex_(qh del_vertices) 
     qh_delvertex (vertex);
@@ -449,9 +454,10 @@ unsigned qh_gethash (int hashsize, setT *set, int size, int firstindex, void *sk
 
   returns:
     returns newfacet
-      adds newfacet to qh.facet_list 
-      newfacet->neighbor= horizon, but not vice versa
+      adds newfacet to qh.facet_list
       newfacet->vertices= vertices
+      if horizon
+        newfacet->neighbor= horizon, but not vice versa
     newvertex_list updated with vertices
 */
 facetT *qh_makenewfacet(setT *vertices, boolT toporient,facetT *horizon) {
@@ -467,7 +473,8 @@ facetT *qh_makenewfacet(setT *vertices, boolT toporient,facetT *horizon) {
   newfacet= qh_newfacet();
   newfacet->vertices= vertices;
   newfacet->toporient= toporient;
-  qh_setappend(&(newfacet->neighbors), horizon);
+  if (horizon)
+    qh_setappend(&(newfacet->neighbors), horizon);
   qh_appendfacet(newfacet);
   return(newfacet);
 } /* makenewfacet */
@@ -533,6 +540,7 @@ void qh_makenewplanes (void /* newfacet_list */) {
           (checks for non-simplicial facet with multiple ridges to visible facet)
         updates neighbor's ridge set
         (checks for simplicial neighbor to non-simplicial visible facet)
+	(deletes ridge if neighbor is simplicial)
           
 */
 #ifndef qh_NOmerge
@@ -788,10 +796,10 @@ void qh_matchneighbor (facetT *newfacet, int newskip, int hashsize, int *hashcou
     qh.newfacet_list with full neighbor sets
       get vertices with nth neighbor by deleting nth vertex
     if qh.PREmerge/MERGEexact or qh.FORCEoutput 
-      all facets check for flipped (also prevents point partitioning)
+      sets facet->flippped if flipped normal (also prevents point partitioning)
     if duplicate ridges and qh.PREmerge/MERGEexact
-      facet->dupridge set
-      missing neighbor links identifies extra ridges to be merging
+      sets facet->dupridge
+      missing neighbor links identifies extra ridges to be merging (qh_MERGEridge)
 
   notes:
     newfacets already have neighbor[0] (horizon facet)
@@ -809,7 +817,7 @@ void qh_matchneighbor (facetT *newfacet, int newskip, int hashsize, int *hashcou
         match it with a facet
     check for flipped facets
 */
-void qh_matchnewfacets (void) {
+void qh_matchnewfacets (void /* qh newfacet_list */) {
   int numnew=0, hashcount=0, newskip;
   facetT *newfacet, *neighbor;
   int dim= qh hull_dim, hashsize, neighbor_i, neighbor_n;
@@ -1044,6 +1052,9 @@ int qh_pointid (pointT *point) {
   returns:
     updates qh.facet_list .newfacet_list .facet_next visible_list
     decrements qh.num_facets
+
+  see:
+    qh_appendfacet
 */
 void qh_removefacet(facetT *facet) {
   facetT *next= facet->next, *previous= facet->previous;
@@ -1100,9 +1111,13 @@ void qh_removevertex(vertexT *vertex) {
     update vertex neighbors and delete interior vertices
 
   returns:
-    if qh.VERTEXneighbors
-      updates neighbors for each vertex
-    interior vertices added to qh.del_vertices for later partitioning
+    if qh.VERTEXneighbors, updates neighbors for each vertex
+      if qh.newvertex_list, 
+         removes visible neighbors  from vertex neighbors
+      if qh.newfacet_list
+         adds new facets to vertex neighbors
+    if qh.visible_list
+       interior vertices added to qh.del_vertices for later partitioning
 
   design:
     if qh.VERTEXneighbors
@@ -1112,7 +1127,7 @@ void qh_removevertex(vertexT *vertex) {
         removes visible facets from neighbor lists
         marks unused vertices for deletion
 */
-void qh_updatevertices (void) {
+void qh_updatevertices (void /*qh newvertex_list, newfacet_list, visible_list*/) {
   facetT *newfacet= NULL, *neighbor, **neighborp, *visible;
   vertexT *vertex, **vertexp;
 
diff --git a/src/poly.h b/src/poly.h
index d691614..af547ab 100644
--- a/src/poly.h
+++ b/src/poly.h
@@ -75,8 +75,8 @@
 /*-<a                             href="qh-poly.htm#TOC"
   >--------------------------------</a><a name="FORALLnew_facets">-</a>
   
-  FORALLnewfacets { ... } 
-    assign 'facet' to each facet in qh.newfacet_list
+  FORALLnew_facets { ... } 
+    assign 'newfacet' to each facet in qh.newfacet_list
     
   notes:
     uses 'facetT *newfacet;'
@@ -274,8 +274,13 @@ setT   *qh_pointvertex (void /*qh facet_list*/);
 void 	qh_prependfacet(facetT *facet, facetT **facetlist);
 void	qh_printhashtable(FILE *fp);
 void    qh_printlists (void);
-void    qh_resetlists (boolT stats /*qh newvertex_list newfacet_list visible_list*/);
+void    qh_resetlists (boolT stats, boolT resetVisible /*qh newvertex_list newfacet_list visible_list*/);
 void    qh_setvoronoi_all (void);
+void	qh_triangulate (void /*qh facet_list*/);
+void    qh_triangulate_facet (facetT *facetA, vertexT **first_vertex);
+void    qh_triangulate_link (facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB);
+void	qh_triangulate_mirror (facetT *facetA, facetT *facetB);
+void    qh_triangulate_null (facetT *facetA);
 void    qh_vertexintersect(setT **vertexsetA,setT *vertexsetB);
 setT   *qh_vertexintersect_new(setT *vertexsetA,setT *vertexsetB);
 void    qh_vertexneighbors (void /*qh facet_list*/);
diff --git a/src/poly2.c b/src/poly2.c
index a5fd0d5..6c12445 100644
--- a/src/poly2.c
+++ b/src/poly2.c
@@ -47,6 +47,8 @@ void qh_addhash (void* newelem, setT *hashtable, int hashsize, unsigned hash) {
     qh_check_maxout(), qh_outerinner()
 
   notes:
+    only called from qh_check_points()
+      seldom used since qh.MERGING is almost always set
     if notverified>0 at end of routine
       some points were well inside the hull.  If the hull contains
       a lens-shaped component, these points were not verified.  Use
@@ -60,12 +62,12 @@ void qh_addhash (void* newelem, setT *hashtable, int hashsize, unsigned hash) {
       error if point is outside of facet
 */
 void qh_check_bestdist (void) {
-  boolT waserror= False, isoutside, unassigned;
+  boolT waserror= False, unassigned;
   facetT *facet, *bestfacet, *errfacet1= NULL, *errfacet2= NULL;
   facetT *facetlist; 
   realT dist, maxoutside, maxdist= -REALmax;
   pointT *point;
-  int numpart, facet_i, facet_n, notgood= 0, notverified= 0;
+  int numpart= 0, facet_i, facet_n, notgood= 0, notverified= 0;
   setT *facets;
 
   trace1((qh ferr, "qh_check_bestdist: check points below nearest facet.  Facet_list f%d\n",
@@ -90,8 +92,9 @@ below %2.2g of the nearest %sfacet.\n",
     point= qh_point(facet_i);
     if (point == qh GOODpointp)
       continue;
-    bestfacet= qh_findbest (point, facet, qh_ALL, False, !qh_NOupper,
-			    &dist, &isoutside, &numpart);
+    qh_distplane(point, facet, &dist);
+    numpart++;
+    bestfacet= qh_findbesthorizon (!qh_IScheckmax, point, facet, qh_NOupper, &dist, &numpart);
     /* occurs after statistics reported */
     maximize_(maxdist, dist);
     if (dist > maxoutside) {
@@ -103,8 +106,10 @@ below %2.2g of the nearest %sfacet.\n",
 	waserror= True;
 	fprintf(qh ferr, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n", 
 		facet_i, bestfacet->id, dist, maxoutside);
-	errfacet2= errfacet1;
-	errfacet1= bestfacet;		    
+	if (errfacet1 != bestfacet) {
+	  errfacet2= errfacet1;
+	  errfacet1= bestfacet;
+	}
       }
     }else if (unassigned && dist < -qh MAXcoplanar)
       notverified++;
@@ -121,7 +126,7 @@ options 'Qci Tv' to verify all points.\n", notverified);
   }else if (waserror && qh outside_err > REALmax/2)
     qh_errexit2 (qh_ERRprec, errfacet1, errfacet2);
   else if (waserror)
-    ;                       /* the error was logged to qh_errlog() but does not effect the output */
+    ;                       /* the error was logged to qh.ferr but does not effect the output */
   trace0((qh ferr, "qh_check_bestdist: max distance outside %2.2g\n", maxdist));
 } /* check_bestdist */
 
@@ -133,7 +138,7 @@ options 'Qci Tv' to verify all points.\n", notverified);
     if qh.ONLYgood, ignores !good facets
 
   returns:
-    updates facet->maxoutside via qh_findbest()
+    updates facet->maxoutside via qh_findbesthorizon()
     sets qh.maxoutdone
     if printing qh.min_vertex (qh_outerinner), 
       it is updated to the current vertices
@@ -160,9 +165,9 @@ options 'Qci Tv' to verify all points.\n", notverified);
 #ifndef qh_NOmerge
 void qh_check_maxout (void) {
   facetT *facet, *bestfacet, *neighbor, **neighborp, *facetlist;
-  realT dist, maxoutside, minvertex;
+  realT dist, maxoutside, minvertex, old_maxoutside;
   pointT *point;
-  int numpart, facet_i, facet_n, notgood= 0;
+  int numpart= 0, facet_i, facet_n, notgood= 0;
   setT *facets, *vertices;
   vertexT *vertex;
 
@@ -192,28 +197,35 @@ void qh_check_maxout (void) {
     qh_settempfree (&vertices);  
   }
   facets= qh_pointfacet (/*qh facet_list*/);
-  FOREACHfacet_i_(facets) {     /* for each point with facet assignment */
-    if (facet) { 
-      point= qh_point(facet_i);
-      if (point == qh GOODpointp)
-	continue;
-      zinc_(Ztotcheck);
-      bestfacet= qh_findbest (point, facet, qh_ALL, False, !qh_NOupper,
-			         &dist, NULL, &numpart);
-      zadd_(Zcheckpart, numpart);
-      if (bestfacet && dist > maxoutside) {
-        if (qh ONLYgood && !bestfacet->good 
-        && !((bestfacet= qh_findgooddist (point, bestfacet, &dist, &facetlist))
-             && dist > maxoutside))
-          notgood++;
-        else
-	  maxoutside= dist;
+  do {
+    old_maxoutside= fmax_(qh max_outside, maxoutside);
+    FOREACHfacet_i_(facets) {     /* for each point with facet assignment */
+      if (facet) { 
+	point= qh_point(facet_i);
+	if (point == qh GOODpointp)
+	  continue;
+	zinc_(Ztotcheck);
+	qh_distplane(point, facet, &dist);
+	numpart++;
+	bestfacet= qh_findbesthorizon (qh_IScheckmax, point, facet, !qh_NOupper, &dist, &numpart);
+	if (bestfacet && dist > maxoutside) {
+	  if (qh ONLYgood && !bestfacet->good 
+	  && !((bestfacet= qh_findgooddist (point, bestfacet, &dist, &facetlist))
+	       && dist > maxoutside))
+	    notgood++;
+	  else
+	    maxoutside= dist;
+	}
+	if (dist > qh TRACEdist || (bestfacet && bestfacet == qh tracefacet))
+	  fprintf (qh ferr, "qh_check_maxout: p%d is %.2g above f%d\n",
+		     qh_pointid (point), dist, bestfacet->id);
       }
-      if (dist > qh TRACEdist || (bestfacet && bestfacet == qh tracefacet))
-	fprintf (qh ferr, "qh_check_maxout: p%d is %.2g above f%d\n",
-		   qh_pointid (point), dist, bestfacet->id);
     }
-  }
+  }while 
+    (maxoutside > 2*old_maxoutside);
+    /* if qh.maxoutside increases substantially, qh_SEARCHdist is not valid 
+          e.g., RBOX 5000 s Z1 G1e-13 t1001200614 | qhull */
+  zzadd_(Zcheckpart, numpart);
   qh_settempfree (&facets);
   wval_(Wmaxout)= maxoutside - qh max_outside;
   wmax_(Wmaxoutside, qh max_outside);
@@ -233,6 +245,7 @@ void qh_check_maxout (void) {
   
   qh_check_output()
     performs the checks at the end of qhull algorithm
+    Maybe called after voronoi output.  Will recompute otherwise centrums are Voronoi centers instead
 */
 void qh_check_output (void) {
   int i;
@@ -263,8 +276,10 @@ void qh_check_point (pointT *point, facetT *facet, realT *maxoutside, realT *max
   /* occurs after statistics reported */
   qh_distplane(point, facet, &dist);
   if (dist > *maxoutside) {
-    *errfacet2= *errfacet1;
-    *errfacet1= facet;
+    if (*errfacet1 != facet) {
+      *errfacet2= *errfacet1;
+      *errfacet1= facet;
+    }
     fprintf(qh ferr, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n", 
 	      qh_pointid(point), facet->id, dist, *maxoutside);
   }
@@ -279,7 +294,8 @@ void qh_check_point (pointT *point, facetT *facet, realT *maxoutside, realT *max
     checks that all points are inside all facets
 
   notes:
-    uses qh_findbest if lots of points
+    if many points and qh_check_maxout not called (i.e., !qh.MERGING), 
+       calls qh_findbesthorizon (seldom done).
     ignores flipped facets
     maxoutside includes 2 qh.DISTrounds
       one qh.DISTround for the computed distances in qh_check_points
@@ -312,7 +328,7 @@ void qh_check_points (void) {
   if (total >= qh_VERIFYdirect && !qh maxoutdone) {
     if (!qh_QUICKhelp && qh SKIPcheckmax && qh MERGING)
       fprintf (qh ferr, "\n\
-qhull input warning: merging without checking outer planes ('Q5').\n\
+qhull input warning: merging without checking outer planes ('Q5' or 'Po').\n\
 Verify may report that a point is outside of a facet.\n");
     qh_check_bestdist();
   }else {
@@ -348,6 +364,10 @@ all %sfacets.  Will make %2.0f distance computations.\n",
         continue;
       if (facet->flipped)
         continue;
+      if (!facet->normal) {
+	fprintf( qh ferr, "qhull warning (qh_check_points): missing normal for facet f%d\n", facet->id);
+        continue;
+      }
       if (testouter) {
 #if qh_MAXoutside
 	maxoutside= facet->maxoutside + 2* qh DISTround;
@@ -409,7 +429,7 @@ void qh_checkconvex(facetT *facetlist, int fault) {
   vertexT *vertex;
   realT dist;
   pointT *centrum;
-  boolT waserror= False, tempcentrum= False, allsimplicial;
+  boolT waserror= False, centrum_warning= False, tempcentrum= False, allsimplicial;
   int neighbor_i;
 
   trace1((qh ferr, "qh_checkconvex: check all ridges are convex\n"));
@@ -426,14 +446,14 @@ void qh_checkconvex(facetT *facetlist, int fault) {
       waserror= True;
       continue;
     }
-    if (qh MERGING && (!qh ZEROcentrum || !facet->simplicial))
+    if (qh MERGING && (!qh ZEROcentrum || !facet->simplicial || facet->tricoplanar))
       allsimplicial= False;
     else {
       allsimplicial= True;
       neighbor_i= 0;
       FOREACHneighbor_(facet) {
         vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT);
-	if (!neighbor->simplicial) {
+	if (!neighbor->simplicial || neighbor->tricoplanar) {
 	  allsimplicial= False;
 	  continue;
 	}
@@ -477,12 +497,18 @@ void qh_checkconvex(facetT *facetlist, int fault) {
           facet->center= qh_getcentrum (facet);
         centrum= facet->center;
       }else {
+	if (!centrum_warning && (!facet->simplicial || facet->tricoplanar)) {
+	   centrum_warning= True;
+	   fprintf (qh ferr, "qhull note: recomputing centrums for convexity test.  This may lead to false, precision errors.\n");
+	}
         centrum= qh_getcentrum(facet);
         tempcentrum= True;
       }
       FOREACHneighbor_(facet) {
 	if (qh ZEROcentrum && facet->simplicial && neighbor->simplicial)
 	  continue;
+	if (facet->tricoplanar || neighbor->tricoplanar)
+	  continue;
         zzinc_(Zdistconvex);
         qh_distplane (centrum, neighbor, &dist);
         if (dist > qh DISTround) {
@@ -493,7 +519,7 @@ void qh_checkconvex(facetT *facetlist, int fault) {
           errfacet1= facet;
           errfacet2= neighbor;
           waserror= True;
-        }else if (dist >= 0.0) {   /* if arithmetic always rounds the same,
+	}else if (dist >= 0.0) {   /* if arithmetic always rounds the same,
 				     can test against centrum radius instead */
           zzinc_(Zcoplanarridges);
           qh_precision ("coplanar ridge");
@@ -607,11 +633,12 @@ void qh_checkfacet(facetT *facet, boolT newmerge, boolT *waserrorp) {
          facet->id, numvertices, numneighbors);
        waserror= True;
     }
+    /* in 3-d, can get a vertex twice in an edge list, e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv TP624 TW1e-13 T4 */
     if (numridges < numneighbors
-    ||(qh hull_dim == 3 && numvertices != numridges && !qh NEWfacets)
+    ||(qh hull_dim == 3 && numvertices > numridges && !qh NEWfacets)
     ||(qh hull_dim == 2 && numridges + numvertices + numneighbors != 6)) {
       if (!facet->degenerate && !facet->redundant) {
-	fprintf(qh ferr, "qhull internal error (qh_checkfacet): for facet f%d, #ridges %d < #neighbors %d or (3-d) != #vertices %d or (2-d) not all 2\n",
+	fprintf(qh ferr, "qhull internal error (qh_checkfacet): for facet f%d, #ridges %d < #neighbors %d or (3-d) > #vertices %d or (2-d) not all 2\n",
 	    facet->id, numridges, numneighbors, numvertices);
 	waserror= True;
       }
@@ -817,11 +844,16 @@ void qh_checkpolygon(facetT *facetlist) {
       if (!nextseen) {
 	if (facet == qh facet_next)
 	  nextseen= True;
-	else if (qh_setsize (facet->outsideset)
-        && !(qh NARROWhull && qh CHECKfrequently)) {
-	  fprintf (qh ferr, "qhull internal error (qh_checkpolygon): f%d has outside set before qh facet_next\n",
-		   facet->id);
-	  qh_errexit (qh_ERRqhull, facet, NULL);
+	else if (qh_setsize (facet->outsideset)) {
+	  if (!qh NARROWhull
+#if !qh_COMPUTEfurthest
+	       || facet->furthestdist >= qh MINoutside
+#endif
+			) {
+	    fprintf (qh ferr, "qhull internal error (qh_checkpolygon): f%d has outside points before qh facet_next\n",
+		     facet->id);
+	    qh_errexit (qh_ERRqhull, facet, NULL);
+	  }
 	}
       }
       numfacets++;
@@ -866,8 +898,8 @@ void qh_checkpolygon(facetT *facetlist) {
   qh vertex_visit += numfacets;
   if (facetlist == qh facet_list) {
     if (numfacets != qh num_facets - qh num_visible) {
-      fprintf(qh ferr, "qhull internal error (qh_checkpolygon): actual number of facets is %d, cumulative facet count is %d\n",
-	      numfacets, qh num_facets- qh num_visible);
+      fprintf(qh ferr, "qhull internal error (qh_checkpolygon): actual number of facets is %d, cumulative facet count is %d - %d visible facets\n",
+	      numfacets, qh num_facets, qh num_visible);
       waserror= True;
     }
     qh vertex_visit++;
@@ -897,9 +929,10 @@ void qh_checkpolygon(facetT *facetlist) {
       waserror= True;
     }
     if (qh hull_dim == 3 && numvertices + numfacets - numridges/2 != 2) {
-      fprintf (qh ferr, "qhull internal error (qh_checkpolygon): #vertices %d + #facets %d - #edges %d != 2\n",
+      fprintf (qh ferr, "qhull warning: #vertices %d + #facets %d - #edges %d != 2\n\
+	A vertex appears twice in a edge list.  May occur during merging.",
         numvertices, numfacets, numridges/2);
-      waserror= True;
+      /* occurs if lots of merging and a vertex ends up twice in an edge list.  e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv */
     }
   }
   if (waserror) 
@@ -1004,7 +1037,7 @@ void qh_createsimplex(setT *vertices) {
   vertexT *vertex;
   
   qh facet_list= qh newfacet_list= qh facet_tail= qh_newfacet();
-  qh num_facets= qh num_vertices= 0;
+  qh num_facets= qh num_vertices= qh num_visible= 0;
   qh vertex_list= qh newvertex_list= qh vertex_tail= qh_newvertex(NULL);
   FOREACHvertex_i_(vertices) {
     newfacet= qh_newfacet();
@@ -1141,9 +1174,10 @@ setT *qh_facet3vertex (facetT *facet) {
     
   notes:
     this works for all distributions
-    if inside, qh_findbestfacet performed an exhaustive search
+    if inside, qh_findbestfacet performs an exhaustive search
+       this may be too conservative.  Sometimes it is clearly required.
     qh_findbestfacet is not used by qhull.
-    uses qh.visit_id, qh.searchset
+    uses qh.visit_id and qh.coplanarset
     
   see:
     <a href="geom.c#findbest">qh_findbest</a>
@@ -1154,12 +1188,8 @@ facetT *qh_findbestfacet (pointT *point, boolT bestoutside,
   int numpart, totpart= 0;
   
   bestfacet= qh_findbest (point, qh facet_list, 
-			    bestoutside, False, bestoutside,
+			    bestoutside, !qh_ISnewfacets, bestoutside /* qh_NOupper */,
 			    bestdist, isoutside, &totpart);
-  if (!bestfacet) {
-    fprintf (qh ferr, "qh_findbestfacet: all facets are flipped or upper Delaunay\n");
-    qh_errexit (qh_ERRqhull, NULL, NULL);
-  }
   if (*bestdist < -qh DISTround) {
     bestfacet= qh_findfacet_all (point, bestdist, isoutside, &numpart);
     totpart += numpart;
@@ -1593,7 +1623,7 @@ void qh_initbuild( void) {
          qh IStracing ? qh IStracing : qh TRACElevel, qh rbox_command, qh qhull_command);
     fprintf (qh ferr, "Options selected for Qhull %s:\n%s\n", qh_version, qh qhull_options);
   }
-  qh_resetlists (False /*qh visible_list newvertex_list newfacet_list */);
+  qh_resetlists (False, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */);
   qh facet_next= qh facet_list;
   qh_furthestnext (/* qh facet_list */);
   if (qh PREmerge) {
@@ -1614,7 +1644,7 @@ good point (QGn or QG-n), or a good vertex with 'QJ' or 'Q0' (QVn).\n");
     if (qh GOODvertex > 0  && !qh MERGING  /* matches qh_partitionall */
 	&& !qh_isvertex (qh GOODvertexp, vertices)) {
       facet= qh_findbestnew (qh GOODvertexp, qh facet_list, 
-			  &dist, &isoutside, &numpart);
+			  &dist, !qh_ALL, &isoutside, &numpart);
       zadd_(Zdistgood, numpart);
       if (!isoutside) {
         fprintf (qh ferr, "qhull input error: point for QV%d is inside initial simplex.  It can not be made a vertex.\n",
@@ -1656,7 +1686,7 @@ void qh_initialhull(setT *vertices) {
 #endif
 
   qh_createsimplex(vertices);  /* qh facet_list */
-  qh_resetlists (False);
+  qh_resetlists (False, qh_RESETvisible);
   qh facet_next= qh facet_list;      /* advance facet when processed */
   qh interior_point= qh_getcenter(vertices);
   firstfacet= qh facet_list;
@@ -1692,18 +1722,17 @@ void qh_initialhull(setT *vertices) {
       minimize_( minangle, angle);
     }
   }
-  if (minangle < qh_MAXnarrow) {
+  if (minangle < qh_MAXnarrow && !qh NOnarrow) { 
     realT diff= 1.0 + minangle;
 
     qh NARROWhull= True;
     qh_option ("_narrow-hull", NULL, &diff);
     if (minangle < qh_WARNnarrow && !qh RERUN && qh PRINTprecision)
       fprintf (qh ferr, "qhull precision warning: \n\
-The initial hull is narrow (the cosine of the minimum angle is %.9g).\n\
-A coplanar point may lead to a wide facet.  Options 'Qs' (search for best\n\
-initial hull), 'QbB' (scale to unit box), or 'Qbb' (scale last coordinate)\n\
-may remove this warning.  Use 'Pp' to ignore this warning.\n\
-See 'Limitations' in qh-impre.htm.\n",
+The initial hull is narrow (cosine of min. angle is %.16f).\n\
+A coplanar point may lead to a wide facet.  Options 'QbB' (scale to unit box)\n\
+or 'Qbb' (scale last coordinate) may remove this warning.  Use 'Pp' to skip\n\
+this warning.  See 'Limitations' in qh-impre.htm.\n",
           -minangle);   /* convert from angle between normals to angle between facets */
   }
   zzval_(Zprocessed)= qh hull_dim+1;
@@ -1850,6 +1879,15 @@ vertexT *qh_isvertex (pointT *point, setT *vertices) {
       for visible facets, 
         visible->r.replace is corresponding new facet
 
+  see also: 
+    qh_makenewplanes() -- make hyperplanes for facets
+    qh_attachnewfacets() -- attachnewfacets if not done here (qh ONLYgood)
+    qh_matchnewfacets() -- match up neighbors
+    qh_updatevertices() -- update vertex neighbors and delvertices
+    qh_deletevisible() -- delete visible facets
+    qh_checkpolygon() --check the result
+    qh_triangulate() -- triangulate a non-simplicial facet
+
   design:
     for each visible facet
       make new facets to its horizon facets
@@ -1908,12 +1946,16 @@ vertexT *qh_makenewfacets (pointT *point /*visible_list*/) {
   see also:
     qh_matchneighbor
 
+  notes:
+
   design:
     compute hash value for atfacet and atskip
     repeat twice -- once to make best matches, once to match the rest
       for each possible facet in qh.hash_table
         if it is a matching facet and pass 2
-          make match marked for merging (qh_MERGEridge)
+          make match 
+	  unless tricoplanar, mark match for merging (qh_MERGEridge)
+          [e.g., tricoplanar RBOX s 1000 t993602376 | QHULL C-1e-3 d Qbb FA Qt]
         if it is a matching facet and pass 1
           test if this is a better match
       if pass 1,
@@ -1953,7 +1995,10 @@ void qh_matchduplicates (facetT *atfacet, int atskip, int hashsize, int *hashcou
 	  }else if (ismatch && makematch) {
 	    if (SETelemt_(newfacet->neighbors, newskip, facetT) == qh_DUPLICATEridge) {
 	      SETelem_(facet->neighbors, skip)= newfacet;
-	      SETelem_(newfacet->neighbors, newskip)= qh_MERGEridge;
+	      if (newfacet->tricoplanar)
+  		SETelem_(newfacet->neighbors, newskip)= facet;
+	      else
+		SETelem_(newfacet->neighbors, newskip)= qh_MERGEridge;
 	      *hashcount -= 2; /* removed two unmatched facets */
 	      trace4((qh ferr, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d merge\n",
 		    facet->id, skip, newfacet->id, newskip));
@@ -2057,7 +2102,7 @@ void qh_nearcoplanar ( void /* qh.facet_list */) {
 	qh_setcompact (facet->coplanarset);
       }
     }
-    zadd_(Zcheckpart, numpart);
+    zzadd_(Zcheckpart, numpart);
   }
 } /* nearcoplanar */
 
@@ -2073,21 +2118,45 @@ void qh_nearcoplanar ( void /* qh.facet_list */) {
   notes:
     if qh.DELAUNAY
       distance is measured in the input set
+    searches neighboring tricoplanar facets (requires vertexneighbors)
+      Slow implementation.  Recomputes vertex set for each point.
+    The vertex set could be stored in the qh.keepcentrum facet.
 */
 vertexT *qh_nearvertex (facetT *facet, pointT *point, realT *bestdistp) {
   realT bestdist= REALmax, dist;
-  vertexT *bestvertex= NULL, *vertex, **vertexp;
+  vertexT *bestvertex= NULL, *vertex, **vertexp, *apex;
+  coordT *center;
+  facetT *neighbor, **neighborp;
+  setT *vertices;
   int dim= qh hull_dim;
 
   if (qh DELAUNAY)
     dim--;
-  FOREACHvertex_(facet->vertices) {
+  if (facet->tricoplanar) {
+    if (!qh VERTEXneighbors || !facet->center) {
+      fprintf(qh ferr, "qhull internal error (qh_nearvertex): qh.VERTEXneighbors and facet->center required for tricoplanar facets\n");
+      qh_errexit(qh_ERRqhull, NULL, NULL);
+    }
+    vertices= qh_settemp (qh TEMPsize);
+    apex= SETfirst_(facet->vertices);
+    center= facet->center;
+    FOREACHneighbor_(apex) {
+      if (neighbor->center == center) {
+	FOREACHvertex_(neighbor->vertices) 
+	  qh_setappend(&vertices, vertex);
+      }
+    }
+  }else 
+    vertices= facet->vertices;
+  FOREACHvertex_(vertices) {
     dist= qh_pointdist (vertex->point, point, -dim);
     if (dist < bestdist) {
       bestdist= dist;
       bestvertex= vertex;
     }
   }
+  if (facet->tricoplanar)
+    qh_settempfree (&vertices);
   *bestdistp= sqrt (bestdist);
   return bestvertex;
 } /* nearvertex */
@@ -2366,11 +2435,14 @@ setT *qh_pointvertex (void /*qh facet_list*/) {
       e.g., can lose _next by deleting and then prepending before _next
 */
 void qh_prependfacet(facetT *facet, facetT **facetlist) {
-  facetT *prevfacet, *list= *facetlist;
+  facetT *prevfacet, *list;
   
 
   trace4((qh ferr, "qh_prependfacet: prepend f%d before f%d\n",
-	  facet->id, list->id));
+	  facet->id, getid_(*facetlist)));
+  if (!*facetlist)
+    (*facetlist)= qh facet_tail;
+  list= *facetlist;
   prevfacet= list->previous;
   facet->previous= prevfacet;
   if (prevfacet)
@@ -2442,31 +2514,38 @@ void qh_printhashtable(FILE *fp) {
 void qh_printlists (void) {
   facetT *facet;
   vertexT *vertex;
+  int count= 0;
   
   fprintf (qh ferr, "qh_printlists: facets:");
-  FORALLfacets 
+  FORALLfacets {
+    if (++count % 100 == 0)
+      fprintf (qh ferr, "\n     ");
     fprintf (qh ferr, " %d", facet->id);
-  fprintf (qh ferr, "\n  new facets %d visible facets %d next facet for addpoint %d\n  vertices (new %d):",
+  }
+  fprintf (qh ferr, "\n  new facets %d visible facets %d next facet for qh_addpoint %d\n  vertices (new %d):",
      getid_(qh newfacet_list), getid_(qh visible_list), getid_(qh facet_next),
      getid_(qh newvertex_list));
-  FORALLvertices
+  count = 0;
+  FORALLvertices {
+    if (++count % 100 == 0)
+      fprintf (qh ferr, "\n     ");
     fprintf (qh ferr, " %d", vertex->id);
+  }
   fprintf (qh ferr, "\n");
 } /* printlists */
   
 /*-<a                             href="qh-poly.htm#TOC"
   >-------------------------------</a><a name="resetlists">-</a>
   
-  qh_resetlists( stats )
+  qh_resetlists( stats, qh_RESETvisible )
     reset newvertex_list, newfacet_list, visible_list
     if stats, 
       maintains statistics
 
   returns:
-    clears num_visible
     visible_list is empty if qh_deletevisible was called
 */
-void qh_resetlists (boolT stats /*qh newvertex_list newfacet_list visible_list*/) {
+void qh_resetlists (boolT stats, boolT resetVisible /*qh newvertex_list newfacet_list visible_list*/) {
   vertexT *vertex;
   facetT *newfacet, *visible;
   int totnew=0, totver=0;
@@ -2487,12 +2566,14 @@ void qh_resetlists (boolT stats /*qh newvertex_list newfacet_list visible_list*/
   FORALLnew_facets
     newfacet->newfacet= False;
   qh newfacet_list= NULL;
-  FORALLvisible_facets {
-    visible->f.replace= NULL;
-    visible->visible= False;
+  if (resetVisible) {
+    FORALLvisible_facets {
+      visible->f.replace= NULL;
+      visible->visible= False;
+    }
+    qh num_visible= 0;
   }
-  qh visible_list= NULL;
-  qh num_visible= 0;
+  qh visible_list= NULL; /* may still have visible facets via qh_triangulate */
   qh NEWfacets= False;
 } /* resetlists */
 
@@ -2528,7 +2609,347 @@ void qh_setvoronoi_all (void) {
   }
 } /* setvoronoi_all */
 
+#ifndef qh_NOmerge
+
+/*-<a                             href="qh-poly.htm#TOC"
+  >-------------------------------</a><a name="triangulate">-</a>
+  
+  qh_triangulate()
+    triangulate non-simplicial facets on qh.facet_list, 
+    if qh.CENTERtype=qh_ASvoronoi, sets Voronoi centers of non-simplicial facets
+
+  returns:
+    all facets simplicial
+    each tricoplanar facet has ->f.triowner == owner of ->center,normal,etc.
+
+  notes:
+    call after qh_check_output since may switch to Voronoi centers
+    Output may overwrite ->f.triowner with ->f.area
+*/
+void qh_triangulate (void /*qh facet_list*/) {
+  facetT *facet, *nextfacet, *owner;
+  int onlygood= qh ONLYgood;
+  facetT *neighbor, *visible= NULL, *facet1, *facet2, *new_facet_list= NULL;
+  facetT *orig_neighbor= NULL, *otherfacet;
+  vertexT *new_vertex_list= NULL;
+  mergeT *merge; 
+  mergeType mergetype;
+  int neighbor_i, neighbor_n;
+
+  trace1((qh ferr, "qh_triangulate: triangulate non-simplicial facets\n"));
+  if (qh hull_dim == 2)
+    return;
+  if (qh VORONOI) {  /* otherwise lose Voronoi centers [could rebuild vertex set from tricoplanar] */
+    qh_clearcenters (qh_ASvoronoi);
+    qh_vertexneighbors();
+  }
+  qh ONLYgood= False; /* for makenew_nonsimplicial */
+  qh visit_id++;
+  qh NEWfacets= True;
+  qh degen_mergeset= qh_settemp (qh TEMPsize);
+  qh newvertex_list= qh vertex_tail;
+  for (facet= qh facet_list; facet && facet->next; facet= nextfacet) { /* non-simplicial facets moved to end */
+    nextfacet= facet->next;
+    if (facet->visible || facet->simplicial)
+      continue;
+    /* triangulate all non-simplicial facets, otherwise merging does not work, e.g., RBOX c P-0.1 P+0.1 P+0.1 D3 | QHULL d Qt Tv */
+    if (!new_facet_list)
+      new_facet_list= facet;  /* will be moved to end */
+    qh_triangulate_facet (facet, &new_vertex_list);
+  }
+  trace2((qh ferr, "qh_triangulate: delete null facets from f%d -- apex same as second vertex\n", getid_(new_facet_list)));
+  for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* null facets moved to end */
+    nextfacet= facet->next;
+    if (facet->visible) 
+      continue;
+    if (facet->ridges) {
+      if (qh_setsize(facet->ridges) > 0) {
+	fprintf( qh ferr, "qhull error (qh_triangulate): ridges still defined for f%d\n", facet->id);
+	qh_errexit (qh_ERRqhull, facet, NULL);
+      }
+      qh_setfree (&facet->ridges);
+    }
+    if (SETfirst_(facet->vertices) == SETsecond_(facet->vertices)) {
+      zinc_(Ztrinull);
+      qh_triangulate_null (facet);
+    }
+  }
+  trace2((qh ferr, "qh_triangulate: delete %d or more mirror facets -- same vertices and neighbors\n", qh_setsize(qh degen_mergeset)));
+  qh visible_list= qh facet_tail;
+  while ((merge= (mergeT*)qh_setdellast (qh degen_mergeset))) {
+    facet1= merge->facet1;
+    facet2= merge->facet2;
+    mergetype= merge->type;
+    qh_memfree (merge, sizeof(mergeT));
+    if (mergetype == MRGmirror) {
+      zinc_(Ztrimirror);
+      qh_triangulate_mirror (facet1, facet2);
+    }
+  }
+  qh_settempfree(&qh degen_mergeset);
+  trace2((qh ferr, "qh_triangulate: update neighbor lists for vertices from v%d\n", getid_(new_vertex_list)));
+  qh newvertex_list= new_vertex_list;  /* all vertices of new facets */
+  qh visible_list= NULL;
+  qh_updatevertices(/*qh newvertex_list, empty newfacet_list and visible_list*/);
+  qh_resetlists (False, !qh_RESETvisible /*qh newvertex_list, empty newfacet_list and visible_list*/);
+
+  trace2((qh ferr, "qh_triangulate: identify degenerate tricoplanar facets from f%d\n", getid_(new_facet_list)));
+  trace2((qh ferr, "qh_triangulate: and replace facet->f.triowner with tricoplanar facets that own center, normal, etc.\n"));
+  FORALLfacet_(new_facet_list) {
+    if (facet->tricoplanar && !facet->visible) {
+      FOREACHneighbor_i_(facet) {
+	if (neighbor_i == 0) {  /* first iteration */
+	  if (neighbor->tricoplanar)
+            orig_neighbor= neighbor->f.triowner;
+	  else
+	    orig_neighbor= neighbor;
+	}else {
+	  if (neighbor->tricoplanar)
+  	    otherfacet= neighbor->f.triowner;
+	  else
+	    otherfacet= neighbor;
+	  if (orig_neighbor == otherfacet) {
+	    zinc_(Ztridegen);
+	    facet->degenerate= True;
+	    break;
+	  }
+	}
+      }
+    }
+  }
+
+  trace2((qh ferr, "qh_triangulate: delete visible facets -- non-simplicial, null, and mirrored facets\n"));
+  owner= NULL;
+  visible= NULL;
+  for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* may delete facet */
+    nextfacet= facet->next;
+    if (facet->visible) {
+      if (facet->tricoplanar) { /* a null or mirrored facet */
+	qh_delfacet(facet);
+	qh num_visible--;
+      }else {  /* a non-simplicial facet followed by its tricoplanars */
+	if (visible && !owner) {
+	  /*  RBOX 200 s D5 t1001471447 | QHULL Qt C-0.01 Qx Qc Tv Qt -- f4483 had 6 vertices/neighbors and 8 ridges */
+	  trace2((qh ferr, "qh_triangulate: all tricoplanar facets degenerate for non-simplicial facet f%d\n",
+		       visible->id));
+	  qh_delfacet(visible);
+	  qh num_visible--;
+	}
+	visible= facet;
+	owner= NULL;
+      }
+    }else if (facet->tricoplanar) {
+      if (facet->f.triowner != visible) { 
+	fprintf( qh ferr, "qhull error (qh_triangulate): tricoplanar facet f%d not owned by its visible, non-simplicial facet f%d\n", facet->id, getid_(visible));
+	qh_errexit2 (qh_ERRqhull, facet, visible);
+      }
+      if (owner) 
+	facet->f.triowner= owner;
+      else if (!facet->degenerate) {
+	owner= facet;
+	nextfacet= visible->next; /* rescan tricoplanar facets with owner */
+	facet->keepcentrum= True;  /* one facet owns ->normal, etc. */
+	facet->coplanarset= visible->coplanarset;
+	facet->outsideset= visible->outsideset;
+  	visible->coplanarset= NULL;
+	visible->outsideset= NULL;
+        if (!qh TRInormals) { /* center and normal copied to tricoplanar facets */
+	  visible->center= NULL;
+	  visible->normal= NULL;
+	}
+	qh_delfacet(visible);
+	qh num_visible--;
+      }
+    }
+  }
+  if (visible && !owner) {
+    trace2((qh ferr, "qh_triangulate: all tricoplanar facets degenerate for last non-simplicial facet f%d\n",
+	         visible->id));
+    qh_delfacet(visible);
+    qh num_visible--;
+  }
+  qh NEWfacets= False;
+  qh ONLYgood= onlygood; /* restore value */
+  if (qh CHECKfrequently) 
+    qh_checkpolygon (qh facet_list);
+} /* triangulate */
+
+
+/*-<a                             href="qh-poly.htm#TOC"
+  >-------------------------------</a><a name="triangulate_facet">-</a>
+  
+  qh_triangulate_facet (facetA)
+    triangulate a non-simplicial facet
+      if qh.CENTERtype=qh_ASvoronoi, sets its Voronoi center
+  returns:
+    qh.newfacet_list == simplicial facets
+      facet->tricoplanar set and ->keepcentrum false
+      facet->degenerate set if duplicated apex
+      facet->f.trivisible set to facetA
+      facet->center copied from facetA (created if qh_ASvoronoi)
+	qh_eachvoronoi, qh_detvridge, qh_detvridge3 assume centers copied
+      facet->normal,offset,maxoutside copied from facetA
+
+  notes:
+      qh_makenew_nonsimplicial uses neighbor->seen for the same
+
+  see also:
+      qh_addpoint() -- add a point
+      qh_makenewfacets() -- construct a cone of facets for a new vertex
+
+  design:
+      if qh_ASvoronoi, 
+	 compute Voronoi center (facet->center)
+      select first vertex (highest ID to preserve ID ordering of ->vertices)
+      triangulate from vertex to ridges
+      copy facet->center, normal, offset
+      update vertex neighbors
+*/
+void qh_triangulate_facet (facetT *facetA, vertexT **first_vertex) {
+  facetT *newfacet;
+  facetT *neighbor, **neighborp;
+  vertexT *apex;
+  int numnew=0;
+
+  trace3((qh ferr, "qh_triangulate_facet: triangulate facet f%d\n", facetA->id));
+
+  if (qh IStracing >= 4)
+    qh_printfacet (qh ferr, facetA);
+  FOREACHneighbor_(facetA) {
+    neighbor->seen= False;
+    neighbor->coplanar= False;
+  }
+  if (qh CENTERtype == qh_ASvoronoi && !facetA->center  /* matches upperdelaunay in qh_setfacetplane() */
+        && fabs_(facetA->normal[qh hull_dim -1]) >= qh ANGLEround * qh_ZEROdelaunay) {
+    facetA->center= qh_facetcenter (facetA->vertices);
+  }
+  qh_willdelete (facetA, NULL);
+  qh newfacet_list= qh facet_tail;
+  facetA->visitid= qh visit_id;
+  apex= SETfirst_(facetA->vertices);
+  qh_makenew_nonsimplicial (facetA, apex, &numnew);
+  SETfirst_(facetA->neighbors)= NULL;
+  FORALLnew_facets {
+    newfacet->tricoplanar= True;
+    newfacet->f.trivisible= facetA;
+    newfacet->degenerate= False;
+    newfacet->upperdelaunay= facetA->upperdelaunay;
+    newfacet->good= facetA->good;
+    if (qh TRInormals) { 
+      newfacet->keepcentrum= True;
+      newfacet->normal= qh_copypoints (facetA->normal, 1, qh hull_dim);
+      if (qh CENTERtype == qh_AScentrum) 
+	newfacet->center= qh_getcentrum (newfacet);
+      else
+	newfacet->center= qh_copypoints (facetA->center, 1, qh hull_dim);
+    }else {
+      newfacet->keepcentrum= False;
+      newfacet->normal= facetA->normal;
+      newfacet->center= facetA->center;
+    }
+    newfacet->offset= facetA->offset;
+#if qh_MAXoutside
+    newfacet->maxoutside= facetA->maxoutside;
+#endif
+  }
+  qh_matchnewfacets(/*qh newfacet_list*/);
+  zinc_(Ztricoplanar);
+  zadd_(Ztricoplanartot, numnew);
+  zmax_(Ztricoplanarmax, numnew);
+  qh visible_list= NULL;
+  if (!(*first_vertex))
+    (*first_vertex)= qh newvertex_list;
+  qh newvertex_list= NULL;
+  qh_updatevertices(/*qh newfacet_list, empty visible_list and newvertex_list*/);
+  qh_resetlists (False, !qh_RESETvisible /*qh newfacet_list, empty visible_list and newvertex_list*/);
+} /* triangulate_facet */
+
+/*-<a                             href="qh-poly.htm#TOC"
+  >-------------------------------</a><a name="triangulate_link">-</a>
+  
+  qh_triangulate_link (oldfacetA, facetA, oldfacetB, facetB)
+    relink facetA to facetB via oldfacets
+  returns:
+    adds mirror facets to qh degen_mergeset (4-d and up only)
+  design:
+    if they are already neighbors, the opposing neighbors become MRGmirror facets
+*/
+void qh_triangulate_link (facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB) {
+  int errmirror= False;
+
+  trace3((qh ferr, "qh_triangulate_link: relink old facets f%d and f%d between neighbors f%d and f%d\n", 
+         oldfacetA->id, oldfacetB->id, facetA->id, facetB->id));
+  if (qh_setin (facetA->neighbors, facetB)) {
+    if (!qh_setin (facetB->neighbors, facetA)) 
+      errmirror= True;
+    else
+      qh_appendmergeset (facetA, facetB, MRGmirror, NULL);
+  }else if (qh_setin (facetB->neighbors, facetA)) 
+    errmirror= True;
+  if (errmirror) {
+    fprintf( qh ferr, "qhull error (qh_triangulate_link): mirror facets f%d and f%d do not match for old facets f%d and f%d\n",
+       facetA->id, facetB->id, oldfacetA->id, oldfacetB->id);
+    qh_errexit2 (qh_ERRqhull, facetA, facetB);
+  }
+  qh_setreplace (facetB->neighbors, oldfacetB, facetA);
+  qh_setreplace (facetA->neighbors, oldfacetA, facetB);
+} /* triangulate_link */
+
+/*-<a                             href="qh-poly.htm#TOC"
+  >-------------------------------</a><a name="triangulate_mirror">-</a>
+  
+  qh_triangulate_mirror (facetA, facetB)
+    delete mirrored facets from qh_triangulate_null() and qh_triangulate_mirror
+      a mirrored facet shares the same vertices of a logical ridge
+  design:
+    since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet
+    if they are already neighbors, the opposing neighbors become MRGmirror facets
+*/
+void qh_triangulate_mirror (facetT *facetA, facetT *facetB) {
+  facetT *neighbor, *neighborB;
+  int neighbor_i, neighbor_n;
+
+  trace3((qh ferr, "qh_triangulate_mirror: delete mirrored facets f%d and f%d\n", 
+         facetA->id, facetB->id));
+  FOREACHneighbor_i_(facetA) {
+    neighborB= SETelemt_(facetB->neighbors, neighbor_i, facetT);
+    if (neighbor == neighborB)
+      continue; /* occurs twice */
+    qh_triangulate_link (facetA, neighbor, facetB, neighborB);
+  }
+  qh_willdelete (facetA, NULL);
+  qh_willdelete (facetB, NULL);
+} /* triangulate_mirror */
+
 /*-<a                             href="qh-poly.htm#TOC"
+  >-------------------------------</a><a name="triangulate_null">-</a>
+  
+  qh_triangulate_null (facetA)
+    remove null facetA from qh_triangulate_facet()
+      a null facet has vertex #1 (apex) == vertex #2
+  returns:
+    adds facetA to ->visible for deletion after qh_updatevertices
+    qh degen_mergeset contains mirror facets (4-d and up only)
+  design:
+    since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet
+    if they are already neighbors, the opposing neighbors become MRGmirror facets
+*/
+void qh_triangulate_null (facetT *facetA) {
+  facetT *neighbor, *otherfacet;
+
+  trace3((qh ferr, "qh_triangulate_null: delete null facet f%d\n", facetA->id));
+  neighbor= SETfirst_(facetA->neighbors);
+  otherfacet= SETsecond_(facetA->neighbors);
+  qh_triangulate_link (facetA, neighbor, facetA, otherfacet);
+  qh_willdelete (facetA, NULL);
+} /* triangulate_null */
+
+#else /* qh_NOmerge */
+void qh_triangulate (void) {
+}
+#endif /* qh_NOmerge */
+
+   /*-<a                             href="qh-poly.htm#TOC"
   >-------------------------------</a><a name="vertexintersect">-</a>
   
   qh_vertexintersect( vertexsetA, vertexsetB )
@@ -2579,9 +3000,9 @@ setT *qh_vertexintersect_new (setT *vertexsetA,setT *vertexsetB) {
 } /* vertexintersect_new */
 
 /*-<a                             href="qh-poly.htm#TOC"
-  >-------------------------------</a><a name="vertexneighhbors">-</a>
+  >-------------------------------</a><a name="vertexneighbors">-</a>
   
-  qh_vertexneighhbors()
+  qh_vertexneighbors()
     for each vertex in qh.facet_list, 
       determine its neighboring facets 
 
diff --git a/src/qconvex.c b/src/qconvex.c
index 3695997..5e2af72 100644
--- a/src/qconvex.c
+++ b/src/qconvex.c
@@ -51,7 +51,7 @@ int isatty (int);  /* returns 1 if stdin is a tty
     concise prompt below
 */  
 
-char qh_version[]= "version 3.0 2001/02/11";   /* used for error messages */
+char qh_version[]= "version 3.1 2001/10/04";   /* used for error messages */
 
 /* duplicated in qconvex.htm */
 char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
@@ -66,7 +66,8 @@ input (stdin):\n\
     comments:    start with a non-numeric character\n\
 \n\
 options:\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Qc   - keep coplanar points with nearest facet\n\
     Qi   - keep interior points with nearest facet\n\
 \n\
@@ -92,6 +93,7 @@ Trace options:\n\
     Tv   - verify result: structure, convexity, and point inclusion\n\
     Tz   - send all output to stdout\n\
     TFn  - report summary when n or more facets created\n\
+    TI file - input data from file, no spaces or single quotes\n\
     TO file - output results to file, may be enclosed in single quotes\n\
     TPn  - turn on tracing when point n added to hull\n\
      TMn - turn on tracing at merge n\n\
@@ -190,7 +192,8 @@ qconvex- compute the convex hull.  Qhull %s\n\
     comments start with a non-numeric character\n\
 \n\
 options (qconvex.htm):\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Tv   - verify result: structure, convexity, and point inclusion\n\
     .    - concise list of all options\n\
     -    - one-line description of all options\n\
@@ -244,11 +247,12 @@ Except for 'F.' and 'PG', upper-case options take an argument.\n\
  PMerge_keep    Poutput_forced Pprecision_not\n\
 \n\
  QbBound 0:0.5  QbB_scale_box  Qcoplanar      QGood_point    Qinterior\n\
- QJoggle        Qrandom        QRotate        Qsearch_1st    QVertex_good\n\
+ QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
+ QVertex_good\n\
 \n\
  T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
- TFacet_log     TPoint_trace   TMerge_trace   TOutput_file   TWide_trace\n\
- TVertex_stop   TCone_stop\n\
+ TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
+ TWide_trace    TVertex_stop   TCone_stop\n\
 \n\
  Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
 ";
diff --git a/src/qdelaun.c b/src/qdelaun.c
index b9afe7d..eaac01c 100644
--- a/src/qdelaun.c
+++ b/src/qdelaun.c
@@ -52,10 +52,10 @@ int isatty (int);  /* returns 1 if stdin is a tty
     concise prompt below
 */  
 
-char qh_version[]= "version 3.0 2001/02/11";   /* used for error messages */
+char qh_version[]= "version 3.1 2001/10/04";   /* used for error messages */
 
 /* duplicated in qdelau_f.htm and qdelaun.htm */
-char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
+char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
 
 char qh_prompta[]= "\n\
 qdelaunay- compute the Delaunay triangulation\n\
@@ -68,7 +68,8 @@ input (stdin):\n\
 \n\
 options:\n\
     Qu   - compute furthest-site Delaunay triangulation\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
 \n\
 Qhull control options:\n\
     QJn  - randomly joggle input in range [-n,n]\n\
@@ -88,6 +89,7 @@ Trace options:\n\
     Tv   - verify result: structure, convexity, and in-circle test\n\
     Tz   - send all output to stdout\n\
     TFn  - report summary when n or more facets created\n\
+    TI file - input data from file, no spaces or single quotes\n\
     TO file - output results to file, may be enclosed in single quotes\n\
     TPn  - turn on tracing when point n added to hull\n\
      TMn - turn on tracing at merge n\n\
@@ -133,7 +135,6 @@ More formats:\n\
                     #real (2), max outer plane, min vertex\n\
     FS   - sizes:   #int (0)\n\
                     #real(2) tot area, 0\n\
-    Ft   - Delaunay triangulation with centrums for non-simplicial (OFF)\n\
     Fv   - count plus vertices for each Delaunay region\n\
     Fx   - extreme points of Delaunay triangulation (on convex hull)\n\
 \n\
@@ -180,8 +181,9 @@ qdelaunay- compute the Delaunay triangulation. Qhull %s\n\
     comments start with a non-numeric character\n\
 \n\
 options (qdelaun.htm):\n\
-    QJ   - joggle input instead of merging facets\n\
     Qu   - furthest-site Delaunay triangulation\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Tv   - verify result: structure, convexity, and in-circle test\n\
     .    - concise list of all options\n\
     -    - one-line description of all options\n\
@@ -189,7 +191,6 @@ options (qdelaun.htm):\n\
 output options (subset):\n\
     s    - summary of results (default)\n\
     i    - vertices incident to each Delaunay region\n\
-    Ft   - Delaunay triangulation with centrums for non-simplicial (OFF)\n\
     Fx   - extreme points (vertices of the convex hull)\n\
     o    - OFF format (shows the points lifted to a paraboloid)\n\
     G    - Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
@@ -200,8 +201,8 @@ output options (subset):\n\
 examples:\n\
     rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i\n\
     rbox c P0 D2 | qdelaunay Fv           rbox c P0 D2 | qdelaunay s Qu Fv\n\
-    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay Ft\n\
-    rbox c G1 d D2 | qdelaunay QJ s Ft    rbox M3,4 z 100 D2 | qdelaunay s\n\
+    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay Qt\n\
+    rbox M3,4 z 100 D2 | qdelaunay s      rbox M3,4 z 100 D2 | qdelaunay s Qt\n\
 \n\
 ";
 /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
@@ -222,7 +223,7 @@ Except for 'F.' and 'PG', upper-case options take an argument.\n\
  Farea          FArea_total    Fcoincident    Fd_cdd_in      FD_cdd_out\n\
  FF_dump_xridge FIDs           Fmerges        Fneighbors     FNeigh_vertex\n\
  FOptions       FPoint_near    FQdelaun       Fsummary       FSize\n\
- Ftriangles     Fvertices      Fxtremes\n\
+ Fvertices      Fxtremes\n\
 \n\
  Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
  Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
@@ -231,12 +232,12 @@ Except for 'F.' and 'PG', upper-case options take an argument.\n\
  PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
  PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
 \n\
- QGood_point    QJoggle        Qsearch_1st    QupperDelaunay\n\
+ QGood_point    QJoggle        Qsearch_1st    Qtriangulate   QupperDelaunay\n\
  QVertex_good   Qzinfinite\n\
 \n\
  T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
- TFacet_log     TPoint_trace   TMerge_trace   TOutput_file   TWide_trace\n\
- TVertex_stop   TCone_stop\n\
+ TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
+ TWide_trace    TVertex_stop   TCone_stop\n\
 \n\
  Angle_max      Centrum_size   Random_dist    Wide_outside\n\
 ";
diff --git a/src/qh-geom.htm b/src/qh-geom.htm
index 19dc06f..068cd22 100644
--- a/src/qh-geom.htm
+++ b/src/qh-geom.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="../src/index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm#TOC">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -54,7 +54,7 @@ computations is determined at initialization. The roundoff error
 in halfspace computation is accounted for by computing the
 distance from vertices to the halfspace. </p>
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <b>Geom</b> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a> &#149; 
@@ -63,8 +63,8 @@ distance from vertices to the halfspace. </p>
 <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <a href="qh-set.htm#TOC">Set</a> &#149; 
 <a href="qh-stat.htm#TOC">Stat</a> &#149; <a href="qh-user.htm#TOC">User</a> </p>
 
-<h3>Index to <a href="geom.c#TOP">geom.c</a>, 
-<a href="geom2.c#TOP">geom2.c</a>, and <a href="geom.h#TOP">geom.h</a></h3>
+<h3>Index to <a href="geom.c">geom.c</a>, 
+<a href="geom2.c">geom2.c</a>, and <a href="geom.h">geom.h</a></h3>
 
 <ul>
 <li><a href="#gtype">geometric data types and constants</a> </li>
@@ -146,6 +146,7 @@ generate a random dimXdim matrix in range (-1,1) </li>
 <ul>
 <li><a href="geom2.c#detsimplex">qh_detsimplex</a> compute
 determinate of a simplex of points </li>
+<li><a href="io.c#detvnorm">qh_detvnorm</a> determine normal for Voronoi ridge </li>
 <li><a href="geom2.c#distnorm">qh_distnorm</a> compute
 distance from point to hyperplane as defined by normal and offset</li>
 <li><a href="geom2.c#facetarea_simplex">qh_facetarea_simplex</a>
@@ -158,7 +159,7 @@ arithmetic center for a set of vertices </li>
 distance between two points </li>
 <li><a href="geom2.c#rotatepoints">qh_rotatepoints</a> rotate
 numpoints points by a row matrix </li>
-<li><a href="geom.c#sethalfspace">qh_sethalfspace</a> set
+<li><a href="geom2.c#sethalfspace">qh_sethalfspace</a> set
 coords to dual of halfspace relative to an interior point </li>
 <li><a href="geom.c#sethyperplane_det">qh_sethyperplane_det</a>
 return hyperplane for oriented simplex using determinates
@@ -174,7 +175,7 @@ return Voronoi center for a set of points </li>
 <ul>
 <li><a href="geom2.c#copypoints">qh_copypoints</a> return
 malloc'd copy of points</li>
-<li><a href="geom.c#joggleinput">qh_joggleinput</a> joggle
+<li><a href="geom2.c#joggleinput">qh_joggleinput</a> joggle
 input points by qh.JOGGLEmax </li>
 <li><a href="geom2.c#maxmin">qh_maxmin</a> return max/min
 points for each dimension</li>
@@ -182,7 +183,7 @@ points for each dimension</li>
 maximum simplex for a set of points </li>
 <li><a href="geom2.c#printpoints">qh_printpoints</a> print ids for a 
 set of points </li>
-<li><a href="geom.c#projectinput">qh_projectinput</a> project
+<li><a href="geom2.c#projectinput">qh_projectinput</a> project
 input using qh DELAUNAY and qh low_bound/high_bound </li>
 <li><a href="geom2.c#projectpoints">qh_projectpoints</a>
 project points along one or more dimensions </li>
@@ -190,7 +191,7 @@ project points along one or more dimensions </li>
 input points using row matrix </li>
 <li><a href="geom2.c#scaleinput">qh_scaleinput</a> scale
 input points using qh low_bound/high_bound </li>
-<li><a href="geom.c#scalelast">qh_scalelast</a> scale last
+<li><a href="geom2.c#scalelast">qh_scalelast</a> scale last
 coordinate to [0,m] for Delaunay triangulations </li>
 <li><a href="geom2.c#scalepoints">qh_scalepoints</a> scale
 points to new lowbound and highbound </li>
@@ -207,14 +208,14 @@ point </li>
 distance from point to facet </li>
 <li><a href="geom2.c#facetarea">qh_facetarea</a> return area
 of a facet </li>
-<li><a href="geom.c#facetcenter">qh_facetcenter</a> return
+<li><a href="geom2.c#facetcenter">qh_facetcenter</a> return
 Voronoi center for a facet's vertices </li>
 <li><a href="geom.c#findbest">qh_findbest</a> find visible
 facet or best facet for a point </li>
+<li><a href="geom.c#findbesthorizon">qh_findbesthorizon</a> 
+update best new facet with horizon facets</li>
 <li><a href="geom.c#findbestnew">qh_findbestnew</a> find best
 new facet for point </li>
-<li><a href="geom.c#findbestsharp">qh_findbestsharp</a> find best
-new facet for point and detect sharp corners</li>
 <li><a href="geom2.c#getarea">qh_getarea</a> get area of all
 facets in facetlist, collect statistics </li>
 <li><a href="geom.c#getcentrum">qh_getcentrum</a> return
@@ -232,6 +233,8 @@ orient facet so that <tt>qh.interior_point</tt> is inside</li>
 point onto a facet </li>
 <li><a href="geom.c#setfacetplane">qh_setfacetplane</a> sets
 the hyperplane for a facet </li>
+<li><a href="geom.c#sharpnewfacets">qh_sharpnewfacets</a> true
+if new facets contains a sharp corner</li>
 </ul>
 
 <h3><a href="qh-geom.htm#TOC">»</a><a name="ground">geometric roundoff functions</a></h3>
@@ -245,7 +248,6 @@ maximum roundoff error due to a distance computation to a
 normalized hyperplane</li>
 <li><a href="geom2.c#divzero">qh_divzero</a> divide by a
 number that is nearly zero </li>
-constants</li>
 <li><a href="geom2.c#maxouter">qh_maxouter</a> return maximum outer
 plane</li>
 <li><a href="geom2.c#outerinner">qh_outerinner</a> return actual
@@ -258,9 +260,8 @@ outer and inner planes
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -268,6 +269,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -275,7 +277,7 @@ Qhull</a> <br>
 &#149; <a href="qh-poly.htm">Poly</a> &#149; <a href="qh-qhull.htm#TOC">Qhull</a>
 &#149; <a href="qh-set.htm">Set</a> &#149; <a href="qh-stat.htm">Stat</a>
 &#149; <a href="qh-user.htm">User</a><br>
-</p>
+
 
 <p><!-- GC common information --> </p>
 <hr>
@@ -286,7 +288,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-globa.htm b/src/qh-globa.htm
index 0ae4fee..5596b61 100644
--- a/src/qh-globa.htm
+++ b/src/qh-globa.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm#TOC">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -42,7 +42,7 @@ dynamically allocated with malloc().  See
 <a href="user.h#QHpointer">QHpointer</a>.
 </p>
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <b>Global</b> &#149; 
@@ -51,8 +51,8 @@ dynamically allocated with malloc().  See
 <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <a href="qh-set.htm#TOC">Set</a> &#149; 
 <a href="qh-stat.htm#TOC">Stat</a> &#149; <a href="qh-user.htm#TOC">User</a> </p>
 
-<h3>Index to <a href="global.c#TOP">global.c</a> and 
-<a href="qhull.h#TOP">qhull.h</a></h3>
+<h3>Index to <a href="global.c">global.c</a> and 
+<a href="qhull.h">qhull.h</a></h3>
 
 <ul>
 <li><a href="#ovar">Qhull's global variables</a> </li>
@@ -129,9 +129,8 @@ strtod() and strtol() </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -139,6 +138,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -146,7 +146,6 @@ Qhull</a> <br>
 &#149; <a href="qh-poly.htm">Poly</a> &#149; <a href="qh-qhull.htm#TOC">Qhull</a>
 &#149; <a href="qh-set.htm">Set</a> &#149; <a href="qh-stat.htm">Stat</a>
 &#149; <a href="qh-user.htm">User</a><br>
-</p>
 <p><!-- GC common information --> </p>
 <hr>
 <p><a href="http://www.geom.umn.edu/"><img
@@ -156,7 +155,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-io.htm b/src/qh-io.htm
index 0d6fdbc..f15de04 100644
--- a/src/qh-io.htm
+++ b/src/qh-io.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm#TOC">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -53,7 +53,7 @@ the same driver: </p>
 qh_skipfacet() is tested. </p>
 
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> <a name="TOC">&#149;</a>
 <a href="qh-globa.htm#TOC">Global</a> &#149; <b>Io</b> &#149; 
@@ -62,7 +62,7 @@ qh_skipfacet() is tested. </p>
 <a href="qh-set.htm#TOC">Set</a> &#149; <a href="qh-stat.htm#TOC">Stat</a> &#149; 
 <a href="qh-user.htm#TOC">User</a> </p>
 
-<h3>Index to <a href="io.c#TOP">io.c</a> and <a href="io.h#TOP">io.h</a></h3>
+<h3>Index to <a href="io.c">io.c</a> and <a href="io.h">io.h</a></h3>
 
 <ul>
 <li><a href="#iconst">io.h constants and types</a> </li>
@@ -213,8 +213,6 @@ voronoi diagram for each ridge of each vertex from qh_markvoronoi</li>
 separating plane of the Voronoi diagram for a pair of input sites</li>
 <li><a href="io.c#printvridge">qh_printvridge</a> print 
 ridge of the Voronoi diagram for a pair of input sites</li>
-<li><a href="io.c#printvridge3">qh_printvridge3</a> print one
-ridge of a 3-d Voronoi diagram for a pair of input sites</li>
 <li><a href="io.c#projectdim3">qh_projectdim3</a> project 2-d
 3-d or 4-d point to a 3-d point ('G')</li>
 </ul>
@@ -259,8 +257,6 @@ prints a 2-d or 3-d point as 3-d VECT's </li>
 prints a 2-d or 3-d point as 2 3-d VECT's </li>
 <li><a href="io.c#printspheres">qh_printspheres</a> prints 3-d
 vertices as OFF spheres </li>
-<li><a href="io.c#printspheres3">qh_printspheres3</a> print
-3-d vertices as spheres (OFF) </li>
 </ul>
 <p>
 <p><!-- Navigation links --> </p>
@@ -269,9 +265,8 @@ vertices as OFF spheres </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -279,6 +274,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -296,7 +292,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-mem.htm b/src/qh-mem.htm
index 844b005..aeb72ac 100644
--- a/src/qh-mem.htm
+++ b/src/qh-mem.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm#TOC">Mem</a>
@@ -40,7 +40,7 @@ from a reserved buffer. </p>
 <p>Use 'T5' to trace memory allocations.</p>
 
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a> &#149;
@@ -49,8 +49,8 @@ from a reserved buffer. </p>
 &#149; <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <a href="qh-set.htm#TOC">Set</a>
 &#149; <a href="qh-stat.htm#TOC">Stat</a> &#149; <a href="qh-user.htm#TOC">User</a>
 </p>
-<h3>Index to <a href="mem.c#TOP">mem.c</a> and 
-<a href="mem.h#TOP">mem.h</a></h3>
+<h3>Index to <a href="mem.c">mem.c</a> and 
+<a href="mem.h">mem.h</a></h3>
 <ul>
 <li><a href="#etype">mem.h data types</a> </li>
 <li><a href="#emacro">mem.h macros</a> </li>
@@ -110,9 +110,8 @@ print out memory statistics </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -120,6 +119,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -137,7 +137,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-merge.htm b/src/qh-merge.htm
index c5e2039..d3771fe 100644
--- a/src/qh-merge.htm
+++ b/src/qh-merge.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -32,12 +32,12 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 
 <h2>merge.c -- facet merge operations</h2>
 <blockquote>
-<p>Qhull handles precision problems by merging facets.
+<p>Qhull handles precision problems by merged facets or joggled input.
 Except for redundant vertices, it corrects a problem by
 merging two facets. When done, all facets are clearly
-convex. See <a href="qh-impre.htm">Imprecision in Qhull</a>
+convex. See <a href="../html/qh-impre.htm">Imprecision in Qhull</a>
 for further information. </p>
-<p>Users may joggle the input ('<a href="qh-optq.htm#QJn">QJn</a>')
+<p>Users may joggle the input ('<a href="../html/qh-optq.htm#QJn">QJn</a>')
 instead of merging facets. </p>
 <p>Qhull detects and corrects the following problems: </p>
 <ul>
@@ -98,7 +98,7 @@ structure.This is called a <em>redundant vertex</em>.
 </li>
 </ul>
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a>
@@ -107,8 +107,8 @@ structure.This is called a <em>redundant vertex</em>.
 &#149; <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <a href="qh-set.htm#TOC">Set</a>
 &#149; <a href="qh-stat.htm#TOC">Stat</a> &#149; <a href="qh-user.htm#TOC">User</a>
 </p>
-<h3>Index to <a href="merge.c#TOP">merge.c</a> and 
-<a href="merge.h#TOP">merge.h</a></h3>
+<h3>Index to <a href="merge.c">merge.c</a> and 
+<a href="merge.h">merge.h</a></h3>
 <ul>
 <li><a href="#mtype">merge.h data types, macros, and
 global sets</a> </li>
@@ -146,7 +146,7 @@ constants</a></h3>
 <ul>
 <li><a href="qhull.h#qh-prec">qh precision constants</a>
 precision constants for Qhull </li>
-<li><a href="merge.h#MRG...">MRG...</a> indicates the
+<li><a href="merge.h#MRG">MRG...</a> indicates the
 type of a merge (mergeT-&gt;type)</li>
 <li><a href="merge.h#qh_ANGLEredundant">qh_ANGLEredundant</a>
 indicates redundant merge in mergeT-&gt;angle </li>
@@ -195,9 +195,6 @@ check for a degenerate and redundant facet</li>
 <li><a href="merge.c#degen_redundant_neighbors">qh_degen_redundant_neighbors</a>
 append degenerate and redundant neighbors to
 qh.degen_mergeset </li>
-<li><a href="merge.c#facetdegen">qh_facetdegen</a>
-true if facet already in mergeset as a degenerate
-</li>
 <li><a href="merge.c#getmergeset_initial">qh_getmergeset_initial</a>
 build initial qh.facet_mergeset </li>
 <li><a href="merge.c#getmergeset">qh_getmergeset</a>
@@ -251,8 +248,6 @@ merge the vertex neighbors of two facets </li>
 merge the vertex sets of two facets </li>
 <li><a href="merge.c#newvertices">qh_newvertices</a>
 register all vertices as new vertices </li>
-<li><a href="merge.c#mergevertices2d">qh_mergevertices2d</a>
-merges vertices1 into vertices2 in 2-d case </li>
 <li><a href="merge.c#updatetested">qh_updatetested</a>
 clear tested flags and centrums involved in a
 merge </li>
@@ -327,8 +322,6 @@ trace</a></h3>
 <ul>
 <li><a href="merge.c#checkconnect">qh_checkconnect</a>
 check that new facets are connected </li>
-<li><a href="merge.c#checkridge_boundary">qh_checkridge_boundary</a>
-checks that ridges of a facet are boundaryless </li>
 <li><a href="merge.c#tracemerge">qh_tracemerge</a>
 print trace message after merge </li>
 <li><a href="merge.c#tracemerging">qh_tracemerging</a>
@@ -341,9 +334,8 @@ print trace message during post-merging </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -351,6 +343,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -368,7 +361,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-poly.htm b/src/qh-poly.htm
index f5e44a8..ce92cd0 100644
--- a/src/qh-poly.htm
+++ b/src/qh-poly.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -41,11 +41,11 @@ a (<em>d-2</em>)-face is a <em>ridge</em>, and a <em>0</em>-face
 is a <em>vertex</em>. For example in 3-d, a facet is a polygon
 and a ridge is an edge. A facet is built from a ridge (the <em>base</em>)
 and a vertex (the <em>apex</em>). See 
-<a href="index.htm#structure">Qhull's data structures</a>.</p>
+<a href="../html/index.htm#structure">Qhull's data structures</a>.</p>
 
 <p>Qhull's primary data structure is a polyhedron. A
 polyhedron is a list of facets. Each facet has a set of
-neighoring facets and a set of vertices. Each facet has a
+neighboring facets and a set of vertices. Each facet has a
 hyperplane. For example, a tetrahedron has four facets.
 If its vertices are <em>a, b, c, d</em>, and its facets
 are <em>1, 2, 3, 4,</em> the tetrahedron is </p>
@@ -87,7 +87,7 @@ defines the orientation of the facet's vertices.  For example in 3-d,
 of the left-hand fingers when the thumb is pointing away from the center).
 Except for axis-parallel facets in 5-d and higher, topological orientation
 determines the geometric orientation of the facet's hyperplane.
-</b>
+
 <p>A nonsimplicial facet is due to merging two or more
 facets. The facet's ridge set determine a simplicial
 decomposition of the facet. Each ridge is a 1-face (i.e.,
@@ -109,8 +109,17 @@ passes between the inner and outer planes. The outer
 plane is defined by <tt>facet-&gt;maxoutside</tt> while
 the inner plane is computed from the facet's vertices.</p>
 
+<p>Qhull 3.1 includes triangulation of non-simplicial facets
+('<A href="/software/qhull/html/qh-optq.htm#Qt">Qt</A>').  
+These facets,
+called <i>tricoplanar</i>, share the same normal. centrum, and Voronoi center.
+One facet (keepcentrum) owns these data structures.
+While tricoplanar facets are more accurate than the simplicial facets from 
+joggled input, they
+may have zero area or flipped orientation.
+
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a>
@@ -119,9 +128,9 @@ the inner plane is computed from the facet's vertices.</p>
 &#149; <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <a href="qh-set.htm#TOC">Set</a>
 &#149; <a href="qh-stat.htm#TOC">Stat</a> &#149; <a href="qh-user.htm#TOC">User</a>
 </p>
-<h3>Index to <a href="poly.c#TOP">poly.c</a>, 
-<a href="poly2.c#TOP">poly2.c</a>, <a href="poly.h#TOP">poly.h</a>,
-and <a href="qhull.h#TOP">qhull.h</a></h3>
+<h3>Index to <a href="poly.c">poly.c</a>, 
+<a href="poly2.c">poly2.c</a>, <a href="poly.h">poly.h</a>,
+and <a href="qhull.h">qhull.h</a></h3>
 <ul>
 <li><a href="#ptype">Data types and global
 lists for polyhedrons</a> </li>
@@ -234,7 +243,7 @@ ridges set </li>
 <li><a href="qhull.h#FOREACHvertex_i_">FOREACHvertex_i_</a>
 assign 'vertex' and 'vertex_i' to each vertex in
 vertices set </li>
-<li><a href="poly.h#FOREACHsetelementreverse12_">FOREACHvertexreverse12_</a>
+<li><a href="poly.h#FOREACHvertexreverse12_">FOREACHvertexreverse12_</a>
 assign 'vertex' to each vertex in vertex set;
 reverse the order of first two vertices </li>
 </ul>
@@ -265,10 +274,12 @@ construct the initial hull as a simplex of
 vertices </li>
 <li><a href="poly2.c#nearcoplanar">qh_nearcoplanar</a> 
   remove near-inside points from coplanar sets</li>
-<li><a href="poly2.c#nonupper">qh_nonupper</a> return
-first non-flipped facet </li>
 <li><a href="poly2.c#prependfacet">qh_prependfacet</a>
 prepends facet to start of facetlist </li>
+<li><a href="user.c#printfacetlist">qh_printfacetlist</a>
+print facets in a facetlist</li>
+<li><a href="poly2.c#printlists">qh_printlists</a>
+print out facet list for debugging </li>
 <li><a href="poly.c#removefacet">qh_removefacet</a>
 unlinks facet from qh.facet_list</li>
 <li><a href="poly2.c#resetlists">qh_resetlists</a>
@@ -299,12 +310,26 @@ make new hyperplanes for facets </li>
 move points from outside set to coplanar set </li>
 <li><a href="poly2.c#setvoronoi_all">qh_setvoronoi_all</a>
 compute Voronoi centers for all facets </li>
+<li><a href="poly2.c#triangulate">qh_triangulate</a>
+triangulate non-simplicial facets</li>
+<li><a href="poly2.c#triangulate_facet">qh_triangulate_facet</a>
+triangulate a non-simplicial facet</li>
+<li><a href="poly2.c#triangulate_link">qh_triangulate_link</a>
+link facets together from qh_triangulate</li>
+<li><a href="poly2.c#triangulate_mirror">qh_triangulate_mirror</a>
+delete mirrored facets from qh_triangulate</li>
+<li><a href="poly2.c#triangulate_null">qh_triangulate_null</a>
+delete null facet from qh_triangulate</li>
 </ul>
 <h3><a href="qh-poly.htm#TOC">»</a><a name="pvertex">Vertex,
 ridge, and point functions</a></h3>
 <ul>
 <li><a href="poly.c#appendvertex">qh_appendvertex</a>
 append vertex to end of qh.vertex_list, </li>
+<li><a href="io.c#detvridge">qh_detvridge</a> determine Voronoi
+ridge for an input site
+<li><a href="io.c#detvridge3">qh_detvridge3</a> determine 3-d Voronoi
+ridge for an input site
 <li><a href="poly2.c#facet3vertex">qh_facet3vertex</a>
 return an oriented vertex set for a 3-d facet </li>
 <li><a href="poly.c#facetintersect">qh_facetintersect</a>
@@ -337,7 +362,7 @@ vertices </li>
 intersect two vertex sets </li>
 <li><a href="poly2.c#vertexintersect_new">qh_vertexintersect_new</a>
 return intersection of two vertex sets </li>
-<li><a href="poly2.c#vertexneighhbors">qh_vertexneighhbors</a>
+<li><a href="poly2.c#vertexneighbors">qh_vertexneighbors</a>
 for each vertex in hull, determine facet
 neighbors </li>
 <li><a href="poly2.c#vertexsubset">qh_vertexsubset</a>
@@ -424,9 +449,8 @@ print out facet list for debugging </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -434,6 +458,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -451,7 +476,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-qhull.htm b/src/qh-qhull.htm
index 61ea09a..2149331 100644
--- a/src/qh-qhull.htm
+++ b/src/qh-qhull.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -36,12 +36,12 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 the convex hull. The Quickhull algorithm combines two
 well-known algorithms: the 2-d quickhull algorithm and
 the n-d beneath-beyond algorithm. See 
-<a href="index.htm#description">Description of Qhull</a>. </p>
+<a href="../html/index.htm#description">Description of Qhull</a>. </p>
 <p>This section provides an index to the top-level
 functions and base data types.  The top-level header file, <tt>qhull.h</tt>,
 contains prototypes for these functions.</p>
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a>
@@ -50,15 +50,15 @@ contains prototypes for these functions.</p>
 &#149; <b>Qhull</b> &#149; <a href="qh-set.htm#TOC">Set</a>
 &#149; <a href="qh-stat.htm#TOC">Stat</a> &#149; <a href="qh-user.htm#TOC">User</a>
 </p>
-<h3>Index to <a href="qhull.c#TOP">qhull.c</a>,
-<a href="qhull.h#TOP">qhull.h</a>, and 
-<a href="unix.c#TOP">unix.c</a></h3>
+<h3>Index to <a href="qhull.c">qhull.c</a>,
+<a href="qhull.h">qhull.h</a>, and 
+<a href="unix.c">unix.c</a></h3>
 <ul>
 <li><a href="#qtype">qhull.h and unix.c data types and
 constants</a> </li>
 <li><a href="#qmacro">qhull.h other macros</a> </li>
 <li><a href="#qfunc">Quickhull routines in call order</a> </li>
-<li><a href=="#qinit">Top-level routines for initializing and terminating Qhull</a></li>
+<li><a href="#qinit">Top-level routines for initializing and terminating Qhull</a></li>
 <li><a href="#qin">Top-level routines for reading and modifying the input</a></li>
 <li><a href="#qcall">Top-level routines for calling Qhull</a></li>
 <li><a href="#qout">Top-level routines for returning results</a></li>
@@ -88,7 +88,7 @@ codes for indicating errors </li>
 <h3><a href="qh-qhull.htm#TOC">»</a><a name="qmacro">qhull.h other
 macros</a></h3>
 <ul>
-<li><a href="qhull.h#traceN">traceN</a> print trace
+<li><a href="qhull_a.h#traceN">traceN</a> print trace
 message if <em>qh.IStracing &gt;= N</em>. </li>
 </ul>
 
@@ -143,11 +143,11 @@ before error handling initialized </li>
 after points are defined </li>
 <li><a href="global.c#initflags">qh_initflags</a> set
 flags and constants from command line </li>
-<li><a href="qhull.c#restore_qhull">qh_restore_qhull</a>
+<li><a href="global.c#restore_qhull">qh_restore_qhull</a>
 restores a saved qhull </li>
-<li><a href="qhull.c#save_qhull">qh_save_qhull</a>
+<li><a href="global.c#save_qhull">qh_save_qhull</a>
 saves qhull for later restoring </li>
-<li><a href="qhull.c#user_memsizes">qh_user_memsizes</a>
+<li><a href="user.c#user_memsizes">qh_user_memsizes</a>
 define additional quick allocation sizes
 </li>
 </ul>
@@ -156,7 +156,7 @@ define additional quick allocation sizes
 <ul>
 <li><a href="geom2.c#gram_schmidt">qh_gram_schmidt</a>
 implements Gram-Schmidt orthogonalization by rows </li>
-<li><a href="qhull.c#projectinput">qh_projectinput</a>
+<li><a href="geom2.c#projectinput">qh_projectinput</a>
 project input along one or more dimensions +
 Delaunay projection </li>
 <li><a href="geom2.c#randommatrix">qh_randommatrix</a>
@@ -190,7 +190,7 @@ the convex hull of a set of points </li>
 <ul>
 <li><a href="stat.c#collectstatistics">qh_collectstatistics</a>
 collect statistics for qh.facet_list </li>
-<li><a href="geom2.c#nearvertex">qh_nearvertex</a>
+<li><a href="poly2.c#nearvertex">qh_nearvertex</a>
 return nearest vertex to point </li>
 <li><a href="poly2.c#point">qh_point</a> return point
 for a point ID </li>
@@ -209,7 +209,7 @@ print neighborhood of one or two facets </li>
 print summary </li>
 <li><a href="io.c#produce_output">qh_produce_output</a>
 print the results of qh_qhull() </li>
-<li><a href="qhull.c#setvoronoi_all">qh_setvoronoi_all</a>
+<li><a href="poly2.c#setvoronoi_all">qh_setvoronoi_all</a>
 compute Voronoi centers for all facets </li>
 </ul>
 
@@ -240,9 +240,8 @@ print all fields for a list of facets </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -250,6 +249,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -267,7 +267,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-set.htm b/src/qh-set.htm
index 78d907e..6bf9200 100644
--- a/src/qh-set.htm
+++ b/src/qh-set.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -60,7 +60,7 @@ If a set is full, appending an element copies the set to
 a larger array. </p>
 
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a> &#149;
@@ -69,8 +69,8 @@ a larger array. </p>
 &#149; <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <b>Set</b>
 &#149; <a href="qh-stat.htm#TOC">Stat</a> &#149; <a href="qh-user.htm#TOC">User</a>
 </p>
-<h3>Index to <a href="qset.c#TOP">qset.c</a> and 
-<a href="qset.h#TOP">qset.h</a></h3>
+<h3>Index to <a href="qset.c">qset.c</a> and 
+<a href="qset.h">qset.h</a></h3>
 <ul>
 <li><a href="#stype">Data types and constants</a> </li>
 <li><a href="#seach">FOREACH macros</a> </li>
@@ -134,10 +134,12 @@ return size of a set (normally use <a href="qset.c#setsize">qh_setsize</a>) </li
 second element of set </li>
 <li><a href="qset.h#SETsecondt_">SETsecondt_</a>
 return second element of set as a type</li>
+<li><a href="qset.h#SETtruncate_">SETtruncate_</a>
+truncate set to size, i.e., qh_settruncate()</li>
 </ul>
 <h3><a href="qh-set.htm#TOC">»</a><a name="sint">Internal macros</a></h3>
 <ul>
-<li><a href="qset.c#SETsizeaddr&quot;">SETsizeaddr_</a>
+<li><a href="qset.c#SETsizeaddr_">SETsizeaddr_</a>
 return pointer to end element of a set (indicates
 current size) </li>
 </ul>
@@ -272,9 +274,8 @@ temporary) </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -282,6 +283,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -299,7 +301,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-stat.htm b/src/qh-stat.htm
index ee86508..732ff56 100644
--- a/src/qh-stat.htm
+++ b/src/qh-stat.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -41,7 +41,7 @@ Statistics
 may be turned off in user.h. If so, all but the 'zz'
 statistics are ignored.</p>
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a>
@@ -50,8 +50,8 @@ statistics are ignored.</p>
 &#149; <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <a href="qh-set.htm#TOC">Set</a>
 &#149; <b>Stat</b> &#149; <a href="qh-user.htm#TOC">User</a>
 </p>
-<h3>Index to <a href="stat.c#TOP">stat.c</a> and 
-<a href="stat.h#TOP">stat.h</a></h3>
+<h3>Index to <a href="stat.c">stat.c</a> and 
+<a href="stat.h">stat.h</a></h3>
 <ul>
 <li><a href="#ttype">stat.h types</a> </li>
 <li><a href="#tconst">stat.h constants</a> </li>
@@ -131,9 +131,8 @@ standard deviation and average from statistics </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -141,6 +140,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -158,7 +158,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qh-user.htm b/src/qh-user.htm
index bbeac43..30bb625 100644
--- a/src/qh-user.htm
+++ b/src/qh-user.htm
@@ -11,9 +11,8 @@ content="text/html; charset=iso-8859-1">
 <p><a name="TOP"><b>Up:</b></a> <a
 href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual</a>: Table of Contents <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -21,6 +20,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a><br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; <a href="qh-globa.htm">Global</a>
 &#149; <a href="qh-io.htm">Io</a> &#149; <a href="qh-mem.htm">Mem</a>
@@ -35,7 +35,7 @@ href="http://www.geom.umn.edu/locate/qhull">Home page</a> for Qhull<br>
 user may want to change. </p>
 
 </blockquote>
-<p><b>Copyright © 1995-2001 The Geometry Center, Minneapolis MN</b></p>
+<p><b>Copyright &copy; 1995-2001 The Geometry Center, Minneapolis MN</b></p>
 <hr>
 <p><a href="#TOP">»</a> <a href="qh-geom.htm#TOC">Geom</a> 
 <a name="TOC">&#149;</a> <a href="qh-globa.htm#TOC">Global</a>
@@ -44,14 +44,14 @@ user may want to change. </p>
 &#149; <a href="qh-qhull.htm#TOC">Qhull</a> &#149; <a href="qh-set.htm#TOC">Set</a>
 &#149; <a href="qh-stat.htm#TOC">Stat</a> &#149; <b>User</b>
 </p>
-<h3>Index to <a href="user.c#TOP">user.c</a> and 
-<a href="user.h#TOP">user.h</a></h3>
+<h3>Index to <a href="user.c">user.c</a> and 
+<a href="user.h">user.h</a></h3>
 <ul>
 <li><a href="#utype">user.h data types and
 configuration macros</a> </li>
 <li><a href="#ujoggle">joggle constants</a></li>
 <li><a href="#uperform">performance related constants</a></li>
-<li><a href="#umemory">memory and other constants</a></li>
+<li><a href="#umemory">memory constants</a></li>
 <li><a href="#ucond">conditional compilation</a></li>
 <li><a href="#umerge">merge constants</a> </li>
 <li><a href="#ufunc">user.c functions</a> </li>
@@ -64,12 +64,22 @@ of floating point numbers </li>
 <li><a href="user.h#CPUclock">qh_CPUclock</a> clock()
 function for reporting the total time spent by
 Qhull </li>
-<li><a href="user.h#ORIENTclock">qh_ORIENTclock</a>
-define convention for orienting facets</li>
 <li><a href="user.h#RANDOM">qh_RANDOM...</a> random
 number generator </li>
 </ul>
 
+<h3><a href="qh-user.htm#TOC">»</a><a name="udef">definition constants</a></h3>
+<ul>
+<li><a href="user.h#DEFAULTbox">qh_DEFAULTbox</a>
+define default box size for rbox, 'Qbb', and 'QbB' (Geomview expects 0.5) </li>
+<li><a href="user.h#INFINITE">qh_INFINITE</a> on
+output, indicates Voronoi center at infinity </li>
+<li><a href="user.h#ORIENTclock">qh_ORIENTclock</a>
+define convention for orienting facets</li>
+<li><a href="user.h#ZEROdelaunay">qh_ZEROdelaunay</a>
+define facets that are ignored in Delaunay triangulations</li>
+</ul>
+
 <h3><a href="qh-user.htm#TOC">»</a><a name="ujoggle">joggle constants</a></h3>
 <ul>
 <li><a href="user.h#JOGGLEagain">qh_JOGGLEagain</a>
@@ -107,13 +117,8 @@ tracing </li>
 count is smaller </li>
 </ul>
 
-<h3><a href="qh-user.htm#TOC">»</a><a name="umemory">memory and
-other constants</a></h3>
+<h3><a href="qh-user.htm#TOC">»</a><a name="umemory">memory constants</a></h3>
 <ul>
-<li><a href="user.h#DEFAULTbox">qh_DEFAULTbox</a>
-default box size (Geomview expects 0.5) </li>
-<li><a href="user.h#INFINITE">qh_INFINITE</a> on
-output, indicates Voronoi center at infinity </li>
 <li><a href="user.h#MEMalign">qh_MEMalign</a> memory
 alignment for qh_meminitbuffers() in global.c </li>
 <li><a href="user.h#MEMbufsize">qh_MEMbufsize</a>
@@ -158,7 +163,7 @@ max dimension for vertex reduction </li>
 <li><a href="user.h#DIMmergeVertex">qh_DIMmergeVertex</a>
 max dimension for vertex merging </li>
 <li><a href="user.h#DISToutside">qh_DISToutside</a>
-when does qh_findbestnew() stop search? </li>
+when is a point clearly outside of a facet for qh_findbestnew and qh_partitionall</li>
 <li><a href="user.h#MAXnarrow">qh_MAXnarrow</a> max.
 cosine for qh.NARROWhull </li>
 <li><a href="user.h#MAXnewcentrum">qh_MAXnewcentrum</a>
@@ -170,9 +175,10 @@ qh_reducevertices_centrums? </li>
 <li><a href="user.h#RATIOnearinside">qh_RATIOnearinside</a>
 ratio for retaining inside points for
 qh_check_maxout() </li>
+<li><a href="user.h#SEARCHdist">qh_SEARCHdist</a>
+when is facet coplanar with the best facet for qh_findbesthorizon</li>
 <li><a href="user.h#USEfindbestnew">qh_USEfindbestnew</a>
-cut-off between qh_findbest() and
-qh_findbestnew()</li>
+when to use qh_findbestnew for qh_partitionpoint()</li>
 <li><a href="user.h#WIDEcoplanar">qh_WIDEcoplanar</a>
 what is a WIDEfacet? </li>
 <li><a href="user.h#WARNnarrow">qh_WARNnarrow</a>
@@ -184,8 +190,6 @@ functions</a></h3>
 <ul>
 <li><a href="user.c#errexit">qh_errexit</a> report
 error and exit qhull()</li>
-<li><a href="user.c#errlog">qh_errlog</a> write
-qh.errmsg and open qh.ferrlog </li>
 <li><a href="user.c#errprint">qh_errprint</a> print
 information about facets and ridges </li>
 <li><a href="user.c#new_qhull">qh_new_qhull</a> call qhull on an array
@@ -200,9 +204,8 @@ print all fields of all facets </li>
 <a href="http://www.geom.umn.edu/locate/qhull">Home page for
 Qhull</a> <br>
 <b>Up:</b> <a href="../html/index.htm#TOC">Qhull manual: Table of Contents</a> <br>
-<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>Up:</b> <a href="../html/qh-quick.htm#programs">Programs</a>
-&#149;</a> <a href="../html/qh-quick.htm#options">Options</a> 
+&#149; <a href="../html/qh-quick.htm#options">Options</a> 
 &#149; <a href="../html/qh-opto.htm#output">Output</a> 
 &#149; <a href="../html/qh-optf.htm#format">Formats</a> 
 &#149; <a href="../html/qh-optg.htm#geomview">Geomview</a> 
@@ -210,6 +213,7 @@ Qhull</a> <br>
 &#149; <a href="../html/qh-optq.htm#qhull">Qhull</a> 
 &#149; <a href="../html/qh-optc.htm#prec">Precision</a> 
 &#149; <a href="../html/qh-optt.htm#trace">Trace</a><br>
+<b>Up:</b> <a href="../html/qh-in.htm#TOC">Qhull internals: Table of Contents</a> <br>
 <b>To:</b> <a href="index.htm">Qhull functions</a>, macros, and data structures<br>
 <b>To:</b> <a href="qh-geom.htm">Geom</a> &#149; 
 <a href="qh-globa.htm">Global</a> &#149; <a href="qh-io.htm">Io</a>
@@ -227,7 +231,5 @@ Geometry Center Home Page </i></p>
 <a href="http://www.geom.umn.edu/software/qhull/qhull-mail.html">qhull@geom.umn.edu
 </a><br>
 Created: May 2, 1997 --- <!-- hhmts start --> Last modified: see top <!-- hhmts end --> </p>
-</li>
-</dir>
 </body>
 </html>
diff --git a/src/qhalf.c b/src/qhalf.c
index dc8b0f9..56c34a6 100644
--- a/src/qhalf.c
+++ b/src/qhalf.c
@@ -51,7 +51,7 @@ int isatty (int);  /* returns 1 if stdin is a tty
     concise prompt below
 */  
 
-char qh_version[]= "version 3.0 2001/02/11";   /* used for error messages */
+char qh_version[]= "version 3.1 2001/10/04";   /* used for error messages */
 
 /* duplicated in qhalf.htm */
 char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
@@ -68,7 +68,8 @@ input (stdin):\n\
 \n\
 options:\n\
     Hn,n - specify coordinates of interior point\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Qc   - keep coplanar halfspaces\n\
     Qi   - keep other redundant halfspaces\n\
 \n\
@@ -90,6 +91,7 @@ Trace options:\n\
     Tv   - verify result: structure, convexity, and redundancy\n\
     Tz   - send all output to stdout\n\
     TFn  - report summary when n or more facets created\n\
+    TI file - input data from file, no spaces or single quotes\n\
     TO file - output results to file, may be enclosed in single quotes\n\
     TPn  - turn on tracing when halfspace n added to intersection\n\
     TMn  - turn on tracing at merge n\n\
@@ -179,7 +181,8 @@ qhalf- halfspace intersection about a point. Qhull %s\n\
 \n\
 options (qhalf.htm):\n\
     Hn,n - specify coordinates of interior point\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Tv   - verify result: structure, convexity, and redundancy\n\
     .    - concise list of all options\n\
     -    - one-line description of all options\n\
@@ -227,11 +230,11 @@ Except for 'F.' and 'PG', upper_case options take an argument.\n\
  PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
 \n\
  Qbk:0Bk:0_drop Qcoplanar      QG_half_good   Qi_redundant   QJoggle\n\
- Qsearch_1st    QVertex_good\n\
+ Qsearch_1st    Qtriangulate   QVertex_good\n\
 \n\
  T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
- TFacet_log     TPoint_trace   TMerge_trace   TOutput_file   TWide_trace\n\
- TVertex_stop   TCone_stop\n\
+ TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
+ TWide_trace    TVertex_stop   TCone_stop\n\
 \n\
  Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
 ";
diff --git a/src/qhull.c b/src/qhull.c
index 74a4488..eba31f0 100644
--- a/src/qhull.c
+++ b/src/qhull.c
@@ -69,6 +69,7 @@ void qh_qhull (void) {
       qh_checkzero( qh_ALL);
     if (qh ZEROall_ok && !qh TESTvneighbors && !qh WAScoplanar) {
       trace2((qh ferr, "qh_qhull: all facets are clearly convex and no coplanar points.  Post-merging and check of maxout not needed.\n"));
+      qh DOcheckmax= False;
     }else {
       if (qh MERGEexact || (qh hull_dim > qh_DIMreduceBuild && qh PREmerge))
         qh_postmerge ("First post-merge", qh premerge_centrum, qh premerge_cos, 
@@ -84,19 +85,19 @@ void qh_qhull (void) {
         qh_partitionvisible (/*visible_list, newfacet_list*/ !qh_ALL, &numoutside);
         qh findbestnew= False;
         qh_deletevisible (/*qh visible_list*/);
-        qh_resetlists (False /*qh visible_list newvertex_list newfacet_list */);
+        qh_resetlists (False, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */);
       }
-      if (qh DOcheckmax){
-	if (qh REPORTfreq) {
-	  qh_buildtracing (NULL, NULL); 
-	  fprintf (qh ferr, "\nTesting all coplanar points.\n");
-	}
-	qh_check_maxout();
+    }
+    if (qh DOcheckmax){
+      if (qh REPORTfreq) {
+	qh_buildtracing (NULL, NULL); 
+	fprintf (qh ferr, "\nTesting all coplanar points.\n");
       }
+      qh_check_maxout();
     }
+    if (qh KEEPnearinside && !qh maxoutdone)  
+      qh_nearcoplanar();
   }
-  if (qh KEEPnearinside && !qh maxoutdone)  
-    qh_nearcoplanar();
   if (qh_setsize ((setT*)qhmem.tempstack) != 0) {
     fprintf (qh ferr, "qhull internal error (qh_qhull): temporary sets not empty (%d)\n",
 	     qh_setsize ((setT*)qhmem.tempstack));
@@ -115,6 +116,7 @@ void qh_qhull (void) {
     if checkdist, 
       check that point is above facet.
       if point is not outside of the hull, uses qh_partitioncoplanar()
+      assumes that facet is defined by qh_findbestfacet()
     else if facet specified,
       assumes that point is above facet (major damage if below)
     for Delaunay triangulations, 
@@ -130,8 +132,13 @@ void qh_qhull (void) {
       do not deallocate the point's coordinates
   
   notes:
+    assumes point is near its best facet and not at a local minimum of a lens
+      distributions.  Use qh_findbestfacet to avoid this case.
     uses qh.visible_list, qh.newfacet_list, qh.delvertex_list, qh.NEWfacets
 
+  see also:
+    qh_triangulate() -- triangulate non-simplicial facets
+
   design:
     check point in qh.first_point/.num_points
     if checkdist
@@ -147,7 +154,8 @@ void qh_qhull (void) {
     update vertex neighbors and delete interior vertices
     exit if STOPcone requested
     merge non-convex new facets
-    check for using qh_findbestnew() instead of qh_findbest()
+    if merge found, many merges, or 'Qf'
+       use qh_findbestnew() instead of qh_findbest()
     partition outside points from visible facets
     delete visible facets
     check polyhedron if requested
@@ -166,11 +174,11 @@ boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist) {
   if (qh_pointid (furthest) == -1)
     qh_setappend (&qh other_points, furthest);
   if (!facet) {
-    fprintf (qh ferr, "qh_addpoint: NULL facet.  Use qh_findbestfacet\n");
+    fprintf (qh ferr, "qh_addpoint: NULL facet.  Need to call qh_findbestfacet first\n");
     qh_errexit (qh_ERRqhull, NULL, NULL);
   }
   if (checkdist) {
-    facet= qh_findbest (furthest, facet, !qh_ALL, False, !qh_NOupper,
+    facet= qh_findbest (furthest, facet, !qh_ALL, !qh_ISnewfacets, !qh_NOupper,
 			&dist, &isoutside, &numpart);
     zzadd_(Zpartition, numpart);
     if (!isoutside) {
@@ -191,7 +199,7 @@ boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist) {
     facet->notfurthest= True;
     /* last point of outsideset is no longer furthest.  This is ok
        since all points of the outside are likely to be bad */
-    qh_resetlists (False /*qh visible_list newvertex_list newfacet_list */);
+    qh_resetlists (False, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */);
     return True;
   }
   zzinc_(Zprocessed);
@@ -208,7 +216,7 @@ boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist) {
     FORALLnew_facets 
       qh_delfacet (newfacet);
     qh_delvertex (vertex);
-    qh_resetlists (True /*qh visible_list newvertex_list newfacet_list */);
+    qh_resetlists (True, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */);
     zinc_(Znotgoodnew);
     facet->notfurthest= True;
     return True;
@@ -221,9 +229,10 @@ boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist) {
     facet->notfurthest= True;
     return False;  /* visible_list etc. still defined */
   }
+  qh findbestnew= False;
   if (qh PREmerge || qh MERGEexact) {
     qh_premerge (vertex, qh premerge_centrum, qh premerge_cos);
-    if (zzval_(Ztotmerge) > qh_USEfindbestnew)
+    if (qh_USEfindbestnew)
       qh findbestnew= True;
     else {
       FORALLnew_facets {
@@ -246,9 +255,12 @@ boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist) {
   qh_deletevisible (/*qh visible_list*/);
   zmax_(Zmaxvertex, qh num_vertices);
   qh NEWfacets= False;
-  if (qh IStracing >= 4)
+  if (qh IStracing >= 4) {
+    if (qh num_facets < 2000)
+      qh_printlists();
     qh_printfacetlist (qh newfacet_list, NULL, True);
-  if (qh CHECKfrequently) {
+    qh_checkpolygon (qh facet_list);
+  }else if (qh CHECKfrequently) {
     if (qh num_facets < 50)
       qh_checkpolygon (qh facet_list);
     else
@@ -256,13 +268,10 @@ boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist) {
   }
   if (qh STOPpoint > 0 && qh furthest_id == qh STOPpoint-1) 
     return False; 
-  qh_resetlists (True /*qh visible_list newvertex_list newfacet_list */);
+  qh_resetlists (True, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */);
+  /* qh_triangulate(); to test qh.TRInormals */
   trace2((qh ferr, "qh_addpoint: added p%d new facets %d new balance %2.2g point balance %2.2g\n",
     qh_pointid (furthest), numnew, newbalance, pbalance));
-  if (qh hull_dim > 3 && qh TRACEpoint == qh_pointid (furthest)) {
-    qh IStracing= 0;
-    qhmem.IStracing= 0;
-  }
   return True;
 } /* addpoint */
 
@@ -447,6 +456,9 @@ At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n
   if (qh TRACEpoint == furthestid) {
     qh IStracing= qh TRACElevel;
     qhmem.IStracing= qh TRACElevel;
+  }else if (qh TRACEpoint != -1 && qh TRACEdist < REALmax/2) {
+    qh IStracing= 0;
+    qhmem.IStracing= 0;
   }
   if (qh REPORTfreq && (qh facet_id-1 > qh lastreport+qh REPORTfreq)) {
     qh lastreport= qh facet_id-1;
@@ -511,6 +523,7 @@ void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet) {
   
   qh_findhorizon( point, facet, goodvisible, goodhorizon )
     given a visible facet, find the point's horizon and visible facets
+    for all facets, !facet-visible
 
   returns:
     returns qh.visible_list/num_visible with all visible facets 
@@ -553,6 +566,10 @@ void qh_findhorizon(pointT *point, facetT *facet, int *goodvisible, int *goodhor
     qh_errprint ("visible", facet, NULL, NULL, NULL);
   qh visit_id++;
   FORALLvisible_facets {
+    if (visible->tricoplanar && !qh TRInormals) {
+      fprintf (qh ferr, "qh_findhorizon: does not work for tricoplanar facets.  Use option 'Q11'\n");
+      qh_errexit (qh_ERRqhull, visible, NULL);
+    }
     visible->visitid= qh visit_id;
     FOREACHneighbor_(visible) {
       if (neighbor->visitid == qh visit_id) 
@@ -731,7 +748,6 @@ pointT *qh_nextfurthest (facetT **visible) {
     does not partition qh.GOODpoint
     if qh.ONLYgood && !qh.MERGING, 
       does not partition qh.GOODvertex
-    sets facet->newfacet for qh_findbestnew() in qh_partitionpoint()
 
   notes:
     faster if qh.facet_list sorted by anticipated size of outside set
@@ -778,10 +794,7 @@ void qh_partitionall(setT *vertices, pointT *points, int numpoints){
       SETelem_(pointset, id)= NULL;
   }
   if (!qh BESToutside) {  /* matches conditional for qh_partitionpoint below */
-    if (qh MERGING)
-      distoutside= qh_DISToutside; /* defined in user.h */
-    else
-      distoutside= qh MINoutside;
+    distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */
     zval_(Ztotpartition)= qh num_points - qh hull_dim - 1; /*misses GOOD... */
     remaining= qh num_facets;
     point_end= numpoints;
@@ -820,6 +833,7 @@ void qh_partitionall(setT *vertices, pointT *points, int numpoints){
       qh_settruncate (pointset, point_end);
     }
   }
+  /* if !qh BESToutside, pointset contains points not assigned to outsideset */
   if (qh BESToutside || qh MERGING || qh KEEPcoplanar || qh KEEPinside) {
     qh findbestnew= True;
     FOREACHpoint_i_(pointset) { 
@@ -866,33 +880,39 @@ void qh_partitionall(setT *vertices, pointT *points, int numpoints){
         update qh.max_outside
       else
         append point one before end of coplanar set
+    else if point is clearly outside of qh.max_outside and bestfacet->coplanarset
+    and bestfacet is more than perpendicular to facet
+      repartition the point using qh_findbest() -- it may be put on an outsideset
     else
       update qh.max_outside
 */
 void qh_partitioncoplanar (pointT *point, facetT *facet, realT *dist) {
   facetT *bestfacet;
   pointT *oldfurthest;
-  realT bestdist, dist2;
-  int numpart= 0;
-  boolT isoutside, istrace= False;
+  realT bestdist, dist2, angle;
+  int numpart= 0, oldfindbest;
+  boolT isoutside;
 
   qh WAScoplanar= True;
   if (!dist) {
     if (qh findbestnew)
-      bestfacet= qh_findbestnew (point, facet, 
-			  &bestdist, NULL, &numpart);
+      bestfacet= qh_findbestnew (point, facet, &bestdist, qh_ALL, &isoutside, &numpart);
     else
-      bestfacet= qh_findbest (point, facet, qh_ALL, False, !qh_NOupper, 
+      bestfacet= qh_findbest (point, facet, qh_ALL, !qh_ISnewfacets, qh DELAUNAY, 
                           &bestdist, &isoutside, &numpart);
     zinc_(Ztotpartcoplanar);
     zzadd_(Zpartcoplanar, numpart);
-    if (!qh KEEPinside) {
+    if (!qh DELAUNAY && !qh KEEPinside) { /*  for 'd', bestdist skips upperDelaunay facets */
       if (qh KEEPnearinside) {
         if (bestdist < -qh NEARinside) { 
           zinc_(Zcoplanarinside);
+	  trace4((qh ferr, "qh_partitioncoplanar: point p%d is more than near-inside facet f%d dist %2.2g findbestnew %d\n",
+		  qh_pointid(point), bestfacet->id, bestdist, qh findbestnew));
           return;
         }
       }else if (bestdist < -qh MAXcoplanar) {
+	  trace4((qh ferr, "qh_partitioncoplanar: point p%d is inside facet f%d dist %2.2g findbestnew %d\n",
+		  qh_pointid(point), bestfacet->id, bestdist, qh findbestnew));
         zinc_(Zcoplanarinside);
         return;
       }
@@ -901,32 +921,40 @@ void qh_partitioncoplanar (pointT *point, facetT *facet, realT *dist) {
     bestfacet= facet;
     bestdist= *dist;
   }
+  if (bestdist > qh max_outside) {
+    if (!dist && facet != bestfacet) { 
+      zinc_(Zpartangle);
+      angle= qh_getangle(facet->normal, bestfacet->normal);
+      if (angle < 0) {
+	/* typically due to deleted vertex and coplanar facets, e.g.,
+	     RBOX 1000 s Z1 G1e-13 t1001185205 | QHULL Tv */
+	zinc_(Zpartflip);
+	trace2((qh ferr, "qh_partitioncoplanar: repartition point p%d from f%d.  It is above flipped facet f%d dist %2.2g\n",
+		qh_pointid(point), facet->id, bestfacet->id, bestdist));
+	oldfindbest= qh findbestnew;
+        qh findbestnew= False;
+	qh_partitionpoint(point, bestfacet);
+        qh findbestnew= oldfindbest;
+	return;
+      }
+    }
+    qh max_outside= bestdist;
+    if (bestdist > qh TRACEdist) {
+      fprintf (qh ferr, "qh_partitioncoplanar: ====== p%d from f%d increases max_outside to %2.2g of f%d last p%d\n",
+		     qh_pointid(point), facet->id, bestdist, bestfacet->id, qh furthest_id);
+      qh_errprint ("DISTANT", facet, bestfacet, NULL, NULL);
+    }
+  }
   if (qh KEEPcoplanar + qh KEEPinside + qh KEEPnearinside) {
     oldfurthest= (pointT*)qh_setlast (bestfacet->coplanarset);
     if (oldfurthest) {
       zinc_(Zcomputefurthest);
       qh_distplane (oldfurthest, bestfacet, &dist2);
     }
-    if (!oldfurthest || dist2 < bestdist) {
+    if (!oldfurthest || dist2 < bestdist) 
       qh_setappend(&bestfacet->coplanarset, point);
-      if (bestdist > qh max_outside) {
-	qh max_outside= bestdist;
-	if (bestdist > qh TRACEdist)
-	  istrace= True;
-      }
-    }else
+    else 
       qh_setappend2ndlast(&bestfacet->coplanarset, point);
-  }else { /* !KEEPcoplanar && !KEEPinside */
-    if (bestdist > qh max_outside) {
-      qh max_outside= bestdist;
-      if (bestdist > qh TRACEdist) 
-	istrace= True;
-    }
-  }
-  if (istrace) {
-    fprintf (qh ferr, "qh_partitioncoplanar: ====== p%d increases max_outside to %2.2g of f%d last p%d\n",
-		   qh_pointid(point), bestdist, bestfacet->id, qh furthest_id);
-    qh_errprint ("DISTANT", bestfacet, NULL, NULL, NULL);
   }
   trace4((qh ferr, "qh_partitioncoplanar: point p%d is coplanar with facet f%d (or inside) dist %2.2g\n",
 	  qh_pointid(point), bestfacet->id, bestdist));
@@ -977,10 +1005,9 @@ void qh_partitionpoint (pointT *point, facetT *facet) {
 #endif
 
   if (qh findbestnew)
-    bestfacet= qh_findbestnew (point, facet,
-			  &bestdist, &isoutside, &numpart);
+    bestfacet= qh_findbestnew (point, facet, &bestdist, qh BESToutside, &isoutside, &numpart);
   else
-    bestfacet= qh_findbest (point, facet, qh BESToutside, True, !qh_NOupper,
+    bestfacet= qh_findbest (point, facet, qh BESToutside, qh_ISnewfacets, !qh_NOupper,
 			  &bestdist, &isoutside, &numpart);
   zinc_(Ztotpartition);
   zzadd_(Zpartition, numpart);
@@ -1022,14 +1049,18 @@ void qh_partitionpoint (pointT *point, facetT *facet) {
 #endif
     }
     qh num_outside++;
-    trace4((qh ferr, "qh_partitionpoint: point p%d is outside facet f%d\n",
-	  qh_pointid(point), bestfacet->id));
-  }else if (bestdist >= -qh MAXcoplanar) {
+    trace4((qh ferr, "qh_partitionpoint: point p%d is outside facet f%d new? %d(or narrowhull)\n",
+	  qh_pointid(point), bestfacet->id, bestfacet->newfacet));
+  }else if (qh DELAUNAY || bestdist >= -qh MAXcoplanar) { /* for 'd', bestdist skips upperDelaunay facets */
     zzinc_(Zcoplanarpart);
     if (qh DELAUNAY)
       qh_precision ("nearly incident point");
-    if (qh KEEPcoplanar + qh KEEPnearinside || bestdist > qh max_outside) 
+    if ((qh KEEPcoplanar + qh KEEPnearinside) || bestdist > qh max_outside) 
       qh_partitioncoplanar (point, bestfacet, &bestdist);
+    else {
+      trace4((qh ferr, "qh_partitionpoint: point p%d is coplanar to facet f%d (dropped)\n",
+	  qh_pointid(point), bestfacet->id));
+    }
   }else if (qh KEEPnearinside && bestdist > -qh NEARinside) {
     zinc_(Zpartnear);
     qh_partitioncoplanar (point, bestfacet, &bestdist);
@@ -1037,7 +1068,7 @@ void qh_partitionpoint (pointT *point, facetT *facet) {
     zinc_(Zpartinside);
     trace4((qh ferr, "qh_partitionpoint: point p%d is inside all facets, closest to f%d dist %2.2g\n",
 	  qh_pointid(point), bestfacet->id, bestdist));
-    if (qh KEEPinside)	  
+    if (qh KEEPinside)
       qh_partitioncoplanar (point, bestfacet, &bestdist);
   }
 } /* partitionpoint */
@@ -1098,6 +1129,10 @@ void qh_partitionvisible(/*visible_list*/ boolT allpoints, int *numoutside) {
     }
     if (!newfacet)
       newfacet= qh newfacet_list;
+    if (newfacet == qh facet_tail) {
+      fprintf (qh ferr, "qhull precision error (qh_partitionvisible): all new facets deleted as\n        degenerate facets. Can not continue.\n");
+      qh_errexit (qh_ERRprec, NULL, NULL);
+    }
     if (visible->outsideset) {
       size= qh_setsize (visible->outsideset);
       *numoutside += size;
@@ -1109,7 +1144,7 @@ void qh_partitionvisible(/*visible_list*/ boolT allpoints, int *numoutside) {
       size= qh_setsize (visible->coplanarset);
       coplanar += size;
       FOREACHpoint_(visible->coplanarset) {
-        if (allpoints)
+        if (allpoints) /* not used */
           qh_partitionpoint (point, newfacet);
         else
           qh_partitioncoplanar (point, newfacet, NULL);
@@ -1118,7 +1153,7 @@ void qh_partitionvisible(/*visible_list*/ boolT allpoints, int *numoutside) {
   }
   FOREACHvertex_(qh del_vertices) {
     if (vertex->point) {
-      if (allpoints)
+      if (allpoints) /* not used */
         qh_partitionpoint (vertex->point, qh newfacet_list);
       else
         qh_partitioncoplanar (vertex->point, qh newfacet_list, NULL);
@@ -1153,6 +1188,7 @@ void qh_precision (char *reason) {
 
   notes:
     not in io.c so that user_eg.c can prevent io.c from loading
+    qh_printsummary and qh_countfacets must match counts
 
   design:
     determine number of points, vertices, and coplanar points
@@ -1165,6 +1201,8 @@ void qh_printsummary(FILE *fp) {
   int goodused;
   facetT *facet;
   char *s;
+  int numdel= zzval_(Zdelvertextot);
+  int numtricoplanars= 0;
 
   size= qh num_points + qh_setsize (qh other_points);
   numvertices= qh num_vertices - qh_setsize (qh del_vertices);
@@ -1173,14 +1211,17 @@ void qh_printsummary(FILE *fp) {
     if (facet->coplanarset)
       numcoplanars += qh_setsize( facet->coplanarset);
     if (facet->good) {
-      if (!facet->simplicial && qh_setsize(facet->vertices) != qh hull_dim)
+      if (facet->simplicial) {
+	if (facet->keepcentrum && facet->tricoplanar)
+	  numtricoplanars++;
+      }else if (qh_setsize(facet->vertices) != qh hull_dim)
 	nonsimplicial++;
     }
   }
   if (id >=0 && qh STOPcone-1 != id && -qh STOPpoint-1 != id)
     size--;
   if (qh STOPcone || qh STOPpoint)
-      fprintf (fp, "\nAt a premature exit due to 'TVn', 'TCn', or precision error.");
+      fprintf (fp, "\nAt a premature exit due to 'TVn', 'TCn', 'TRn', or precision error.");
   if (qh UPPERdelaunay)
     goodused= qh GOODvertex + qh GOODpoint + qh SPLITthresholds;
   else if (qh DELAUNAY)
@@ -1197,10 +1238,12 @@ Furthest-site Voronoi vertices by the convex hull of %d points in %d-d:\n\n", si
 Voronoi diagram by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
     fprintf(fp, "  Number of Voronoi regions%s: %d\n",
               qh ATinfinity ? " and at-infinity" : "", numvertices);
-    if (numcoplanars) 
-      fprintf(fp, "  Number of nearly incident points: %d\n", numcoplanars); 
-    else if (size > numvertices) 
-      fprintf(fp, "  Total number of nearly incident points: %d\n", size - numvertices); 
+    if (numdel)
+      fprintf(fp, "  Total number of deleted points due to merging: %d\n", numdel); 
+    if (numcoplanars - numdel > 0) 
+      fprintf(fp, "  Number of nearly incident points: %d\n", numcoplanars - numdel); 
+    else if (size - numvertices - numdel > 0) 
+      fprintf(fp, "  Total number of nearly incident points: %d\n", size - numvertices - numdel); 
     fprintf(fp, "  Number of%s Voronoi vertices: %d\n", 
               goodused ? " 'good'" : "", qh num_good);
     if (nonsimplicial) 
@@ -1215,10 +1258,12 @@ Furthest-site Delaunay triangulation by the convex hull of %d points in %d-d:\n\
 Delaunay triangulation by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
     fprintf(fp, "  Number of input sites%s: %d\n", 
               qh ATinfinity ? " and at-infinity" : "", numvertices);
-    if (numcoplanars) 
-      fprintf(fp, "  Number of nearly incident points: %d\n", numcoplanars); 
-    else if (size > numvertices) 
-      fprintf(fp, "  Total number of nearly incident points: %d\n", size - numvertices); 
+    if (numdel)
+      fprintf(fp, "  Total number of deleted points due to merging: %d\n", numdel); 
+    if (numcoplanars - numdel > 0) 
+      fprintf(fp, "  Number of nearly incident points: %d\n", numcoplanars - numdel); 
+    else if (size - numvertices - numdel > 0)
+      fprintf(fp, "  Total number of nearly incident points: %d\n", size - numvertices - numdel); 
     fprintf(fp, "  Number of%s Delaunay regions: %d\n", 
               goodused ? " 'good'" : "", qh num_good);
     if (nonsimplicial) 
@@ -1264,6 +1309,8 @@ Convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
       fprintf(fp, "  Number of%s non-simplicial facets: %d\n", 
               goodused ? " 'good'" : "", nonsimplicial);
   }
+  if (numtricoplanars)
+      fprintf(fp, "  Number of triangulated facets: %d\n", numtricoplanars);
   fprintf(fp, "\nStatistics for: %s | %s", 
                       qh rbox_command, qh qhull_command);
   if (qh ROTATErandom != INT_MIN)
@@ -1291,10 +1338,11 @@ Convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
   }
 #endif
   if (nummerged) {
-    fprintf(fp,"  Number of merged facets: %d\n", nummerged);
     fprintf(fp,"  Number of distance tests for merging: %d\n",zzval_(Zbestdist)+
           zzval_(Zcentrumtests)+zzval_(Zdistconvex)+zzval_(Zdistcheck)+
           zzval_(Zdistzero));
+    fprintf(fp,"  Number of distance tests for checking: %d\n",zzval_(Zcheckpart));
+    fprintf(fp,"  Number of merged facets: %d\n", nummerged);
   }
   if (!qh RANDOMoutside && qh QHULLfinished) {
     cpu= qh hulltime;
@@ -1325,7 +1373,8 @@ Convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
       fprintf(fp, "  Maximum distance of %spoint above facet: %2.2g", 
 	    (qh QHULLfinished ? "" : "merged "), outerplane);
       ratio= outerplane/(qh ONEmerge + qh DISTround);
-      if (ratio > 0.05 && qh ONEmerge > qh MINoutside && qh JOGGLEmax > REALmax/2)
+      /* don't report ratio if MINoutside is large */
+      if (ratio > 0.05 && 2* qh ONEmerge > qh MINoutside && qh JOGGLEmax > REALmax/2)
         fprintf (fp, " (%.1fx)\n", ratio);
       else
         fprintf (fp, "\n");
diff --git a/src/qhull.h b/src/qhull.h
index e545794..54eb22f 100644
--- a/src/qhull.h
+++ b/src/qhull.h
@@ -147,6 +147,9 @@ typedef enum {qh_PRINTnone= 0,
 */
 #define qh_ALL      True
 #define qh_NOupper  True     /* argument for qh_findbest */
+#define qh_IScheckmax  True     /* argument for qh_findbesthorizon */
+#define qh_ISnewfacets  True     /* argument for qh_findbest */
+#define qh_RESETvisible  True     /* argument for qh_resetlists */
 
 /*-<a                             href="qh-qhull.htm#TOC"
   >--------------------------------</a><a name="qh_ERR">-</a>
@@ -225,6 +228,7 @@ struct facetT {
 #endif
   coordT   offset;      /* exact offset of hyperplane from origin */ 
   coordT  *normal;      /* normal of hyperplane, hull_dim coefficients */
+			/*   if tricoplanar, shared with a neighbor */
   union {               /* in order of testing */
    realT   area;        /* area of facet, only in io.c if  ->isarea */
    facetT *replace;	/*  replacement facet if ->visible and NEWfacets
@@ -232,9 +236,12 @@ struct facetT {
    facetT *samecycle;   /*  cycle of facets from the same visible/horizon intersection,
    			     if ->newfacet */
    facetT *newcycle;    /*  in horizon facet, current samecycle of new facets */ 
+   facetT *trivisible;  /* visible facet for ->tricoplanar facets during qh_triangulate() */
+   facetT *triowner;    /* owner facet for ->tricoplanar, !isarea facets w/ ->keepcentrum */
   }f;
   coordT  *center;      /*  centrum for convexity, qh CENTERtype == qh_AScentrum */
       			/*  Voronoi center, qh CENTERtype == qh_ASvoronoi */
+			/*   if tricoplanar, shared with a neighbor */
   facetT  *previous;    /* previous facet in the facet_list */
   facetT  *next;        /* next facet in the facet_list */
   setT    *vertices;    /* vertices for this facet, inverse sorted by ID 
@@ -255,7 +262,13 @@ struct facetT {
 			   all uses are independent */
   unsigned id;	        /* unique identifier from qh facet_id */
   unsigned nummerge:9;  /* number of merges */
-#define qh_MAXnummerge 511 /*     2^9-1 */
+#define qh_MAXnummerge 511 /*     2^9-1, 32 flags total, see "flags:" in io.c */
+  flagT    tricoplanar:1; /* True if TRIangulate and simplicial and coplanar with a neighbor */
+			  /*   all tricoplanars share the same ->center, ->normal, ->offset, ->maxoutside */
+			  /*   all tricoplanars share the same apex */
+                          /*   if ->degenerate, does not span facet (one logical ridge) */
+                          /*   one tricoplanar has ->keepcentrum and ->coplanarset */
+                          /*   during qh_triangulate, f.trivisible points to original facet */
   flagT	   newfacet:1;  /* True if facet on qh newfacet_list (new or merged) */
   flagT	   visible:1;   /* True if visible facet (will be deleted) */
   flagT    toporient:1; /* True if created with top orientation
@@ -280,9 +293,9 @@ struct facetT {
   flagT     mergehorizon:1; /* True if will merge into horizon (->coplanar) */
   flagT	    cycledone:1;/* True if mergecycle_all already done */
   flagT    tested:1;    /* True if facet convexity has been tested (false after merge */
-  flagT    keepcentrum:1; /* True if keep old centrum after a merge */
+  flagT    keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar */
   flagT	   newmerge:1;  /* True if facet is newly merged for reducevertices */
-  flagT	   degenerate:1; /* True if facet is degenerate (degen_mergeset) */
+  flagT	   degenerate:1; /* True if facet is degenerate (degen_mergeset or ->tricoplanar) */
   flagT	   redundant:1;  /* True if facet is redundant (degen_mergeset) */
 };
 
@@ -421,6 +434,7 @@ struct qhT {
   realT   postmerge_centrum; /*   'Cn' centrum_radius when post merging.  Default is round-off */
   boolT MERGEvertices;	  /* true 'Q3' if merging redundant vertices */
   realT MINvisible;       /* 'Vn' min. distance for a facet to be visible */
+  boolT NOnarrow;         /* true 'Q10' if no special processing for narrow distributions */
   boolT NOnearinside;     /* true 'Q8' if ignore near-inside points when partitioning */
   boolT NOpremerge;       /* true 'Q0' if no defaults for C-0 or Qx */
   boolT ONLYgood; 	  /* true 'Qg' if process points with good visible or horizon facets */
@@ -476,6 +490,8 @@ struct qhT {
   int   TRACEpoint;       /* 'TPn' start tracing when point n is a vertex */
   realT TRACEdist;        /* 'TWn' start tracing when merge distance too big */
   int   TRACEmerge;       /* 'TMn' start tracing before this merge */
+  boolT TRIangulate;	  /* true 'Qt' if triangulate non-simplicial facets */
+  boolT TRInormals;	  /* true 'Q11' if triangulate duplicates normals (sets Qt) */
   boolT UPPERdelaunay;    /* true 'Qu' if computing furthest-site Delaunay */
   boolT VERIFYoutput;     /* true 'Tv' if verify output at end of qhull */
   boolT VIRTUALmemory;    /* true 'Q7' if depth-first processing in buildhull */
@@ -486,7 +502,7 @@ struct qhT {
   boolT DOcheckmax;       /* true if calling qh_check_maxout (qh_initqhull_globals) */
   char	*feasible_string;  /* feasible point 'Hn,n,n' for halfspace intersection */
   coordT *feasible_point;  /*    as coordinates, both malloc'd */
-  boolT GETarea;          /* true if need to compute facet areas in io.c */
+  boolT GETarea;          /* true 'Fa', 'FA', 'FS', 'PAn', 'PFn' if compute facet area/Voronoi volume in io.c */
   boolT KEEPnearinside;   /* true if near-inside points in coplanarset */
   int 	hull_dim;         /* dimension of hull, set by initbuffers */
   int 	input_dim;	  /* dimension of input, set by initbuffers */
@@ -585,8 +601,8 @@ struct qhT {
   facetT *tracefacet;     /*   set in newfacet/mergefacet, undone in delfacet*/
   unsigned tracevertex_id;  /* set at buildtracing, can print whenever */
   vertexT *tracevertex;     /*   set in newvertex, undone in delvertex*/
-  vertexT *vertex_list;   /* list of all vertices, to vertex_tail */
-  vertexT  *vertex_tail;   
+  vertexT *vertex_list;     /* list of all vertices, to vertex_tail */
+  vertexT  *vertex_tail;    /*      end of vertex_list (dummy vertex) */
   vertexT *newvertex_list; /* list of vertices in newfacet_list, to vertex_tail
                              all vertices have 'newlist' set */
   int 	num_facets;	  /* number of facets in facet_list
@@ -637,8 +653,8 @@ struct qhT {
   int 	printoutvar;	  /* temporary variable for qh_printbegin, etc. */
   int 	printoutnum;	  /* number of facets printed */
   boolT QHULLfinished;    /* True after qhull() is finished */
-  realT totarea;          /* total facet area computed by qh_getarea */
-  realT totvol;           /* total volume computed by qh_getarea */
+  realT totarea;          /* 'FA': total facet area computed by qh_getarea */
+  realT totvol;           /* 'FA': total volume computed by qh_getarea */
   unsigned int visit_id;  /* unique ID for searching neighborhoods, */
   unsigned int vertex_visit; /* unique ID for searching vertices */
   boolT ZEROall_ok;       /* True if qh_checkzero always succeeds */
@@ -695,7 +711,7 @@ struct qhT {
   int   ridgeoutnum;      /* number of ridges in 4OFF output */
   void *old_qhstat;       /* for saving qh_qhstat in save_qhull() */
   setT *old_tempstack;     /* for saving qhmem.tempstack in save_qhull */
-  setT *searchset;        /* set of facets for searching in qh_findbest() */
+  setT *coplanarset;      /* set of coplanar facets for searching qh_findbesthorizon() */
 };
 
 /*=========== -macros- =========================*/
@@ -944,7 +960,7 @@ facetT *qh_findbest (pointT *point, facetT *startfacet,
 		     boolT bestoutside, boolT newfacets, boolT noupper,
 		     realT *dist, boolT *isoutside, int *numpart);
 facetT *qh_findbestnew (pointT *point, facetT *startfacet,
-	   realT *dist, boolT *isoutside, int *numpart);
+                     realT *dist, boolT bestoutside, boolT *isoutside, int *numpart);
 boolT   qh_gram_schmidt(int dim, realT **rows);
 void    qh_outerinner (facetT *facet, realT *outerplane, realT *innerplane);
 void	qh_printsummary(FILE *fp);
@@ -971,6 +987,7 @@ void 	qh_initqhull_globals (coordT *points, int numpoints, int dim, boolT ismall
 void    qh_initqhull_mem (void);
 void 	qh_initqhull_start (FILE *infile, FILE *outfile, FILE *errfile);
 void 	qh_initthresholds (char *command);
+void    qh_option (char *option, int *i, realT *r);
 #if qh_QHpointer
 void 	qh_restore_qhull (qhT **oldqh);
 qhT    *qh_save_qhull (void);
@@ -1003,6 +1020,7 @@ setT   *qh_pointfacet (void /*qh.facet_list*/);
 int     qh_pointid (pointT *point);
 setT   *qh_pointvertex (void /*qh.facet_list*/);
 void    qh_setvoronoi_all (void);
+void	qh_triangulate (void /*qh facet_list*/);
 
 /********* -stat.c prototypes (duplicated from stat.h) **********************/
 
diff --git a/src/qhull_a.h b/src/qhull_a.h
index c27fd21..eef637e 100644
--- a/src/qhull_a.h
+++ b/src/qhull_a.h
@@ -107,7 +107,6 @@ void    qh_appendprint (qh_PRINT format);
 void 	qh_freebuild (boolT allmem);
 void 	qh_freebuffers (void);
 void    qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc);
-void    qh_option (char *option, int *i, realT *r);
 int     qh_strtol (const char *s, char **endp);
 double  qh_strtod (const char *s, char **endp);
 
@@ -118,7 +117,10 @@ void	qh_allstatB (void);
 void	qh_allstatC (void);
 void	qh_allstatD (void);
 void	qh_allstatE (void);
+void	qh_allstatE2 (void);
 void	qh_allstatF (void);
+void	qh_allstatG (void);
+void	qh_allstatH (void);
 void 	qh_freebuffers (void);
 void    qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc);
 
diff --git a/src/qset.c b/src/qset.c
index 658a176..77d168b 100644
--- a/src/qset.c
+++ b/src/qset.c
@@ -146,8 +146,8 @@ void qh_setappend(setT **setp, void *newelem) {
     appends setA to *setp
 
   notes:
-    *setp and setA may be NULL
     *setp can not be a temp set
+    *setp and setA may be NULL
 
   design:
     setup for copy
@@ -1225,6 +1225,9 @@ void qh_settemppush(setT *set) {
 
   notes:
     set must be defined
+  
+  see:
+    SETtruncate_
 
   design:
     check size
diff --git a/src/qset.h b/src/qset.h
index 62ee4da..88a0e0c 100644
--- a/src/qset.h
+++ b/src/qset.h
@@ -411,6 +411,19 @@ struct setT {
 */
 #define SETempty_(set) 	          (!set || (SETfirst_(set) ? 0:1))
 
+/*-<a                                     href="qh-set.htm#TOC"
+  >---------------------------------------</a><a name="SETtruncate_">-</a>
+
+   SETtruncate_(set)
+     return first element of set
+
+   see:
+     qh_settruncate()
+   
+*/
+#define SETtruncate_(set, size) {set->e[set->maxsize].i= size+1; /* maybe overwritten */ \
+      set->e[size].p= NULL;}
+
 /*======= prototypes in alphabetical order ============*/
 
 void  qh_setaddsorted(setT **setp, void *elem);
diff --git a/src/qvoronoi.c b/src/qvoronoi.c
index 20db82b..05706aa 100644
--- a/src/qvoronoi.c
+++ b/src/qvoronoi.c
@@ -52,10 +52,10 @@ int isatty (int);  /* returns 1 if stdin is a tty
     concise prompt below
 */  
 
-char qh_version[]= "version 3.0 2001/02/11";   /* used for error messages */
+char qh_version[]= "version 3.1 2001/10/04";   /* used for error messages */
 
 /* duplicated in qvoron_f.htm and qvoronoi.htm */
-char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
+char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Pv Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
 
 char qh_prompta[]= "\n\
 qvoronoi- compute the Voronoi diagram\n\
@@ -68,14 +68,15 @@ input (stdin):\n\
 \n\
 options:\n\
     Qu   - compute furthest-site Voronoi diagram\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
 \n\
 Qhull control options:\n\
+    Qz   - add point-at-infinity to Voronoi diagram\n\
     QJn  - randomly joggle input in range [-n,n]\n\
 %s%s%s%s";  /* split up qh_prompt for Visual C++ */
 char qh_promptb[]= "\
     Qs   - search all points for the initial simplex\n\
-    Qz   - add point-at-infinity to Voronoi diagram\n\
     QGn  - Voronoi vertices if visible from point n, -n if not\n\
     QVn  - Voronoi vertices for input point n, -n if not\n\
 \n\
@@ -88,6 +89,7 @@ Trace options:\n\
     Tv   - verify result: structure, convexity, and in-circle test\n\
     Tz   - send all output to stdout\n\
     TFn  - report summary when n or more facets created\n\
+    TI file - input data from file, no spaces or single quotes\n\
     TO file - output results to file, may be enclosed in single quotes\n\
     TPn  - turn on tracing when point n added to hull\n\
      TMn - turn on tracing at merge n\n\
@@ -174,8 +176,9 @@ qvoronoi- compute the Voronoi diagram. Qhull %s\n\
     comments start with a non-numeric character\n\
 \n\
 options (qvoronoi.htm):\n\
-    QJ   - joggle input instead of merging facets\n\
     Qu   - compute furthest-site Voronoi diagram\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Tv   - verify result: structure, convexity, and in-circle test\n\
     .    - concise list of all options\n\
     -    - one-line description of all options\n\
@@ -224,12 +227,12 @@ Except for 'F.' and 'PG', upper-case options take an argument.\n\
  PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
  PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
 \n\
- QG_vertex_good QJoggle        Qsearch_1st    Qupper_voronoi\n\
+ QG_vertex_good QJoggle        Qsearch_1st    Qtriangulate   Qupper_voronoi\n\
  QV_point_good  Qzinfinite\n\
 \n\
  T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
- TFacet_log     TPoint_trace   TMerge_trace   TOutput_file   TWide_trace\n\
- TVertex_stop   TCone_stop\n\
+ TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
+ TWide_trace    TVertex_stop   TCone_stop\n\
 \n\
  Angle_max      Centrum_size   Random_dist    Wide_outside\n\
 ";
diff --git a/src/rbox.c b/src/rbox.c
index 851e8cc..1c288bd 100644
--- a/src/rbox.c
+++ b/src/rbox.c
@@ -42,7 +42,7 @@
 char prompt[]= "\n\
 -rbox- generate various point distributions.  Default is random in cube.\n\
 \n\
-args (any order, space separated):                    Version: 2001/02/11\n\
+args (any order, space separated):                    Version: 2001/06/24\n\
   3000    number of random points in cube, lens, spiral, sphere or grid\n\
   D3      dimension 3-d\n\
   c       add a unit cube to the output ('c G2.0' sets size)\n\
@@ -451,13 +451,10 @@ int main(int argc, char **argv) {
 	  mult[k]= 0;
 	}
       }
-      if (iscdd)
-	fprintf (fp, "end\nhull\n");
-      return 0;
     }
 
     /* ============= regular points for 's' =============== */
-    if (isregular && !islens) {
+    else if (isregular && !islens) {
       if (dim != 2 && dim != 3) {
 	fprintf(stderr, "rbox error: regular points can be used only in 2-d and 3-d\n\n");
 	exit(1);
@@ -501,12 +498,9 @@ int main(int argc, char **argv) {
 	  }
 	}
       }
-      if (iscdd)
-	fprintf (fp, "end\nhull\n");
-      return 0;
     }
     /* ============= regular points for 'r Ln D2' =============== */
-    if (isregular && islens && dim == 2) {
+    else if (isregular && islens && dim == 2) {
       double cos_0;
       
       angle= lensangle;
@@ -524,12 +518,9 @@ int main(int argc, char **argv) {
 	  out2n( x*box, -y*box);
 	}
       }
-      if (iscdd)
-	fprintf (fp, "end\nhull\n");
-      return 0;
     }
     /* ============= regular points for 'r Ln D3' =============== */
-    if (isregular && islens && dim != 2) {
+    else if (isregular && islens && dim != 2) {
       if (dim != 3) {
 	fprintf(stderr, "rbox error: regular points can be used only in 2-d and 3-d\n\n");
 	exit(1);
@@ -556,130 +547,129 @@ int main(int argc, char **argv) {
           out1( 1.0);
 	out3n( box*x, box*y, -box * offset);
       }
-      if (iscdd)
-	fprintf (fp, "end\nhull\n");
-      return 0;
     }
     /* ============= apex of 'Zn' distribution + gendim =============== */
-    if (isaxis) {
-      gendim= dim-1;
-      if (iscdd)
-        out1( 1.0);
-      for (j=0; j < gendim; j++)
-	out1( 0.0);
-      out1( -box);
-      fprintf (fp, "\n");
-    }else if (islens) 
-      gendim= dim-1;
-    else
-      gendim= dim;
-    /* ============= generate random point in unit cube =============== */
-    for (i=0; i < numpoints; i++) {
-      norm= 0.0;
-      for (j=0; j < gendim; j++) {
-	randr= qh_RANDOMint;
-	coord[j]= 2.0 * randr/randmax - 1.0;
-	norm += coord[j] * coord[j];
-      }
-      norm= sqrt (norm);
-      /* ============= dim-1 point of 'Zn' distribution ========== */
+    else {
       if (isaxis) {
-	if (!isgap) {
-	  isgap= 1;
-	  gap= 1.0;
-	}
-	randr= qh_RANDOMint;
-	rangap= 1.0 - gap * randr/randmax;
-	factor= radius * rangap / norm;
-	for (j=0; j<gendim; j++)
-	  coord[j]= factor * coord[j];
-      /* ============= dim-1 point of 'Ln s' distribution =========== */
-      }else if (islens && issphere) {
-        if (!isgap) {
-	  isgap= 1;
-	  gap= 1.0;
-	}
-	randr= qh_RANDOMint;
-	rangap= 1.0 - gap * randr/randmax;
-	factor= rangap / norm;
-	for (j=0; j<gendim; j++)
-	  coord[j]= factor * coord[j];
-      /* ============= dim-1 point of 'Ln' distribution ========== */
-      }else if (islens && !issphere) {
-        if (!isgap) {
-	  isgap= 1;
-	  gap= 1.0;
-	}
-	j= qh_RANDOMint % gendim;
-	if (coord[j] < 0)
-	  coord[j]= -1.0 - coord[j] * gap;
-	else
-	  coord[j]= 1.0 - coord[j] * gap;
-      /* ============= point of 'l' distribution =============== */
-      }else if (isspiral) {
-	if (dim != 3) {
-	  fprintf(stderr, "rbox error: spiral distribution is available only in 3d\n\n");
-	  exit(1);
-	}
-	coord[0]= cos(2*PI*i/(numpoints - 1));
-	coord[1]= sin(2*PI*i/(numpoints - 1));
-	coord[2]= 2.0*(double)i/(double)(numpoints-1) - 1.0;
-      /* ============= point of 's' distribution =============== */
-      }else if (issphere) {
-	factor= 1.0/norm;
-	if (iswidth) {
-  	  randr= qh_RANDOMint;
-	  factor *= 1.0 - width * randr/randmax;
-	}
-	for (j=0; j<dim; j++)
-	  coord[j]= factor * coord[j];
-      }
-      /* ============= project 'Zn s' point in to sphere =============== */
-      if (isaxis && issphere) {
-	coord[dim-1]= 1.0;
-	norm= 1.0;
-	for (j=0; j<gendim; j++)
+	gendim= dim-1;
+	if (iscdd)
+	  out1( 1.0);
+	for (j=0; j < gendim; j++)
+	  out1( 0.0);
+	out1( -box);
+	fprintf (fp, "\n");
+      }else if (islens) 
+	gendim= dim-1;
+      else
+	gendim= dim;
+      /* ============= generate random point in unit cube =============== */
+      for (i=0; i < numpoints; i++) {
+	norm= 0.0;
+	for (j=0; j < gendim; j++) {
+	  randr= qh_RANDOMint;
+	  coord[j]= 2.0 * randr/randmax - 1.0;
 	  norm += coord[j] * coord[j];
-	norm= sqrt (norm);
-	for (j=0; j<dim; j++)
-	  coord[j]= coord[j] / norm;
-	if (iswidth) {
-  	  randr= qh_RANDOMint;
-	  coord[dim-1] *= 1 - width * randr/randmax;
 	}
-      /* ============= project 'Zn' point onto cube =============== */
-      }else if (isaxis && !issphere) {  /* not very interesting */
-        randr= qh_RANDOMint;
-	coord[dim-1]= 2.0 * randr/randmax - 1.0;
-      /* ============= project 'Ln' point out to sphere =============== */
-      }else if (islens) {
-	coord[dim-1]= lensbase;
-	for (j=0, norm= 0; j<dim; j++)
-	  norm += coord[j] * coord[j];
 	norm= sqrt (norm);
-	for (j=0; j<dim; j++)
-	  coord[j]= coord[j] * radius/ norm;
-	coord[dim-1] -= lensbase;
-	if (iswidth) {
-  	  randr= qh_RANDOMint;
-	  coord[dim-1] *= 1 - width * randr/randmax;
+	/* ============= dim-1 point of 'Zn' distribution ========== */
+	if (isaxis) {
+	  if (!isgap) {
+	    isgap= 1;
+	    gap= 1.0;
+	  }
+	  randr= qh_RANDOMint;
+	  rangap= 1.0 - gap * randr/randmax;
+	  factor= radius * rangap / norm;
+	  for (j=0; j<gendim; j++)
+	    coord[j]= factor * coord[j];
+	/* ============= dim-1 point of 'Ln s' distribution =========== */
+	}else if (islens && issphere) {
+	  if (!isgap) {
+	    isgap= 1;
+	    gap= 1.0;
+	  }
+	  randr= qh_RANDOMint;
+	  rangap= 1.0 - gap * randr/randmax;
+	  factor= rangap / norm;
+	  for (j=0; j<gendim; j++)
+	    coord[j]= factor * coord[j];
+	/* ============= dim-1 point of 'Ln' distribution ========== */
+	}else if (islens && !issphere) {
+	  if (!isgap) {
+	    isgap= 1;
+	    gap= 1.0;
+	  }
+	  j= qh_RANDOMint % gendim;
+	  if (coord[j] < 0)
+	    coord[j]= -1.0 - coord[j] * gap;
+	  else
+	    coord[j]= 1.0 - coord[j] * gap;
+	/* ============= point of 'l' distribution =============== */
+	}else if (isspiral) {
+	  if (dim != 3) {
+	    fprintf(stderr, "rbox error: spiral distribution is available only in 3d\n\n");
+	    exit(1);
+	  }
+	  coord[0]= cos(2*PI*i/(numpoints - 1));
+	  coord[1]= sin(2*PI*i/(numpoints - 1));
+	  coord[2]= 2.0*(double)i/(double)(numpoints-1) - 1.0;
+	/* ============= point of 's' distribution =============== */
+	}else if (issphere) {
+	  factor= 1.0/norm;
+	  if (iswidth) {
+  	    randr= qh_RANDOMint;
+	    factor *= 1.0 - width * randr/randmax;
+	  }
+	  for (j=0; j<dim; j++)
+	    coord[j]= factor * coord[j];
 	}
-	if (qh_RANDOMint > randmax/2)
-	  coord[dim-1]= -coord[dim-1];
-      /* ============= project 'Wn' point toward boundary =============== */
-      }else if (iswidth && !issphere) {
-	j= qh_RANDOMint % gendim;
-	if (coord[j] < 0)
-	  coord[j]= -1.0 - coord[j] * width;
-	else
-	  coord[j]= 1.0 - coord[j] * width;
+	/* ============= project 'Zn s' point in to sphere =============== */
+	if (isaxis && issphere) {
+	  coord[dim-1]= 1.0;
+	  norm= 1.0;
+	  for (j=0; j<gendim; j++)
+	    norm += coord[j] * coord[j];
+	  norm= sqrt (norm);
+	  for (j=0; j<dim; j++)
+	    coord[j]= coord[j] / norm;
+	  if (iswidth) {
+  	    randr= qh_RANDOMint;
+	    coord[dim-1] *= 1 - width * randr/randmax;
+	  }
+	/* ============= project 'Zn' point onto cube =============== */
+	}else if (isaxis && !issphere) {  /* not very interesting */
+	  randr= qh_RANDOMint;
+	  coord[dim-1]= 2.0 * randr/randmax - 1.0;
+	/* ============= project 'Ln' point out to sphere =============== */
+	}else if (islens) {
+	  coord[dim-1]= lensbase;
+	  for (j=0, norm= 0; j<dim; j++)
+	    norm += coord[j] * coord[j];
+	  norm= sqrt (norm);
+	  for (j=0; j<dim; j++)
+	    coord[j]= coord[j] * radius/ norm;
+	  coord[dim-1] -= lensbase;
+	  if (iswidth) {
+  	    randr= qh_RANDOMint;
+	    coord[dim-1] *= 1 - width * randr/randmax;
+	  }
+	  if (qh_RANDOMint > randmax/2)
+	    coord[dim-1]= -coord[dim-1];
+	/* ============= project 'Wn' point toward boundary =============== */
+	}else if (iswidth && !issphere) {
+	  j= qh_RANDOMint % gendim;
+	  if (coord[j] < 0)
+	    coord[j]= -1.0 - coord[j] * width;
+	  else
+	    coord[j]= 1.0 - coord[j] * width;
+	}
+	/* ============= write point =============== */
+	if (iscdd)
+	  out1( 1.0);
+	for (k=0; k < dim; k++) 
+	  out1( coord[k] * box);
+	fprintf (fp, "\n");
       }
-      /* ============= write point =============== */
-      if (iscdd)
-        out1( 1.0);
-      for (k=0; k < dim; k++) 
-	out1( coord[k] * box);
-      fprintf (fp, "\n");
     }
     /* ============= write cube vertices =============== */
     if (addcube) {
diff --git a/src/stat.c b/src/stat.c
index a4523a5..5b4bcf7 100644
--- a/src/stat.c
+++ b/src/stat.c
@@ -43,7 +43,7 @@ void qh_allstatA (void) {
   zdef_(wmin, Wmindenom, "min. denominator in hyperplane computation", -1);
 
   qhstat precision= qhstat next;  /* call qh_precision for each of these */
-  zzdef_(zdoc, Zdoc3, "precision problems", -1);
+  zzdef_(zdoc, Zdoc3, "precision problems (corrected unless 'Q0' or an error)", -1);
   zzdef_(zinc, Zcoplanarridges, "coplanar half ridges in output", -1);
   zzdef_(zinc, Zconcaveridges, "concave half ridges in output", -1);
   zzdef_(zinc, Zflippedfacets, "flipped facets", -1);
@@ -97,8 +97,6 @@ void qh_allstatC (void) {
   zdef_(zmax, Zvisfacetmax,  "    maximum", -1);
   zdef_(zadd, Zvisvertextot, "ave. visible vertices per iteration", Zprocessed);
   zdef_(zmax, Zvisvertexmax, "    maximum", -1);
-  zdef_(zadd, Zdelvertextot, "  ave. vertices deleted per iteration", Zprocessed);
-  zdef_(zmax, Zdelvertexmax, "    maximum vertices deleted", -1);
   zdef_(zinc, Ztothorizon, "ave. horizon facets per iteration", Zprocessed);
   zdef_(zadd, Znewfacettot,  "ave. new or merged facets per iteration", Zprocessed);
   zdef_(zmax, Znewfacetmax,  "    maximum (includes initial simplex)", -1);
@@ -117,15 +115,34 @@ void qh_allstatC (void) {
   zzdef_(zinc, Znumvisibility, "distance tests for facet visibility", -1);
   zdef_(zinc, Zdistvertex, "distance tests to report minimum vertex", -1);
   zdef_(zinc, Ztotcheck, "points checked for facets' outer planes", -1);
-  zdef_(zinc, Zcheckpart, "  ave. distance tests per check", Ztotcheck);
+  zzdef_(zinc, Zcheckpart, "  ave. distance tests per check", Ztotcheck);
 }
 void qh_allstatD(void) {
-  zdef_(zdoc, Zdoc4, "partitioning statistics", -1);
+  zdef_(zdoc, Zdoc4, "partitioning statistics (see previous for outer planes)", -1);
+  zzdef_(zadd, Zdelvertextot, "total vertices deleted", -1);
+  zdef_(zmax, Zdelvertexmax, "    maximum vertices deleted per iteration", -1);
+  zdef_(zinc, Zfindbest, "calls to findbest", -1);
+  zdef_(zadd, Zfindbesttot, " ave. facets tested", Zfindbest);
+  zdef_(zmax, Zfindbestmax, " max. facets tested", -1);
+  zdef_(zadd, Zfindcoplanar, " ave. coplanar search", Zfindbest);
+  zdef_(zinc, Zfindnew, "calls to findbestnew", -1);
+  zdef_(zadd, Zfindnewtot, " ave. facets tested", Zfindnew);
+  zdef_(zmax, Zfindnewmax, " max. facets tested", -1);
+  zdef_(zinc, Zfindnewjump, " ave. clearly better", Zfindnew);
+  zdef_(zinc, Zfindnewsharp, " calls due to qh_sharpnewfacets", -1);
+  zdef_(zinc, Zfindhorizon, "calls to findhorizon", -1);
+  zdef_(zadd, Zfindhorizontot, " ave. facets tested", Zfindhorizon);
+  zdef_(zmax, Zfindhorizonmax, " max. facets tested", -1);
+  zdef_(zinc, Zfindjump,       " ave. clearly better", Zfindhorizon);
+  zdef_(zinc, Zparthorizon, " horizon facets better than bestfacet", -1);
+  zdef_(zinc, Zpartangle, "angle tests for repartitioned coplanar points", -1);
+  zdef_(zinc, Zpartflip, "  repartitioned coplanar points for flipped orientation", -1);
   zdef_(zinc, Zpartinside, "inside points", -1);
   zdef_(zinc, Zpartnear, "  inside points kept with a facet", -1);
   zdef_(zinc, Zcoplanarinside, "  inside points that were coplanar with a facet", -1);
   zdef_(wadd, Wmaxout, "difference in max_outside at final check", -1);
-  
+}
+void qh_allstatE(void) {
   zzdef_(zinc, Zpartitionall, "distance tests for initial partition", -1);
   zdef_(zinc, Ztotpartition, "partitions of a point", -1);
   zzdef_(zinc, Zpartition, "distance tests for partitioning", -1);
@@ -139,7 +156,7 @@ void qh_allstatD(void) {
   zzdef_(zinc, Zpartcoplanar, "   distance tests for these partitions", -1);
   zdef_(zinc, Zcomputefurthest, "distance tests for computing furthest", -1);
 }
-void qh_allstatE(void) {
+void qh_allstatE2(void) {
   zdef_(zdoc, Zdoc5, "statistics for matching ridges", -1);
   zdef_(zinc, Zhashlookup, "total lookups for matching ridges of new facets", -1);
   zdef_(zinc, Zhashtests, "average number of tests to match a ridge", Zhashlookup);
@@ -254,6 +271,14 @@ void qh_allstatI(void) {
   zzdef_(zinc, Zridge0, "bounded ridges with near-zero normal", -1);
   zzdef_(wadd, Wridge0, "  ave. angle to ridge", Zridge0);
   zzdef_(wmax, Wridge0max, "  max. angle to ridge", -1);
+
+  zdef_(zdoc, Zdoc12, "Triangulation statistics (Qt)", -1);
+  zdef_(zinc, Ztricoplanar, "non-simplicial facets triangulated", -1);
+  zdef_(zadd, Ztricoplanartot, "  ave. new facets created (may be deleted)", Ztricoplanar);
+  zdef_(zmax, Ztricoplanarmax, "  max. new facets created", -1);
+  zdef_(zinc, Ztrinull, "null new facets deleted (duplicated vertex)", -1);
+  zdef_(zinc, Ztrimirror, "mirrored pairs of new facets deleted (same vertices)", -1);
+  zdef_(zinc, Ztridegen, "degenerate new facets in output (same ridge)", -1);
 } /* allstat */
 
 /*-<a                             href="qh-stat.htm#TOC"
@@ -426,6 +451,7 @@ void qh_initstatistics (void) {
   qh_allstatC();
   qh_allstatD();
   qh_allstatE();
+  qh_allstatE2();
   qh_allstatF();
   qh_allstatG();
   qh_allstatH();
diff --git a/src/stat.h b/src/stat.h
index 29cdcae..992011e 100644
--- a/src/stat.h
+++ b/src/stat.h
@@ -112,6 +112,7 @@ enum statistics {     /* alphabetical after Z/W */
     Zdoc9,
     Zdoc10,
     Zdoc11,
+    Zdoc12,
     Zdropdegen,
     Zdropneighbor,
     Zdupflip,
@@ -120,11 +121,24 @@ enum statistics {     /* alphabetical after Z/W */
     Wduplicatetot,
     Zdupridge,
     Zdupsame,
-    Zfindfail,
     Zflipped, 
     Wflippedmax, 
     Wflippedtot, 
     Zflippedfacets,
+    Zfindbest,
+    Zfindbestmax,
+    Zfindbesttot,
+    Zfindcoplanar,
+    Zfindfail,
+    Zfindhorizon,
+    Zfindhorizonmax,
+    Zfindhorizontot,
+    Zfindjump,
+    Zfindnew,
+    Zfindnewmax,
+    Zfindnewtot,
+    Zfindnewjump,
+    Zfindnewsharp,
     Zgauss0,
     Zgoodfacet,
     Zhashlookup,
@@ -188,7 +202,10 @@ enum statistics {     /* alphabetical after Z/W */
     Znumvisibility,
     Znumvneighbors,
     Zonehorizon,
+    Zpartangle,
     Zpartcoplanar,
+    Zpartflip,
+    Zparthorizon,
     Zpartinside,
     Zpartition, 
     Zpartitionall,
@@ -229,6 +246,12 @@ enum statistics {     /* alphabetical after Z/W */
     Ztotridges,
     Ztotvertices,
     Ztotvisible,
+    Ztricoplanar,
+    Ztricoplanarmax,
+    Ztricoplanartot,
+    Ztridegen,
+    Ztrimirror,
+    Ztrinull,
     Wvertexmax,
     Wvertexmin,
     Zvertexridge,
@@ -256,12 +279,14 @@ enum statistics {     /* for zzdef etc. macros */
   Zback0,
   Zbestdist,
   Zcentrumtests,
+  Zcheckpart,
   Zconcaveridges,
   Zcoplanarhorizon,
   Zcoplanarpart,
   Zcoplanarridges,
   Zcyclefacettot,
   Zcyclehorizon,
+  Zdelvertextot,
   Zdistcheck,
   Zdistconvex,
   Zdistzero,
@@ -475,6 +500,7 @@ void    qh_allstatB(void);
 void    qh_allstatC(void);
 void    qh_allstatD(void);
 void    qh_allstatE(void);
+void    qh_allstatE2(void);
 void    qh_allstatF(void);
 void    qh_allstatG(void);
 void    qh_allstatH(void);
diff --git a/src/unix.c b/src/unix.c
index 4f3b4e5..654e213 100644
--- a/src/unix.c
+++ b/src/unix.c
@@ -51,7 +51,7 @@ int isatty (int);  /* returns 1 if stdin is a tty
     recompile user_eg.c, rbox.c, qhull.c, qconvex.c, qdelaun.c qvoronoi.c, qhalf.c
 */
 
-char qh_version[]= "version 3.0 2001/02/11"; 
+char qh_version[]= "version 3.1 2001/10/04"; 
 
 /*-<a                             href="qh-qhull.htm#TOC"
   >-------------------------------</a><a name="prompt">-</a>
@@ -79,7 +79,8 @@ options:\n\
     v    - Voronoi diagram (dual of the Delaunay triangulation)\n\
     v Qu - furthest-site Voronoi diagram\n\
     Hn,n,... - halfspace intersection about point [n,n,0,...]\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Qc   - keep coplanar points with nearest facet\n\
     Qi   - keep interior points with nearest facet\n\
 \n\
@@ -115,6 +116,8 @@ char qh_promptb[]= "\
     Q7   - depth-first processing instead of breadth-first\n\
     Q8   - do not process near-inside points\n\
     Q9   - process furthest of furthest points\n\
+    Q10  - no special processing for narrow distributions\n\
+    Q11  - copy normals and recompute centrums for tricoplanar facets\n\
 \n\
 ";
 char qh_promptc[]= "\
@@ -125,6 +128,7 @@ Topts- Trace options:\n\
     Tv   - verify result: structure, convexity, and point inclusion\n\
     Tz   - send all output to stdout\n\
     TFn  - report summary when n or more facets created\n\
+    TI file - input data from file, no spaces or single quotes\n\
     TO file - output results to file, may be enclosed in single quotes\n\
     TPn  - turn on tracing when point n added to hull\n\
      TMn - turn on tracing at merge n\n\
@@ -236,7 +240,8 @@ options (qh-quick.htm):\n\
     v    - Voronoi diagram as the dual of the Delaunay triangulation\n\
     v Qu - furthest-site Voronoi diagram\n\
     H1,1 - Halfspace intersection about [1,1,0,...] via polar duality\n\
-    QJ   - joggle input instead of merging facets\n\
+    Qt   - triangulated output\n\
+    QJ   - joggled input instead of merged facets\n\
     Tv   - verify result: structure, convexity, and point inclusion\n\
     .    - concise list of all options\n\
     -    - one-line description of all options\n\
@@ -296,15 +301,16 @@ Except for 'F.' and 'PG', upper-case options take an argument.\n\
 \n\
  QbBound 0:0.5  Qbk:0Bk:0_drop QbB-scale-box  Qbb-scale-last Qcoplanar\n\
  Qfurthest      Qgood_only     QGood_point    Qinterior      Qmax_out\n\
- QJoggle        Qrandom        QRotate        Qsearch_1st    QupperDelaunay\n\
- QVertex_good   Qvneighbors    Qxact_merge    Qzinfinite\n\
+ QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
+ QupperDelaunay QVertex_good   Qvneighbors    Qxact_merge    Qzinfinite\n\
 \n\
  Q0_no_premerge Q1_no_angle    Q2_no_independ Q3_no_redundant Q4_no_old\n\
  Q5_no_check_out Q6_no_concave Q7_depth_first Q8_no_near_in  Q9_pick_furthest\n\
+ Q10_no_narrow  Q11_trinormals\n\
 \n\
  T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
- TFacet_log     TPoint_trace   TMerge_trace   TOutput_file   TRerun\n\
- TWide_trace    TVertex_stop   TCone_stop\n\
+ TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
+ TRerun         TWide_trace    TVertex_stop   TCone_stop\n\
 \n\
  Angle_max      Centrum_size   Error_round    Random_dist    Visible_min\n\
  Ucoplanar_max  Wide_outside\n\
diff --git a/src/user.h b/src/user.h
index f0c1292..7955896 100644
--- a/src/user.h
+++ b/src/user.h
@@ -623,14 +623,32 @@
   >--------------------------------</a><a name="DISToutside">-</a>
   
   qh_DISToutside
-    minimum distance when merging to stop search in qh_findbestnew 
-    or qh_partitionall
-   
+    When is a point clearly outside of a facet?  
+    Stops search in qh_findbestnew or qh_partitionall
+    qh_findbest uses qh.MINoutside since since it is only called if no merges.
+     
   notes:
-   if too big then O(n^2) behavior for partitioning in cone
-   if very small then important points not processed
-*/
-#define qh_DISToutside fmax_(4*qh MINoutside, 2*qh max_outside)
+    'Qf' always searches for best facet
+    if !qh.MERGING, same as qh.MINoutside. 
+    if qh_USEfindbestnew, increase value since neighboring facets may be ill-behaved
+      [Note: Zdelvertextot occurs normally with interior points]
+            RBOX 1000 s Z1 G1e-13 t1001188774 | QHULL Tv
+    When there is a sharp edge, need to move points to a
+    clearly good facet; otherwise may be lost in another partitioning.
+    if too big then O(n^2) behavior for partitioning in cone
+    if very small then important points not processed
+    Needed in qh_partitionall for
+      RBOX 1000 s Z1 G1e-13 t1001032651 | QHULL Tv
+    Needed in qh_findbestnew for many instances of
+      RBOX 1000 s Z1 G1e-13 t | QHULL Tv
+
+  See:  
+    qh_DISToutside -- when is a point clearly outside of a facet
+    qh_SEARCHdist -- when is facet coplanar with the best facet?
+    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
+*/
+#define qh_DISToutside ((qh_USEfindbestnew ? 2 : 1) * \
+     fmax_((qh MERGING ? 2 : 1)*qh MINoutside, qh max_outside))
 
 /*-<a                             href="qh-user.htm#TOC"
   >--------------------------------</a><a name="RATIOnearinside">-</a>
@@ -642,16 +660,38 @@
   notes:
     This is overkill since do not know the correct value.
     It effects whether 'Qc' reports all coplanar points
+    Not used for 'd' since non-extreme points are coplanar
 */
 #define qh_RATIOnearinside 5
 
+/*-<a                             href="qh-user.htm#TOC"
+  >--------------------------------</a><a name="SEARCHdist">-</a>
+  
+  qh_SEARCHdist
+    When is a facet coplanar with the best facet?  
+    qh_findbesthorizon: all coplanar facets of the best facet need to be searched.
+
+  See:
+    qh_DISToutside -- when is a point clearly outside of a facet
+    qh_SEARCHdist -- when is facet coplanar with the best facet?
+    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
+*/
+#define qh_SEARCHdist ((qh_USEfindbestnew ? 2 : 1) * \
+      (qh max_outside + 2 * qh DISTround + fmax_( qh MINvisible, qh MAXcoplanar)));
+
 /*-<a                             href="qh-user.htm#TOC"
   >--------------------------------</a><a name="USEfindbestnew">-</a>
   
   qh_USEfindbestnew
-     cut-off between qh_findbest/qh_findbestnew in #merged facets.
+     Always use qh_findbestnew for qh_partitionpoint, otherwise use
+     qh_findbestnew if merged new facet or sharpnewfacets.
+  
+  See:
+    qh_DISToutside -- when is a point clearly outside of a facet
+    qh_SEARCHdist -- when is facet coplanar with the best facet?
+    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
 */
-#define qh_USEfindbestnew 50
+#define qh_USEfindbestnew (zzval_(Ztotmerge) > 50)
 
 /*-<a                             href="qh-user.htm#TOC"
   >--------------------------------</a><a name="WIDEcoplanar">-</a>
@@ -680,10 +720,10 @@
     coplanar points.  If narrow, a coplanar point can be 
     coplanar to two facets of opposite orientations and
     distant from the exact convex hull.
-    
-    set to -cos( 0.2 ) for about 1:10 ratio between coplanar point and distance to exact hull
+
+    Conservative estimate.  Don't actually see problems until it is -1.0
 */
-#define qh_MAXnarrow -0.98
+#define qh_MAXnarrow -0.99999999
 
 /*-<a                             href="qh-user.htm#TOC"
   >--------------------------------</a><a name="WARNnarrow">-</a>
@@ -693,9 +733,9 @@
       
   notes:
     this is a conservative estimate.  
-    Don't actually see problems until much narrower.  See qh-impre.htm
+    Don't actually see problems until it is -1.0.  See qh-impre.htm
 */
-#define qh_WARNnarrow -0.9999
+#define qh_WARNnarrow -0.999999999999999
 
 /*-<a                             href="qh-user.htm#TOC"
   >--------------------------------</a><a name="ZEROdelaunay">-</a>
diff --git a/src/user_eg.c b/src/user_eg.c
index dbb89c7..2e4200e 100644
--- a/src/user_eg.c
+++ b/src/user_eg.c
@@ -14,6 +14,8 @@
 
      user_eg "n" "o" "Fp"                # return normals, OFF, points
 
+     user_eg "n Qt" "o" "Fp"             # triangulated cube
+
      user_eg "QR0 p" "QR0 v p" "QR0 Fp"  # rotate input and return points
                                          # 'v' returns Voronoi
 					 # transform is rotated for halfspaces
@@ -45,7 +47,7 @@
 
 #include "qhull_a.h"
 
-char qh_version[] = "user_eg 2001/02/11";  /* used for error messages */
+char qh_version[] = "user_eg 3.1 2001/10/04";  /* used for error messages */
 
 /*-------------------------------------------------
 -internal function prototypes
diff --git a/src/user_eg2.c b/src/user_eg2.c
index c177f92..3543358 100644
--- a/src/user_eg2.c
+++ b/src/user_eg2.c
@@ -5,13 +5,13 @@
 
   sample code for calling qhull() from an application.
 
-  Everything here can be done more simply with qh_new_qhull() [see 
-  user_eg.c].  The format used here gives the caller more control 
-  over Qhull.  See unix.c for another example.
+  See user_eg.c for a simpler method using qh_new_qhull().
+  The method used here and in unix.c gives you additional
+  control over Qhull. 
   
   call with:
 
-     user_eg2 "cube/diamond options" "delaunay options" "halfspace options"
+     user_eg2 "triangulated cube/diamond options" "delaunay options" "halfspace options"
 
   for example:
 
@@ -51,7 +51,7 @@
 
 #include "qhull_a.h"
 
-char qh_version[] = "user_eg2 2001/02/11";  /* used for error messages */
+char qh_version[] = "user_eg2 3.1 2001/10/04";  /* used for error messages */
 
 /*-------------------------------------------------
 -internal function prototypes
@@ -352,13 +352,14 @@ your project.\n\n");
     coordT array[TOTpoints][DIM];
 
     strcat (qh rbox_command, "user_eg cube");
-    sprintf (options, "qhull s Tcv %s", argc >= 2 ? argv[1] : "");
+    sprintf (options, "qhull s Tcv Q11 %s ", argc >= 2 ? argv[1] : "");
     qh_initflags (options);
-    printf( "\ncompute convex hull of cube after rotating input\n");
+    printf( "\ncompute triangulated convex hull of cube after rotating input\n");
     makecube (array[0], SIZEcube, DIM);
     qh_init_B (array[0], SIZEcube, DIM, ismalloc);
     qh_qhull();
     qh_check_output();
+    qh_triangulate();  /* requires option 'Q11' if want to add points */ 
     print_summary ();
     if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
       qh_check_points ();
-- 
GitLab