[savi] 01/03: Imported Upstream version 1.4.9

YunQiang Su wzssyqa-guest at moszumanska.debian.org
Fri Feb 19 09:31:44 UTC 2016


This is an automated email from the git hooks/post-receive script.

wzssyqa-guest pushed a commit to branch master
in repository savi.

commit 5ee64c41cd3eda23ceefc2f032a6d57179da1289
Author: YunQiang Su <syq at debian.org>
Date:   Fri Feb 19 15:36:57 2016 +0800

    Imported Upstream version 1.4.9
---
 BUGS                              | 403 +++++++++++++++++++++++++++++---------
 COPYRIGHT                         |  19 +-
 PACKAGING                         |  54 +++--
 README                            | 198 +++++++++++++++----
 README-COVERAGE-TEXTUREMAP        | 101 ++++------
 VERSION                           |   2 +-
 data/Makefile                     |   8 +-
 data/atcontact.tcl                |   4 +-
 data/celestri.tcl                 |   6 +-
 data/clarke.tcl                   |   4 +-
 data/dmc.tcl                      |   4 +-
 data/draim-4.tcl                  |   3 +-
 data/ellipso.tcl                  |  19 +-
 data/galileo.tcl                  |   4 +-
 data/globalstar.tcl               |   7 +-
 data/glonass.tcl                  |   4 +-
 data/gps.tcl                      |   4 +-
 data/gs2.tcl                      |   4 +-
 data/ico.tcl                      |  10 +-
 data/iridium-66.tcl               |   9 +-
 data/leosat.tcl                   |  64 ++++++
 data/leqo.tcl                     |   8 +-
 data/macrocell.tcl                |   4 +-
 data/mm.tcl                       |   4 +-
 data/molnya.tcl                   |  16 +-
 data/nels.tcl                     |   4 +-
 data/o3b-networks.tcl             |  84 +++++---
 data/odyssey.tcl                  |   4 +-
 data/oneweb.tcl                   |  63 ++++++
 data/orbcomm.tcl                  |   4 +-
 data/orblink.tcl                  |   6 +-
 data/rapideye.tcl                 |   4 +-
 data/sirius-radio.tcl             |   6 +-
 data/skybridge-64.tcl             |  16 +-
 data/spaceway-ngso.tcl            |   4 +-
 data/teledesic-288.tcl            |   4 +-
 data/tundra.tcl                   |  16 +-
 data/us-patent-6726152-boeing.tcl |   4 +-
 manual/images/savi-fisheye.png    | Bin 13666 -> 27774 bytes
 manual/index.html                 |  35 +++-
 maps/Makefile                     |   3 +-
 maps/world-mask.unp.pbm           | Bin 0 -> 22511 bytes
 maps/world-mask1024.unp.pbm       | Bin 0 -> 65548 bytes
 oogl/Makefile                     |   4 +-
 oogl/earth.oogl                   |   5 +-
 oogl/savi.oogl                    |   4 +-
 savi                              |  23 ++-
 src/Makefile_defs_cygwin          |  10 +-
 src/Makefile_defs_linux           |  13 +-
 src/Makefile_defs_macosx          |   6 +-
 src/Makefile_defs_ubuntu          |  18 +-
 src/Satellite.c                   |   4 +-
 src/axes.c                        |   4 +-
 src/cones.c                       |  13 +-
 src/coverage.c                    |  17 +-
 src/coverage_vis.c                | 265 +++++++------------------
 src/earth.c                       | 102 +++++-----
 src/fisheye.c                     |  63 +++++-
 src/footprints.c                  |  13 +-
 src/globals.c                     |  11 +-
 src/gv_init.c                     |  18 +-
 src/gv_utils.c                    |   4 +-
 src/include/Satellite.h           |  14 +-
 src/include/constants.h           |   4 +-
 src/include/coverage_vis.h        |   6 +-
 src/include/fisheye.h             |   4 +-
 src/include/globals.h             |  13 +-
 src/include/gv_file.h             |   4 +-
 src/include/gv_utils.h            |   4 +-
 src/include/int_types.h           |   4 +-
 src/include/orbit_utils.h         |   4 +-
 src/include/sats.h                |   5 +-
 src/include/savi.h                |   6 +-
 src/include/stats_utils.h         |   4 +-
 src/include/tcl_utils.h           |   4 +-
 src/include/time.h                |   4 +-
 src/include/utils.h               |   2 +-
 src/logo.c                        |   4 +-
 src/main.c                        |  49 +++--
 src/modules.c                     |   4 +-
 src/orbit_utils.c                 |   8 +-
 src/orbits.c                      |   4 +-
 src/plane.c                       |  21 +-
 src/satCmd.c                      |   5 +-
 src/satellites.c                  |   4 +-
 src/sats.c                        |  50 ++++-
 src/stars.c                       |   4 +-
 src/stats_utils.c                 |  12 +-
 src/sun.c                         |   4 +-
 src/tcl_utils.c                   |  10 +-
 src/time.c                        |   4 +-
 src/utils.c                       |   4 +-
 tcl/Makefile                      |   4 +-
 tcl/about.tcl                     |  21 +-
 tcl/constellations.tcl            |   4 +-
 tcl/coverage.tcl                  | 191 ++++++++++++------
 tcl/coverage_size.tcl             |   4 +-
 tcl/details.tcl                   |   4 +-
 tcl/edit.tcl                      |   4 +-
 tcl/empty.tcl                     |   4 +-
 tcl/equator.tcl                   | 101 ++++++++++
 tcl/fisheye.tcl                   |  46 +++--
 tcl/geomview.tcl                  |  55 +++++-
 tcl/helpfile.tcl                  |   4 +-
 tcl/init.tcl                      |  45 +++--
 tcl/load.tcl                      |   4 +-
 tcl/main.tcl                      |  24 ++-
 tcl/no_frames.tcl                 |   4 +-
 tcl/oe.tcl                        |   4 +-
 tcl/params.tcl                    |   4 +-
 tcl/random.tcl                    |   4 +-
 tcl/rosette.tcl                   |   4 +-
 tcl/save.tcl                      |   4 +-
 tcl/snapshot.tcl                  |   4 +-
 tcl/star.tcl                      |   4 +-
 tcl/sunlight.tcl                  |   4 +-
 tcl/utils.tcl                     |  46 ++---
 117 files changed, 1758 insertions(+), 925 deletions(-)

diff --git a/BUGS b/BUGS
index 548ef4b..e6ec624 100644
--- a/BUGS
+++ b/BUGS
@@ -1,10 +1,11 @@
 BUGS recognized in SaVi
 =======================
-$Id: BUGS,v 1.182 2013/05/12 05:00:43 lloydwood Exp $
+$Id: BUGS,v 1.236 2016/01/27 23:41:18 lloydwood Exp $
 
-This list of BUGS describes caveats and problems with use of the SaVi
-satellite visualization software. This document contains the following
-sections:
+This list of BUGS describes caveats and problems with use of
+the SaVi satellite visualization software.
+
+This document contains the following sections:
 
 1. Caveats in use of SaVi. Be aware of these.
 
@@ -20,6 +21,8 @@ sections:
           -- for SaVi
           -- for Geomview
    b. Cygwin on Microsoft Windows
+          -- for SaVi
+          -- for Geomview
 
 3. A detailed SaVi wishlist. Notes on issues in these SaVi releases.
    a. Coding and build issues
@@ -33,6 +36,7 @@ sections:
    i. Various
    j. Interaction with other 3D renderers
    k. Interaction with the network simulator ns
+   l. Desirable constellations to simulate
 
 4. Remaining integration work from unreleased SaVi 1.1.
 
@@ -47,8 +51,10 @@ Changing default simulation parameters (central body radius,
 gravity, etc.) can cause unexpected behaviour; scripts generally
 describe satellites in circular orbits via an altitude above the
 body's surface. Use at own risk. If simulating a different planet
-to Earth, set the -orbit-model J0 flag to avoid simulating Earth's
-oblateness and environment.
+to Earth, we should force the -orbit-model J0 flag to avoid
+simulating Earth's oblateness and environment. J0/J2 should be
+selectable in the params dialog. Any changes should reset time
+to zero - with a warning.
 
 Two-line-element (TLE or 'elset') reading and constellation code
 in tcl/constellations.tcl still needs considerable work. Reading
@@ -64,6 +70,12 @@ until a marker type is first selected or satellite orbital elements
 are edited. Operations on multiple satellites (e.g. Cut) only work
 on the last satellite selected.
 
+Sunlight is approximated by having the sun orbit the Earth as a
+distant satellite with the appropriate year-long period. This
+should not be done as a J2 calculation, but should at least be J0.
+Geomview's lighting rendering needs to be fixed to match this
+coverage footprint.
+
 
 
 2. PLATFORM-SPECIFIC ISSUES
@@ -81,20 +93,40 @@ the tools that can compile these and other programs.
 
 As of Mac OS X 10.7, Xcode is now an app available from the Mac App
 Store. As well as downloading and installing the Xcode app, it is
-necessary to explicitly enable command line tools so that e.g. gcc
+necessary to explicitly enable command-line tools so that e.g. gcc
 is available. The command line tools must be selected in:
-Xcode > Preferences > Downloads > Components > Command Line Tools 
+Xcode > Preferences > Downloads > Components > Command Line Tools
+
+Simply typing 'make' in a Terminal window may generate a dialog to
+install the app and necessary command-line tools. Alternatively,
+the command-line tools can be installed by typing:
+    xcode-select --install
+
+Although later releases of Mac OS X include Tcl/Tk headers, they do
+not include the X11 headers that Tk needs to compile. One way to
+get these headers is to install the XQuartz package from
+http://xquartz.macosforge.org/
+The XQuartz copy of X11 headers are looked for during compilation.
 
 The Tcl/Tk libraries shipped with Mac OS X releases have some
-user-interface problems. It is possible to install a later
-ActiveTcl release and then choose to build with that instead;
-to do so, uncomment the TCL_LIBS = line in src/Makefile_defs_macosx
-before compiling savi with make ARCH=macosx.
+user-interface problems and are prone to crashing. It is preferable
+to install a later ActiveTcl release from
+    http://www.activestate.com/activetcl
+and then choose to build with that instead; to do so, uncomment the
+second, commented, TCL_LIBS = line in src/Makefile_defs_macosx
+before compiling savi by typing
+    make ARCH=macosx
+
+Mac Tcl issues fixed in ActiveTcl include:
+- Mac OS X 10.5 Leopard menu problems
+- accelerator key crashes
+- coverage panel angle slider crashing Tcl due to a busy event loop
+  when texturemapping, cone and footprint drawing are on.
 
 -- for Geomview
 
 To build Geomview on Mac OS X, you must first install a Motif clone
-such as Lesstif (available via www.geomview.org's Downloads section.)
+such as Lesstif (available via www.geomview.org's Downloads section).
 In Lesstif's directory you will need to
     configure
     make
@@ -138,8 +170,8 @@ time SaVi is launched.
 
 Installing ActiveTcl, uncommenting the TCL_LIBS line before compiling,
 as described above, and removing the -redrawn-menus flag from the
-./savi launch script is another way to work around the menu
-problems of the Tk supplied with 10.5.
+./savi launch script is the preferred way to work around the user
+interface problems of the Tk supplied with 10.5.
 
 -- for Geomview
 
@@ -158,10 +190,11 @@ iii. Other minor Mac-specific issues
 - Menu shortcuts are disabled on the Mac unless -redrawn-menus is
   used. This is to prevent a freeze on using a keypress to open
   a window (seen in 10.6 with Tk 8.5.7). 10.7 is unaffected,
-  and shortcuts can be enabled by editing disable_mac in tcl/utils.tcl.
+  and shortcuts can be enabled for ActiveTcl by editing disable_mac
+  in tcl/utils.tcl.
 - On compilation, two binaries are produced: bin/SaVi-macosx.bin and
-  bin/SaVi. Tiger and Snow Leopard users can delete bin/SaVi-macosx.bin
-  to get just 'SaVi' in the menubar as the application name.
+  bin/SaVi. You can rm bin/SaVi-macosx.bin to get just 'SaVi' in the
+  menubar as the application name.
 - Under the Tcl/Tk supplied with 10.5, coverage colour buttons are
   only fully coloured when another application is frontmost.
 - Under the Tcl/Tk supplied with 10.6, menu highlight colours are
@@ -176,11 +209,41 @@ iii. Other minor Mac-specific issues
 
 b. CYGWIN ON MICROSOFT WINDOWS
 
-Tk issues have appeared with the migration from Insight Tcl/Tk 8.4
-to a more Unix-like Tcl/Tk 8.5.
+32-bit and the new 64-bit Cygwin can coexist on a PC. 32-bit Cygwin has
+better Geomview interaction, and so is preferable for SaVi.
+
+If both 32-bit and 64-bit Cygwin are installed:
+- Depending on which XWin the Start menu Cygwin-X folder launches,
+  the other can be launched when that is not running by launching
+  the appropriate terminal, then typing
+    startx -- -multiwindow -clipboard &
+
+- The Task Manager will indicate whether 32-bit or 64-bit Xwin.exe
+is running.
+
+- uname -a in a terminal indicates whether that terminal is
+32-bit or 64-bit; x86_64 is 64-bit.
+
+-- for SaVi
 
 When expanding the coverage window to show a tiled coverage map, there
-is now a line of pixels where coverage is not drawn on the background.
+are two lines of pixels, one to the left of the map, one to the right,
+where coverage is not drawn on the background. Satellites and maps
+are drawn correctly. Oddly, this only appears under the 32-bit
+Cygwin, not the newer 64-bit Cygwin. This has not been seen on any
+platform other than 32-bit Cygwin.
+
+-- for Geomview
+
+The SaVi/Geomview combination does not yet appear functional under
+the new 64-bit Cygwin introduced in March 2013, though 32-bit Cygwin
+is fine. Geomview experiences OpenGL and piping problems under
+64-bit Cygwin.  Use 32-bit Cygwin!
+
+Under 64-bit Cygwin, you can try building Geomview with:
+MOTIFLIBS='-lDtPrint -lMrm -lXm -lXt -lXmu -lXp -lXext -lX11 -lSM -lICE'
+./configure --with-motif=/usr --with-opengl=/usr CPPFLAGS="-DglBindTextureEXT=glBindTexture -DglDeleteTexturesEXT=glDeleteTextures"
+make
 
 
 
@@ -192,7 +255,7 @@ originally accumulated during work for the SaVi 1.2 release during
 October-November 2001, and kept up-to-date with later development.
 
 Development takes place at:
-http://info.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/src/unreleased/
+http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/src/
 http://savi.sourceforge.net/
 
 Many suggestions (such as the user interface and fisheye
@@ -208,17 +271,19 @@ a. CODING AND BUILD ISSUES
   package problems caused by maintainers unfamiliar with the savi tree,
   described below.
 
+- Binary packages are not created by the SaVi authors. You can always
+  download SaVi from http://savi.sf.net/ and compile it to get
+  all the files created for SaVi.
+
 - The savi-1.4.3 package available from getdeb.net from December 2009 onward
-  (and available in Ubuntu's Synaptic package manager) removed the
+  (and available in Ubuntu's Synaptic package manager) initially removed the
   textfiles and manual from SaVi. This package installed SaVi under
   /usr/share/savi, while the COPYRIGHT file was edited, renamed 'copyright'
   and placed under /usr/share/doc/savi. This broke SaVi's help
   system by removing all help information. Packaging was fixed in later
-  revisions. These packages are not compiled using zlib, although doing so
-  and making zlib a package dependency would have been straighforward.
-  Binary packages are not created by the SaVi authors. You can always
-  download SaVi from http://savi.sf.net/ and compile it to get
-  all the files created for SaVi.
+  revisions. These packages were not initially compiled using zlib, although
+  and making zlib a package dependency is straightforward. More details
+  are in the PACKAGING textfile.
 
 - Cygwin support isn't seamless, and may need some editing of
   tcl/Makefile to support the version of Tcl Cygwin uses.
@@ -232,6 +297,10 @@ a. CODING AND BUILD ISSUES
 - $HOST or $HOSTNAME? One or both have the machine info we need
   for the compile version info preserved in Help/About...
 
+- gv_utils.c warning: implicit declaration of functions fileno and fdopen
+  because they're POSIX, not ANSI C, even though they're normally in stdio.h;
+  could set -std=gnu99 flag to relax restriction if this mattered.
+
 - The executable bin/SaVi (named for viewing the process name, e.g. in
   the Mac OS X menubar) is considered the same name as the savi script
   on case-insensitive file systems (Mac OS X, Windows). This may lead
@@ -245,6 +314,9 @@ a. CODING AND BUILD ISSUES
   window is then closed, writing status messages to stderr, e.g.
   when loading a new constellation, fails due to a broken pipe.
   The resulting Tk error dialog stalls SaVi until it is closed.
+  Option to remove ALL output sent to stdout? -quiet? Would need
+  printf varargs wrapper. Could log to file instead - but not much
+  point sans timestamps?
 
 - We should really be using snprintf instead of sprintf.
 
@@ -257,6 +329,25 @@ a. CODING AND BUILD ISSUES
   to the state of the pipe to Geomview; how can this be made smarter?
   Should we sleep after gv_end()/gv_stop() ceases nesting?
 
+- Command line handling to note what options are set should note more
+  for hint in About dialog. For debugging purposes, could allow override
+  of existing global variables by writing support for
+    -tclvar <variable1> <value> -tclvar <variable2> <value> 
+  by setting them near the end of init.tcl init code. Check existence
+  of value set and warn if not already present.
+
+- Menu shortcuts don't work while any menu is dropped down. This looks
+  like a Tcl failing crossplatform.
+
+- -fisheye and -coverage flags to spawn those windows at startup?
+  How do we set size? -large-map and -levels handles that...
+  -camera <n> to spawn n geomview cameras at startup? 2nd/3rd could
+  be north/south pole views. How to position windows on screen?
+
+- Rewrite README (for building SaVi) and README-TEXTUREMAPPING into
+  README (for building), SAVI-USE, and GEOMVIEW-USE for better online
+  help.
+
 
 
 b. SCALABILITY
@@ -316,14 +407,19 @@ needs more work.
   present.  Move current time into reworked playbar line instead?
   Cutting to remove a satellite jumps to end of (long) list, unless
   start of list is shown.
+  Bindings are needed for cursor up/down so that satellite selection
+  moves.
 
 * Coverage panel:
   Some wasted space here. When -large-map is selected the playbar
   at end is drawn below the bottom of a 1024x768 screen, which
-  is a problem if you can't move windows from available edges.
+  is a problem if you can't move windows from available edges -
+  which is why the buttons are also listed as commands in a menu.
   Reaching the coverage angle options also becomes tricky.
   Clicking and dragging the map sideways to shift the view would
   be cool - esa's Space Trajectory Analysis v3.0 does this.
+  Bindings are needed for cursor left/right (forwards/back) and
+  shift-cursor left-right (single step forwards/back)
 
 * Edit satellite:
   Dialog layout can be improved, with better alignment of captions,
@@ -335,6 +431,9 @@ needs more work.
   Panel can be left open when inappropriate, e.g. when a new
   constellation is loaded in. Should switch to editing a new
   satellite.
+  Loading in a saved set of satellites after an existing set
+  leads to the names of the first few satellites being overwritten.
+  This is a sideeffect of satellite names being retrofitted.
 
 * Rosette and crude star generators:
   Dialog layout can be improved, with better alignment of captions,
@@ -357,6 +456,11 @@ Provide menu of colour choices for highlights etc.
 It's possible to type into the help menu text windows. That should be
 prevented. But that is not simple in Tk: http://wiki.tcl.tk/1152
 
+Ballard/crude star generators need to create info text in "About
+constellation" window.  Look at how the initial LEO satellite text
+is created. Need to create info text separately from function that
+we may in future call from scripts that we collapsse down to Ballard?
+
 
 
 e. COVERAGE VIEW IMPROVEMENTS
@@ -364,22 +468,41 @@ e. COVERAGE VIEW IMPROVEMENTS
 Now that we have satellite names, an option to show them in the
 coverage view would be useful.
 
-Blue diversity colours could be masked onto black areas of the
-map as coverage colours suitable for the ocean. Add maps
-where the oceans are blacked out/marked in another colour requiring
-a different four-colour filetype, and an option to have 'Ocean
-Blue', which hides/changes decay colour boxes. Could also do
-blending with the detailed earth map, but that means uncompressing
-it and blending on a pixel-by-pixel basis, or setting alpha
-transparency in Geomview for a coverage sphere over the earth sphere.
+Could blend coverage maps somehow with the detailed map, but that
+means uncompressing it and blending on a pixel-by-pixel basis,
+or setting alpha transparency in Geomview for a coverage sphere
+over the earth sphere.
 
 Decay/sunlight options are really mutually exclusive, and could
-be done via a popup menu that could also include the 'diversity
-shades used over black ocean' option discussed above:
-Diversity
-Diversity and decay
-Diversity and sunlight
-Diversity and sea
+be done via a popup menu:
+No coverage (all-white background)
+Coverage (white background)
+Coverage and decay (default)
+Coverage and sunlight (two shades of decay)
+Coverage over land and sea (blue background)
+but we need masking for all supported projections first.
+
+Drawing the Earth map last in each rastering is nice for sending
+to Geomview earlier, where the vector Earth can be overlaid instead -
+but means that green satellite cross markers are behind and occluded
+by continent/country outlines. Ideally we have subsatellite nadir
+markers drawn by Geomview, with bitmap crosses drawn after the
+bitmap Earth maps, and not sent to Geomview either. Could fix coverage
+satellites drawn behind map bitmap outline problem. In map-drawing
+section, test value in lookup table, i.e. that it's not green,
+before plotting. Or could move loop of detect-and-draw-green-crosses
+after map drawing loop, at cost of not drawing them in Geomview.
+
+If "use sunlight" is on, why is change shading only restricted to
+land/satellite coverage only? For land/sea both should change;
+debatable for others. But labels need to update to show 1/2 sats etc.
+
+Could implement 0 satellites in view/0 intervals as two white boxes,
+not given in color swaths, but colors set individually by clicking
+buttons. Possibly better as menu option spawning color box? Set
+uncovered map color? Should intervals off default to 4+ colors, not 1?
+
+Add greyscale option for colors? diversity is white? Unless land/sea?
 
 As well as allowing coverage angles to be set per satellite, having
 multiple fooprints per satellite at set elevation angles (5 degrees,
@@ -396,19 +519,33 @@ What is the diversity/decay value of the pixel that we have clicked?
 Report it next to fisheye lat/long coords. Unlike coords, this
 will need to be updated in real time. If fisheye is open, then we
 likely already know it from within the red circle, and can just
-repeat it in coverage?
+repeat it in coverage? Useful reality check by comparing the two.
+
+Should opening coverage panel turn on vector Geomview map overlay?.
 
-'Use Earth map' checkbox could also control Geomview continents via
-use_fancy_earth. Would we have to turn both of these on when opening
-the coverage panel?
+There are alternatives to plotting full circular footprints:
+- just plotting only edges of footprints - hollow circles.
+- plotting imaging swath widths, i.e. a line perpendicular to
+  the orbit inclination, width diameter footprint.
+- plotting complex spotbeams, again aligned with respect to
+  to the orbit inclination. (Chris Meenan's footprint generator
+  demonstrated hexagonal arrays.)
+This would involve making changes to e.g.
+src/stats_utils.c::fill_grid() and intensity_circle_footprint()
 
-Look at drawing SaVi logo on coverage maps - this makes most sense
+Look at masking SaVi logo onto coverage maps - this makes most sense
 in corners of spherical and sinusoidal maps, but area used would
-need to be discounted from coverage calculations
+need to be discounted from coverage calculations.
 
 The coverage slider position should be updated when a script
 loaded from the menu changes the coverage angle.
 
+A threshold altitude for enabling coverage footprints and cones
+is useful for elliptical orbits where satellites only
+transmit at apogee, but is currently only a command-line option.
+This may be more useful for a mix of orbits if specified as an
+angle around apogee, rather than as an altitude.
+
 Longitude calculation for spherical fisheye clicks are inaccurate.
 Edge calculation methods have visible differences (as does
 sinusoidal). Area calculation hasn't been attempted; calculations
@@ -418,13 +555,24 @@ due to rounding at curved edges of map. Coverage calculations for all
 projections are estimates at best, reflect the map projection in use
 by changing with latitude, and are limited to not exceed
 the 100% threshold. Calculations should really reflect degree of
-coverage overlap and be consistent across all views. See
+coverage overlap and be consistent across all views. Working
+off stats_utils.c::footprint_circle_radius() when that is computed,
+not off a distorted map, can give total coverage for each small
+circle that coverage generates. These can be summed to give
+overlapping coverage.
+
+Calculating amount of coverage overlap for 1/2/3 etc. satellites
+is possible by counting pixels, but still depends on choice of
+projection and latitude of satellite. For handling overlap, see
 Kantsiper and Weiss, An Analytic Approach to Calculating Earth
 Coverage, AAS 97-620, while they were at MIT, for an analytical
 integration approach using the inclusion/exclusion principle.
-Calculating amount of coverage overlap for 1/2/3 etc. satellites
-is possible by counting pixels, but still depends on choice of
-projection and latitude of satellite.
+Also Brian Kantsiper, A Systematic Approach to Station-Keeping
+of Constellations of Satellites, PhD dissertation, MIT, Feb 1998.
+See also A. Gonzalez, Measurement of areas on a sphere using
+Fibonacci and latitude-longitude lattices, Mathematical
+Geosciences, January 2010, pp. 42-49.
+http://arxiv.org/abs/0912.4540
 
 When choosing new colour shades after animating forwards then
 stopping, the satellites move on an interval unexpectedly as
@@ -449,7 +597,8 @@ subsatellite point.
 Coverage areas of the selected satellite(s) can be shown in
 different shades - possibly shades of green.
 
-Add optional latitude/longitude lines.
+Add optional latitude/longitude lines. Could add equator line
+to match showing equator in fisheye view.
 
 Earth outline on sinusoidal map is drawn using different algorithm
 to backdrop. Overlap is poor; both should be drawn on the
@@ -465,6 +614,12 @@ Opening the coverage window when animating means that the coverage
 playbar is not immediately updated with playbar status, and
 playbars only sync when the next playbar button is pressed.
 
+Menu options invoking popup windows to control project groundtrack,
+coverage angle slider, and minimum transmit altitude slide would
+be useful on small screens where these controls are offscreen
+at the bottom. Minimum transmit altitude is of minority interest,
+does not require slider to always be onscreen.
+
 
 
 f. FISHEYE VIEW IMPROVEMENTS
@@ -480,14 +635,40 @@ checkbox is turned off.
 Add slider to select size of fisheye crosshairs; will need to adjust
 text positioning slightly. Can we add this on buttonbar?
 
+When equatorial exclusion zone is shown, satellites are not indicated
+as within or outside it. This needs to be figured out. Equator
+altitude should be figured out from first principles in case
+simulation constants get changed and we're not simulating Earth.
+
+We support minimum elevation of the terminal, i.e. whether the
+terminal can see each satellite, but do not consider half-angle of
+the satellite, i.e. whether each satellite can see the terminal.
+Considering both would be ideal, and useful as a prelude to
+connectivity/link work.
+
+Could create fisheye orbit markers to show trajectory of currently
+selected satellite, if any. Would need to be a separate satellite
+marker list, since parallels table wraps around. Do we space markers
+in RAAN or time? Would need to cut down on satellite info to just
+the minimum and create a special marker group, then simplify equator
+code to use it? Would this even make sense with HEO orbits, where
+markers won't be spaced evenly?
+
 How much work would be required to enable multiple fisheye windows
 to be spawned? Probably a lot, if pass times are to be recorded in the
 SL list structures on a per-view basis.
 
--debug outputs information about satellite positions, but it's verbose,
-showing angle to all satellites, even those below the horizon, and lots
-of debugging information for visible satellites. A decent log format
-for visible satellites and their angles above the horizon is needed.
+A fisheye view that wandered (randomly?) over time would be nice
+to have, as it could show the equator and latitude lines moving
+smoothly. This would probably require a simulation event scheduler
+to be implemented so that commands could be executed on repeat
+intervals.
+
+The -debug flag outputs information about satellite positions, but it's
+verbose, showing angle to all satellites, even those below the horizon,
+and lots of debugging information for visible satellites. A decent log
+format for visible satellites and their angles above the horizon is
+needed.
 
 Saving bitmaps would be nice to have as an option. Postscript can
 always be converted to a bitmap via GhostScript:
@@ -499,6 +680,16 @@ results anyway.... it's simpler to just take a screen capture.
 
 g. GEOMVIEW INTERACTION
 
+Geomview coverage cones and footprints are dynamically updated when
+the coverage view angle slider is moved. For cones, this is computationally
+laggy for large constellations. Speed it up by forcing a delay and
+scheduling a later update after a timer expires? We're already
+collapsing it in BEGIN/END. Should gv_end force a texturemap update
+for after e.g. loading a constellation?
+
+Should footprints be turned on if dynamic texturemapping and switching
+to a projection that cannot be texturemapped?
+
 Fisheye location(s) should be shown in Geomview - another colored line?
 
 Now that we have satellite names, an option to show them in Geomview
@@ -514,35 +705,18 @@ exactly what a satellite sees at nadir as the satellite moves,
 would be very useful to have.
 
 Geomview's light source positioning appears to be buggy at present,
-as shown by savi -geomview -sun-lighting.
+as shown by savi -geomview -sun-lighting. Could implement a
+terminator plane at right angles to the sun pointer, reusing
+equatorial plane code.
 
 Quitting SaVi as a Geomview module can leave the blue Earth sphere
 behind. This was identified as a bug in Geomview exposed by chosen
 -O3 optimisation when building, which vanishes when -O2 is chosen -
 see the January 2012 geomview-users archives.
 
-With Geomview 1.8.1, the large list structures used in writing
-footprints and cones cause complaints about not being able to 'seek
-back far enough in pipe.' This is related to how piping is handled,
-and the piping code rewrite by Claus-Justus Heine in Geomview 1.8.2
-release candidates for the 1.9 releases appears to have fixed this.
-An alternative to the oogl used in:
-footprints.c::write_footprints_geom()
-cones.c::write_cones_geom()
-would be good to have for remaining Geomview 1.8.1 users.
-Footprints and cones are off by default to avoid this problem.
-
-Geomview binary format is only used in one place at present (the
-default satellite marker if the architecture permits it), but
-offers a scaling advantage. Note that e.g. Geomview 1.8.0 (Linux,
-some glibc) has problems with handling binary format; selecting
-a more complicated marker type than the default green dot avoids
-use of binary format entirely, but an explicit option would be
-better.
-
 Should be able to scale one or all satellites in size. Being able
 to scale one spherical satellite to large could be useful for
-simulating the Moon.
+simulating the Moon. But would need to match position to J2 model.
 
 Rotation of satellite markers as they approach the poles is inaccurate;
 detailed satellite solar panels should be at right angles to the
@@ -567,7 +741,8 @@ central body as an option? This would be like Geomview's
 with the Earth.
 
 Replace equatorial plane with more detailed sectored concentric
-circles.
+circles, or with a translucent circle sized to the current
+stationary orbit as set in parameters.
 
 Can Geomview postscript output be improved and made useful by
 tweaking SaVi's oogl? This probably requires work on Geomview.
@@ -587,6 +762,38 @@ uses its own Motif menus in its main window. This means that
 switching between SaVi and Geomview is a little disruptive
 to the user experience. This cannot be fixed only in SaVi.
 
+Check deleting central body and turning off simple earth.
+only works in one order, should work in both.
+
+Loading in constellation updates texturemapped coverage slowly.
+Because we need to change earth types? Might be a reason to dump
+numesh.oogl to try and simplify?
+
+
+Geomview 1.8.1 points:
+
+These are unlikely to be dealt with, as 1.8.1 no longer
+builds with modern compilers.
+
+With Geomview 1.8.1, the large list structures used in writing
+footprints and cones cause complaints about not being able to 'seek
+back far enough in pipe.' This is related to how piping is handled,
+and the piping code rewrite by Claus-Justus Heine in Geomview 1.8.2
+release candidates for the 1.9 releases appears to have fixed this.
+An alternative to the oogl used in:
+footprints.c::write_footprints_geom()
+cones.c::write_cones_geom()
+would be good to have for remaining Geomview 1.8.1 users.
+Footprints and cones are off by default to avoid this problem.
+
+Geomview binary format is only used in one place at present (the
+default satellite marker if the architecture permits it), but
+offers a scaling advantage. Note that e.g. Geomview 1.8.0 (Linux,
+some glibc) has problems with handling binary format; selecting
+a more complicated marker type than the default green dot avoids
+use of binary format entirely, but an explicit option would be
+better.
+
 
 
 h. DYNAMIC TEXTUREMAPPING WITH GEOMVIEW
@@ -604,21 +811,6 @@ Coverage texturemap is not immediately updated when turning 'project
 groundtracks forward in time' on or of, so it is out of sync with
 coverage window until next animation step.
 
-For the now-legacy scratchfile method, these are unlikely to be carried
-out:
-
-- SaVi should write to and tell Geomview to read from multiple tmpfiles
-alternately, so that SaVi is writing one tmpfile while Geomview is
-reading from the other. This would improve handling of large
-uncompressed texturemaps by preventing interruption of reads as the
-read file is overwritten by the next texturemap iteration.
-(This property is arguably a failing in unix filesystem design.)
-
-- gcc 3.3.5 (Debian) and 3.4.4 (FreeBSD) complain about our texturemap
-tmpfile strategy:
-In function `coverage_tempfile_created':
-: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
-
 
 
 i. VARIOUS
@@ -646,7 +838,15 @@ up the various windows on startup; can these be scripted?
 
 Allow switching between a set of default values for various planets
 (e.g. Venus, Earth, Mars) with matching surface maps, and even a
-default Constellations menu for each planet.
+default Constellations menu for each planet. This wuold involve
+changing the body gravity/spin defaults and possibly adding a
+finetuned special-case per-planet orbit model to handle the
+equivalent of Earth's J2 precession. A different default colour
+scheme to indicate 'not Earth' is probably also a good idea.
+A number of scripts - Clarke geostationary, Draim, possibly
+Molnya/Tundra - could compute from the defaults and generalise
+to any planet; three-satellite Mars stationary would be the first
+target. Other constellation scripts would be Earth-specific.
 
 More accurate Earth gravitational models than J2, e.g. J20, could be
 implemented via the new -orbit-model flag and the switch cases in
@@ -711,6 +911,17 @@ it stands. A new format is needed.
 
 
 
+l. DESIRABLE CONSTELLATIONS TO SIMULATE
+
+Newly-announced large satellite constellations, e.g. OneWeb, LeoSat,
+are not yet simulated well because their geometries are not known.
+Unlike the efforts of the 1990s, these have not filed public
+designs with the US FCC, and are less open about their technical
+choices. Adding simulations of these once they are public would
+be good. Details are at http://www.oneweb.net http://www.leosat.com
+
+
+
 4. REMAINING INTEGRATION WORK FROM UNRELEASED SAVI 1.1
 ======================================================
 
diff --git a/COPYRIGHT b/COPYRIGHT
index 2b74ba6..4d6cd3c 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-COPYRIGHT for SaVi
+COPYRIGHT FOR SaVi
 ==================
-$Id: COPYRIGHT,v 1.20 2013/05/05 05:19:25 lloydwood Exp $
+$Id: COPYRIGHT,v 1.27 2016/01/28 00:28:42 lloydwood Exp $
 
 This contains:
 
@@ -9,14 +9,14 @@ This contains:
 
 
 
-1. ADDITIONAL COPYRIGHT FOR THE SAVI 1.2, 1.3 and 1.4 RELEASES
+1. ADDITIONAL COPYRIGHT FOR THE SaVi 1.2, 1.3 AND 1.4 RELEASES
 ==============================================================
 
 Enhancements to and modifications of SaVi 1.0, expressed in the
 SaVi 1.2, 1.3 and 1.4 releases, are:
 
-Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006
-2007, 2008, 2009, 2010, 2011, 2012, 2013 Lloyd Wood.
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Lloyd Wood.
 
 Lloyd Wood maintains SaVi, and welcomes bug reports and fixes from
 users.  Contact Lloyd at: lloydwood at users.sourceforge.net.
@@ -24,16 +24,19 @@ users.  Contact Lloyd at: lloydwood at users.sourceforge.net.
 SaVi continues to be provided "as is", and no warranty or guarantee of
 fitness for use is expressed or implied.
 
-Use of SaVi images should credit SaVi. Suggested references are:
+Use of SaVi images must credit SaVi. Suggested references are:
+
 - L. Wood, SaVi: satellite constellation visualization,
   First Annual CCSR Research Symposium (CRS 2011),
   Centre for Communication Systems Research, 30 June 2011.
+  http://arxiv.org/abs/1204.3265
+
 - L. Wood, P. Worfolk et al., SaVi - Satellite constellation
-  Visualisation software, http://savi.sf.net/, 2011.
+  Visualisation software, http://savi.sf.net/, 2016.
 
 
 
-2. ORIGINAL COPYRIGHT FOR SAVI 1.0
+2. ORIGINAL COPYRIGHT FOR SaVi 1.0
 ==================================
 
 
diff --git a/PACKAGING b/PACKAGING
index 5310561..e7064d7 100644
--- a/PACKAGING
+++ b/PACKAGING
@@ -1,6 +1,6 @@
 PACKAGING SaVi FOR RELEASES AND BINARY DISTRIBUTION
 ==================================================
-$Id: PACKAGING,v 1.13 2013/04/26 04:54:16 lloydwood Exp $
+$Id: PACKAGING,v 1.21 2016/01/26 08:23:38 lloydwood Exp $
 
 1. Packaging SaVi for binary distribution
 2. Packaging SaVi for releases
@@ -14,7 +14,7 @@ If you're packaging SaVi to release a .rpm, .deb or similar, great!
 Please go ahead. I hope that the following notes will be helpful.
 If these notes could be improved, please let me know.
 
-SaVi requires Tcl and Tk as package dependencies. The makefiles and
+SaVi requires Tcl and Tk as package dependencies. Most makefiles and
 savi launch script expect 8.5, but any version of 8.x can be compiled with.
 You will want to compile SaVi with zlib (steps are detailed in
 README-COVERAGE-TEXTUREMAP) and have zlib as an additional package dependency.
@@ -30,10 +30,11 @@ SaVi users progress with time from reading the manual and helpfiles to reading
 scripts in data/ before copying scripts and editing them to create their own,
 so these all need to be in one place - the savi directory. Textfiles are loaded
 in by the executable for its help menu, and are linked to from the manual in
-manual/ - please do not move or remove these, though making additional copies
-elsewhere is fine. In the top-level directory, only the Makefile, configure,
-and PACKAGING files are now redundant. Makefiles can be removed from all
-directories and subdirectories (src/include and manual/images).
+manual/ - please do not remove these, though making additional copies
+elsewhere is fine, and they can be loaded in by adjusting $SAVI where indicated
+near the end of the launch script. In the top-level directory, only the
+Makefile, configure, and PACKAGING files are now redundant. Makefiles can be
+removed from all directories and subdirectories (src/include and manual/images).
 
 In bin/ two copies of the SaVi binary are deliberately created on
 compilation, as bin/SaVi and bin/SaVi-arch.bin.
@@ -52,6 +53,17 @@ Although the platform where -x86-64.bin was built reported itself as 64-bit,
 we don't know about the compile chain or where the binary is run, and
 defaulting to 32-bit appears safest.
 
+The detailed Earth map is freely available from NASA's Blue Marble project.
+This unprojected map is in
+  oogl/blue_marble_land_shallow_topo_2048.jpeg
+and is loaded by oogl/earth_fancy.oogl and checked for by src/gv_init.c.
+Geomview requires the jpegtopnm utility, from the netpbm package
+available at http://netpbm.sourceforge.net/
+in its path to unpack this image into a less space-efficient format.
+Since that is a Geomview dependency, Geomview use is optional
+with SaVi, and use of the detailed Earth map is optional with Geomview,
+SaVi only includes the compact .jpeg file.
+
 
 
 2. PACKAGING SaVi FOR RELEASES
@@ -65,29 +77,31 @@ include a RELEASE-NOTE file indicating changes. Do not change VERSION.
 Individual files may be replaced with files from CVS, or have CVS
 information removed should changes warrant.
 
-a. Pull a fresh copy of savi-dev/ from the CVS repository.
+a. Delete /savi-dev and pull a fresh copy from the CVS repository.
 b. Mark CVS HEAD with cvs tag savi_1_4_X. Commit.
 c. Edit end of README to indicate version and major changes.
 d. Update VERSION to X+1 development, commit.
-e. Remove all CVS directories. Remember src/include/CVS, manual/images/CVS.
+e. Delete and pull another fresh copy to avoid e.g. editing backup files.
+f. Remove all CVS directories. Remember src/include/CVS, manual/images/CVS.
    \rm -fr CVS; \rm -fr */CVS; \rm -fr */*/CVS
-f. Edit VERSION to indicate release and give date.
-g. Edit configure script variable to indicate version. Delete CVS Id line.
-h. Rename savi-dev/ to savi1.4.X/ to indicate version.
-i. Check for unneeded executable bits on all source files, e.g.
+g. Edit VERSION to indicate release and give date.
+h. Edit configure script variable to indicate version. Delete CVS Id line.
+i. Rename savi-dev/ to savi1.4.X/ to indicate version.
+j. Check for unneeded executable bits on all source files, e.g.
    chmod -x tcl/sunlight.tcl, src/sun.c, manual/index.html, manual/images/*,
    data/o3b-networks.tcl, data/skybridge-80.tcl, data/us-patent-*, maps/*
    (since permissions can't be fixed in the CVS original).
-j. touch -t all directories with a suitable timestamp, starting with
+k. touch -t all directories with a suitable timestamp, starting with
    src/include, ending with savi1.4.X. Also touch configure and VERSION.
-k. Create tarball (tar cvf savi1.4.X-release.tar savi1.4.X), touch, gzip -9.
-l. tar xvfz elsewhere and build to check all works.
-m. Pull copy of savi-dev/ from CVS and build for further work.
-n. Put tarball on sourceforge, local webpages. Remember freshcode!
-o. Announce on mailing lists etc.
+l. Create tarball (tar cvf savi1.4.X-release.tar savi1.4.X), touch, gzip -9.
+m. tar xvfz elsewhere and build to check all works.
+n. Pull copy of savi-dev/ from CVS and build for further work.
+o. Put tarball on sourceforge, local webpages, update pages.
+p. Announce on mailing lists etc.
+   Announce on Sourceforge News: http://sourceforge.net/p/savi/news/
+   Announce on fresh(code): http://freshcode.club
+   
 
 
 Lloyd Wood
 lloydwood at users.sourceforge.net
-last updated April 2013
-
diff --git a/README b/README
index c9523ba..59c734b 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
-README for SaVi distribution
-============================
-$Id: README,v 1.106 2013/05/12 05:20:21 lloydwood Exp $
+README for SaVi - SATELLITE CONSTELLATION SIMULATION AND VISUALIZATION
+======================================================================
+$Id: README,v 1.136 2016/01/29 22:09:01 lloydwood Exp $
 
 This README supplied with the SaVi satellite visualization software
 contains the following sections:
@@ -15,11 +15,13 @@ contains the following sections:
    - how to make SaVi correctly. You must read and follow this section.
 5. Running the SaVi software
    - how to launch SaVi with or without Geomview. Read this section.
-6. Contributing to SaVi
+6. Command-line switches for SaVi
+   - things that can be selected when launching SaVi.
+7. Contributing to SaVi
    - notes for programmers.
-7. Version history of SaVi
+8. Version history of SaVi
    - a brief overview of major developments in SaVi.
-8. Acknowledgements for SaVi
+9. Acknowledgements for SaVi
    - a list of contributors to the SaVi project.
 
 
@@ -28,21 +30,21 @@ contains the following sections:
 =======================
 
 SaVi is software written to facilitate the visualization and analysis
-of satellite constellations.  This software is freely and publicly
+of satellite constellations.  This software is freely and publically
 available.  We require that use of any images produced by this software
 credits SaVi and The Geometry Center.
 
 A webpage user manual for SaVi is in the manual/ directory.
 
-Lloyd Wood, the current SaVi maintainer, can be contacted at:
+Lloyd Wood, the current SaVi maintainer, welcomes suggestions,
+patches and improvements to SaVi. Lloyd can be contacted at:
 lloydwood at users.sourceforge.net
-Lloyd welcomes suggestions, patches and improvements to SaVi.
 
 See the SaVi webpages:
 
 http://savi.sourceforge.net/
-http://info.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
-http://www.geom.uiuc.edu/locate/SaVi
+http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+http://www.geom.uiuc.edu/projects/visualization/savi.html
 
 Support for SaVi is provided via the savi-users mailing list:
 https://lists.sourceforge.net/lists/listinfo/savi-users
@@ -60,7 +62,7 @@ to the savi-users mailing list.
 The original authors could be contacted at: savi at geom.umn.edu.
 
 SaVi is originally Copyright (c) 1995-1997 by The Geometry Center.
-SaVi is also Copyright (c) 2001-2012 by Lloyd Wood.
+SaVi is also Copyright (c) 2001-2016 by Lloyd Wood.
 See the textfile COPYRIGHT for full details.
 
 
@@ -70,12 +72,13 @@ See the textfile COPYRIGHT for full details.
 SaVi requires:
 
  - an ANSI C compiler, e.g. gcc from http://gcc.gnu.org/
-   - tested and builds with gcc 2.95, 3.2, 3.3, 3.4, 4.0, 4.2, 4.4, 4.5.
+   - tested and builds with gcc 5.3.0, 4.9 back to 4.0, 3.4 to 3.2,
+     and 2.95.
    or clang from http://clang.llvm.org/
    - tested and builds with clang 3.1.
 
  - Tcl and Tk, from http://www.tcl.tk/
-   - most recently tested with Tcl/Tk 8.5 releases and ActiveTcl 8.6b1.2.
+   - most recently tested with Tcl/Tk 8.5 releases and ActiveTcl 8.6.4.
      Use of the Tk color picker and load/save file dialogs demands
      a minimum of Tcl/Tk 7.6/4.2.
      Tcl/Tk 8.x gives increased performance, and is recommended.
@@ -86,32 +89,38 @@ SaVi requires:
      The savi wrapper script in this directory, and the Makefile_defs_
      files in the src/ directory, assume that Tcl/Tk 8.5 are available,
      and will need to be edited if other versions are used.
+     On RedHat/Fedora/CentOS etc. try:     yum install tk-devel
+     On Ubuntu/Debian etc. try:            apt-get install tk-dev
 
 SaVi can optionally use:
 
- - Geomview, discussed below. Geomview requires an X Window
-   installation.
+ - Geomview, discussed below.
+   - most recently tested with Geomview 1.9.5.
 
  - the zlib compression library, from http://www.zlib.net/
-   - most recently tested with zlib 1.2.3. zlib is most useful with
+   - most recently tested with zlib 1.2.8. zlib is most useful with
      Geomview. To build with zlib to compress dynamic texturemaps that
      are sent to Geomview, remove the -DNO_ZLIB flag from src/Makefile.
+     On RedHat/Fedora/CentOS etc. try:     yum install zlib-devel
+     On Ubuntu/Debian etc. try:            apt-get install zlib1g-dev
 
 
 SaVi has been successfully compiled and run on the following architectures
 and unix-like operating systems:
 
- - Intel x86 and PowerPC / Macintosh OS X (10.4.11, 10.5.8, 10.6.8, 10.7.2)
+ - Intel x86 and PowerPC / Macintosh OS X
+   (10.9.5, 10.7.2, 10.6.8, 10.5.8, 10.4.11)
    Mac users - you must read the BUGS file! A section there discusses
    Mac-specific problems and workarounds for those problems.
- - Intel x86 / Windows running Cygwin (1.7.10; 1.5.9-1 to .25-11)
+ - Intel x86 / Windows running Cygwin (2.4.0, 1.7.10 to .29; 1.5.9-1 to .25-11)
+   Geomview support demands 32-bit Cygwin, not 64-bit - see BUGS.
    Cygwin users - Insight Tcl/Tk 8.4 was replaced by a more conventional
    unix port of 8.5 in October 2011. If you are still using Insight and
    haven't updated, build with:
      make ARCH=cygwin84
    instead of cygwin.
- - Intel x86 / Linux (Fedora 12.0; Red Hat 6.x, 7.0, 7.2; Enterprise
-   3.0; Mandrake 9.0; Debian, Ubuntu 8.04, 9.10, 10.04; Mandriva One 2010)
+ - Intel x86 / Linux (Ubuntu 14, 13, 10, 9, 8; CentOS 6.5, Fedora 12;
+   Red Hat 6.x, 7.x and Enterprise 3.0; Mandrake 9.0; Mandriva One 2010)
    Ubuntu users - you must read the instructions in
    src/Makefile_defs_ubuntu!
  - Intel x86 / FreeBSD (6.0, 8.1)
@@ -132,36 +141,38 @@ an X Window display.
 SaVi can be run either as a stand-alone program, or as an "external
 module" for the Geomview program.  The latter mode enables
 three-dimensional visualization of the satellite constellations,
-but also needs the Geomview program.
+but also requires Geomview.
 
 Geomview is available from:
 	http://www.geomview.org/
 	http://geomview.sourceforge.net/
 
-SaVi was most recently tested with Geomview 1.9.5 (pre-release).
-Geomview 1.6 or later is needed for SaVi's optional texture mapping.
-Geomview 1.9 or later has vastly improved texture mapping.
-The 1.9 releases significantly improve stability, compatibility and
-performance over 1.8.1.
-The latest Geomview release (as of writing, 1.9.4) is strongly
-recommended for all platforms.
+On Ubuntu/Debian etc., where these packages are maintained:
+        apt-get install geomview
+        apt-get install savi
+will save you the effort of compiling Geomview.
 
-Texture mapping support requires OpenGL, and is discussed further in
-the textfile README-COVERAGE-TEXTUREMAPPING.
+SaVi was most recently tested with Geomview 1.9.5.
+The 1.9 releases significantly improve stability, compatibility and
+performance over 1.8.1.  The latest Geomview release (as of writing,
+1.9.5) is strongly recommended for all platforms.
 
+Geomview 1.6 or later is needed for SaVi's optional texture mapping.
+Geomview 1.9 or later have vastly improved texture mapping.
 For texture mapping, SaVi can optionally use the zlib compression
-library to compress texturemapping files that Geomview reads. This
-is accomplished by removing the -DNO_ZLIB flag from src/Makefile
-when compiling SaVi. See the textfile README-COVERAGE-TEXTUREMAPPING.
+library to compress the dynamic coverage texturemaps that are sent to
+Geomview. Compile zlib support by removing the -DNO_ZLIB flag from
+src/Makefile when compiling SaVi. Texture mapping support requires
+OpenGL support in Geomview, and is discussed in further detail in
+README-COVERAGE-TEXTUREMAPPING, also accessible from SaVi's Help menu.
 
 Discussion of maintaining and building Geomview on various platforms
-and with various compilers can be found in the geomview-users mailing
-list archives:
+can be found in the geomview-users mailing list archives:
 	http://lists.sourceforge.net/lists/listinfo/geomview-users
 
 Instructions for building Geomview under Microsoft Windows with Cygwin
 are available from:
-	http://info.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/building-under-Windows/
+	http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/building-under-Windows/
 
 
 Geomview, like SaVi, was originally available from the Geometry Center:
@@ -327,7 +338,7 @@ directory. Do not run the binary executable directly.
 
     Create a file here called ".geomview-savi" containing e.g.:
 
-        (emodule-define  "SaVi"  "/usr/local/savi1.4.6/savi -geomview")
+        (emodule-define  "SaVi"  "/usr/local/savi1.4.8/savi -geomview")
 
     where the right-hand side is the absolute path name for the savi
     script. The .geomview file can be modified to say e.g.:
@@ -336,23 +347,126 @@ directory. Do not run the binary executable directly.
 
 
 
+6. COMMAND-LINE SWITCHES FOR SAVI
+=================================
+
+SaVi supports the following command-line switches and flags when run
+standalone. These can be combined, e.g.
+    geomview -run savi -geomview -large-map -levels -19 -debug $*
+
+-debug
+    turns on debugging output to the terminal. This is useful for
+    programmers or for output of detailed statistics.
+
+-fake-geomview
+    pretends that SaVi is running with Geomview, even when it isn't.
+    This is useful for debugging.
+
+-help
+    shows command-line switch help in the terminal.
+
+-large-map
+    uses a bigger coverage panel map of 1024x512 pixels, instead of 600x300.
+    Also defaults to 14 color levels, rather than 4. Useful for larger
+    displays, and for better texturemapping.
+
+-levels <n>
+    Sets the number of color levels used by the coverage panel map.
+    n can be from 1 to 19. A large value of n is useful for high-diversity
+    constellations with overlapping coverage, such as GPS and Galileo.
+
+-map-view-height <n>
+    resizes the coverage panel map to 2n pixels across by n pixels down.
+    A large height can give slightly better texturemapping in Geomview,
+    though the coverage panel map outline is not resized. n can be from
+    8 to 2048, giving map sizes ranging from 16x8 to 4096x2048 pixels.
+
+-map-view-middle <longitude>
+    shifts the map horizontally so that the selected longitude is centred.
+    zero is the default. The longitude can be from -180 to 180, going from
+    west to east.
+
+-min-transmit-altitude <kilometers>
+    sets an altitude below which coverage footprints are not drawn.
+    This is useful for simulating satellites in elliptical orbits whose
+    satellites communicate while near apogee, e.g. Molnya, Tundra,
+    Sirius Radio and Ellipso.
+
+-orbit-model <JO|J2>
+    chooses the orbital model. J2 is the default, but a simpler Keplerian
+    J0 can be selected.
+
+-redrawn-menus
+    changes how SaVi draws its menus to an older method. This is useful
+    on some versions of Tcl under Mac OS X (particularly 10.5 Leopard).
+
+-splash
+    generates SaVi's about dialog on launch. This dialog is useful
+    for reporting the version of SaVi and the command-line flags chosen.
 
-6. CONTRIBUTING TO SAVI
+-version
+    reports the version of SaVi and when it was built.
+
+[filename]
+    a script for SaVi to run on launch, typically from the savi/data
+    directory.
+
+
+and when run with Geomview:
+
+-dynamic-texture-with-map
+    passes the unprojected or cylindrical bitmap coverage panel outline
+    map through to Geomview for texturemapping, instead of drawing
+    the vector outline map in Geomview.
+
+-geomview
+    tells SaVi that it is being run with Geomview, and that it should
+    pipe commands to Geomview.
+
+-gzip-compressed-textures
+    uses gzip headers when compressing the texturemaps sent to Geomview,
+    when SaVi has been built with the zlib library. Only of interest to
+    programmers.
+
+-no-logo
+    disables display of the SaVi logo in the corner of the Geomview camera.
+
+-sun-lighting
+    turns on Geomview light sources that attempt to emulate the Sun's
+    lighting. Lighting appears wrong, so this is disabled by default.
+
+-uncompressed
+    forces sending uncompressed texturemaps to Geomview, when SaVi
+    has been built with the zlib library. Only of interest to
+    programmers.
+
+
+
+7. CONTRIBUTING TO SAVI
 =======================
 
 Contributions and additions to SaVi, particularly those addressing
 the issues raised in the BUGS textfile, are welcome - just email
 lloydwood at users.sourceforge.net.
 
+There is also a savi-developers mailing list for discussion:
+https://lists.sourceforge.net/lists/listinfo/savi-developers
+
 SaVi's code layout believes that a tab is four spaces. C code uses
 an indent of two spaces, while Tcl code uses an indent of four spaces.
 
 
 
-7. VERSION HISTORY OF SAVI
+8. VERSION HISTORY OF SAVI
 ==========================
 
-1.4.6. Minor bugfixes. Cygwin unix Tcl/Tk 8.5 compatibility. May 2013.
+1.4.8  Bugfixes to new colorful coverage map. Wider support for
+       Tcl/Tk 8.6. January 2015.
+
+1.4.7  Minor bugfixes. Fisheye geostationary ring and parallels.
+       New colorful unprojected land/sea coverage map. January 2015.
+
+1.4.6  Minor bugfixes. Cygwin unix Tcl/Tk 8.5 compatibility. May 2013.
 
 1.4.5  Minor bugfixes. Mac ActiveTcl compatibility. April 2011.
 
@@ -411,6 +525,8 @@ possible with his thoughtful additions to Geomview.
 Ari Stern contributed assistance with menus and porting to Mac OS X.
 Matthias Foehl contributed assistance with file dialogs and Cygwin.
 
+Cliff Anders suggested and supported the fisheye equatorial exclusion zone.
+
 Lloyd Wood has contributed simulations of commercial constellations and
 other code significantly enhancing the SaVi project, and maintains SaVi
 at SourceForge.
diff --git a/README-COVERAGE-TEXTUREMAP b/README-COVERAGE-TEXTUREMAP
index d0b6cc8..46e43e2 100644
--- a/README-COVERAGE-TEXTUREMAP
+++ b/README-COVERAGE-TEXTUREMAP
@@ -1,6 +1,6 @@
 TEXTUREMAPPING IN GEOMVIEW from SaVi
 ====================================
-$Id: README-COVERAGE-TEXTUREMAP,v 1.40 2010/10/02 09:23:55 lloydwood Exp $
+$Id: README-COVERAGE-TEXTUREMAP,v 1.46 2016/01/26 08:23:38 lloydwood Exp $
 
 This README supplied with the SaVi satellite visualization software
 supplements the main README textfile. This contains the following sections:
@@ -47,19 +47,16 @@ map is a cylindrical projection in oogl/Earth.ppm.gz, and is loaded by
 oogl/earth.oogl. This map works with Geomview 1.6 and later, and uses
 Geomview's traditional texture mesh defined in oogl/numesh.oogl.
 
-The detailed Earth map comes from NASA's Blue Marble project. This map
-is unprojected, in oogl/blue_marble_land_shallow_topo_2048.jpeg, and is
-loaded by earth_fancy.oogl and checked for by src/gv_init.c. This map
-requires Geomview 1.9 or later, as it uses the new STSPHERE method for
-texturemapping. Geomview requires the jpegtopnm utility, from the
-netpbm package available at http://netpbm.sourceforge.net/, in its
-path to unpack this image into a less space-efficient format.
-
-(Note that STSPHERE uses CYLINDRICAL for unprojected maps and
-RECTANGULAR for cylindrical projections. By using numesh.oogl rather
-than the newer STSPHERE RECTANGULAR, texturemapping supports older
-pre-1.9 Geomview releases that can only texturemap from cylindrical
-maps.)
+The detailed Earth map is freely available from NASA's Blue Marble project.
+This unprojected map is in
+  oogl/blue_marble_land_shallow_topo_2048.jpeg
+and is loaded by oogl/earth_fancy.oogl and checked for by src/gv_init.c.
+Geomview requires the jpegtopnm utility, from the netpbm package
+available at http://netpbm.sourceforge.net/
+in its path to unpack this image into a less space-efficient format.
+Since that is a Geomview dependency, Geomview use is optional
+with SaVi, and use of the detailed Earth map is optional with Geomview,
+SaVi only includes the compact .jpeg file.
 
 
 
@@ -77,18 +74,15 @@ Dynamic texturemapping of satellite coverage in Geomview requires
 SaVi's coverage panel open, to reuse the map area that that coverage
 panel draws and copy it to Geomview.
 
-The coverage map must be set to a particular projection.
-- Geomview 1.9.0 and later support cylindrical and unprojected
-  projections.
-- Geomview earlier than 1.9.0 supports the cylindrical projection only,
-  when used with the simple Earth map.
+The coverage map must be set to a particular projection. Geomview 1.9.0
+and later support cylindrical and unprojected projections.
 If another projection is selected that cannot be texturemapped to
 Geomview, the default static simple Earth map will be shown in Geomview.
 
 To turn on dynamic texturemapping:
 a. Launch SaVi from Geomview.
 b. Open the coverage panel window from the View menu.
-c. Turn on 'Send full map to Geomview' in the coverage panel's
+c. Turn on 'Show coverage in Geomview' in the coverage panel's
    Rendering menu to introduce texturemapping of the coverage map to
    Geomview's Earth sphere, so that Geomview shows in three dimensions
    what you can see in the SaVi coverage panel in two.
@@ -125,19 +119,11 @@ Geomview. Texturemap compression is recommended for sending large
 bitmaps to Geomview, as pipe use or disk access is decreased. See
 section 5 of this document for how to enable texturemap compression.
 
--dynamic-texture-to-file
-This moves SaVi from streaming images directly to Geomview (which works
-with all Geomview versions 1.9.0 and above) to the older method of
-writing out a temporary scratchfile for Geomview to read. SaVi will
-automatically use this method with older versions of Geomview (before
-1.9.0) for backward compatibility. This is less accurate than streaming
-images.
-
 -uncompressed
 If SaVi has been compiled with zlib support (see section 5 below), this
 can be set to force uncompressed textures, ignoring zlib. Performance
-will vary between compressed and uncompressed images depending on your
-system and whether disk scratchfiles are in use.
+may vary between compressed and uncompressed images depending on your
+system.
 
 -gzip-compressed-textures
 If SaVi has been compiled with zlib support (see section 5 below), this
@@ -158,11 +144,6 @@ where Geomview was run. Launching SaVi from Geomview with the
 -large-map option may help, as may upgrading your OpenGL drivers and
 rebuilding Geomview.
 
-If you are using the older disk scratchfile method and disk access is
-intensive, try texturemap compression to decrease the size of temporary
-graphics files and improve performance. See below. Upgrading Geomview
-to avoid the disk scratchfile method is recommended.
-
 
 
 5. ENABLING TEXTUREMAP COMPRESSION
@@ -173,7 +154,8 @@ using zlib where available. This increases performance by decreasing
 the amount of writing to, reading from, and waiting for pipe or disk
 that is required.
 
-You can tell whether compression is working by SaVi's status messages.
+You can tell whether compression is working by SaVi's status messages
+in the console window where savi was launched.
 
 Transparent compression requires use of the free zlib library.
 As zlib is optional and may not be present on your system, use of zlib
@@ -182,7 +164,7 @@ is disabled by default and must be explicitly enabled by you.
 If the zlib library and zlib.h are not already available
 on your system, zlib can be downloaded from http://www.zlib.net/
 and shown to work with:
-	cd zlib-1.2.3
+	cd zlib-1.2.8
 	./configure -s
 	make test
 Then install zlib as superuser (or get an administrator to do so) with:
@@ -192,24 +174,24 @@ Transparent compression must be selectively enabled in the SaVi code
 by editing SaVi's src/Makefile to remove the -DNO_ZLIB flag before
 recompiling SaVi after first doing 'make clean'.
 
-SaVi's Help/about SaVi... dialog will tell you whether compression
-support has been included in SaVi by the compiler.
+SaVi can tell you whether compression support was included when building
+SaVi in its About dialog from the Help menu.
 
 SaVi's support for texturemapping varies depending on the version of
 Geomview used, with the default being the newest method. Older
 methods are supported via command-line options described earlier.
 Geomview 1.8.x
- - compressed and uncompressed texturemaps must be written to disk
-   to be read by Geomview. This is slow and jerky.
-   Only the cylindrical coverage projection is supported.
+ - dynamic coverage texturemaps were last supported in SaVi 1.4.8.
+   Static Earth texturemaps are still available.
 Geomview 1.9.x
- - compressed and uncompressed texturemaps may be piped to Geomview
+ - static and dynamic texturemaps are supported.
+   Compressed and uncompressed texturemaps may be piped to Geomview
    directly, for a significant performance improvement.
    Cylindrical and unprojected coverage projections are supported.
-   * Geomview 1.9.0 to 1.9.4
+   * Geomview 1.9.0 to 1.9.4:
      - piped compressed texturemaps are handled by spawning a gzip
        process to uncompress them.
-   * Geomview later than 1.9.4
+   * Geomview 1.9.5 and later:
      - Geomview handles decompression internally rather than spawning
        gzip to uncompress, for a minor performance improvement.
        Texturemaps may also be piped to Geomview using zlib's
@@ -234,22 +216,14 @@ Interval decay is turned on because white areas show up in Geomview's
 lighting as gold, and blue is rather cooler and matches Geomview's
 default blue sphere.
 
-Images are sent down a pipe to Geomview, inline with oogl commands.
-For the older disk method, opening the coverage window and turning on
-texturemapping starts copying coverage maps to Geomview via a temporary
-file, with fallback to writing $HOME/coverage-savi.ppm or .ppm.gz if a
-temporary file cannot be created in the system temporary directory.
-
-The fallback disk method presumes that $HOME is a user-writable
-directory (which is usually the case) and that the installation of SaVi
-is only being used once for dynamic texturemapping by each person.
-
+Coverage images are sent down a pipe to Geomview, inline with oogl
+commands.
 
 
 7. PROGRAMMING IMPLEMENTATION NOTES
 ===================================
 
-Mapping is horribly convenient because the Tcl coverage image is
+Mapping is very convenient because the Tcl coverage image is
 effectively already a raw RGB ppm file, which we can send to
 Geomview or write to a scratchfile we tell Geomview to read in.
 
@@ -263,9 +237,10 @@ since we'd be rendering two separate maps). Texturemapping of other
 projections has been disabled as incorrect and inconvenient for viewing
 in Geomview.
 
-Note that the cylindrical map is RECTANGULAR as far as Geomview's
-STSPHERE setting knows, while unprojected is known as CYLINDRICAL
-to STSPHERE.
+Note that Geomview 1.9's STSPHERE uses CYLINDRICAL for unprojected
+maps and RECTANGULAR for cylindrical projections, which is backwards.
+(Geomview 1.8.1 does not support STSPHERE, and requires oogl/numesh.oogl
+to support only cylindrical projections.)
 
 More correct image/grid handling for multiple grids would probably
 require a pointer to the image stored in grid structure we're passing
@@ -284,17 +259,21 @@ New unprojected equirectangular and orthographic spherical maps were
 created from maps generated by Versamap, then screenshots were turned
 to greyscale, resized, set threshold in gimp, then saved as xbm before
 being processed as above.
-	http://www.versamap.com/
+ http://www.versamap.com/
 
 Some maps used in previous versions of SaVi were created from maps
 generated by Henry Bottomley's java map applet, which does a variety
 of interesting projections:
-	http://www.btinternet.com/%7Ese16/js/mapproj.htm
+ http://www.btinternet.com/%7Ese16/js/mapproj.htm
 
 The blue-and-gold Earthmap in oogl/Earth.ppm.gz used for simple static
 texturemapping was originally created by the Geometry Center for the
 Orrery, another Geomview module, and tweaked.
 
+The continents mask Earthmaps used for the unprojected duochrome
+shaded land and sea maps were resized from
+ http://naturalearth.springercarto.com/ne3_data/16200/masks/water_16k.png
+
 NASA's Blue Marble project at http://visibleearth.nasa.gov/ has created
 detailed Earth texturemaps for more accurate Earth rendering.
 
diff --git a/VERSION b/VERSION
index 9a1172f..cd33552 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.4.7 development (13 May 2013)
+1.4.9 release (30 January 2016)
diff --git a/data/Makefile b/data/Makefile
index 296bb4f..d2ed557 100644
--- a/data/Makefile
+++ b/data/Makefile
@@ -1,7 +1,7 @@
 #
 # Makefile - SaVi data directory. Run top-level Makefile instead.
 #
-# $Id: Makefile,v 1.14 2011/03/16 10:05:51 lloydwood Exp $
+# $Id: Makefile,v 1.16 2016/01/17 22:52:15 lloydwood Exp $
 
 
        SHELL = /bin/sh
@@ -10,9 +10,9 @@
   OTHER_SRCS = aries.tcl atcontact.tcl celestri.tcl clarke.tcl \
 		commstellation-78.tcl deligo.tcl draim-4.tcl dmc.tcl \
 		ellipso.tcl galileo.tcl globalstar.tcl glonass.tcl gps.tcl \
-		gs2.tcl ico.tcl iridium-66.tcl leqo.tcl macrocell.tcl mm.tcl \
-		molnya.tcl nels.tcl nuonce.tcl \
-		o3b-networks.tcl odyssey.tcl orbcomm.tcl orblink.tcl \
+		gs2.tcl ico.tcl iridium-66.tcl leqo.tcl leosat.tcl macrocell.tcl \
+		mm.tcl molnya.tcl nels.tcl nuonce.tcl o3b-networks.tcl \
+		odyssey.tcl oneweb.tcl orbcomm.tcl orblink.tcl \
 		quasi-geo.tcl rapideye.tcl sirius-radio.tcl skybridge-64.tcl \
 		skybridge-80.tcl spaceway-ngso.tcl \
 		teledesic-288.tcl teledesic-840.tcl \
diff --git a/data/atcontact.tcl b/data/atcontact.tcl
index 95261a3..37e432b 100644
--- a/data/atcontact.tcl
+++ b/data/atcontact.tcl
@@ -9,9 +9,9 @@
 # Was at http://www.atcontactcom.com/
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: atcontact.tcl,v 1.10 2008/12/29 00:37:16 lloydwood Exp $
+# $Id: atcontact.tcl,v 1.11 2015/08/31 01:29:33 lloydwood Exp $
 
 # site says 16 operational satellites and four spares, one per plane.
 set SATS_PER_PLANE 4
diff --git a/data/celestri.tcl b/data/celestri.tcl
index 851201a..75bc605 100644
--- a/data/celestri.tcl
+++ b/data/celestri.tcl
@@ -14,7 +14,7 @@
 # * information used from the Motorola FCC application, June 1997.
 #
 # Was available online in Adobe Acrobat pdf format from Motorola; see:
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/constellations/celestri/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/constellations/celestri/
 # for an archived copy.
 #
 # Full details are in the scanned pdf of the section titled part two,
@@ -22,9 +22,9 @@
 # map showing subsatellite points.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: celestri.tcl,v 1.12 2008/12/29 02:08:39 lloydwood Exp $
+# $Id: celestri.tcl,v 1.13 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 9
 set NUM_PLANES 7
diff --git a/data/clarke.tcl b/data/clarke.tcl
index 3b19b68..744b0d0 100644
--- a/data/clarke.tcl
+++ b/data/clarke.tcl
@@ -23,9 +23,9 @@
 # http://www.sciencemuseum.org.uk/on-line/clarke/ww1.asp
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: clarke.tcl,v 1.11 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: clarke.tcl,v 1.12 2015/08/31 01:29:33 lloydwood Exp $
 
 # It's easiest to give each satellite its own RAAN, so we'll treat them
 # as having separate planes even though they're not actually ascending.
diff --git a/data/dmc.tcl b/data/dmc.tcl
index 0d0a396..86c8570 100644
--- a/data/dmc.tcl
+++ b/data/dmc.tcl
@@ -39,7 +39,7 @@
 # * Internet router from Cisco Systems, and became the first satellite
 # * to run IPv6 and the Delay-Tolerant Networking 'Bundle Protocol'.
 #
-# $Id: dmc.tcl,v 1.17 2012/01/20 06:20:54 lloydwood Exp $
+# $Id: dmc.tcl,v 1.18 2015/01/15 23:03:13 lloydwood Exp $
 
 # sun-synchronous, so turn on sunlight
 upvar #0 sun_flag sun_flag
@@ -68,7 +68,7 @@ set coverage_angle 66.4
 # set coverage_angle_flag 1
 # puts stderr "\n\nSaVi: half-cone coverage angle of $coverage_angle deg shows extent of DMC imaging swath."
 
-puts stderr "SaVi: imaging swath shown. Set mask angle to zero for limits of communications connectivity."
+puts stderr "\nSaVi: imaging swath shown. Set mask angle to zero for limits of communications connectivity."
 
 set SATS_PER_PLANE 4
 
diff --git a/data/draim-4.tcl b/data/draim-4.tcl
index bb43200..9a87bf3 100644
--- a/data/draim-4.tcl
+++ b/data/draim-4.tcl
@@ -1,5 +1,6 @@
 #
 # * THEORETICAL CONSTELLATIONS
+# * ELLIPTICAL SYSTEMS
 # *
 # * Draim example 4-satellite elliptical constellation
 # *
@@ -18,7 +19,7 @@
 # * constellation, US Patent 4,854,527, August 1989.
 # http://www.freepatentsonline.com/4854527.html
 #
-# $Id: draim-4.tcl,v 1.12 2011/09/02 07:59:05 lloydwood Exp $
+# $Id: draim-4.tcl,v 1.13 2014/01/28 21:00:09 lloydwood Exp $
 
 set NUM_PLANES 4
 
diff --git a/data/ellipso.tcl b/data/ellipso.tcl
index 995f5a5..1cc6d38 100644
--- a/data/ellipso.tcl
+++ b/data/ellipso.tcl
@@ -1,4 +1,8 @@
 #
+# * ELLIPTICAL SYSTEMS
+# *
+# * NON-GEOSTATIONARY EQUATORIAL-RING PROPOSALS
+# *
 # * Ellipso
 # *
 # * Combines highly-elliptical orbits useful near apogee with
@@ -10,13 +14,15 @@
 # * hemisphere (the Borealis constellation). Ellipsat CEO David Castiel
 # * was famously quoted in Wired as saying "Frankly, my business plan
 # * can do without the people on Easter Island." (Joe Flower, Iridium,
-# * Wired 1.05.) The business plan focused on voice telephony and low-rate
-# * data.
+# * Wired 1.05.) Its business plan focused on voice telephony and low-rate
+# * data. GSM terrestrial mobile cellular telephony became widespread,
+# * and the construction, launch and bankruptcies of the competing
+# * Iridium and Globalstar efforts indicated a shift in the market.
 # *
 # * Not built. Ellipsat Inc. announced an alliance with ICO/Teledesic
 # * in March 2001.
-
-# $Id: ellipso.tcl,v 1.7 2011/04/08 15:42:11 lloydwood Exp $
+# *
+# $Id: ellipso.tcl,v 1.10 2016/01/09 23:04:34 lloydwood Exp $
 
 # to ensure overlapping coverage in the northern hemisphere
 set coverage_angle 25
@@ -31,6 +37,11 @@ set NUM_PLANES 2
 set apogee_altitude 7846.0
 set perigee_altitude 520.0
 
+# * Setting minimum transmission altitude to 5,000 km works well
+# * to turn off transmission away from apogee with some overlap.
+# *
+# * savi -min-transmit-altitude 5000
+
 # setup orbital elements
 set a [expr ($apogee_altitude+$perigee_altitude)/2+$RADIUS_OF_EARTH]
 set e [expr ($apogee_altitude-$perigee_altitude)/(2*$a)]
diff --git a/data/galileo.tcl b/data/galileo.tcl
index d376375..e6c4a99 100644
--- a/data/galileo.tcl
+++ b/data/galileo.tcl
@@ -31,9 +31,9 @@
 # plus one.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: galileo.tcl,v 1.11 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: galileo.tcl,v 1.12 2015/08/31 01:29:33 lloydwood Exp $
 
 # We are excluding all spares.
 set SATS_PER_PLANE 9
diff --git a/data/globalstar.tcl b/data/globalstar.tcl
index 87aa385..95f420d 100644
--- a/data/globalstar.tcl
+++ b/data/globalstar.tcl
@@ -11,8 +11,9 @@
 # * Service officially launched in October 1999.
 # *
 # * Designed for voice telephony and low-rate data. In the decade while
-# * Globalstar was being designed and built, GSM telephony became
-# * widespread, removing the intended 'business traveller' market.
+# * Globalstar was being designed and built for Qualcomm, GSM terrestrial
+# * mobile cellular telephony became widespread, removing the intended
+# * 'business traveller' market.
 # * Filed for US Chapter 11 bankruptcy protection
 # * February 2002, and re-emerged in April 2004.
 # *
@@ -34,7 +35,7 @@
 # *
 # * See also http://www.globalstar.com/
 #
-# $Id: globalstar.tcl,v 1.11 2011/04/08 15:55:13 lloydwood Exp $
+# $Id: globalstar.tcl,v 1.13 2016/01/09 23:04:34 lloydwood Exp $
 
 set SATS_PER_PLANE 6
 set NUM_PLANES 8
diff --git a/data/glonass.tcl b/data/glonass.tcl
index 47d1bb7..4ea021c 100644
--- a/data/glonass.tcl
+++ b/data/glonass.tcl
@@ -15,9 +15,9 @@
 # has basic constellation information.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: glonass.tcl,v 1.2 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: glonass.tcl,v 1.3 2015/08/31 01:29:33 lloydwood Exp $
 
 # We are excluding all spares.
 set SATS_PER_PLANE 8
diff --git a/data/gps.tcl b/data/gps.tcl
index 76e373a..97561c9 100644
--- a/data/gps.tcl
+++ b/data/gps.tcl
@@ -17,9 +17,9 @@
 # http://www.colorado.edu/geography/gcraft/notes/gps/nomconst.html
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: gps.tcl,v 1.9 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: gps.tcl,v 1.10 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 4
 set NUM_PLANES 6
diff --git a/data/gs2.tcl b/data/gs2.tcl
index 408dce0..98c7592 100644
--- a/data/gs2.tcl
+++ b/data/gs2.tcl
@@ -10,9 +10,9 @@
 # * The filing also mentions four geostationary satellites, not simulated.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: gs2.tcl,v 1.10 2008/12/29 02:10:55 lloydwood Exp $
+# $Id: gs2.tcl,v 1.11 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 8
 set NUM_PLANES 8
diff --git a/data/ico.tcl b/data/ico.tcl
index 396e043..5043ee5 100644
--- a/data/ico.tcl
+++ b/data/ico.tcl
@@ -8,6 +8,10 @@
 # * Contract work was done with TRW; this also led to the Odyssey system,
 # * which was cancelled in December 1997 in favour of ICO.
 # *
+# * GSM terrestrial mobile cellular telephony became widespread,
+# * and the construction, launch and bankruptcies of the competing
+# * Iridium and Globalstar efforts indicated a shift in the market.
+# *
 # * ICO filed for US Chapter 11 bankruptcy protection in August 1999.
 # * ICO then emerged from bankruptcy protection in May 2000, after its
 # * first launch lost a satellite in March 2000. The second launch in
@@ -15,7 +19,7 @@
 # * have yet been launched.
 # *
 # * (ICO Global's G1 geostationary satellite was launched in April 2008, and
-# * claimed to be the largest geostationary satellite yet launched.
+# * was claimed to be the largest geostationary satellite yet launched.
 # * This is intended to provide "ICO mim" (mobile interactive media)
 # * services, including mobile video, over the United States.)
 
@@ -24,9 +28,9 @@
 # which is ideal for coverage.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: ico.tcl,v 1.9 2011/04/27 21:06:25 lloydwood Exp $
+# $Id: ico.tcl,v 1.11 2016/01/09 23:04:34 lloydwood Exp $
 
 set SATS_PER_PLANE 5
 set NUM_PLANES 2
diff --git a/data/iridium-66.tcl b/data/iridium-66.tcl
index 394d4bf..c5a70a1 100644
--- a/data/iridium-66.tcl
+++ b/data/iridium-66.tcl
@@ -15,9 +15,10 @@
 # * for 'bad approach'.
 # *
 # * Designed for voice telephony and low-rate data. In the decade while
-# * Iridium was being designed and built, GSM telephony became
-# * widespread, removing the intended 'business traveller' market and
-# * leading to a focus on specialist industries in remote areas.
+# * Iridium was being designed and built for Motorola, GSM terrestrial
+# * mobile cellular telephony became widespread, removing the intended
+# * 'business traveller' market and leading to a focus on specialist
+# * industries in remote areas.
 # *
 # * Full constellation launched as of May 1998. Service offered
 # * as of end of 1998. Filed for US Chapter 11 bankruptcy protection
@@ -35,7 +36,7 @@
 # *
 # * Uses intersatellite links, which are not yet simulated here.
 
-# $Id: iridium-66.tcl,v 1.10 2011/04/08 15:55:13 lloydwood Exp $
+# $Id: iridium-66.tcl,v 1.12 2016/01/09 23:04:34 lloydwood Exp $
 
 set SATS_PER_PLANE 11
 set NUM_PLANES 6
diff --git a/data/leosat.tcl b/data/leosat.tcl
new file mode 100644
index 0000000..93b58f9
--- /dev/null
+++ b/data/leosat.tcl
@@ -0,0 +1,64 @@
+#
+# * PROPOSED LARGE BROADBAND CONSTELLATIONS - CURRENT EFFORTS
+# *
+# * LeoSat
+# *
+# * A Walker polar star geometry, using optical intersatellite
+# * links with the Iridium NEXT bus. Note the 'orbital seam' where
+# * the footprints of ascending (going north over the Equator) and
+# * descending (going (south) satellites overlap more to ensure
+# * continuous coverage.
+# *
+# * This simulation is a rough approximation, based only on news reports.
+# * It is speculative, not authoritative, and not finalised.
+# *
+# * "It's 78-108 satellites in polar orbit at 1,430 kilometers in
+# * altitude, six orbital planes with 18 satellites each."
+# * -- Mark Rigolle, CEO of LeoSat, interviewed by Peter B. de Selding
+# * in "Never Mind the Unconnected Masses, LeoSat’s Broadband Constellation
+# * is Strictly Business," Space News, 20 November 2015.
+# http://spacenews.com/nevermind-the-unconnected-masses-leosats-broadband-constellation-is-strictly-business/
+# *
+# * See http://leosat.com/
+# *
+# * Uses intersatellite links, which are not yet simulated here.
+
+# $Id: leosat.tcl,v 1.5 2016/01/18 07:17:17 lloydwood Exp $
+
+set SATS_PER_PLANE 18
+set NUM_PLANES 6
+
+# rough guess.
+set INTERPLANE_SPACING 31.0
+
+# setup orbital elements
+# could be retrograde sun synchronous orbit to simplify solar panel
+# tracking, at circa 110 degrees, but seems unlikely.
+set a [expr 1430.0+$RADIUS_OF_EARTH]
+set e 0.0
+set inc 87.0
+set omega 0.0
+
+# needs relatively low elevation angle for terminals.
+set coverage_angle 25.0
+
+# compute period of orbit
+set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)]
+
+
+satellites GV_BEGIN
+for {set j 0} {$j < $NUM_PLANES} {incr j} {
+	set Omega [expr $j * $INTERPLANE_SPACING]
+	for {set i 0} {$i < $SATS_PER_PLANE} {incr i} {
+		if { $j % 2 == 0} {
+			set plane_offset 0
+		} else {
+			set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0]
+		}
+		set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset]
+		set n [satellites LOAD $a $e $inc $Omega $omega $T "LeoSat ($j, $i)"]
+		if {$i > 0} {satellites ORBIT_SET $n 0}
+	}
+}
+satellites GV_END
+
diff --git a/data/leqo.tcl b/data/leqo.tcl
index a7c3193..85b23e1 100644
--- a/data/leqo.tcl
+++ b/data/leqo.tcl
@@ -1,5 +1,5 @@
 #
-# * NON-GEOSTATIONARY EQUATORIAL-RING PROPOSALS
+# * NON-GEOSTATIONARY EQUATORIAL RING - PROPOSAL
 # *
 # * LEqO
 # *
@@ -13,12 +13,12 @@
 # * W. Sun, M. Sweeting and A. da Silva Curiel,
 # * LEO satellite constellation for regional communications,
 # * Proceedings of IAF '96.
-# http://web.archive.org/web/20040220030502/http://www.ee.surrey.ac.uk/SSC/CSER/UOSAT/papers/iaf96/leqo/leqo.html
+# http://web.archive.org/web/20040220030502/http://personal.ee.surrey.ac.uk/SSC/CSER/UOSAT/papers/iaf96/leqo/leqo.html
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: leqo.tcl,v 1.10 2011/05/15 16:14:25 lloydwood Exp $
+# $Id: leqo.tcl,v 1.12 2015/08/31 01:29:33 lloydwood Exp $
 
 set NUM_SATS 8
 
diff --git a/data/macrocell.tcl b/data/macrocell.tcl
index 54d7e5a..3e5f09c 100644
--- a/data/macrocell.tcl
+++ b/data/macrocell.tcl
@@ -9,9 +9,9 @@
 # * SaVi simulation can be verified against picture on page A-8.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: macrocell.tcl,v 1.7 2008/12/29 02:08:40 lloydwood Exp $
+# $Id: macrocell.tcl,v 1.8 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 12
 set NUM_PLANES 8
diff --git a/data/mm.tcl b/data/mm.tcl
index 47d640f..7c3bdff 100644
--- a/data/mm.tcl
+++ b/data/mm.tcl
@@ -1,4 +1,6 @@
 #
+# * ELLIPTICAL SYSTEMS
+# *
 # * Millimeter Wave Satellite proposal
 # *
 # * Uses elliptical orbits. Not built.
@@ -14,7 +16,7 @@
 # * Navigation, May 1996, pp. 51-54.
 # http://dx.doi.org/10.1049/cp:19960407
 #
-# $Id: mm.tcl,v 1.8 2011/07/18 14:52:08 lloydwood Exp $
+# $Id: mm.tcl,v 1.9 2014/01/28 21:00:09 lloydwood Exp $
 
 # number of satellites
 set IMAX 30
diff --git a/data/molnya.tcl b/data/molnya.tcl
index f0d9677..704d854 100644
--- a/data/molnya.tcl
+++ b/data/molnya.tcl
@@ -1,6 +1,8 @@
 #
 # * THEORETICAL CONSTELLATIONS
 # *
+# * ELLIPTICAL SYSTEMS
+# *
 # * Molnya (Molniya, Russian: 'Lightning') high-latitude coverage
 # *
 # * Highly-elliptical orbits useful near apogee.
@@ -23,11 +25,11 @@
 # * Information from 'Satellite Communication Systems', Maral and
 # * Bousqet, 2nd/3rd edition, chapter 7; values are set to match
 # * Figure 7.12.
-#
+# * 
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: molnya.tcl,v 1.13 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: molnya.tcl,v 1.19 2015/08/31 01:29:33 lloydwood Exp $
 
 
 # setup orbital elements
@@ -50,6 +52,14 @@ set apogee_altitude  [expr ($sma*(1+$e)-$RADIUS_OF_EARTH)]
 # mean altitude is semi-major axis
 set a $sma
 
+# * Setting minimum transmission altitude to 20,000 km works well
+# * to turn off transmission away from apogee with some overlap.
+# *
+# * savi -min-transmit-altitude 20000
+# or uncomment:
+# set min_transmit_altitude 20000
+
+
 
 # inclination must be  63.435 (stationary apogee in northern hemisphere)
 #                  or -63.435 (stationary apogee in southern hemisphere)
diff --git a/data/nels.tcl b/data/nels.tcl
index dc561f2..a7cebbc 100644
--- a/data/nels.tcl
+++ b/data/nels.tcl
@@ -36,9 +36,9 @@
 # Report, SAT2003-123, pp. 7-12, 2003. 
 #  
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: nels.tcl,v 1.9 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: nels.tcl,v 1.10 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 12
 set NUM_PLANES 10
diff --git a/data/o3b-networks.tcl b/data/o3b-networks.tcl
index 6b604d1..0aa2d3b 100644
--- a/data/o3b-networks.tcl
+++ b/data/o3b-networks.tcl
@@ -1,50 +1,66 @@
 #
-# * NON-GEOSTATIONARY EQUATORIAL-RING PROPOSALS
+# * NON-GEOSTATIONARY EQUATORIAL RING - OPERATIONAL SYSTEM
 # *
 # * O3b
 # *
-# * Named for 'the other three billion people' without good network
-# * service.
-# *
-# * Announced with much publicity in September 2008. Some investment
-# * from Google and others. Not yet built; first launch now expected
-# * in 2013.
-# *
 # * See http://www.o3bnetworks.com/
 # *
-# * Satellite altitude has been altered slightly over time. See:
-# *
-# * Sea Launch signs launch agreement with O3b Networks, press release,
-# * 23 September 2008.
-# * ("equatorial injection orbit of 7,825 kilometers above the earth")
-# *
-# * O3b signs agreement with Arianespace, press release, 17 March 2010.
-# * ("nearly 8,000 kilometers from the earth")
+# * Named for 'the other three billion people' without good network
+# * service.
 # *
-# * http://www.o3bnetworks.com/AboutUs/faq.html checked 8 April 2011.
-# * ("O3b is positioning its satellites in an orbit 8,063km from
-# * Earth.")
+# * Announced with much publicity in September 2008. Investment from
+# * Google, SES, and others. First four satellites launched in June 2013,
+# * with operational traffic from January 2014. Second four satellites
+# * launched July 2014. Third four satellites launched December 2014.
 # *
-# * O3b satellites are under construction in France by Thales Alenia
-# * Space.
+
+# Satellite altitude has been altered slightly over time. See:
+#
+# Sea Launch signs launch agreement with O3b Networks, press release,
+# 23 September 2008.
+# ("equatorial injection orbit of 7,825 kilometers above the earth")
+#
+# O3b signs agreement with Arianespace, press release, 17 March 2010.
+# ("nearly 8,000 kilometers from the earth")
+
+# http://www.o3bnetworks.com/AboutUs/faq.html checked 8 April 2011.
+# "O3b is positioning its satellites in an orbit 8,063km from
+# Earth.")
+
+# Website currently says 8,062km altitude.
+# http://www.o3bnetworks.com/o3b-advantage/our-technology
+# checked 12 October 2014.
 
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: o3b-networks.tcl,v 1.11 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: o3b-networks.tcl,v 1.20 2015/08/31 01:29:33 lloydwood Exp $
 
-# * An initial deployment of eight satellites.
-set NUM_SATS 8
+# * A stated deployment of eight satellites at 8,062km altitude,
+# * but only six were active, due to power converter problems with
+# * the first four satellites. Two of the faulty satellites are not
+# * in service, acting as on-orbit spares for the other two.
+# * 'Two O3b Satellites Taken Out of Service as a Precaution,'
+# * Peter de Selding, Space News, 11 September 2014.
+# *
+# * After four further satellites were launched in December 2014,
+# * we presume that ten satellites are active.
+# *
+# http://www.spacenews.com/article/satellite-telecom/41831world-satellite-business-week-two-o3b-satellites-taken-out-of-service
+
+# * There is a comparison with Ellipso's proposed six-satellite
+# * Concordia ring:
+# *
+# * Lloyd Wood, Yuxuan Lou, and Opeoluwa Olusola, 'Revisiting
+# * elliptical satellite orbits to enhance the O3b constellation',
+# * Journal of the British Interplanetary Society, vol. 67, no. 3,
+# * pp. 110-118, March 2014.
+# http://arxiv.org/abs/1407.2521
 
-# sixteen more to follow.
-# http://www.o3bnetworks.com/AboutUs/faq.html 24 May 2010.
-# Contract signed for four more, taking to 12:
-# O3b Networks set to virtually double fleet capacity as financing is
-# secured to build four more satellites, O3b press release, 10 November 
-# 2012.
+set NUM_SATS [expr 4 - 2 + 4 + 4]
 
 # setup orbital elements
-set a [expr 8063.0+$RADIUS_OF_EARTH]
+set a [expr 8062.0+$RADIUS_OF_EARTH]
 set e 0.0
 set inc 0.0
 set omega 0.0
@@ -53,6 +69,10 @@ set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)]
 # We're told coverage between 45 degrees of latitude.
 # Ka-band, so a relatively high mask angle can be expected.
 # But mask must be low to cover up to 45 deg lat consistently.
+# > 5 degrees elevation for 7.3m diameter gateway stations.
+# > 15 degrees elevation for 2.4m diameter and larger antennas.
+# > 20 degrees elevation for 1.8m diameter antennas.
+
 set coverage_angle 15.0
 
 satellites GV_BEGIN
diff --git a/data/odyssey.tcl b/data/odyssey.tcl
index 23ce4f8..0b87588 100644
--- a/data/odyssey.tcl
+++ b/data/odyssey.tcl
@@ -23,9 +23,9 @@
 # basically unchanged.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: odyssey.tcl,v 1.8 2008/12/29 02:08:40 lloydwood Exp $
+# $Id: odyssey.tcl,v 1.9 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 4
 set NUM_PLANES 3
diff --git a/data/oneweb.tcl b/data/oneweb.tcl
new file mode 100644
index 0000000..9da290d
--- /dev/null
+++ b/data/oneweb.tcl
@@ -0,0 +1,63 @@
+#
+# * PROPOSED LARGE BROADBAND CONSTELLATIONS - CURRENT EFFORTS
+# *
+# * OneWeb
+# *
+# * Greg Wyler's followup to the popular O3b.
+# *
+# * A Walker polar star geometry. Note the 'orbital seam' where
+# * the footprints of ascending (going north over the Equator) and
+# * descending (going (south) satellites overlap more to ensure
+# * continuous coverage.
+# *
+# * This simulation is a rough approximation, based only on news reports.
+# * It is speculative, not authoritative, and not finalised.
+# *
+# * "OneWeb’s 150-kilogram satellites will operate in an orbit
+# * 1,200 kilometers in altitude, in 18 planes of 40 satellites each,
+# * with an inclination of 87.9 degrees relative to the equator."
+# *  -- OneWeb Pledges Vigilance on Orbital Debris Issue,
+# * Peter B. de Selding, October 15, 2015.
+# http://spacenews.com/oneweb-pledges-vigilance-on-orbital-debris-issue/
+
+# * See http://oneweb.world/ or http://spacenews.com/tag/oneweb/
+# *
+# * Uses intersatellite links, which are not yet simulated here.
+
+# $Id: oneweb.tcl,v 1.4 2016/01/18 03:16:52 lloydwood Exp $
+
+set SATS_PER_PLANE 40
+set NUM_PLANES 18
+
+# rough guess.
+set INTERPLANE_SPACING 10.0
+
+# setup orbital elements
+set a [expr 1200.0+$RADIUS_OF_EARTH]
+set e 0.0
+set inc 87.9
+set omega 0.0
+
+# Ku-band, but presume high elevation angle for terminals.
+set coverage_angle 50.0
+
+# compute period of orbit
+set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)]
+
+
+satellites GV_BEGIN
+for {set j 0} {$j < $NUM_PLANES} {incr j} {
+	set Omega [expr $j * $INTERPLANE_SPACING]
+	for {set i 0} {$i < $SATS_PER_PLANE} {incr i} {
+		if { $j % 2 == 0} {
+			set plane_offset 0
+		} else {
+			set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0]
+		}
+		set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset]
+		set n [satellites LOAD $a $e $inc $Omega $omega $T "OneWeb ($j, $i)"]
+		if {$i > 0} {satellites ORBIT_SET $n 0}
+	}
+}
+satellites GV_END
+
diff --git a/data/orbcomm.tcl b/data/orbcomm.tcl
index ca318c9..95f7d49 100644
--- a/data/orbcomm.tcl
+++ b/data/orbcomm.tcl
@@ -28,9 +28,9 @@
 # over time; the phasing here is not optimal.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: orbcomm.tcl,v 1.9 2008/12/28 15:29:55 lloydwood Exp $
+# $Id: orbcomm.tcl,v 1.10 2015/08/31 01:29:33 lloydwood Exp $
 
 
 # for main rosette constellation only
diff --git a/data/orblink.tcl b/data/orblink.tcl
index 07bdcf4..9a0c938 100644
--- a/data/orblink.tcl
+++ b/data/orblink.tcl
@@ -1,5 +1,5 @@
 #
-# * NON-GEOSTATIONARY EQUATORIAL-RING PROPOSALS
+# * NON-GEOSTATIONARY EQUATORIAL RING - PROPOSAL
 # *
 # * Orblink
 # *
@@ -20,9 +20,9 @@
 # * 25 September 1997.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: orblink.tcl,v 1.8 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: orblink.tcl,v 1.10 2015/08/31 01:29:33 lloydwood Exp $
 
 set NUM_SATS 7
 
diff --git a/data/rapideye.tcl b/data/rapideye.tcl
index b8a50eb..be44ffc 100644
--- a/data/rapideye.tcl
+++ b/data/rapideye.tcl
@@ -16,7 +16,7 @@
 # *
 # * See also http://www.rapideye.de/.
 #
-# $Id: rapideye.tcl,v 1.7 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: rapideye.tcl,v 1.8 2015/01/15 23:03:13 lloydwood Exp $
 
 # sun-synchronous, so turn on sunlight
 upvar #0 sun_flag sun_flag
@@ -44,7 +44,7 @@ set coverage_angle 86.82
 # set coverage_angle_flag 1
 # puts stderr "\n\nSaVi: half-cone coverage angle of $coverage_angle deg shows extent of RapidEye imaging swath."
 
-puts stderr "SaVi: imaging swath shown. Set mask angle to zero for limits of communications connectivity."
+puts stderr "\nSaVi: imaging swath shown. Set mask angle to zero for limits of communications connectivity."
 
 set SATS_PER_PLANE 5
 
diff --git a/data/sirius-radio.tcl b/data/sirius-radio.tcl
index e22011c..8099434 100644
--- a/data/sirius-radio.tcl
+++ b/data/sirius-radio.tcl
@@ -1,4 +1,6 @@
 #
+# * ELLIPTICAL SYSTEMS
+# *
 # * Sirius Radio
 # *
 # * A three-satellite Molnya-like constellation which uses modified
@@ -12,9 +14,9 @@
 # * See http://www.sirius.com/.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: sirius-radio.tcl,v 1.12 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: sirius-radio.tcl,v 1.14 2015/08/31 01:29:33 lloydwood Exp $
 
 # information from 'mission overview' Acrobat pdf handout found at:
 # http://www.ilslaunch.com/launch_schedules/overviews/sirius2.pdf
diff --git a/data/skybridge-64.tcl b/data/skybridge-64.tcl
index b00b790..fedb2b2 100644
--- a/data/skybridge-64.tcl
+++ b/data/skybridge-64.tcl
@@ -14,8 +14,10 @@
 # *
 # * The aim of having two overlapping synchronised rosettes was to give
 # * frequency sharing with satellites in GEO. The idea was that when
-# * one Skybridge satellite was too near to the centre of a GEO
-# * satellite's footprint, service could be provided by its neightbour.
+# * one Skybridge satellite was too near in the sky to the equatorial
+# * belt and to a geostationary satellite, service could be provided
+# * by its slightly-more-distant neighbour. This can be demonstrated
+# * by showing the equatorial exclusion zone.
 # *
 # * See:
 # *  the SkyBridge FCC application, 28 February 1997, pp. 27-31.
@@ -26,9 +28,9 @@
 # http://www.patentstorm.us/patents/6032902.html
 
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: skybridge-64.tcl,v 1.10 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: skybridge-64.tcl,v 1.14 2015/08/31 01:29:33 lloydwood Exp $
 
 
 
@@ -59,6 +61,10 @@ set inc 55
 set omega 0.0
 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)]
 
+puts stderr "\nSaVi: showing Skybridge's equatorial exclusion zone."
+upvar #0 plane_flag plane_flag
+set plane_flag 1
+
 satellites GV_BEGIN
 
 # outer loop for both sub-constellations
@@ -67,7 +73,7 @@ for {set k 0} {$k < $NUM_CONSTS} {incr k} {
    for {set j 0} {$j < $NUM_PLANES} {incr j} {
 
         set Omega [expr $j * 45.0 + $k * $LONG_OFFSET ]
-        set plane_offset [expr $T_per / 360.0 * $j * -33.75 + $k * $LAT_OFFSET ]
+        set plane_offset [expr $T_per / 360.0 * ($j * -33.75 + $k * $LAT_OFFSET) ]
 
         for {set i 0} {$i < $SATS_PER_PLANE} {incr i} {
 
diff --git a/data/spaceway-ngso.tcl b/data/spaceway-ngso.tcl
index 8cee31b..36e6f20 100644
--- a/data/spaceway-ngso.tcl
+++ b/data/spaceway-ngso.tcl
@@ -11,9 +11,9 @@
 # sats in that plane, which is ideal for coverage. Just like ICO.
 #
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: spaceway-ngso.tcl,v 1.8 2008/12/29 02:08:40 lloydwood Exp $
+# $Id: spaceway-ngso.tcl,v 1.9 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 5
 set NUM_PLANES 4
diff --git a/data/teledesic-288.tcl b/data/teledesic-288.tcl
index 0f5be85..c6a53ac 100644
--- a/data/teledesic-288.tcl
+++ b/data/teledesic-288.tcl
@@ -20,9 +20,9 @@
 # * the company developing the smaller MEO ICO system.
 # 
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: teledesic-288.tcl,v 1.9 2011/04/27 09:02:38 lloydwood Exp $
+# $Id: teledesic-288.tcl,v 1.10 2015/08/31 01:29:33 lloydwood Exp $
 
 
 # note that planes would not be as clearly offset in reality;
diff --git a/data/tundra.tcl b/data/tundra.tcl
index 2c79bf9..3637168 100644
--- a/data/tundra.tcl
+++ b/data/tundra.tcl
@@ -1,6 +1,8 @@
 #
 # * THEORETICAL CONSTELLATIONS
 # *
+# * ELLIPTICAL SYSTEMS
+# *
 # * Tundra high-latitude coverage - compare with similar Soviet Molnya.
 # *
 # * Highly-elliptical orbits useful near apogee.
@@ -11,11 +13,11 @@
 # * Information from 'Satellite Communication Systems', Maral and
 # * Bousquet, 2nd/3rd edition, chapter 7; values are set to match
 # * Figure 7.13.
-#
+# *
 # this script for SaVi by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 #
-# $Id: tundra.tcl,v 1.12 2011/07/18 14:44:46 lloydwood Exp $
+# $Id: tundra.tcl,v 1.16 2015/08/31 01:29:33 lloydwood Exp $
 
 
 # setup orbital elements
@@ -38,6 +40,14 @@ set apogee_altitude [expr ($sma*(1+$e)-$RADIUS_OF_EARTH)]
 
 set a $sma
 
+# * Setting minimum transmission altitude to 40,000 km works well
+# * to turn off transmission away from apogee with some overlap.
+# *
+# * savi -min-transmit-altitude 40000
+# or uncomment:
+# set min_transmit_altitude 40000
+
+
 # inclination must be  63.435 (stationary apogee in northern hemisphere)
 #                  or -63.435 (stationary apogee in southern hemisphere)
 set inc 63.435
diff --git a/data/us-patent-6726152-boeing.tcl b/data/us-patent-6726152-boeing.tcl
index f621a82..31f2369 100644
--- a/data/us-patent-6726152-boeing.tcl
+++ b/data/us-patent-6726152-boeing.tcl
@@ -11,9 +11,9 @@
 # harmonic you might expect.
 #
 # this script for SaVi 1.2, by Lloyd Wood (lloydwood at users.sourceforge.net)
-# http://www.ee.surrey.ac.uk/Personal/L.Wood/constellations/
+# http://personal.ee.surrey.ac.uk/Personal/L.Wood/constellations/
 #
-# $Id: us-patent-6726152-boeing.tcl,v 1.4 2009/02/25 11:04:10 lloydwood Exp $
+# $Id: us-patent-6726152-boeing.tcl,v 1.5 2015/08/31 01:29:33 lloydwood Exp $
 
 set SATS_PER_PLANE 5
 set NUM_PLANES 4
diff --git a/manual/images/savi-fisheye.png b/manual/images/savi-fisheye.png
index dcce897..5f235f9 100644
Binary files a/manual/images/savi-fisheye.png and b/manual/images/savi-fisheye.png differ
diff --git a/manual/index.html b/manual/index.html
index 8bdfb35..6eb7f37 100644
--- a/manual/index.html
+++ b/manual/index.html
@@ -1,7 +1,7 @@
 <html>
 <head>
 <title>SaVi satellite constellation visualization - user manual</title>
-<!-- $Id: index.html,v 1.55 2013/05/05 05:37:01 lloydwood Exp $ -->
+<!-- $Id: index.html,v 1.60 2014/12/26 14:18:13 lloydwood Exp $ -->
 <link rel="icon" href="images/savi-spot.png" TYPE="image/png">
 </head>
 <style type="text/css" media="screen, projection">
@@ -67,7 +67,7 @@ for <i>SaVi</i></a> are also given.</li>
 
 <p>
 <b>Further information on <em>SaVi</em> is available on the web at
-<a href="http://savi.sourceforge.net/">http://savi.sourceforge.net/</a> and <a href="http://info.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/">http://info.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/</a>.</b>
+<a href="http://savi.sourceforge.net/">http://savi.sourceforge.net/</a> and <a href="http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/">http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/</a>.</b>
 </p>
 
 <p>
@@ -303,17 +303,23 @@ A number of different map projections can be chosen:
 </p>
 
 <ul>
-<li>The default unprojected view is most useful for saving maps in to show
-to others, and for sending texturemaps to <i>Geomview</i>. The texturemapping feature
-is controlled from the coverage panel's <b>Rendering</b> menu.</li>
-<li>The cylindrical map shows high latitudes and poles less clearly than the
-unprojected view does. This map can also be sent to Geomview.</li>
-<li>The sinusoidal views may be of use for examining coverage in the map centers.</li>
-<li>The spherical views are a poor substitute for running <i>Geomview</i>,
+<li>The <b>unprojected land/sea</b> map is colorful, matching and enhancing <i>Geomview</i>'s simple static world map.</li>
+<li>The default <b>unprojected</b> map is most useful for examining coverage, and for saving maps in to show to others.</li>
+<li>The <b>cylindrical</b> map shows high latitudes and poles less clearly than the
+unprojected view does.</li>
+<li>The <b>sinusoidal</b> views may be of use for examining coverage in the map centers.</li>
+<li>The <b>spherical</b> views are a poor substitute for running <i>Geomview</i>,
 to gain an idea of 'real' coverage on a globe.</li>
 </ul>
 
 <p>
+The unprojected views and the cylindrical view can send their maps as
+texturemaps to <i>Geomview</i> to draw on the world sphere in its camera.
+This texturemapping feature is controlled from the coverage panel's
+<b>Rendering</b> menu.
+</p>
+
+<p>
 Clicking in the map sets coordinates that are passed to the fisheye window,
 and can then be selected in that window to replace the current coordinates in use.
 This is a two-step process to prevent stray clicks from inadvertently changing
@@ -389,7 +395,9 @@ The playbar is repeated at the bottom of this window for convenience.
 
 <p>
 The fisheye window shows a view of the sky looking upwards from the ground, with the
-horizon around the outside of the circle. North is to the top of the fisheye. The
+horizon around the outside of the circle. North is to the top of the fisheye. East is
+to the left, unless the 'Reverse fisheye view' option is chosen, since this is looking
+up. The
 default location is at zero point (zero longitude, zero latitude, zero altitude,
 floating on the sea just off the coast of Africa).
 </p>
@@ -414,6 +422,13 @@ accurate time-in-view estimates.
 </p>
 
 <p>
+The equatorial geostationary arc can be drawn along with selected latitude markers,
+or parallels. These parallels default to 3.5 degrees of latitude, which is the limit
+of the geostationary exclusion zone, where frequencies used by geostationary satellites
+cannot be reused by other satellites, to prevent interference.
+</p>
+
+<p>
 <i>Enter new coordinates</i> updates the fisheye to use the values in the white
 text boxes, which will be copied to the actual coordinates shown higher up in the fisheye panel.
 Use this feature to determine how many satellites are visible from a selected point
diff --git a/maps/Makefile b/maps/Makefile
index 4612977..47bd124 100644
--- a/maps/Makefile
+++ b/maps/Makefile
@@ -1,13 +1,14 @@
 #
 # Makefile - SaVi maps directory. Run top-level Makefile instead.
 #
-# $Id: Makefile,v 1.6 2008/12/30 16:32:22 lloydwood Exp $
+# $Id: Makefile,v 1.7 2014/12/24 16:17:55 lloydwood Exp $
 
        SHELL = /bin/sh
           RM = /bin/rm -f
 
   OTHER_SRCS = world.cyl.pbm world1024.cyl.pbm \
 	       world.unp.pbm world1024.unp.pbm \
+	       world-mask.unp.pbm world-mask1024.unp.pbm \
 	       world.sph.pbm world1024.sph.pbm \
 	       world90W.sph.pbm world90W1024.sph.pbm \
 	       world.sinu.pbm world1024.sinu.pbm \
diff --git a/maps/world-mask.unp.pbm b/maps/world-mask.unp.pbm
new file mode 100644
index 0000000..e7467d9
Binary files /dev/null and b/maps/world-mask.unp.pbm differ
diff --git a/maps/world-mask1024.unp.pbm b/maps/world-mask1024.unp.pbm
new file mode 100644
index 0000000..d4f2e22
Binary files /dev/null and b/maps/world-mask1024.unp.pbm differ
diff --git a/oogl/Makefile b/oogl/Makefile
index dfe7981..e9456df 100644
--- a/oogl/Makefile
+++ b/oogl/Makefile
@@ -1,7 +1,7 @@
 #
 # Makefile - savi oogl directory. Run top-level Makefile instead.
 #
-# $Id: Makefile,v 1.11 2011/04/26 20:41:31 lloydwood Exp $
+# $Id: Makefile,v 1.12 2015/12/15 12:35:10 lloydwood Exp $
 
         SHELL = /bin/sh
            RM = /bin/rm -f
@@ -24,4 +24,4 @@ tarfilelist:
 	@srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \
 	for i in $$srcs ; do \
 	  echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \
-	done
\ No newline at end of file
+	done
diff --git a/oogl/earth.oogl b/oogl/earth.oogl
index c403e3b..53766ff 100644
--- a/oogl/earth.oogl
+++ b/oogl/earth.oogl
@@ -1,4 +1,4 @@
-# $Id: earth.oogl,v 1.4 2005/01/27 14:09:38 lloydwood Exp $
+# $Id: earth.oogl,v 1.5 2015/12/15 12:35:10 lloydwood Exp $
 
 appearance {
 	material { diffuse 0.839 1.000 0.461 }
@@ -17,3 +17,6 @@ appearance {
 	}
 }
 {: numesh_h }
+
+# STSPHERE RECTANGULAR 1 0 0 0
+# only works with Geomview 1.9.0 or later.
diff --git a/oogl/savi.oogl b/oogl/savi.oogl
index 06761ba..2446772 100644
--- a/oogl/savi.oogl
+++ b/oogl/savi.oogl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 # This file is part of SaVi.  SaVi is free software;
 # you can redistribute it and/or modify it only under
@@ -23,7 +23,7 @@
 # General description - axes, planes, coverage, satellites.
 # Loads in always-available vector Earth description.
 #
-# $Id: savi.oogl,v 1.23 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: savi.oogl,v 1.26 2016/01/09 04:21:17 lloydwood Exp $
 
 (progn
   (normalization allgeoms none)
diff --git a/savi b/savi
index 60cdcd7..6fd55c2 100755
--- a/savi
+++ b/savi
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2012 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # Script that is always used to launch the binary SaVi executable
 #
-# $Id: savi,v 1.70 2012/03/25 09:06:46 lloydwood Exp $
+# $Id: savi,v 1.76 2016/01/24 19:24:39 lloydwood Exp $
 
 #
 # If SAVI environment variable is not defined
@@ -61,8 +61,18 @@ fi
 if [ ! -d "$TK_LIBRARY" ]; then
   TCL_LIBRARY=/usr/local/lib/tcl8.5
   TK_LIBRARY=/usr/local/lib/tk8.5
+fi
+
+if [ ! -d "$TK_LIBRARY" ]; then
+  TCL_LIBRARY=/usr/lib/tcl8.6
+  TK_LIBRARY=/usr/lib/tk8.6
+fi
+
+if [ ! -d "$TK_LIBRARY" ]; then
+  TCL_LIBRARY=/usr/local/lib/tcl8.6
+  TK_LIBRARY=/usr/local/lib/tk8.6
 
-  if [ ! -d "$TK_LIBRARY" ]; then
+    if [ ! -d "$TK_LIBRARY" ]; then
     # Mandriva One 2010
     TCL_LIBRARY=/usr/include
     TK_LIBRARY=/usr/include
@@ -75,6 +85,8 @@ fi
 #
 params=""
 
+# start messages on clean line
+echo
 
 #
 # Check for known machine types
@@ -190,7 +202,6 @@ NOTFOUND=no
 COMPLAIN=no
 MAKEFILE=no
 
-SAVIBIN="${SAVI}/${SAVIBIN}"
 #
 # Try specific binary, then default to filename without extension
 #
@@ -272,7 +283,7 @@ OLDCWD=`pwd`; export OLDCWD
 # placed elsewhere, then uncomment and edit the following line to reset SAVI to
 # that other tree location.
 # SAVI=/usr/share/savi
-# This is required by Debian packagers.
+# This was implemented for Debian packagers.
 
 #
 # Change directory
@@ -294,4 +305,4 @@ else
   echo "(setenv SAVI \"$SAVI\")"
 fi
 
-exec ${SAVIBIN} $* ${params}
+exec "$OLDCWD/${SAVIBIN}" $* ${params}
diff --git a/src/Makefile_defs_cygwin b/src/Makefile_defs_cygwin
index 7b2899d..ec014eb 100644
--- a/src/Makefile_defs_cygwin
+++ b/src/Makefile_defs_cygwin
@@ -1,11 +1,9 @@
 #
 # Makefile_defs_cygwin
-# Definitions which work for a Windows/cygwin system running Tcl/Tk 8.5.
-# Insight Tcl/Tk was replaced in Cygwin October 2011 by a more conventional
-# unix port.
-#
 # Definitions which work for a Windows/cygwin system:
 # http://www.cygwin.com/
+# A conventional unix port of Tcl/Tk 8.5 replaced Cygwin's Insight Tcl/Tk 8.4
+# in October 2011 - the older cygwin84 Makefile.
 #
 # Always run make ARCH=platform from the top-level savi directory.
 #
@@ -23,7 +21,7 @@
 # X11 binaries are only needed if Geomview is installed. See:
 # http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/building-under-Windows/
 #
-# $Id: Makefile_defs_cygwin,v 1.9 2012/02/19 12:36:55 lloydwood Exp $
+# $Id: Makefile_defs_cygwin,v 1.10 2013/07/09 04:44:28 lloydwood Exp $
 
 
 ########################################################
@@ -62,7 +60,7 @@ LINEEND =
 # libtcl.a and libtk.a. Alter to suit - see above.     #
 #                                                      #
 ########################################################
-TCL_LIBS = -ltk8.5 -ltcl8.5
+TCL_LIBS = -ltk -ltcl
 
 ########################################################
 #                                                      #
diff --git a/src/Makefile_defs_linux b/src/Makefile_defs_linux
index 9aed8be..7c652d2 100644
--- a/src/Makefile_defs_linux
+++ b/src/Makefile_defs_linux
@@ -10,7 +10,7 @@
 
 # Always run make ARCH=platform from the top-level savi directory.
 #
-# $Id: Makefile_defs_linux,v 1.11 2011/04/26 20:41:31 lloydwood Exp $
+# $Id: Makefile_defs_linux,v 1.12 2015/01/11 01:55:59 lloydwood Exp $
 
 
 ########################################################
@@ -40,7 +40,10 @@ CC = gcc
 #                                                      #
 ########################################################
 
-TCL_INCLUDES = -I/usr/include/tcl8.5 -I/usr/include/tk8.5
+TCL_INCLUDES = -I/usr/include/tcl -I/usr/include/tk
+
+# Can also try:
+# TCL_INCLUDES = -I/usr/include/tcl8.5 -I/usr/include/tk8.5
 
 ########################################################
 #                                                      #
@@ -51,10 +54,10 @@ TCL_INCLUDES = -I/usr/include/tcl8.5 -I/usr/include/tk8.5
 # Debian requires a dot here: -ltcl8.4 -ltk8.4
 # as does Red Hat Enterprise.
 
-TCL_LIBS = -ltcl8.5 -ltk8.5
+TCL_LIBS = -ltcl -ltk
 
-# TCL_LIBS = -ltcl -ltk
-# is a generic alternative to try.
+# Can also try instead:
+# TCL_LIBS = -ltcl8.5 -ltk8.5
 
 #######################################################
 #                                                      #
diff --git a/src/Makefile_defs_macosx b/src/Makefile_defs_macosx
index 4f3089e..49cd8d3 100644
--- a/src/Makefile_defs_macosx
+++ b/src/Makefile_defs_macosx
@@ -5,7 +5,7 @@
 #
 # Always run make ARCH=platform from the top-level savi directory.
 #
-# $Id: Makefile_defs_macosx,v 1.6 2011/04/26 20:41:31 lloydwood Exp $
+# $Id: Makefile_defs_macosx,v 1.7 2014/11/30 12:45:40 lloydwood Exp $
 
 
 ########################################################
@@ -36,7 +36,9 @@ CC = gcc
 # match.                                               #
 #                                                      #
 ########################################################
-TCL_INCLUDES =
+# XQuartz installs Xlib headers here
+# - needed on Mac OS X 10.9 and later.
+TCL_INCLUDES = -I/opt/X11/include
 
 ########################################################
 #                                                      #
diff --git a/src/Makefile_defs_ubuntu b/src/Makefile_defs_ubuntu
index e4b5f21..706e54c 100644
--- a/src/Makefile_defs_ubuntu
+++ b/src/Makefile_defs_ubuntu
@@ -2,13 +2,14 @@
 # Makefile_defs_ubuntu
 #
 # Definitions which work for a Ubuntu (Debian derivative) linux system.
-# Last tested with Ubuntu 10.04.
+# Last tested with Ubuntu 14, which upgrades Tcl/Tk from 8.5 to 8.6.
 #
 # Always run make ARCH=platform from the top-level savi directory.
 #
-# Ubuntu includes gcc by default, but not standard C library
+# Ubuntu includes gcc by default, but not always standard C library
 # header files or Tcl/Tk and the Tcl/Tk header files for compiling
-# programs. Install those before compiling SaVi.
+# programs. Install those before compiling SaVi, by e.g.:
+# sudo apt-get install tk-dev
 #
 # zlib also needs to be installed if -lz is to be used.
 #
@@ -16,7 +17,7 @@
 # sudo apt-get install build-essentials tcl tk tcl-dev tk-dev zlib1g-dev
 # make ARCH=ubuntu
 #
-# $Id: Makefile_defs_ubuntu,v 1.6 2011/04/26 20:41:31 lloydwood Exp $
+# $Id: Makefile_defs_ubuntu,v 1.8 2015/01/14 23:11:40 lloydwood Exp $
 
 
 ########################################################
@@ -45,7 +46,10 @@ CC = gcc
 # match.                                               #
 #                                                      #
 ########################################################
-TCL_INCLUDES = -I/usr/include/tcl8.5 -I/usr/include/tk8.5
+TCL_INCLUDES = -I/usr/include/tcl8.6 -I/usr/include/tk8.6
+
+# TCL_INCLUDES = -I/usr/include/tcl -I/usr/include/tk
+# is a generic alternative to try.
 
 ########################################################
 #                                                      #
@@ -53,10 +57,10 @@ TCL_INCLUDES = -I/usr/include/tcl8.5 -I/usr/include/tk8.5
 # libtcl.a and libtk.a. Alter to suit - see above.     #
 #                                                      #
 ########################################################
-# Debian requires a dot here: -ltcl8.4 -ltk8.4
+# Debian variants, including Ubuntu, require a dot here: -ltcl8.4 -ltk8.4
 # as does Red Hat Enterprise.
 
-TCL_LIBS = -ltcl8.5 -ltk8.5
+TCL_LIBS = -ltcl8.6 -ltk8.6
 
 # TCL_LIBS = -ltcl -ltk
 # is a generic alternative to try.
diff --git a/src/Satellite.c b/src/Satellite.c
index 572edd3..07ebd65 100644
--- a/src/Satellite.c
+++ b/src/Satellite.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * Routines for Satellite object
  *
- * $Id: Satellite.c,v 1.17 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: Satellite.c,v 1.20 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include <string.h>
diff --git a/src/axes.c b/src/axes.c
index cd3f851..07f43fb 100644
--- a/src/axes.c
+++ b/src/axes.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * axes.c
  *
- * $Id: axes.c,v 1.17 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: axes.c,v 1.20 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdlib.h>
 
diff --git a/src/cones.c b/src/cones.c
index efc5da4..4bd74ce 100644
--- a/src/cones.c
+++ b/src/cones.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * routines for cones in Geomview
  *
- * $Id: cones.c,v 1.33 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: cones.c,v 1.40 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <stdlib.h>
@@ -225,11 +225,10 @@ cone_size(double *radius, double *height, const Satellite s, const
 	  Constellation * pconstellation)
 {
   CentralBody *pcb = pconstellation->pcb;
-  double r, theta, c, si, temp;
+  double a, r, theta, c, si, temp;
 
-  r = s->x_S.r / pcb->radius;
-  if (r <= 1.0) {
-    /* satellite inside central body! */
+  a = s->x_S.r - pcb->radius;
+  if (a <= min_transmit_altitude) {
     *radius = 0;
     *height = 0;
     return;
@@ -239,6 +238,8 @@ cone_size(double *radius, double *height, const Satellite s, const
   theta = coverage_angle * DEG_TO_RAD;
   c = cos(theta);
   si = sin(theta);
+  r = s->x_S.r / pcb->radius;
+
   if (MASK_ELEVATION == get_coverage_type()) {
     temp = sqrt(r * r - c * c);
     *radius = c * (temp - si) / r;
diff --git a/src/coverage.c b/src/coverage.c
index a36602c..179f73a 100644
--- a/src/coverage.c
+++ b/src/coverage.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -21,7 +21,7 @@
  *
  * coverage.c
  *
- * $Id: coverage.c,v 1.41 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: coverage.c,v 1.46 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <math.h>
 #include <stdlib.h>
@@ -91,6 +91,10 @@ coverage_on_cmd(int argc, char *argv[])
   CentralBody *pcb;
   Satellite_list sl;
 
+  if (Image_Height * Image_Width <= 0) {
+      return EMPTY_str;
+  }
+
   /* do memory allocations and initialize display first time only */
   if (!c_grid) {
     c_grid = create_grid(Image_Height, Image_Width);
@@ -207,6 +211,8 @@ map_on_cmd(int argc, char *argv[])
     update_coverage_display();
   }
 
+  redraw_earth(argc, argv);
+
   return EMPTY_str;
 }
 
@@ -219,6 +225,8 @@ map_off_cmd(int argc, char *argv[])
     update_coverage_display();
   }
 
+  redraw_earth(argc, argv);
+
   return EMPTY_str;
 }
 
@@ -368,6 +376,11 @@ get_coverage_type()
   return coverage_type;
 }
 
+int
+get_map_flag()
+{
+  return map_flag;
+}
 
 /*
  * Clear current coverage completely
diff --git a/src/coverage_vis.c b/src/coverage_vis.c
index d1f92fd..f6dc00d 100644
--- a/src/coverage_vis.c
+++ b/src/coverage_vis.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * Coverage visualization routines.
  *
- * $Id: coverage_vis.c,v 1.120 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: coverage_vis.c,v 1.134 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include <math.h>
@@ -75,15 +75,6 @@ static const char format2[] =
 
 static void write_image_as_ppm(FILE *f);
 
-#define LENGTH_APPEARANCE_FILE 1024
-#define LENGTH_LINE 128
-static char dynamic_description[LENGTH_APPEARANCE_FILE];
-static char static_description[LENGTH_APPEARANCE_FILE];
-static char temp_scratchfile[LENGTH_STRING_BUFFER];
-
-static void append_file_suffix(char * filename);
-static char * append_string(char * string, const char * add);
-
 #ifndef NO_ZLIB
 /* used only in this file */
 static int gzip_compress2(Bytef *dest, uLongf *destLen,
@@ -96,8 +87,6 @@ static void write_image_to_file_gz(char *name);
 static void * image_compress_scratch = NULL;
 #endif /* NO_ZLIB */
 
-static int coverage_dynamic_disk_initialised(void);
-
 static void set_coverage(int projection, grid *g);
 
 static int reset_map_foreground(const unsigned char * map_pointer,
@@ -125,7 +114,7 @@ static unsigned char colors[60];
 static unsigned char noaccess_colors[60];
 
 /* Color for earth outline and ground track - see enum in coverage_vis.h */
-static unsigned char outline_colors[] = { 0, 0, 0,  /* background */
+static unsigned char outline_colors[] = { 255, 255, 255,  /* background */
 					  0, 0, 0,	 /* earth outline */
 					  0, 255, 0,    /* projected ground track */
 					  255, 0, 255, /* selected ground track */
@@ -144,6 +133,7 @@ static unsigned char * cyl_foreground;
 static unsigned char * sin_foreground;
 static unsigned char * sin_90_foreground;
 static unsigned char * unp_foreground;
+static unsigned char * unp_mask_foreground;
 static unsigned char * sph_foreground;
 static unsigned char * sph_90_foreground;
 
@@ -268,6 +258,11 @@ image_init(grid * g)
   width = g->width;
   image_size = height * width;
 
+  if (image_size <= 0) {
+     error("image size must be greater than zero.");
+     return;
+  }
+
   image = (Tk_PhotoImageBlock *) malloc(sizeof(Tk_PhotoImageBlock));
   image->pixelPtr = (unsigned char *) malloc(image_size * PIXELSIZE *
 					     sizeof(unsigned char *));
@@ -286,6 +281,7 @@ image_init(grid * g)
     sin_foreground = (unsigned char *) malloc(sizeof(char) * image_size);
     sin_90_foreground = (unsigned char *) malloc(sizeof(char) * image_size);
     unp_foreground = (unsigned char *) malloc(sizeof(char) * image_size);
+    unp_mask_foreground = (unsigned char *) malloc(sizeof(char) * image_size);
     sph_foreground = (unsigned char *) malloc(sizeof(char) * image_size);
     sph_90_foreground = (unsigned char *) malloc(sizeof(char) * image_size);
 
@@ -310,6 +306,11 @@ image_init(grid * g)
 	free(unp_foreground);
 	unp_foreground = NULL;
       }
+      made = overlay_bitmap(height, width, unp_mask_foreground, UNPROJECTED_MASK_LARGE_BITMAP_NAME);
+      if (!made) {
+	free(unp_mask_foreground);
+	unp_mask_foreground = NULL;
+      }
       made = overlay_bitmap(height, width, sph_foreground, SPHERICAL_LARGE_BITMAP_NAME);
       if (!made) {
 	free(sph_foreground);
@@ -342,6 +343,11 @@ image_init(grid * g)
 	free(unp_foreground);
 	unp_foreground = NULL;
       }
+      made = overlay_bitmap(height, width, unp_mask_foreground, UNPROJECTED_MASK_BITMAP_NAME);
+      if (!made) {
+	free(unp_mask_foreground);
+	unp_mask_foreground = NULL;
+      }
       made = overlay_bitmap(height, width, sph_foreground, SPHERICAL_BITMAP_NAME);
       if (!made) {
 	free(sph_foreground);
@@ -586,40 +592,9 @@ coverage_output_image(void)
     } else {
       write_image_to_stream();
     }
-  } else {
-    if (geomview_compressed_images) {
-#ifndef NO_ZLIB
-      write_image_to_file_gz(temp_scratchfile);
-#else
-      error("geomview_compressed_images was set wrongly. Not sending image.");
-#endif
-    } else {
-      write_image_to_file(temp_scratchfile);
-    }
-    coverage_send_scratchfile();
   }
 }
 
-static void
-append_file_suffix(char * filename) {
-  char * string;
-
-  string = filename + strlen(filename);
-
-  if (geomview_compressed_images) {
-    strcpy(string,"-savi.ppm.gz");
-  } else {
-    strcpy(string,"-savi.ppm");
-  }
-}
-
-static char *
-append_string(char * string, const char * add)
-{
-  strcpy(string, add);
-  return(string + strlen(add));
-}
-
 int
 coverage_dynamic_initialised(void)
 {
@@ -648,127 +623,7 @@ coverage_dynamic_initialised(void)
     return(TRUE);
   }
 
-  return(coverage_dynamic_disk_initialised());
-}
-
-static int
-coverage_dynamic_disk_initialised(void)
-{
-  char line[LENGTH_LINE];
-  const char name[] = "oogl/earth.oogl";
-  const char fallback_tmpnam[] = "coverage";
-  const char static_name[] = "oogl/Earth.ppm.Z";
-  const char file_separator[] = "/";
-  const char file_start[] = "file \"";
-  const char file_end[] = "\"\n";
-  char *dynamic_description_end, *static_description_end, *string, *path;
-  const char null_char = 0;
-  const char tab_char = 9;
-  const char space_char = 32;
-  const char comment_char = 35; /* # */
-  unsigned int replaced = 0;
-  unsigned int add_static_length = 0;
-  unsigned int add_dynamic_length = 0;
-  unsigned int incr_length;
-  FILE *f, *g;
-
-  if (NULL == (f = fopen(name, "r"))) {
-    fprintf(stderr,"\nSaVi: unable to open texturemap description %s", name);
-    return(FALSE);
-  }
-
-  string = tmpnam(NULL);
-  strcpy(temp_scratchfile, string);
-  append_file_suffix(temp_scratchfile);
-
-  if (NULL == (g = fopen(temp_scratchfile, "wb+"))) {
-    fprintf(stderr,"\nSaVi: couldn't open assigned tempfile %s", temp_scratchfile);
-    path = getenv("HOME");
-    if (!path) {
-      error("couldn't learn home directory $HOME for fallback scratchfile");
-      return(FALSE);
-    }
-    if (strlen(path) > LENGTH_STRING_BUFFER - 16) {
-      error("pathname of home directory $HOME too long to store.");
-      return(FALSE);
-    }
-    string = append_string(temp_scratchfile, path);
-    string = append_string(string, file_separator);
-    string = append_string(string, fallback_tmpnam);
-    append_file_suffix(temp_scratchfile);
-    if (NULL == (g = fopen(temp_scratchfile, "wb+"))) {
-      fprintf(stderr,"\nSaVi: couldn't open fallback tempfile %s", temp_scratchfile);
-      return(FALSE);
-    }
-  }
-
-  fclose(g);
-
-  fprintf(stderr,"\nSaVi: temporary texturemap scratchfile is %s",
-	  temp_scratchfile);
-
-  dynamic_description_end = dynamic_description;
-  static_description_end = static_description;
-
-  while (fgets(line,100,f) != NULL) {
-    string = line;
-    while ((*string == space_char) || (*string == tab_char)) {
-      /* skip leading whitespace */
-      string++;
-    }
-    if ((*string == comment_char) || (*string == null_char)) {
-      /* skip comments and empty lines */
-      continue;
-    }
-    if (strstr(string,"Earth.ppm.Z")) {
-      /* replace with our file line */
-      incr_length = strlen(file_start) + strlen(temp_scratchfile) +
-	            strlen(file_end);
-      add_dynamic_length += incr_length;
-      path=getenv("SAVI");
-      incr_length = strlen(file_start) + strlen(path) + strlen(file_separator) +
-	            strlen(static_name) + strlen(file_end);
-      add_static_length += incr_length;
-      if ((add_dynamic_length > LENGTH_APPEARANCE_FILE) ||
-	  (add_static_length > LENGTH_APPEARANCE_FILE)) {
-	fprintf(stderr, "\nSaVi: tempfile pathname %s is too long to cache.",
-		temp_scratchfile);
-	return(FALSE);
-      }
-      dynamic_description_end = append_string(dynamic_description_end, file_start);
-      dynamic_description_end = append_string(dynamic_description_end, temp_scratchfile);
-      dynamic_description_end = append_string(dynamic_description_end, file_end);
-      static_description_end = append_string(static_description_end, file_start);
-      static_description_end = append_string(static_description_end, path);
-      static_description_end = append_string(static_description_end, file_separator);
-      static_description_end = append_string(static_description_end, static_name);
-      static_description_end = append_string(static_description_end, file_end);
-      replaced++;
-      continue;
-    }
-
-    incr_length = strlen(string);
-    add_dynamic_length += incr_length;
-    add_static_length += incr_length;
-
-    if ((add_static_length > LENGTH_APPEARANCE_FILE) ||
-	(add_dynamic_length > LENGTH_APPEARANCE_FILE)) {
-      fprintf(stderr, "\nSaVi: Earth appearance in %s is too long to cache.",
-	      name);
-      return(FALSE);
-    }
-
-    dynamic_description_end = append_string(dynamic_description_end, string);
-    static_description_end = append_string(static_description_end, string);
-  }
-
-  if (!replaced) {
-    fprintf(stderr, "\nSaVi: did not find file \"Earth.ppm.Z\" in %s to replace with temp file location.", name);
-  } else if (replaced > 1) {
-    fprintf(stderr, "\nSaVi: found multiple instances of file \"Earth.ppm.Z\" in %s. Problems?", name);
-  }
-
-  return(TRUE);
+  return;
 }
 
 void
@@ -779,10 +634,6 @@ coverage_dynamic_cleanup(void)
 #ifndef NO_ZLIB
       free(image_compress_scratch);
 #endif
-    } else {
-      remove(temp_scratchfile);
-      fprintf(stderr, "\nSaVi: cleaned up temporary scratchfile %s",
-	      temp_scratchfile);
     }
   }
 }
@@ -1007,6 +858,10 @@ new_foreground(int projection, grid * g, unsigned int force)
     Longitude_Center_Line = LONGITUDE_CENTER_LINE;
     coverage_bitmap_drawn = reset_map_foreground(unp_foreground, image_size);
     break;
+  case UNPROJECTED_MASK:
+    Longitude_Center_Line = LONGITUDE_CENTER_LINE;
+    coverage_bitmap_drawn = reset_map_foreground(unp_mask_foreground, image_size);
+    break;
   case SINUSOIDAL:
     Longitude_Center_Line = LONGITUDE_CENTER_LINE;
     coverage_bitmap_drawn = reset_map_foreground(sin_foreground, image_size);
@@ -1040,7 +895,7 @@ new_foreground(int projection, grid * g, unsigned int force)
 void
 grid_and_foreground_to_image(int projection, grid * g, int fgOnly)
 {
-  int drawWidth, middleWidth, projection_supported;
+  int drawWidth, middleWidth, projection_supported, skip_map;
   unsigned int w, h, i, j, offset, ci;
   unsigned int data_value, map_threshold, send_coverage;
   unsigned int sinu_surround = FALSE;
@@ -1066,7 +921,7 @@ grid_and_foreground_to_image(int projection, grid * g, int fgOnly)
   }
 
   projection_supported = (projection == CYLINDRICAL) ||
-                         ((projection == UNPROJECTED) && geomview_stream_textures);
+    (((projection == UNPROJECTED)||(projection == UNPROJECTED_MASK)) && geomview_stream_textures);
 
   send_coverage = geomview_flag && geomview_dynamic_texture_flag &&
                   texture_flag && projection_supported &&
@@ -1078,11 +933,15 @@ grid_and_foreground_to_image(int projection, grid * g, int fgOnly)
     * map outline. For 0/1, could have used || instead of MAX,
     * but MAX is clearer in intent.
     */
-  map_threshold = MAX((send_coverage && !geomview_texture_with_map), !map_flag);
 
-  fill0 = outline_colors[0];
-  fill1 = outline_colors[1];
-  fill2 = outline_colors[2];
+  skip_map = !map_flag || (projection == UNPROJECTED_MASK);
+  
+  map_threshold = MAX((send_coverage && !geomview_texture_with_map), skip_map);
+
+  /* set to match Earth outline */
+  fill0 = outline_colors[3];
+  fill1 = outline_colors[4];
+  fill2 = outline_colors[5];
 
   h = g->height;
   w = g->width;
@@ -1182,13 +1041,28 @@ grid_and_foreground_to_image(int projection, grid * g, int fgOnly)
 
       if (!fgOnly) {
 	data_value = g->data[offset + j];
-	if (data_value || !(no_access_flag || sun_flag)) {
-	  ci = MIN(data_value, NUM_COLORS);
-	  c = colors + PIXELSIZE * ci;
+
+	if (projection == UNPROJECTED_MASK) {
+	  ci = MIN(data_value + 1, NUM_COLORS);
+	  if (*(f-1) == 0) {
+              c = noaccess_colors + PIXELSIZE * ci;
+	      if (!no_access_flag && (ci == 1)) {
+	          c = outline_colors;
+	      }
+
+          } else {
+            c = colors + PIXELSIZE * ci;
+          }
 	} else {
-	  ci = MIN(g->noaccess[offset + j], NUM_COLORS);
-	  c = noaccess_colors + PIXELSIZE * ci;
+	  if (data_value || !(no_access_flag || sun_flag)) {
+	    ci = MIN(data_value, NUM_COLORS);
+	    c = colors + PIXELSIZE * ci;
+	  } else {
+	    ci = MIN(g->noaccess[offset + j], NUM_COLORS);
+	    c = noaccess_colors + PIXELSIZE * ci;
+	  }
 	}
+
 	p[0] = c[0];
 	p[1] = c[1];
 	p[2] = c[2];
@@ -1200,12 +1074,20 @@ grid_and_foreground_to_image(int projection, grid * g, int fgOnly)
     coverage_output_image();
   }
 
-  if (!map_threshold || !map_flag) {
-    /* map outline is already drawn; no need to fill in for coverage window. */
+  if (projection == UNPROJECTED_MASK) {
+    if (map_flag) {
+      f = unp_foreground;
+    } else {
+      f = foreground;
+      return; /* do not draw continents mask */
+    }
+  } else if (!map_flag) {
+    /* map outline is not needed. */
     return;
+  } else {
+    f = foreground;
   }
-
-  f = foreground;
+  
   p = image->pixelPtr;
 
   /* map outline is 1 - cache colors for that from array */
@@ -1225,18 +1107,6 @@ grid_and_foreground_to_image(int projection, grid * g, int fgOnly)
   }
 }
 
-void
-coverage_send_static_file(void)
-{
-  fprintf(gv_out, "(read geometry { define earth_h {\n %s \n} } )", static_description);
-}
-
-void
-coverage_send_scratchfile(void)
-{
-  fprintf(gv_out, "(read geometry { define earth_h {\n %s \n} } )", dynamic_description);
-}
-
 /*
  * tracks_to_foreground - place dot on the foreground map which corresponds
  * to the subsatellite point (nadir).  Do this for every satellite
@@ -1326,6 +1196,7 @@ latlon_to_grid_index(int grid_index[2], LatLon * pl, int projection, grid * g)
 
   switch (projection) {
   case UNPROJECTED:
+  case UNPROJECTED_MASK:
     project_latlon_unprojected(proj, &l);
     break;
   case SINUSOIDAL:
diff --git a/src/earth.c b/src/earth.c
index 5159475..34f2dc4 100644
--- a/src/earth.c
+++ b/src/earth.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * Routines for creating fancy earth model
  *
- * $Id: earth.c,v 1.39 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: earth.c,v 1.44 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <math.h>
@@ -92,6 +92,35 @@ earth_delete_geom(void)
 }
 
 /*
+ * create_earth
+ */
+void
+create_earth(void)
+{
+  /* coverage map checkbox determines if we draw Earth with vector map or not. */
+  if (get_map_flag()) {
+     gv_create_geom("Central_Body", "central_t", "earth_vect_texture_sphere_h");
+  } else {
+     gv_create_geom("Central_Body", "central_t", "earth_h");
+  }
+}
+
+/*
+ * redraw_earth
+ */
+void
+redraw_earth(int argc, char *argv[])
+{
+  if (earth_on_flag) {
+    char *status = EMPTY_str;
+    if (geomview_module) gv_start();
+    status = earth_off_cmd(argc, argv);
+    status = earth_on_cmd(argc, argv);
+    if (geomview_module) gv_stop();
+  }
+}
+
+/*
  * earth_on_cmd
  *
  * Displays the earth sphere, dull or detailed.
@@ -118,7 +147,7 @@ earth_on_cmd(int argc, char *argv[])
 	earth_texture_loaded = gv_sendfile("oogl/earth_texture_h.oogl");
       }
       if (geomview_stream_textures && geomview_dynamic_texture_flag) {
-	if (coverage_projection == UNPROJECTED) {
+	if ((coverage_projection == UNPROJECTED)||(coverage_projection == UNPROJECTED_MASK)) {
 	  if (debug) error("texturemap sphere, dynamic unprojected map.");
 	  gv_sendfile("oogl/earth_coverage_unp_h.oogl");
 	  redraw_coverage_display();
@@ -135,16 +164,12 @@ earth_on_cmd(int argc, char *argv[])
 	  }
 	  geomview_dynamic_coverage = FALSE;
 	}
-	if (use_fancy_earth || use_simple_earth) {
-	  gv_create_geom("Central_Body", "central_t", "earth_vect_texture_sphere_h");
-	} else {
-	  gv_create_geom("Central_Body", "central_t", "earth_h");
-	}
+	create_earth();
       } else if (use_simple_earth) {
 	/* static texture - blue and gold map */
 	if (debug) error ("texturemap sphere, simple static Earth image.\n");
 	gv_sendfile("oogl/earth_h.oogl");
-	gv_create_geom("Central_Body", "central_t", "earth_vect_texture_sphere_h");
+	create_earth();
       } else if (use_fancy_earth) {
 	/* static texture - detailed texturemap */
 	if (debug) error ("texturemap sphere, detailed static Earth image.\n");
@@ -153,7 +178,7 @@ earth_on_cmd(int argc, char *argv[])
 	  error("Detailed Earth map requires later Geomview. Please upgrade.");
 	}
 	gv_sendfile("oogl/earth_fancy_h.oogl");
-	gv_create_geom("Central_Body", "central_t", "earth_vect_texture_sphere_h");
+	create_earth();
       } else {
 	if (debug) error ("texturemap sphere, do not draw detailed Earth.\n");
 	if (geomview_dynamic_coverage) {
@@ -166,14 +191,7 @@ earth_on_cmd(int argc, char *argv[])
       }
     } else if (earth_on_flag) {
       /* no texturing */
-      if (use_fancy_earth || use_simple_earth) {
-	if (debug) error ("ordinary sphere, detailed vector Earth.\n");
-        earth_texture_loaded = gv_sendfile("oogl/earth_vect_h.oogl");
-        gv_create_geom("Central_Body", "central_t", "earth_vect_sphere_h");
-      } else {
-        if (debug) error ("ordinary sphere.");
-        gv_create_geom("Central_Body", "central_t", "unit_sphere_h");
-      }
+      create_earth();
     }
     gv_stop();
   }
@@ -219,7 +237,6 @@ earth_off_cmd(int argc, char *argv[])
   return status;
 }
 
-
 /*
  * simple_on_cmd
  *
@@ -271,12 +288,7 @@ simple_off_cmd(int argc, char *argv[])
 
   use_simple_earth = FALSE;
 
-  if (earth_on_flag) {
-    if (geomview_module) gv_start();
-    status = earth_off_cmd(argc, argv);
-    status = earth_on_cmd(argc, argv);
-    if (geomview_module) gv_stop();
-  }
+  redraw_earth(argc, argv);
 
   return status;
 }
@@ -337,12 +349,7 @@ fancy_off_cmd(int argc, char *argv[])
 
   use_fancy_earth = FALSE;
 
-  if (earth_on_flag) {
-    if (geomview_module) gv_start();
-    status = earth_off_cmd(argc, argv);
-    status = earth_on_cmd(argc, argv);
-    if (geomview_module) gv_stop();
-  }
+  redraw_earth(argc, argv);
 
   return status;
 }
@@ -361,12 +368,7 @@ texture_on_cmd(int argc, char *argv[])
 
   texture_flag = TRUE;
 
-  if (earth_on_flag) {
-    if (geomview_module) gv_start();
-    status = earth_off_cmd(argc, argv);
-    status = earth_on_cmd(argc, argv);
-    if (geomview_module) gv_stop();
-  }
+  redraw_earth(argc, argv);
 
   return status;
 }
@@ -385,12 +387,7 @@ texture_off_cmd(int argc, char *argv[])
 
   texture_flag = FALSE;
 
-  if (earth_on_flag) {
-    if (geomview_module) gv_start();
-    status = earth_off_cmd(argc, argv);
-    status = earth_on_cmd(argc, argv);
-    if (geomview_module) gv_stop();
-  }
+  redraw_earth(argc, argv);
 
   return status;
 }
@@ -412,11 +409,8 @@ geomview_dynamic_texture_on_cmd(int argc, char *argv[])
     geomview_dynamic_texture_flag = TRUE;
   }
 
-  if (texture_flag && earth_on_flag) {
-    if (geomview_module) gv_start();
-    status = earth_off_cmd(argc, argv);
-    status = earth_on_cmd(argc, argv);
-    if (geomview_module) gv_stop();
+  if (texture_flag) {
+    redraw_earth(argc, argv);
   }
 
   return status;
@@ -434,16 +428,8 @@ geomview_dynamic_texture_off_cmd(int argc, char *argv[])
 
   geomview_dynamic_texture_flag = FALSE;
 
-  if (geomview_module && texture_flag) {
-    if (geomview_module) gv_start();
-
-    if (earth_on_flag) {
-      /* switch back to file-based Earth */
-      status = earth_off_cmd(argc, argv);
-      status = earth_on_cmd(argc, argv);
-    }
-
-    if (geomview_module) gv_stop();
+  if (texture_flag) {
+    redraw_earth(argc, argv);
   }
 
   return status;
diff --git a/src/fisheye.c b/src/fisheye.c
index 4cb60e5..6cde4e4 100644
--- a/src/fisheye.c
+++ b/src/fisheye.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * fisheye.c
  *
- * $Id: fisheye.c,v 1.52 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: fisheye.c,v 1.60 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include <math.h>
@@ -367,15 +367,16 @@ fisheye_display(const Satellite_list SL, unsigned int force,
 
   /* plot satellite positions */
   {
-    CartesianCoordinates s;
+    CartesianCoordinates ccs;
     double sky[2];
     double t = current_time();
     double interval_time;
     Satellite_list sl = SL;
 
     unsigned int sats_visible, sats_above_mask;
-    int r, d, x, y, x_start, y_start, x_end, y_end;
+    int a, d, n, r, x, y, x_start, y_start, x_end, y_end;
     int adjust = 2;
+    int mirror = -1;
 
     sprintf(cmd,"fisheye(resize)");
     test = tcl_script(cmd);
@@ -405,6 +406,41 @@ fisheye_display(const Satellite_list SL, unsigned int force,
       sprintf(attributes, "-anchor nw -fill blue");
     }
 
+    /* display equatorial ring markers, if turned on. Unmoving, time 0. */
+    if (plane_flag) {
+      sprintf(plotStr, "purple");
+      for (n = 0; n < EQUATORIAL_MARKERS; n++) {
+      
+        oe_time_to_geocentric(&ccs, 0, &(marker[n]->oe), pcb);
+  
+        if (sat_to_fisheye(&ccs, lat, lon, pcb, 0, sky)) {
+	  if (fisheye_reverse_view_flag) {
+	    sky[0] = -sky[0];
+	  }
+	  
+          x = (int) (offset + r * sky[0]);
+	  y = (int) (offset - r * sky[1]); /* North is top of canvas */
+
+	  /* Draw parallels in dark gray. Plain gray is too light on a Mac. */
+	  if (n > 359) {
+	    sprintf(plotStr, "darkgray");
+	    if (n > 719) {
+	      mirror = -mirror;
+	    }
+	  }
+	  
+	  sprintf(cmd, "%s create line %i %i %i %i -fill %s -tags equator",
+                    fisheye_widget, x, y, x, y+mirror, plotStr);
+	  test = tcl_script(cmd);
+        }
+      }
+    }
+
+    if (debug && !test) {
+      error("Problem telling Tk to draw equator markers.");
+    }
+    
+    /* display satellites */
     while (sl) {
 
       if (!sl->s->can_display_satellite) {
@@ -412,9 +448,11 @@ fisheye_display(const Satellite_list SL, unsigned int force,
 	continue;
       }
 
-      oe_time_to_geocentric(&s, t, &(sl->s->oe), pcb);
-      if (sat_to_fisheye(&s, lat, lon, pcb, t, sky)) {
-	sats_visible++;
+      oe_time_to_geocentric(&ccs, t, &(sl->s->oe), pcb);
+      if (sat_to_fisheye(&ccs, lat, lon, pcb, t, sky)) {
+	
+        sats_visible++;
+	
 	if ((sky[0] * sky[0] + sky[1] * sky[1]) <
 	    (coverage_pct * coverage_pct)) {
 	  if (sl->s->gs_into_view == 0) {
@@ -436,9 +474,16 @@ fisheye_display(const Satellite_list SL, unsigned int force,
 	if (fisheye_reverse_view_flag) {
 	  sky[0] = -sky[0];
 	}
+
 	not_visible_to_terminal = ((coverage_type == MASK_ELEVATION) &&
 	                          (!sl->s->gs_into_view)) ||
 	                          !sl->s->can_display_coverage;
+	a = sl->s->x_S.r - pcb->radius;
+	if (a <= min_transmit_altitude) {
+	  not_visible_to_terminal = TRUE;
+	}
+
+
 	if (not_visible_to_terminal || (coverage_type != MASK_ELEVATION)) {
 	  if (fisheye_names_flag) {
 	    if (fisheye_numbers_flag) {
@@ -520,9 +565,11 @@ fisheye_display(const Satellite_list SL, unsigned int force,
 	sprintf(cmd, "%s create line %i %i %i %i -fill %s -tags crosses",
                 fisheye_widget, x_start, y, x_end, y, plotStr);
 	test = test && tcl_script(cmd);
+	
 	if (debug && !test) {
-	  error("Problem telling Tk to draw fisheye canvas crosses.");
+	  error("Problem telling Tk to draw on fisheye.");
 	}
+	
       } else {
 	sl->s->gs_into_view = 0;
 	/*
diff --git a/src/footprints.c b/src/footprints.c
index f2c53b9..d9c9c91 100644
--- a/src/footprints.c
+++ b/src/footprints.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * routines for footprints in Geomview
  *
- * $Id: footprints.c,v 1.29 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: footprints.c,v 1.36 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <stdlib.h>
@@ -233,11 +233,10 @@ footprint_size(double *radius, double *height, const Satellite s, const
 	       Constellation * pconstellation, int special)
 {
   CentralBody *pcb = pconstellation->pcb;
-  double r, theta, c, si, temp;
+  double a, r, theta, c, si, temp;
 
-  r = s->x_S.r / pcb->radius;
-  if (r <= 1.0) {
-    /* satellite inside central body! */
+  a = s->x_S.r - pcb->radius;
+  if (a <= min_transmit_altitude) {
     *radius = 0;
     *height = 0;
     return;
@@ -254,6 +253,8 @@ footprint_size(double *radius, double *height, const Satellite s, const
   }
   c = cos(theta);
   si = sin(theta);
+  r = s->x_S.r / pcb->radius;
+
   if (MASK_ELEVATION == get_coverage_type()) {
     temp = sqrt(r * r - c * c);
     *radius = c * (temp - si) / r;
diff --git a/src/globals.c b/src/globals.c
index c98d1d8..896259c 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * declaration and initialization of global variables.
  *
- * $Id: globals.c,v 1.42 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: globals.c,v 1.49 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include <limits.h>
@@ -58,6 +58,9 @@ int footprints_flag = FALSE;
 /* sunlight is turned off by default */
 int sun_flag = FALSE;
 
+/* equatorial plane is turned off by default */
+int plane_flag = FALSE;
+
 /* fisheye default is not open, and location is not plotted in coverage */
 int fisheye_viewpoint_flag = FALSE;
 
@@ -74,6 +77,7 @@ int buttons_menu = FALSE;
 unsigned char * cyl_foreground = NULL;
 unsigned char * sin_foreground = NULL;
 unsigned char * unp_foreground = NULL;
+unsigned char * unp_mask_foreground = NULL;
 
 /* presumes default cylindrical projection */
 int Longitude_Center_Line = 0;
@@ -82,6 +86,9 @@ int coverage_display_center_longitude = 0;
 /* so we know if it has been set at command line. */
 int NUM_COLORS = 0;
 
+/* useful for elliptical orbits. */
+int min_transmit_altitude = 0;
+
 char * first_filename = NULL;
 
 /* empty string */
diff --git a/src/gv_init.c b/src/gv_init.c
index 1ddd456..fcca529 100644
--- a/src/gv_init.c
+++ b/src/gv_init.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * Routines for displaying satellites in geomview.
  *
- * $Id: gv_init.c,v 1.39 2013/05/05 05:28:13 lloydwood Exp $
+ * $Id: gv_init.c,v 1.45 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <math.h>
 #include <stdio.h>
@@ -133,7 +133,7 @@ gv_init()
 
   {
     char *ver;
-    static char knownlatestvers[] = "1.9.4";
+    static char knownlatestvers[] = "1.9.5";
     static char firstgoodX11logo[] = "1.8.2";
     static char firstgoodstreaming[] = "1.9.0";
     static char firstgoodzlibstreaming[] = "1.9.5";
@@ -163,16 +163,12 @@ gv_init()
 
     if (strncmp(firstgoodstreaming, ver, 5) > 0) {
       geomview_stream_textures = FALSE;
-      error("can't stream images down a pipe to this old Geomview. Upgrade!");
-      error("falling back on older -dynamic-texture-to-file method.");
-      coverage_projection = CYLINDRICAL;
+      error("can't stream dynamic coverage maps to this old Geomview. Upgrade!");
     } else {
-      if (strncmp(firstgoodzlibstreaming, ver, 5) > 0) {
+      if ((debug && strncmp(firstgoodzlibstreaming, ver, 5) > 0)) {
 	geomview_compress2_textures = FALSE;
-	if (debug) {
-	  error("can't talk zlib direct down a pipe to this version of Geomview.");
-	  error("falling back on older Geomview-spawns-gzip method used by 1.9.4 and older.");
-	}
+	error("can't talk zlib direct down a pipe to this version of Geomview.");
+	error("falling back on older Geomview-spawns-gzip method used by 1.9.4 and older.");
       }
       {
 	FILE *f;
diff --git a/src/gv_utils.c b/src/gv_utils.c
index 62ea18e..85b9053 100644
--- a/src/gv_utils.c
+++ b/src/gv_utils.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * gv_utils.c
  *
- * $Id: gv_utils.c,v 1.30 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: gv_utils.c,v 1.33 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <math.h>
diff --git a/src/include/Satellite.h b/src/include/Satellite.h
index b8f6c07..31c47ed 100644
--- a/src/include/Satellite.h
+++ b/src/include/Satellite.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * Satellite.h
  *
- * $Id: Satellite.h,v 1.15 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: Satellite.h,v 1.20 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _SATELLITE_H_
@@ -36,7 +36,6 @@
 #define SATELLITE_NAME_LENGTH 25
 
 typedef struct satellite {
-  int id;                                /* identifier of satellite     */
   OrbitalElements oe;                    /* classical orbital elements  */
   OrbitalElements oe_t;                  /* orbital elements at time t  */
   CartesianCoordinates x_C;              /* position in geocentric      */
@@ -44,13 +43,14 @@ typedef struct satellite {
   double t;                              /* time                        */
   double period;                         /* classical period            */
   double transform[4][4];                /* transform for use in gv     */
-  int tag;                               /* used for marking satellites */
   float gs_into_view;                    /* time sat into view on ground*/
   float gs_last_into_view;		 /* previous encounter time     */
   float gs_last_pass;			 /* time sat last pass on ground*/
   unsigned int can_display_satellite:1;  /*   satellite display flag    */
   unsigned int can_display_orbit:1;      /*   orbit display flag        */
   unsigned int can_display_coverage:1;   /*   coverage display flag     */
+  int tag;                               /* used for marking satellites */
+  int id;                                /* identifier of satellite     */
   char name[SATELLITE_NAME_LENGTH];      /*      name identifier        */
 } *Satellite;
 
@@ -64,6 +64,12 @@ typedef struct satellite_list {
 } *Satellite_list;
 
 /*
+ * create array of 'marker' static satellites for equatorial ring
+ */
+#define EQUATORIAL_MARKERS 1080
+Satellite marker[EQUATORIAL_MARKERS];
+
+/*
  * define the constellation struct
  *
  */
diff --git a/src/include/constants.h b/src/include/constants.h
index ac56570..7c6d118 100644
--- a/src/include/constants.h
+++ b/src/include/constants.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * constants.h
  *
- * $Id: constants.h,v 1.23 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: constants.h,v 1.26 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef NULL
diff --git a/src/include/coverage_vis.h b/src/include/coverage_vis.h
index 14c12c1..42f533d 100644
--- a/src/include/coverage_vis.h
+++ b/src/include/coverage_vis.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * coverage_vis.h
  *
- * $Id: coverage_vis.h,v 1.34 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: coverage_vis.h,v 1.38 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _COVERAGE_VIS_H_
@@ -32,6 +32,7 @@
 /* bitmap of geographical boundaries for coverage */
 #define CYLINDRICAL_BITMAP_NAME "maps/world.cyl.pbm"
 #define UNPROJECTED_BITMAP_NAME "maps/world.unp.pbm"
+#define UNPROJECTED_MASK_BITMAP_NAME "maps/world-mask.unp.pbm"
 #define SPHERICAL_BITMAP_NAME "maps/world.sph.pbm"
 #define SPHERICAL_90_BITMAP_NAME "maps/world90W.sph.pbm"
 #define SINUSOIDAL_BITMAP_NAME "maps/world.sinu.pbm"
@@ -39,6 +40,7 @@
 
 #define CYLINDRICAL_LARGE_BITMAP_NAME "maps/world1024.cyl.pbm"
 #define UNPROJECTED_LARGE_BITMAP_NAME "maps/world1024.unp.pbm"
+#define UNPROJECTED_MASK_LARGE_BITMAP_NAME "maps/world-mask1024.unp.pbm"
 #define SPHERICAL_LARGE_BITMAP_NAME "maps/world1024.sph.pbm"
 #define SPHERICAL_90_LARGE_BITMAP_NAME "maps/world90W1024.sph.pbm"
 #define SINUSOIDAL_LARGE_BITMAP_NAME "maps/world1024.sinu.pbm"
diff --git a/src/include/fisheye.h b/src/include/fisheye.h
index c477497..9e71b3d 100644
--- a/src/include/fisheye.h
+++ b/src/include/fisheye.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * fisheye.h
  *
- * $Id: fisheye.h,v 1.17 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: fisheye.h,v 1.20 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _FISHEYE_H_
diff --git a/src/include/globals.h b/src/include/globals.h
index 39e5592..b5bf15a 100644
--- a/src/include/globals.h
+++ b/src/include/globals.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * Global variable declarations
  *
- * $Id: globals.h,v 1.48 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: globals.h,v 1.56 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _GLOBALS_H_
@@ -50,6 +50,7 @@ int geomview_compressed_images; /* FALSE if no zlib or -uncompressed. */
 int geomview_sun_lighting; /* TRUE if we trust geomview's light sources */
 
 int footprints_flag; /* TRUE if we want to see edges, inc sun terminator */
+int plane_flag; /* TRUE if we want to see equatorial plane */
 int sun_flag; /* TRUE if we want to see sun lighting */
 int fisheye_viewpoint_flag; /* TRUE if we want to plot location on coverage */
 
@@ -69,7 +70,8 @@ int orbit_model;
 
 /* We don't yet have a proper map for SINUSOIDAL centred on 0 deg lat. */
 typedef enum {
-  UNPROJECTED=0,
+  UNPROJECTED_MASK=0,
+  UNPROJECTED,
   CYLINDRICAL,
   SINUSOIDAL,
   SINUSOIDAL_90,
@@ -89,6 +91,8 @@ int coverage_projection;
 int Longitude_Center_Line;
 int coverage_display_center_longitude;
 
+int min_transmit_altitude ;
+
 /* number of colors in use by coverage panel map display */
 int NUM_COLORS;
 
@@ -101,6 +105,9 @@ unsigned int motion; /* TRUE to move satellites, FALSE to stop them */
 unsigned int reset; /* TRUE to reset satellites to original positions */
 unsigned int single_step; /* TRUE if take only one step */
 
+double equatorial_exclusion_angle; /* half-width/highest latitude of geo frequency exclusion belt */
+double parallels_angle; /* angle marked out in fisheye for parallel lines of latitude */
+
 double delta_t; /* time increment */
 double coverage_angle; /* angle for footprints */
 int coverage_type; /* mask elevation or the less-used cone angle */
diff --git a/src/include/gv_file.h b/src/include/gv_file.h
index 8455737..1c47d75 100644
--- a/src/include/gv_file.h
+++ b/src/include/gv_file.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * gv_file.h
  *
- * $Id: gv_file.h,v 1.9 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: gv_file.h,v 1.12 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _GV_FILE_H_
diff --git a/src/include/gv_utils.h b/src/include/gv_utils.h
index 844e2c1..606efd9 100644
--- a/src/include/gv_utils.h
+++ b/src/include/gv_utils.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * gv_utils.h
  *
- * $Id: gv_utils.h,v 1.18 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: gv_utils.h,v 1.21 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _GV_UTILS_H_
diff --git a/src/include/int_types.h b/src/include/int_types.h
index 41949b2..398cb2e 100644
--- a/src/include/int_types.h
+++ b/src/include/int_types.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * int_types.h
  *
- * $Id: int_types.h,v 1.7 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: int_types.h,v 1.10 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _INT_TYPES_H_
diff --git a/src/include/orbit_utils.h b/src/include/orbit_utils.h
index c8eeb27..6adb7ab 100644
--- a/src/include/orbit_utils.h
+++ b/src/include/orbit_utils.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * orbit_utils.h
  *
- * $Id: orbit_utils.h,v 1.13 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: orbit_utils.h,v 1.16 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _ORBIT_UTILS_H_
diff --git a/src/include/sats.h b/src/include/sats.h
index 9c23490..3ff3a2a 100644
--- a/src/include/sats.h
+++ b/src/include/sats.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * sats.h
  *
- * $Id: sats.h,v 1.17 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: sats.h,v 1.21 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _SATS_H_
@@ -59,6 +59,7 @@ char *sats_new_cmd(int argc, char *argv[]);
 char *sats_copy_cmd(int argc, char *argv[]);
 char *sats_delete_cmd(int argc, char *argv[]);
 char *sats_delete_all_cmd(int argc, char *argv[]);
+char *sats_load_marker_cmd(int argc, char *argv[]);
 char *sats_load_cmd(int argc, char *argv[]);
 char *sats_name_cmd(int argc, char *argv[]);
 char *sats_get_name_cmd(int argc, char *argv[]);
diff --git a/src/include/savi.h b/src/include/savi.h
index cdda2d4..dec5c8f 100644
--- a/src/include/savi.h
+++ b/src/include/savi.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * headers for the different functions
  *
- * $Id: savi.h,v 1.28 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: savi.h,v 1.32 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _SAVI_H_
@@ -39,6 +39,7 @@ void gv_trans_list_create(Satellite_list);
 unsigned int gv_init(void);
 
 /* earth.c */
+void redraw_earth(int argc, char *argv[]);
 char *earth_off_cmd(int argc, char *argv[]);
 void earth_place(double t, const CentralBody *pcb);
 char *earth_on_cmd(int argc, char *argv[]);
@@ -131,6 +132,7 @@ char *print_access_on_cmd(int argc, char *argv[]);
 char *print_access_off_cmd(int argc, char *argv[]);
 char *map_on_cmd(int argc, char *argv[]);
 char *map_off_cmd(int argc, char *argv[]);
+int get_map_flag(void);
 int get_coverage_type(void);
 void tracks_compute(const Satellite_list sl, const CentralBody *pcb);
 char *tracks_on_cmd(int argc, char *argv[]);
diff --git a/src/include/stats_utils.h b/src/include/stats_utils.h
index 0782d00..74a94e6 100644
--- a/src/include/stats_utils.h
+++ b/src/include/stats_utils.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * stats_utils.h
  *
- * $Id: stats_utils.h,v 1.19 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: stats_utils.h,v 1.22 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _STATS_UTILS_H_
diff --git a/src/include/tcl_utils.h b/src/include/tcl_utils.h
index ca3f986..cd233fc 100644
--- a/src/include/tcl_utils.h
+++ b/src/include/tcl_utils.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * tcl_utils.h
  *
- * $Id: tcl_utils.h,v 1.17 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: tcl_utils.h,v 1.20 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _TCL_UTILS_H_
diff --git a/src/include/time.h b/src/include/time.h
index 46a0ac0..9b03da4 100644
--- a/src/include/time.h
+++ b/src/include/time.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * time.h
  *
- * $Id: time.h,v 1.4 2012/01/01 02:48:41 lloydwood Exp $
+ * $Id: time.h,v 1.7 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #ifndef _TIME_H_
diff --git a/src/include/utils.h b/src/include/utils.h
index 3ff2ed1..4ea66fb 100644
--- a/src/include/utils.h
+++ b/src/include/utils.h
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2012 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
diff --git a/src/logo.c b/src/logo.c
index 042abd0..97eee6f 100644
--- a/src/logo.c
+++ b/src/logo.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * logo.c
  *
- * $Id: logo.c,v 1.14 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: logo.c,v 1.17 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdlib.h>
 #include "gv_utils.h"
diff --git a/src/main.c b/src/main.c
index 2ca4b81..6e8b74a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * main.c
  *
- * $Id: main.c,v 1.79 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: main.c,v 1.89 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include <stdio.h>
@@ -151,6 +151,7 @@ decode_cmd_line(int argc, char *argv[])
   int map_format_error = FALSE;
   int map_view_error = FALSE;
   int map_view_height = 0;
+  int min_transmit_altitude_error = FALSE;
   int length_savi_name, length_switches;
   unsigned int i;
 
@@ -173,8 +174,6 @@ decode_cmd_line(int argc, char *argv[])
       coverage_large_map = TRUE;
     } else if (strcmp(argv[i], "-dynamic-texture-with-map") == 0) {
       geomview_texture_with_map = TRUE;
-    } else if (strcmp(argv[i], "-dynamic-texture-to-file") == 0) {
-      geomview_stream_textures = FALSE;
     } else if (strcmp(argv[i], "-gzip-compressed-textures") == 0) {
       geomview_compress2_textures = FALSE;
     } else if (strcmp(argv[i], "-uncompressed") == 0) {
@@ -236,6 +235,13 @@ decode_cmd_line(int argc, char *argv[])
 	  i--;
 	}
       }
+    } else if (strcmp(argv[i],"-min-transmit-altitude") == 0) {
+      if (++i < argc) {
+        if (sscanf((char *) argv[i], "%i", &min_transmit_altitude) != 1) {
+          min_transmit_altitude_error = TRUE;
+          i--;
+        }
+      }
     } else if (strncmp(argv[i],"-",1) == 0) {
       unknown_parameters++;
     } else if (!script_filename) {
@@ -278,10 +284,10 @@ decode_cmd_line(int argc, char *argv[])
     error("supported command-line options include:\n"
 	  "savi [-large-map] [-levels <n>] [-debug] [-fake-geomview] [-redrawn-menus]\n"
 	  "     [-map-view-height <no. of pixels>] [-map-view-middle <longitude>] \n"
-          "     [-orbit-model <J0|J2>]     [filename]\n"
+          "     [-min-transmit-altitude <kilometers> ] [-orbit-model <J0|J2>]  [filename]\n"
 	  "  when SaVi is run standalone. Further flags:\n"
-	  "savi [-geomview] [-dynamic-texture-with-map] [-dynamic-texture-to-file]\n"
-	  "     [-gzip-compressed-textures] [-uncompressed] [-no-logo] [-sun-lighting]\n"
+	  "savi [-geomview] [-dynamic-texture-with-map] [-gzip-compressed-textures]\n"
+	  "     [-uncompressed] [-no-logo] [-sun-lighting]\n"
 	  "  are available when SaVi is run from Geomview.\n");
     error("\nsavi -help shows this help information at the command line.\n"
           "savi -version provides version information at the command line.\n"
@@ -372,8 +378,14 @@ decode_cmd_line(int argc, char *argv[])
     error("unfamiliar orbit model. format is -orbit-model <J0|J2>. Selecting J2.");
   } else if (orbit_model == J0) {
     error("selected J0 orbital model for classical mechanics.");
+    sprintf(temp_buffer, " -orbit-model J0");
+    sprintf(switches, temp_buffer);
+    switches += strlen(temp_buffer);
   } else if (orbit_model == J2) {
     error("defaulting to J2 orbital model.");
+    sprintf(temp_buffer, " -orbit-model J2");
+    sprintf(switches, temp_buffer);
+    switches += strlen(temp_buffer);
   }
 
   if (map_format_error) {
@@ -387,6 +399,15 @@ decode_cmd_line(int argc, char *argv[])
   if (map_view_error) {
     error("format is -map-view-height <number of pixels>");
   }
+  if (min_transmit_altitude_error) {
+    error("format is -min-transmit-altitude <kilometers>");
+  }
+
+  if (min_transmit_altitude) {
+    sprintf(temp_buffer, " -min-transmit-altitude %i", min_transmit_altitude);
+    sprintf(switches, temp_buffer);
+    switches += strlen(temp_buffer);
+  }
 
   if (buttons_menu) {
     sprintf(temp_buffer, " -redrawn-menus");
@@ -434,12 +455,6 @@ decode_cmd_line(int argc, char *argv[])
       switches += strlen(temp_buffer);
     }
 
-    if (!geomview_stream_textures) {
-      sprintf(temp_buffer, " -dynamic-texture-to-file");
-      sprintf(switches, temp_buffer);
-      switches += strlen(temp_buffer);
-    }
-
     if (!geomview_compress2_textures && geomview_compressed_images) {
       sprintf(temp_buffer, " -gzip-compressed-textures");
       sprintf(switches, temp_buffer);
@@ -467,13 +482,9 @@ decode_cmd_line(int argc, char *argv[])
   }
 
   if (!can_use_zlib) {
-    sprintf(temp_buffer, "\n\nSaVi was compiled without zlib compression.");
-  } else {
-    sprintf(temp_buffer, "\n\nSaVi was compiled with zlib compression.");
+    error("compiled without zlib compression.");
   }
-  sprintf(switches, temp_buffer);
-  switches += strlen(temp_buffer);
-
+  
   length_savi_name = strlen(argv[0]);
   length_switches = switches - temp_switches;
 
diff --git a/src/modules.c b/src/modules.c
index 983659e..f0633dd 100644
--- a/src/modules.c
+++ b/src/modules.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -26,7 +26,7 @@
  * Right now, most of the calls to the modules are sprinkled
  * throughout the code :(
  *
- * $Id: modules.c,v 1.11 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: modules.c,v 1.14 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include "Satellite.h"
diff --git a/src/orbit_utils.c b/src/orbit_utils.c
index e7d177e..5818341 100644
--- a/src/orbit_utils.c
+++ b/src/orbit_utils.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * orbit_utils.c
  *
- * $Id: orbit_utils.c,v 1.20 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: orbit_utils.c,v 1.24 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <math.h>
@@ -469,7 +469,7 @@ eccentric_anomaly_to_true_anomaly(const double E, const double e)
 }
 
 /*
- * sat_to_fisheye.c
+ * sat_to_fisheye
  *
  * Given a satellite position vector (cartesian geocentric-equatorial
  * coordinates) and time, compute the fisheye coordinates of that satellite as
@@ -481,7 +481,7 @@ eccentric_anomaly_to_true_anomaly(const double E, const double e)
  * by 1/(PI/2)*(-phi*cos(theta), phi*sin(theta)).  Thus coordinates
  * lie in the unit disk, and are oriented so that north is up, south is
  * down, east is LEFT, west is RIGHT. (This is the correct orientation
- * when looking up.
+ * when looking up.)
  *
  * Value of function is TRUE if satellite is in view, FALSE otherwise.
  */
diff --git a/src/orbits.c b/src/orbits.c
index 01d646a..3f2a0ad 100644
--- a/src/orbits.c
+++ b/src/orbits.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * routines to display orbits
  *
- * $Id: orbits.c,v 1.23 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: orbits.c,v 1.26 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/src/plane.c b/src/plane.c
index eb7c243..f564ea2 100644
--- a/src/plane.c
+++ b/src/plane.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * plane.c
  *
- * $Id: plane.c,v 1.12 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: plane.c,v 1.16 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <math.h>
 #include <stdlib.h>
@@ -49,6 +49,8 @@ plane_cmd(int argc, char *argv[])
   double Omega = atof(argv[3]);
   double m[4][4], ci, si, cO, sO;
 
+  plane_flag = TRUE;
+
   if (!geomview_module)
     return EMPTY_str;
 
@@ -71,8 +73,8 @@ plane_cmd(int argc, char *argv[])
   if (!plane_geom_exists) {
     gv_create_geom("Plane", "plane_t", "plane_h");
   }
-  gv_stop();
   plane_geom_exists = TRUE;
+  gv_stop();
 
   return EMPTY_str;
 }
@@ -85,14 +87,17 @@ plane_cmd(int argc, char *argv[])
 char *
 plane_off_cmd(int argc, char *argv[])
 {
-  if (!plane_geom_exists)
+  if (!plane_flag)
     return EMPTY_str;
 
-  plane_geom_exists = FALSE;
+  if(geomview_module) {
+    gv_start();
+    gv_delete_geom("Plane");
+    plane_geom_exists = FALSE;
+    gv_stop();
+  }
 
-  gv_start();
-  gv_delete_geom("Plane");
-  gv_stop();
+  plane_flag = FALSE;
 
   return EMPTY_str;
 }
diff --git a/src/satCmd.c b/src/satCmd.c
index ea244bd..c87cae9 100644
--- a/src/satCmd.c
+++ b/src/satCmd.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * procedure to implement tcl command "satellites"
  *
- * $Id: satCmd.c,v 1.29 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: satCmd.c,v 1.33 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include <string.h>
@@ -151,6 +151,7 @@ static struct Key key[] = {
   {"SET", sats_set_cmd},
   {"TAG", sats_tag_cmd},
   {"UNTAG", sats_untag_cmd},
+  {"LOAD_MARKER", sats_load_marker_cmd},
   {"LOAD", sats_load_cmd},
   {"NAME", sats_name_cmd},
   {"GET_NAME", sats_get_name_cmd},
diff --git a/src/satellites.c b/src/satellites.c
index 934413f..089e379 100644
--- a/src/satellites.c
+++ b/src/satellites.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * routines for satellites in Geomview
  *
- * $Id: satellites.c,v 1.23 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: satellites.c,v 1.26 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/src/sats.c b/src/sats.c
index 217ce26..e6c5b9d 100644
--- a/src/sats.c
+++ b/src/sats.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * sats.c
  *
- * $Id: sats.c,v 1.56 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: sats.c,v 1.60 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdlib.h>
 #include <string.h>
@@ -49,6 +49,8 @@
 
 unsigned int geomview_flag = FALSE;
 
+static int current_marker = 0;
+
 static double direction; /* 1.0 = FORWARDS, -1.0 = BACKWARDS */
 /*
  * Central body parameter - global from the parameters panel.  It should
@@ -765,6 +767,50 @@ sats_copy_cmd(int argc, char *argv[])
 }
 
 /*
+ * sats_load_marker_cmd
+ */
+char *
+sats_load_marker_cmd(int argc, char *argv[])
+{
+
+  double a = atof(argv[2]);
+  double Omega = atof(argv[3]);
+  double omega = atof(argv[4]);
+  double T = atof(argv[5]);
+  char* name = argv[6];
+
+  Satellite s;
+  int n;
+  static char result[20];
+
+  OrbitalElements oe;
+
+  oe.a = a;
+  oe.e = 0;
+  oe.i = 90 * DEG_TO_RAD; /* N/S for drawing vertical lines */
+  oe.Omega = Omega * DEG_TO_RAD;
+  oe.omega = omega * DEG_TO_RAD;
+  oe.T = T;
+
+  if (current_marker >= EQUATORIAL_MARKERS) {
+    current_marker = 0;
+    if (debug) {
+      error("marker creation wrapped round array - redrawing?");
+    }
+  }
+  
+  marker[current_marker] = satellite_create(0, &oe, constellation.pcb);
+  if (name && !satellite_name(marker[current_marker], name)) {
+    error ("problem naming marker.");
+  }
+  satellite_compute_position(marker[current_marker], 0, constellation.pcb);
+
+  current_marker++;
+  
+  return result;
+}
+
+/*
  * sats_load_cmd
  *
  * Don't forget: User interface angles are in degrees, but internally we
diff --git a/src/stars.c b/src/stars.c
index a5c7609..c4f93ff 100644
--- a/src/stars.c
+++ b/src/stars.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
  *
  * Routines for creating star field
  *
- * $Id: stars.c,v 1.12 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: stars.c,v 1.15 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <math.h>
diff --git a/src/stats_utils.c b/src/stats_utils.c
index c41e346..f855669 100644
--- a/src/stats_utils.c
+++ b/src/stats_utils.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * stats_utils.c
  *
- * $Id: stats_utils.c,v 1.38 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: stats_utils.c,v 1.44 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include <stdio.h>
@@ -152,7 +152,7 @@ fill_grid(const Satellite_list SL, int current_projection, int fp_angle_type,
 {
   CartesianCoordinates c, u, v;
   Satellite_list sl;
-  double angle;
+  double angle, a;
 
   /* first satellite is special sunlight approximation */
   int sunlight = TRUE;
@@ -164,6 +164,10 @@ fill_grid(const Satellite_list SL, int current_projection, int fp_angle_type,
 
   for (sl = SL; NULL != sl; sl = sl->next) {
     if (sl->s->can_display_coverage) {
+      a = sl->s->x_S.r - pcb->radius;
+      if (a <= min_transmit_altitude) {
+         continue;
+      }
       footprint_circle(&c, &u, &v, fp_angle_type, angle,
 		       &(sl->s->x_C), pcb);
       orient_circle(sl->s->t, &c, &u, &v, pcb);
@@ -316,6 +320,7 @@ intensity_circle_footprint(CartesianCoordinates *pc, CartesianCoordinates *pu,
   /* compute phi increment so that we fill in each row of grid */
   switch (current_projection) {
   case UNPROJECTED:
+  case UNPROJECTED_MASK:
   case SINUSOIDAL:
   case SINUSOIDAL_90:
     dt = PI/(g->height-1)/norm(pu);
@@ -435,6 +440,7 @@ intensity_index(int grid_index[2], SphericalCoordinates *point,
 
   switch (current_projection) {
   case UNPROJECTED:
+  case UNPROJECTED_MASK:
     project_unprojected(proj, point);
     break;
   case SINUSOIDAL:
diff --git a/src/sun.c b/src/sun.c
index a0ac019..df9945d 100644
--- a/src/sun.c
+++ b/src/sun.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -23,7 +23,7 @@
  *
  * Routines for creating fancy sun model
  *
- * $Id: sun.c,v 1.13 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: sun.c,v 1.16 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdio.h>
 #include <math.h>
diff --git a/src/tcl_utils.c b/src/tcl_utils.c
index 8745cfc..7c93746 100644
--- a/src/tcl_utils.c
+++ b/src/tcl_utils.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * tcl_utils.c
  *
- * $Id: tcl_utils.c,v 1.33 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: tcl_utils.c,v 1.40 2016/01/09 04:21:17 lloydwood Exp $
  */
 
 #include "constants.h"
@@ -161,6 +161,9 @@ tcl_app_init()
   static char var57[] = "DIV(19)";
   static char var58[] = "DEC(19)";
   static char var59[] = "buttons_menu";
+  static char var60[] = "min_transmit_altitude";
+  static char var61[] = "parallels_angle";
+  static char var62[] = "equatorial_exclusion_angle";
 
   unsigned int test;
 
@@ -237,6 +240,9 @@ tcl_app_init()
   Tcl_LinkVar(interp, var57, (char *) &DIV19, TCL_LINK_INT);
   Tcl_LinkVar(interp, var58, (char *) &DEC19, TCL_LINK_INT);
   Tcl_LinkVar(interp, var59, (char *) &buttons_menu, TCL_LINK_INT);
+  Tcl_LinkVar(interp, var60, (char *) &min_transmit_altitude, TCL_LINK_INT);
+  Tcl_LinkVar(interp, var61, (char *) &parallels_angle, TCL_LINK_DOUBLE);
+  Tcl_LinkVar(interp, var62, (char *) &equatorial_exclusion_angle, TCL_LINK_DOUBLE);
 
   /* execute initialization */
   {
diff --git a/src/time.c b/src/time.c
index 8f16879..6b958f4 100644
--- a/src/time.c
+++ b/src/time.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * time.c
  *
- * $Id: time.c,v 1.16 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: time.c,v 1.19 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <math.h>
 #include <stdio.h>
diff --git a/src/utils.c b/src/utils.c
index 8c0ce97..2b43cca 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -6,7 +6,7 @@
  *          Robert Thurman.
  *
  *  Copyright (c) 1997 by The Geometry Center.
- *  Also Copyright (c) 2013 by Lloyd Wood.
+ *  Also Copyright (c) 2016 by Lloyd Wood.
  *
  *  This file is part of SaVi.  SaVi is free software;
  *  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
  *
  * utils.c
  *
- * $Id: utils.c,v 1.17 2013/05/05 05:19:25 lloydwood Exp $
+ * $Id: utils.c,v 1.20 2016/01/09 04:21:17 lloydwood Exp $
  */
 #include <stdlib.h>
 #include <stdio.h>
diff --git a/tcl/Makefile b/tcl/Makefile
index d8144da..d7f7950 100644
--- a/tcl/Makefile
+++ b/tcl/Makefile
@@ -1,7 +1,7 @@
 #
 # Makefile - SaVi tcl directory. Run top-level Makefile instead.
 #
-# $Id: Makefile,v 1.18 2011/08/06 15:20:26 lloydwood Exp $
+# $Id: Makefile,v 1.19 2014/11/25 10:09:40 lloydwood Exp $
 
        SHELL = /bin/sh
           RM = /bin/rm -f
@@ -10,7 +10,7 @@
 		coverage.tcl coverage_size.tcl edit.tcl fisheye.tcl params.tcl \
 		geomview.tcl random.tcl about.tcl oe.tcl constellations.tcl \
 	        no_frames.tcl snapshot.tcl rosette.tcl star.tcl empty.tcl \
-                sunlight.tcl details.tcl helpfile.tcl
+                sunlight.tcl equator.tcl details.tcl helpfile.tcl
 
      TCLSH = tclsh
 
diff --git a/tcl/about.tcl b/tcl/about.tcl
index 90324e0..a46be80 100644
--- a/tcl/about.tcl
+++ b/tcl/about.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -19,7 +19,7 @@
 ######################################################
 #
 # about.tcl
-# $Id: about.tcl,v 1.27 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: about.tcl,v 1.33 2016/01/09 04:21:17 lloydwood Exp $
 
 proc about(build) {} {
     if {[eval window(raise) about]} return
@@ -40,34 +40,29 @@ proc about(build) {} {
     $logo create image 75 0 -image graphic -anchor n
     pack $logo
 
-    build_Label $cmd l1 "Satellite Constellation Simulation and Visualization"
+    build_Label $cmd l1 "Satellite constellation simulation and Visualization"
     $cmd.l1.label configure -font *-times-medium-i-normal--*-140-*-*-*-*-*-* \
 	-fg blue
     pack $cmd.l1 -anchor n -ipadx 15m -ipady 2m
 
     build_Label $cmd l2 \
-"A user manual is in SaVi's manual/ directory.
+"http://savi.sourceforge.net/
+A user manual is in SaVi's manual/ directory.
 
 
 Originally created at The Geometry Center
 by Patrick Worfolk and Robert Thurman.
 
-Interval decay showing coverage movement
-contributed by Gregory LaCoste.
-
 Enhanced and maintained by Lloyd Wood.
-http://info.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
-http://savi.sourceforge.net/
-
+http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/
 
 SaVi is free software. You may redistribute SaVi and/or modify
 SaVi only under the terms that are given in the file COPYRIGHT,
 which you should have received along with your copy of SaVi.
 
+Copyright (c) 2001-2016 by Lloyd Wood.
 Copyright (c) 1995-1997 by The Geometry Center
-http://www.geom.uiuc.edu/locate/SaVi
-
-Also Copyright (c) 2001-2013 by Lloyd Wood.
+http://www.geom.uiuc.edu/~worfolk/SaVi/
 
 [satellites VERSION]
 
diff --git a/tcl/constellations.tcl b/tcl/constellations.tcl
index 26bd16e..d2d7d6b 100644
--- a/tcl/constellations.tcl
+++ b/tcl/constellations.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2014 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -29,7 +29,7 @@
 # hard to get right. Use at own risk.
 # These need considerable expansion and work.
 #
-# $Id: constellations.tcl,v 1.29 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: constellations.tcl,v 1.30 2014/11/25 10:29:53 lloydwood Exp $
 
 
 proc walker {T P F alt inc lan_offset phase_offset} {
diff --git a/tcl/coverage.tcl b/tcl/coverage.tcl
index a9b19de..87ab7dc 100644
--- a/tcl/coverage.tcl
+++ b/tcl/coverage.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # coverage.tcl
 #
-# $Id: coverage.tcl,v 1.143 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: coverage.tcl,v 1.166 2016/01/09 04:21:17 lloydwood Exp $
 
 # Note: IM_W and IM_H are linked to C variables for the image size
 
@@ -42,6 +42,7 @@ proc coverage(init) {} {
     set project_tracks_flag 0
     set coverage_proj_flag 0
     set coverage_angle_flag 0
+    set coverage_flag 0
 
     set NUM_COLORS_PREV 0
 
@@ -53,13 +54,15 @@ proc coverage(init) {} {
     set tracks_flag_dismissed 1
 
     # this and popup menu match master list in globals.h
-    set Projection(unprojected) 0
-    set Projection(cylindrical) 1
-    set Projection(sinusoidal) 2
-    set Projection(sinusoidal_90) 3
-    set Projection(spherical) 4
-    set Projection(spherical_90) 5
-
+    set Projection(unprojected_mask) 0
+    set Projection(unprojected) 1
+    set Projection(cylindrical) 2
+    set Projection(sinusoidal) 3
+    set Projection(sinusoidal_90) 4
+    set Projection(spherical) 5
+    set Projection(spherical_90) 6
+
+    set coverage_projection $Projection(unprojected)
     set last_coverage_projection $coverage_projection
 }
 
@@ -68,7 +71,7 @@ proc coverage(build) {} {
 	coverage_proj_flag coverage_angle_flag project_tracks_flag map_flag \
 	coverage_projection coverage_angle IM_W IM_H im_x_offset im_y_offset \
 	coverage_flag_dismissed tracks_flag_dismissed no_access_flag_dismissed \
-	coverage_display_center_longitude coverage_name geomview_module \
+	coverage_display_center_longitude coverage_name \
 	sun_flag Fisheye NUM_COLORS NUM_COLORS_PREV
 
 
@@ -76,12 +79,8 @@ proc coverage(build) {} {
 	coverage_size(build)
 	return
     }
-
-    if [winfo exists .coverage] {
-	wm deiconify .coverage
-	raise .coverage
-	return
-    }
+    
+    if {[eval window(raise) coverage]} return
 
     set coverage_name [build_Toplevel coverage]
 
@@ -132,7 +131,7 @@ proc coverage(build) {} {
 	     {"Reverse shading" "coverage(reverse_colors)"} \
 	     {} \
              {"Select random colors" "coverage(random_colors)"} \
-	     {"Swap diversity and decay colors" "coverage(swap_color_diversity_decay)"} \
+	     {"Swap color swatches" "coverage(swap_color_diversity_decay)"} \
 	     {"Shade between end colors" "coverage(blend_colors)"} \
 	     {} \
 	     {"SaVi color shades" "coverage(restore_colors)"} }
@@ -176,16 +175,21 @@ proc coverage(build) {} {
     bind $c <Button-1> {coverage(lat_long) %x %y}
     bind $c <Control-Button-1> {coverage_set(lat_long) %x %y}
 
+    bind $c <Button-2> {coverage(back_step)}
+    bind $c <Button-3> {coverage(forw_step)}
+    bind $c <Shift-Button-2> {coverage(backwards)}
+    bind $c <Shift-Button-3> {coverage(forwards)}
+
     set cmdq [build_StdFrame $cmd q]
     build_Optionslist $cmdq olist \
 	{"Show Earth map" map_flag}
     pack $cmdq.olist -side left
     build_IPopupMenu $cmdq p0 "projected as:" \
-        coverage_projection coverage(map) {"unprojected" "cylindrical" "sinusoidal" "sinusoidal (90W)" "spherical" "spherical (90W)"}
+        coverage_projection coverage(map) {"unprojected land/sea" "unprojected" "cylindrical" "sinusoidal" "sinusoidal (90W)" "spherical" "spherical (90W)"}
     pack $cmdq.p0 -side left
 
     build_LabelEntryColumns $cmdq p1 \
-	{text "" {"Clicked coordinates: "}} \
+	{text "" {"Clicked: "}} \
 	{label "" {Fisheye(clicked_coords)}}
 
     pack $cmdq.p1 -side left
@@ -274,7 +278,7 @@ proc coverage(build) {} {
 
     # handles window being closed and reopened when sunlight on
     if {$sun_flag} {
-	coverage(sunlight_labels_on)
+	coverage(labels_show_sunlight)
     }
 
     build_LabelEntryColumns $cmd le2 \
@@ -427,16 +431,24 @@ proc coverage(set_angle) v {
 }
 
 proc coverage(update_angle) {} {
-    global coverage_flag
+    global coverage_flag coverage_angle cones_flag footprints_flag
 
+    set coverage_angle [expr abs($coverage_angle)]
+    if {$coverage_angle > 90} {
+	set coverage_angle 90
+    }
+    
     coverage(update_decay)
 
-    set flag $coverage_flag
-    set coverage_flag 1
-    if {$flag == 0} {
-      set coverage_flag 0
+    if {$coverage_flag == 1} {
+	set coverage_flag 0
+	set coverage_flag 1
     }
 
+    coverage(update)
+
+    geomview(update_cones_footprints)
+
     fisheye(update)
 }
 
@@ -510,25 +522,72 @@ proc coverage(init_coldiv_coldec) {} {
     set COLDEC(19) #ffffff
 }
 
-proc coverage(sunlight_labels_off) {} {
-global NUM_COLORS
+proc coverage(labels_show_land_sea) {} {
+    global NUM_COLORS coverage_projection Projection
+
+    if {$coverage_projection != $Projection(unprojected_mask)} {
+	return
+    }
 
     if [winfo exists .coverage] {
-	set last [expr $NUM_COLORS - 1]
+	set last [expr $NUM_COLORS]
 	for {set i 1} {$i < $last} {incr i} {
-	    .coverage.cmd.a.ce.cg.$i configure -text $i
+	    set j [expr $i-1]
+	    .coverage.cmd.a.ce.cf.$i configure -text $j
+	    .coverage.cmd.a.ce.cg.$i configure -text $j
 	}
+	
+	set j [expr $last - 1]
+	.coverage.cmd.a.ce.cf.$NUM_COLORS configure -text "$j+"
+	.coverage.cmd.a.ce.cg.$NUM_COLORS configure -text "$j+"
+	.coverage.cmd.a.ce.cf.0 configure -text "satellites in view\n(coverage on land)"
+	.coverage.cmd.a.ce.cg.0 configure -text "satellites in view\n(coverage on sea)"
+    }
+}
 
-	if {$last > 0 } {
-	    .coverage.cmd.a.ce.cg.$last configure -text "$last"
+proc coverage(labels_show_diversity) {} {
+    #top line only
+    global NUM_COLORS coverage_projection Projection
+
+    if {$coverage_projection == $Projection(unprojected_mask)} {
+	return
+    }
+
+    if [winfo exists .coverage] {
+	set last [expr $NUM_COLORS ]
+	for {set i 1} {$i < $last} {incr i} {
+	    .coverage.cmd.a.ce.cf.$i configure -text $i
+	}
+	
+	.coverage.cmd.a.ce.cf.$NUM_COLORS configure -text "$NUM_COLORS+"
+	.coverage.cmd.a.ce.cf.0 configure -text "satellites in view\n(coverage diversity)"
+    }
+}
+
+proc coverage(labels_show_decay) {} {
+    global NUM_COLORS coverage_projection Projection
+
+    if {$coverage_projection == $Projection(unprojected_mask)} {
+	return
+    }
+
+    if [winfo exists .coverage] {
+	set last [expr $NUM_COLORS]
+	for {set i 1} {$i < $last} {incr i} {
+	    .coverage.cmd.a.ce.cg.$i configure -text $i
 	}
+
 	.coverage.cmd.a.ce.cg.$NUM_COLORS configure -text "$NUM_COLORS+"
 	.coverage.cmd.a.ce.cg.0 configure -text "intervals since view\n(coverage decay)"
     }
 }
 
-proc coverage(sunlight_labels_on) {} {
-global NUM_COLORS
+proc coverage(labels_show_sunlight) {} {
+    global NUM_COLORS coverage_projection Projection
+
+    if {$coverage_projection == $Projection(unprojected_mask)} {
+	return
+    }
 
     if [winfo exists .coverage] {
 	set last [expr $NUM_COLORS - 1]
@@ -546,10 +605,16 @@ global NUM_COLORS
 
 
 proc coverage(update_wells) {} {
-global COLDIV COLDEC NUM_COLORS
-global COLOR coverage_flag no_access_flag sun_flag
+global COLDIV COLDEC NUM_COLORS COLOR
+global coverage_projection Projection coverage_flag no_access_flag sun_flag
 
-    if {$sun_flag == 1} {
+    if {$coverage_projection == $Projection(unprojected_mask)} {
+	if {$no_access_flag == 0} {
+	    set j 2
+	} else {
+	    set j 0
+	}
+    } elseif {$sun_flag == 1} {
 	set j [expr $NUM_COLORS - 1]
     } else {
 	set j 0
@@ -573,17 +638,16 @@ global COLOR coverage_flag no_access_flag sun_flag
 	      -command "coverage(diversitycolor) $i"
 	}
 
-
-	if {($no_access_flag == 1) && ($i >= $j)} {
+	if {($coverage_flag == 0) || (($no_access_flag == 0)&&($coverage_projection != $Projection(unprojected_mask))) || ($i < $j)} {
+	  .coverage.cmd.a.ce.cg.$i configure -bg $COLOR(bg) \
+	       -activebackground $COLOR(bg) -highlightbackground black \
+	       -relief flat \
+	       -command ""
+	} else {
 	   .coverage.cmd.a.ce.cg.$i configure -bg $COLDEC($i) \
 	       -activebackground $COLDEC($i) -highlightbackground $COLDEC($i) \
 	       -relief groove \
 	       -command "coverage(decaycolor) $i"
-	} else {
-	   .coverage.cmd.a.ce.cg.$i configure -bg $COLOR(bg) \
-	       -activebackground $COLOR(bg) -highlightbackground black \
-	       -relief flat \
-	       -command ""
 	}
     }
 }
@@ -597,6 +661,10 @@ proc coverage(update_colors) {} {
 	set COLDEC($i) [eval format "#%06x" $DEC($i)]
     }
     satellites COLOR_UPDATE
+
+    # if texturemapping, need to update sphere map
+    geomview(update_texture)
+
     coverage(update_wells)
     coverage(update)
 }
@@ -614,7 +682,7 @@ proc coverage(swap_color_diversity_decay) {} {
 }
 
 proc coverage(random_color_values) {} {
-    global DIV DEC
+    global DIV DEC coverage_projection Projection
     global NUM_COLORS
 
     global coverage_flag no_access_flag sun_flag
@@ -623,7 +691,7 @@ proc coverage(random_color_values) {} {
 	if {$coverage_flag == 1} {
 	    set DIV($i) [random_color]
 	}
-	if {($no_access_flag == 1) && ($sun_flag == 0)} {
+	if {(($coverage_projection == $Projection(unprojected_mask)) || ($no_access_flag == 1)) && ($sun_flag == 0)} {
 	    set DEC($i) [random_color]
 	}
     }
@@ -833,10 +901,11 @@ proc coverage(diversitycolor) {n} {
 }
 
 proc coverage(decaycolor) {n} {
-    global DEC
+    global DEC coverage_projection Projection
     global COLDEC no_access_flag
 
-    if {$no_access_flag == 0} return
+    if {($coverage_projection != $Projection(unprojected_mask)) &&
+	($no_access_flag == 0)} return
 
     if {$n == "1"} {
 	set s ""
@@ -959,7 +1028,7 @@ proc coverage(lat_long) {x y} {
 	    set y 1
 	}
 	set lat [expr asin($y)/$PI*180.0]
-    } elseif {$coverage_projection == $Projection(unprojected)} {
+    } elseif {($coverage_projection == $Projection(unprojected))||($coverage_projection == $Projection(unprojected_mask))} {
 	# unprojected
 	set long [expr (($x%$IM_W)-$HALF_X)/double($IM_W)*360.0+$Longitude_Center_Line]
 	set y [expr 1-$y/double($IM_H)*2]
@@ -1116,7 +1185,7 @@ proc coverage_set(lat_long) {x y} {
 }
 
 proc coverage(foot) {} {
-    global coverage_angle
+    global coverage_angle coverage_flag
 
     if {$coverage_angle > 90} {
       set coverage_angle 90
@@ -1134,6 +1203,8 @@ proc coverage(title) {} {
 	build_Title $coverage_name "view of coverage on cylindrical Earth map"
     } elseif {$coverage_projection == $Projection(unprojected)} {
 	build_Title $coverage_name "view of coverage on unprojected (equirectangular) Earth map"
+    } elseif {$coverage_projection == $Projection(unprojected_mask)} {
+	build_Title $coverage_name "view of coverage on unprojected (equirectangular) colorful Earth map"
     } elseif {$coverage_projection == $Projection(sinusoidal)} {
 	build_Title $coverage_name "view of coverage on sinusoidal Earth map"
     } elseif {$coverage_projection == $Projection(sinusoidal_90)} {
@@ -1147,7 +1218,7 @@ proc coverage(title) {} {
 
 proc coverage(map) {} {
     global coverage_proj_flag coverage_projection last_coverage_projection \
-	geomview_module Projection
+	Projection sun_flag
 
     if {$coverage_projection == $last_coverage_projection} return
 
@@ -1155,13 +1226,23 @@ proc coverage(map) {} {
 
     set coverage_proj_flag [expr 1 - $coverage_proj_flag]
 
-    # this is a hack to reset Earth while dynamic texturemapping if changed
-    # from cylindrical projection.
-    if {$geomview_module == 1} {
-	geomview(reset_texture)
+    if {($coverage_projection == $Projection(unprojected_mask))} {
+	coverage(labels_show_land_sea)
+    } else {
+	if {$sun_flag} {
+	    coverage(labels_show_diversity)
+	    coverage(labels_show_sunlight)
+	} else {
+	    coverage(labels_show_diversity)
+	    coverage(labels_show_decay)
+	}
     }
 
     set last_coverage_projection $coverage_projection
-
     coverage(update)
+
+        # this is a hack to reset Earth while dynamic texturemapping,
+    # if we move from cylindrical/unprojected projections supporting
+    # texturemapping to other projections that don't.
+    geomview(update_texture)
 }
diff --git a/tcl/coverage_size.tcl b/tcl/coverage_size.tcl
index 74ee23a..65192c8 100644
--- a/tcl/coverage_size.tcl
+++ b/tcl/coverage_size.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # coverage_size.tcl
 #
-# $Id: coverage_size.tcl,v 1.14 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: coverage_size.tcl,v 1.17 2016/01/09 04:21:17 lloydwood Exp $
 
 proc coverage_size(build) {} {
     global NUM_COLORS NUM_COLORS_PREV IM_H
diff --git a/tcl/details.tcl b/tcl/details.tcl
index fcf8642..5e30e66 100644
--- a/tcl/details.tcl
+++ b/tcl/details.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -19,7 +19,7 @@
 ######################################################
 #
 # details.tcl
-# $Id: details.tcl,v 1.16 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: details.tcl,v 1.19 2016/01/09 04:21:17 lloydwood Exp $
 
 proc details(build) {} {
     global last_filename source_comments comments_text comments_file details_source
diff --git a/tcl/edit.tcl b/tcl/edit.tcl
index f817158..8efdb03 100644
--- a/tcl/edit.tcl
+++ b/tcl/edit.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # edit.tcl
 #
-# $Id: edit.tcl,v 1.27 2013/05/05 05:19:25 lloydwood Exp $
+# $Id: edit.tcl,v 1.30 2016/01/09 04:21:17 lloydwood Exp $
 
 proc edit(build) {} {
     global edit_oe geomview_module
diff --git a/tcl/empty.tcl b/tcl/empty.tcl
index 606b5dc..ff685e1 100644
--- a/tcl/empty.tcl
+++ b/tcl/empty.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # empty.tcl
 #
-# $Id: empty.tcl,v 1.15 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: empty.tcl,v 1.18 2016/01/09 04:21:17 lloydwood Exp $
 
 proc empty(build) {} {
     if {[eval window(raise) empty]} return
diff --git a/tcl/equator.tcl b/tcl/equator.tcl
new file mode 100644
index 0000000..3fe6a68
--- /dev/null
+++ b/tcl/equator.tcl
@@ -0,0 +1,101 @@
+#
+######################################################
+#
+#  SaVi by Lloyd Wood (lloydwood at users.sourceforge.net),
+#          Patrick Worfolk (worfolk at alum.mit.edu) and
+#          Robert Thurman.
+#
+#  Copyright (c) 1997 by The Geometry Center.
+#  Also Copyright (c) 2016 by Lloyd Wood.
+#
+#  This file is part of SaVi.  SaVi is free software;
+#  you can redistribute it and/or modify it only under
+#  the terms given in the file COPYRIGHT which you should
+#  have received along with this file.  SaVi may be
+#  obtained from:
+#  http://savi.sourceforge.net/
+#  http://www.geom.uiuc.edu/locate/SaVi
+#
+######################################################
+#
+# equator.tcl
+#
+# $Id: equator.tcl,v 1.6 2016/01/09 04:21:17 lloydwood Exp $
+
+set previous_parallels_angle 0
+
+proc equator(init) {} {
+    global parallels_angle equatorial_exclusion_angle
+
+    set equatorial_exclusion_angle 3.5
+
+    set parallels_angle $equatorial_exclusion_angle
+}
+
+proc equator(create) {} {
+
+    global PI params parallels_angle
+
+    # lots of satellites to mark the geostationary or other rings.
+
+    set MU $params(Mu)
+
+    # markers every degree of longitude
+    set NUM_PLANES 360
+
+    # setup orbital elements
+    # need to compute radius in gravitational field with MU instead!
+    set a [expr 35786.1+$params(Radius)]
+    set omega 0.0
+    set T 0
+
+    # not yet requiring geomview.
+    satellites GV_BEGIN
+
+    for {set i 0} {$i < $NUM_PLANES} {incr i} {
+       # SaVi handles wraparound beyond +/-180
+       set Omega [expr 360.0/$NUM_PLANES * $i]
+
+       set name "equator-$i"
+       satellites LOAD_MARKER $a $Omega $omega $T $name
+    }
+
+    set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)]
+    set T [expr $T_per * $parallels_angle/360]
+
+    for {set i 0} {$i < $NUM_PLANES} {incr i} {
+
+       set Omega [expr 360.0/$NUM_PLANES * $i]
+
+       set name "parallel-N-$i"
+       satellites LOAD_MARKER $a $Omega $omega $T $name
+       set name "parallel-S-$i"
+       satellites LOAD_MARKER $a $Omega $omega -$T $name
+    }
+
+    satellites GV_END
+}
+
+proc equator(update_angle) {} {
+
+    global parallels_angle
+
+    # local variable defined at top of this file
+    upvar 1 previous_parallels_angle previous_parallels_angle
+
+    set parallels_angle [expr abs($parallels_angle)]
+
+    if {$parallels_angle > 90} {
+	set parallels_angle 90
+    }
+
+    if {$parallels_angle == $previous_parallels_angle} {
+	return
+    }
+    set previous_parallels_angle $parallels_angle
+    
+    equator(create)
+
+    fisheye(update)
+
+}
diff --git a/tcl/fisheye.tcl b/tcl/fisheye.tcl
index e054d14..06c2129 100644
--- a/tcl/fisheye.tcl
+++ b/tcl/fisheye.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # fisheye.tcl
 #
-# $Id: fisheye.tcl,v 1.55 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: fisheye.tcl,v 1.65 2016/01/09 04:21:17 lloydwood Exp $
 
 proc fisheye(init) {} {
     global fisheye_flag fisheye_reverse_view_flag fisheye_names_flag fisheye_numbers_flag \
@@ -56,8 +56,9 @@ proc fisheye(init) {} {
 }
 
 proc fisheye(build) {} {
-    global fisheye_flag fisheye_flag_dismissed fisheye_names_flag fisheye_times_flag \
-    fisheye_numbers_flag fisheye_viewpoint_flag Fisheye
+    global Fisheye fisheye_flag fisheye_flag_dismissed fisheye_names_flag
+    global fisheye_times_flag fisheye_numbers_flag fisheye_viewpoint_flag
+    global plane_flag parallels_angle
 
     if {[eval window(raise) fisheye]} return
 
@@ -116,6 +117,7 @@ proc fisheye(build) {} {
 	     {"Beijing, China" "fisheye(set_location) 39 55 116 25 {Beijing, China}"} \
 	     {"Berlin, Germany" "fisheye(set_location) 52 30 13 25 {Berlin, Germany}"} \
 	     {"Bombay, India" "fisheye(set_location) 19 0 72 48 {Bombay, India}"} \
+             {"Brisbane, Australia" "fisheye(set_location) -27 28 153 0 {Brisbane, Australia}"} \
 	     {"Brussels, Belgium" "fisheye(set_location) 50 52 4 22 {Brussels, Belgium}"} \
 	     {"Buenos Aires, Argentina" "fisheye(set_location) -34 35 -58 22 {Buenos Aires, Argentina}"} \
 	     {"Canberra, Australia" "fisheye(set_location) -35 18 149 7 {Canberra, Australia}"} \
@@ -127,6 +129,7 @@ proc fisheye(build) {} {
 	     {"Madrid, Spain" "fisheye(set_location) 40 26 -3 42 {Madrid, Spain}"} \
 	     {"Mecca, Saudi Arabia" "fisheye(set_location) 21 29 39 45 {Mecca, Saudi Arabia}"} \
 	     {"Melbourne, Australia" "fisheye(set_location) -37 47 144 58 {Melbourne, Australia}"} \
+             {"Miami, Florida" "fisheye(set_location) 25 47 -80 13 {Miami, Florida}"} \
 	     {"Moscow, Russia" "fisheye(set_location) 55 45 37 36 {Moscow, Russia}"} \
 	     {"New York, USA" "fisheye(set_location) 40 47 -73 58 {New York, USA}"} \
 	     {"Oslo, Norway" "fisheye(set_location) 59 57 10 42 {Oslo, Norway}"} \
@@ -156,12 +159,19 @@ proc fisheye(build) {} {
 	{"Show time in view" fisheye_times_flag} \
 	{"Plot location on map" fisheye_viewpoint_flag} \
 	{} \
+ 	{"Show equator" plane_flag} \
+	{} \
 	{"Reverse fisheye view" fisheye_reverse_view_flag}
 
     set cmd [build_CmdFrame $fisheye_name cmd]
 
     set p "$cmd.p"
-    canvas $p -bg black -height 300 -width 300
+    canvas $p -bg black -height 360 -width 360
+
+    bind $p <Button-2> {main(back_step)}
+    bind $p <Button-3> {main(forw_step)}
+    bind $p <Shift-Button-2> {main(backwards)}
+    bind $p <Shift-Button-3> {main(forwards)}
 
     pack $p -side right
     pack $p -fill both -expand 1
@@ -169,7 +179,7 @@ proc fisheye(build) {} {
     set cmdr [build_StdFrame $cmd r]
 
     build_LabelEntryColumns $cmdr le1 \
-        {label "" {time Fisheye(location_name) fisheye_lat_lon}}
+	{label "" {time Fisheye(location_name) fisheye_lat_lon}}
 
     pack $cmdr
 
@@ -177,17 +187,28 @@ proc fisheye(build) {} {
 	{"Show numbers" fisheye_numbers_flag} \
 	{"Show names" fisheye_names_flag} \
 	{"Show time in view" fisheye_times_flag} \
-	{"Plot location on map" fisheye_viewpoint_flag}
+	{"Plot location on map" fisheye_viewpoint_flag} \
+	{"Show equator" plane_flag}
 
     set cmdb [build_StdFrame $cmd b]
+
     build_LabelEntryColumns $cmdb le2 \
-	{text "coverage angle" ""} \
-	{dentry "" {coverage_angle}}
+        {text "" "Parallels"} \
+        {dentry "" {parallels_angle}} \
+	{text "" "degrees"}
+
+
+    build_LabelEntryColumns $cmdb le3 \
+        {text "" "Coverage"} \
+        {dentry "" {coverage_angle}} \
+	{text "" "degrees"}
 
-    pack $cmdb
+    bind $cmdb.le2.c1.0 <Return> equator(update_angle)
+    bind $cmdb.le2.c1.0 <Tab> equator(update_angle)
+    bind $cmdb.le3.c1.0 <Return> coverage(update_angle)
+    bind $cmdb.le3.c1.0 <Tab> coverage(update_angle)
 
-    bind $cmdb.le2.c1.0 <Return> coverage(foot)
-    bind $cmdb.le2.c1.0 <Tab> coverage(foot)
+    pack $cmdb -fill both -expand 1
 
     set cmdq [build_StdFrame $cmd q]
 
@@ -346,6 +367,7 @@ proc fisheye(delete) {} {
 	$p delete crosses
 	$p delete labels
 	$p delete mask_elevation
+	$p delete equator
     }
 }
 
diff --git a/tcl/geomview.tcl b/tcl/geomview.tcl
index 8cd9515..e97e53a 100644
--- a/tcl/geomview.tcl
+++ b/tcl/geomview.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # geomview.tcl
 #
-# $Id: geomview.tcl,v 1.16 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: geomview.tcl,v 1.31 2016/01/27 04:22:04 lloydwood Exp $
 
 proc geomview(new_camera) {} {
 
@@ -86,14 +86,6 @@ proc geomview(set_background_color) {} {
     geomview(puts) "(backcolor focus $geomr $geomg $geomb)"
 }
 
-proc geomview(reset_texture) {} {
-    global earth_flag
-
-    # recreate the Earth
-    set earth_flag 0
-    set earth_flag 1
-}
-
 proc geomview(wait) {} {
     satellites GV_WAIT
 
@@ -113,3 +105,46 @@ proc geomview(puts) v {
 
     satellites GV_SEND $v
 }
+
+proc geomview(update_texture) {} {
+    global geomview_module earth_flag
+
+    if {($geomview_module == 1)} {
+	geomview(begin)
+        # recreate the Earth if it exists
+	set flag $earth_flag
+	set earth_flag 0
+	if {$flag == 1} {
+            set earth_flag 1
+        }
+	geomview(end)
+    }
+}
+
+proc geomview(update_cones_footprints) {} {
+
+    global geomview_module cones_flag earth_flag footprints_flag
+
+    if {$geomview_module == 1} {
+	geomview(begin)
+
+        # recreate the Earth if it exists
+        set flag $earth_flag
+        set earth_flag 0
+        if {$flag == 1} {
+            set earth_flag 1
+        }
+	set flag $footprints_flag
+	set footprints_flag 0
+        if {$flag == 1} {
+	    set footprints_flag 1
+	}
+	set flag $cones_flag
+	set cones_flag 0
+        if {$flag == 1} {
+	    set cones_flag 1
+        }
+
+	geomview(end)
+    }
+}
diff --git a/tcl/helpfile.tcl b/tcl/helpfile.tcl
index 70b8568..9a7c333 100644
--- a/tcl/helpfile.tcl
+++ b/tcl/helpfile.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -19,7 +19,7 @@
 ######################################################
 #
 # textfile.tcl
-# $Id: helpfile.tcl,v 1.18 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: helpfile.tcl,v 1.21 2016/01/09 04:21:17 lloydwood Exp $
 
 proc helpfile(build) {helpfile} {
     global helpfile_name helpfile_text
diff --git a/tcl/init.tcl b/tcl/init.tcl
index 544531f..b9fa682 100644
--- a/tcl/init.tcl
+++ b/tcl/init.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,12 +20,12 @@
 #
 # init.tcl
 #
-# $Id: init.tcl,v 1.80 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: init.tcl,v 1.91 2016/01/09 04:21:17 lloydwood Exp $
 
 proc geomview_init {} {
     global satellites_flag box_sat_flag planes_sat_flag fancy_sat_flag \
 	   sphere_sat_flag fast_marker_sat_flag cones_flag footprints_flag \
-	   orbits_flag axes_flag plane_flag stars_flag \
+	   orbits_flag axes_flag stars_flag \
 	   earth_flag simple_earth_flag fancy_earth_flag texture_flag \
 	   geomview_flag geomview_dynamic_texture_flag COLOR
 
@@ -45,7 +45,6 @@ proc geomview_init {} {
     trace variable cones_flag w flag_change
 
     trace variable axes_flag w flag_change
-    trace variable plane_flag w flag_change
     trace variable stars_flag w flag_change
 
     trace variable earth_flag w flag_change
@@ -57,7 +56,7 @@ proc geomview_init {} {
 
     trace variable geomview_flag w flag_change
 
-        set satellites_flag 1
+    set satellites_flag 1
     set fast_marker_sat_flag 1
     set box_sat_flag 0
     set planes_sat_flag 0
@@ -69,11 +68,10 @@ proc geomview_init {} {
     set cones_flag 0
 
     set axes_flag 1
-    set plane_flag 0
     set stars_flag 0
 
     set earth_flag 1
-    set simple_earth_flag 0
+    set simple_earth_flag 1
     set fancy_earth_flag 0
     set texture_flag 1
 
@@ -88,6 +86,7 @@ proc app_init {} {
     global first_filename last_filename source_comments comments_text comments_file details_source
     global helpfile_text helpfile_name geomview_module
     global realtime_flag sun_flag playbar delta_t splash_about rendering_size
+    global plane_flag
     global modifier modifier_indicator
 
     # env is unused.
@@ -169,18 +168,22 @@ proc app_init {} {
     set source_comments ""
     set details_source ""
 
+    trace variable plane_flag w flag_change
+    set plane_flag 0
+
     set sun_flag 0
     trace variable sun_flag w flag_change
 
     trace variable realtime_flag w flag_change
     set realtime_flag 0
 
-    coverage(init)
-    fisheye(init)
-
     # load in fake sun as first satellite (zero)
     sunlight(create)
 
+    equator(init)
+    coverage(init)
+    fisheye(init)
+
     # build top window
     set last_filename ""
     main(build)
@@ -189,7 +192,7 @@ proc app_init {} {
 proc flag_change {name element op} {
     global geomview_module box_sat_flag planes_sat_flag fancy_sat_flag \
            sphere_sat_flag satellites_flag no_access_flag sun_flag \
-	   simple_earth_flag fancy_earth_flag
+	   simple_earth_flag fancy_earth_flag plane_flag
     upvar #0 $name flag
 
    if {$geomview_module == 1} {
@@ -244,8 +247,6 @@ proc flag_change {name element op} {
 	if {$flag == 1} {satellites CONES_ON} else {satellites CONES_OFF}
     } elseif {$name == "axes_flag"} {
 	if {$flag == 1} {satellites AXES_ON} else {satellites AXES_OFF}
-    } elseif {$name == "plane_flag"} {
-	if {$flag == 1} {satellites PLANE 0.0 0.0} else {satellites PLANE_OFF}
     } elseif {$name == "stars_flag"} {
 	if {$flag == 1} {satellites STARS_ON} else {satellites STARS_OFF}
     } elseif {$name == "earth_flag"} {
@@ -280,7 +281,7 @@ proc flag_change {name element op} {
 	if {$flag == 1} {satellites REALTIME_ON} else {satellites REALTIME_OFF}
     } elseif {$name == "coverage_flag"} {
 	if {$flag == 1} {satellites COVERAGE_ON} else {satellites COVERAGE_OFF}
-	if [winfo exists .coverage] coverage(update_wells)
+	if {[winfo exists .coverage]} coverage(update_wells)
     } elseif {$name == "no_access_flag"} {
 	if {$flag == 1} { satellites NO_ACCESS_ON
 	} else {
@@ -289,7 +290,7 @@ proc flag_change {name element op} {
 	    }
 	    satellites NO_ACCESS_OFF
 	}
-	if [winfo exists .coverage] coverage(update_wells)
+	if {[winfo exists .coverage]} coverage(update_wells)
     } elseif {$name == "print_access_flag"} {
 	if {$flag == 1} {satellites PRINT_ACCESS_ON} else {satellites PRINT_ACCESS_OFF}
     } elseif {$name == "map_flag"} {
@@ -298,6 +299,16 @@ proc flag_change {name element op} {
 	} else {
 	    satellites MAP_OFF
 	}
+    } elseif {$name == "plane_flag"} {
+        if {$flag == 1} {
+            satellites PLANE 0.0 0.0
+	    equator(create)
+            fisheye(update)
+        } else {
+            satellites PLANE_OFF
+            fisheye(update)
+        }
+
     } elseif {$name == "fisheye_reverse_view_flag"} {
 	if {$flag == 1} {satellites FISHEYE_REVERSE_VIEW_ON} else {satellites FISHEYE_REVERSE_VIEW_OFF}
     } elseif {$name == "fisheye_print_inview_flag"} {
@@ -327,12 +338,12 @@ proc flag_change {name element op} {
 	    satellites SUN_ON
 	    set no_access_flag 1
 	    main(show_sunlight)
-	    coverage(sunlight_labels_on)
+	    coverage(labels_show_sunlight)
 	    coverage(update)
 	} else {
 	    satellites SUN_OFF
 	    main(hide_sunlight)
-	    coverage(sunlight_labels_off)
+	    coverage(labels_show_decay)
 	    coverage(update_decay)
 	}
     } else {
diff --git a/tcl/load.tcl b/tcl/load.tcl
index f829c17..147451d 100644
--- a/tcl/load.tcl
+++ b/tcl/load.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # load.tcl
 #
-# $Id: load.tcl,v 1.17 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: load.tcl,v 1.20 2016/01/09 04:21:17 lloydwood Exp $
 
 proc load(build) {} {
 
diff --git a/tcl/main.tcl b/tcl/main.tcl
index 8a683ee..b59b099 100644
--- a/tcl/main.tcl
+++ b/tcl/main.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # main.tcl
 #
-# $Id: main.tcl,v 1.146 2013/05/05 05:37:01 lloydwood Exp $
+# $Id: main.tcl,v 1.158 2016/01/17 23:24:21 lloydwood Exp $
 
 proc main(build) {} {
     global main_name COLOR FONT TITLE geomview_module last_filename PLATFORM
@@ -112,7 +112,7 @@ proc main(build) {} {
     }
 
     label $cmd.l -text \
-	"no.  semi-major axis      eccentricity     inclination   longitude asc. node     arg. periapsis     time to periapsis  satellite name" \
+	"no.  semi-major axis  eccentricity  inclination  longitude asc. node  arg. periapsis  time to periapsis  satellite name" \
 	-font $FONT(label)
     listbox $cmd.lb -yscrollcommand "$cmd.scroll set" \
 	-height 2 -width $WIDTH -selectmode single \
@@ -127,6 +127,8 @@ proc main(build) {} {
     bind $cmd.lb <Shift-Double-Button-1> {main(rangedblselect) [%W nearest %y]}
     bind $cmd.lb <Control-Button-1> {main(itemselect) [%W nearest %y]}
     bind $cmd.lb <Control-Double-Button-1> {main(itemdblselect) [%W nearest %y]}
+    bind $cmd.lb <Delete> {main(delete)}
+    bind $cmd.lb <Insert> {main(new)}
     scrollbar $cmd.scroll -command "$cmd.lb yview"
     pack $cmd.scroll -side right -fill y
 
@@ -211,6 +213,9 @@ proc main(constellations_menu) {submenu} {
         {"Orblink" "main(constellation) orblink.tcl"} \
         {"LEq0" "main(constellation) leqo.tcl"} \
         {} \
+	{"LeoSat (108)" "main(constellation) leosat.tcl"} \
+	{"OneWeb (720)" "main(constellation) oneweb.tcl"} \
+	{} \
 	{"COMMstellation (78)" "main(constellation) commstellation-78.tcl"} \
 	{"NeLS (120)" "main(constellation) nels.tcl"} \
 	{"Celestri (63)" "main(constellation) celestri.tcl"} \
@@ -355,6 +360,8 @@ proc main(exit) {} {
     }
 
     satellites EXIT
+
+    puts stderr "\nSaVi: thankyou for using SaVi.\n"
     exit
 }
 
@@ -628,6 +635,7 @@ proc main(delete_all) {} {
 
     main(reset_title)
 
+    geomview(update_texture)
     coverage(update_decay)
     main(update)
 }
@@ -652,8 +660,10 @@ proc main(constellation) {filename} {
 
 proc main(source_file) {filename} {
     global coverage_angle coverage_angle_flag PI params source_comments details_source
+    global min_transmit_altitude
 
     set coverage_angle_old $coverage_angle
+    set min_transmit_altitude_old $min_transmit_altitude
 
     # interpret as a tcl file. Set up constants.
     set MU $params(Mu)
@@ -689,13 +699,18 @@ proc main(source_file) {filename} {
     set details_source "$filename"
 
     puts stderr "\nSaVi: loaded $filename"
+
+    if {$min_transmit_altitude != $min_transmit_altitude_old} {
+        puts stderr "      changed minimum transmit altitude from $min_transmit_altitude_old to $min_transmit_altitude km."
+    }
     if {$coverage_angle != $coverage_angle_old} {
-	puts stderr "      changed coverage angle from $coverage_angle_old to $coverage_angle."
+	puts stderr "      changed coverage angle from $coverage_angle_old to $coverage_angle degrees."
 	if {$coverage_angle_flag} {
 	    puts stderr "      Coverage angle probably describes mask elevation."
 	}
     }
 
+    geomview(update_texture)
     details(rebuild)
 }
 
@@ -725,6 +740,7 @@ proc main(load_file) {filename} {
     }
 
     if {$geomview_module == 1} {
+	geomview(update_texture)
         satellites GV_SEND "(ui-freeze off)"
     }
 
diff --git a/tcl/no_frames.tcl b/tcl/no_frames.tcl
index a4fb94f..5e2e8c6 100644
--- a/tcl/no_frames.tcl
+++ b/tcl/no_frames.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # no_frames.tcl
 #
-# $Id: no_frames.tcl,v 1.18 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: no_frames.tcl,v 1.21 2016/01/09 04:21:17 lloydwood Exp $
 
 proc no_frames(build) {} {
     if {[eval window(raise) no_frames]} return
diff --git a/tcl/oe.tcl b/tcl/oe.tcl
index aacb27d..ba3362c 100644
--- a/tcl/oe.tcl
+++ b/tcl/oe.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -22,7 +22,7 @@
 #
 # Procedures for computing with orbital elements
 #
-# $Id: oe.tcl,v 1.12 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: oe.tcl,v 1.15 2016/01/09 04:21:17 lloydwood Exp $
 
 proc oe_to_period {a mu} {
     global PI
diff --git a/tcl/params.tcl b/tcl/params.tcl
index b0f4940..7787c2d 100644
--- a/tcl/params.tcl
+++ b/tcl/params.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # params.tcl
 #
-# $Id: params.tcl,v 1.14 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: params.tcl,v 1.17 2016/01/09 04:21:17 lloydwood Exp $
 
 
 proc params(build) {} {
diff --git a/tcl/random.tcl b/tcl/random.tcl
index 71a2e8f..34e3d67 100644
--- a/tcl/random.tcl
+++ b/tcl/random.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -23,7 +23,7 @@
 # now try:
 # http://www.mit.edu/afs/sipb/project/eichin/common/public_html/random-tcl.html
 #
-# $Id: random.tcl,v 1.14 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: random.tcl,v 1.17 2016/01/09 04:21:17 lloydwood Exp $
 
 proc rand(raw) {} {
     global rand_seed
diff --git a/tcl/rosette.tcl b/tcl/rosette.tcl
index 8ac4517..d756ed5 100644
--- a/tcl/rosette.tcl
+++ b/tcl/rosette.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # rosette.tcl
 #
-# $Id: rosette.tcl,v 1.21 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: rosette.tcl,v 1.24 2016/01/09 04:21:17 lloydwood Exp $
 
 proc rosette(build) {} {
     global rosette_oe coverage_angle
diff --git a/tcl/save.tcl b/tcl/save.tcl
index 5a087ea..a08ec78 100644
--- a/tcl/save.tcl
+++ b/tcl/save.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # save.tcl
 #
-# $Id: save.tcl,v 1.26 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: save.tcl,v 1.29 2016/01/09 04:21:17 lloydwood Exp $
 
 proc save(build) {} {
     global last_filename
diff --git a/tcl/snapshot.tcl b/tcl/snapshot.tcl
index d474735..cef7fbb 100644
--- a/tcl/snapshot.tcl
+++ b/tcl/snapshot.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # large_snapshot.tcl
 #
-# $Id: snapshot.tcl,v 1.10 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: snapshot.tcl,v 1.13 2016/01/09 04:21:17 lloydwood Exp $
 
 proc snapshot(build) {} {
     global rendering_size
diff --git a/tcl/star.tcl b/tcl/star.tcl
index 09bb11a..75f11ec 100644
--- a/tcl/star.tcl
+++ b/tcl/star.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # star.tcl
 #
-# $Id: star.tcl,v 1.8 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: star.tcl,v 1.11 2016/01/09 04:21:17 lloydwood Exp $
 
 proc star(build) {} {
     global star_oe coverage_angle
diff --git a/tcl/sunlight.tcl b/tcl/sunlight.tcl
index 65696fd..e23508c 100644
--- a/tcl/sunlight.tcl
+++ b/tcl/sunlight.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,7 +20,7 @@
 #
 # sunlight.tcl
 #
-# $Id: sunlight.tcl,v 1.10 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: sunlight.tcl,v 1.13 2016/01/09 04:21:17 lloydwood Exp $
 
 
 # Sunlight on Earth
diff --git a/tcl/utils.tcl b/tcl/utils.tcl
index 9ed6c6b..c618147 100644
--- a/tcl/utils.tcl
+++ b/tcl/utils.tcl
@@ -6,7 +6,7 @@
 #          Robert Thurman.
 #
 #  Copyright (c) 1997 by The Geometry Center.
-#  Also Copyright (c) 2013 by Lloyd Wood.
+#  Also Copyright (c) 2016 by Lloyd Wood.
 #
 #  This file is part of SaVi.  SaVi is free software;
 #  you can redistribute it and/or modify it only under
@@ -20,10 +20,10 @@
 #
 # utils.tcl
 #
-# $Id: utils.tcl,v 1.54 2013/05/05 05:19:26 lloydwood Exp $
+# $Id: utils.tcl,v 1.60 2016/01/09 04:21:17 lloydwood Exp $
 
 proc window(raise) {window} {
-    if [winfo exists .$window] {
+    if {[winfo exists .$window]} {
 	wm deiconify .$window
 	raise .$window
 	return 1
@@ -102,7 +102,7 @@ proc string_ends {filename extension} {
 #
 # Returns: .name
 #
-proc build_Wname name {
+proc build_Wname {name} {
     return .$name
 }
 
@@ -194,7 +194,7 @@ proc build_Menubar {parent name helpmenu args} {
     }
 
     # menubars are not currently rebuilt!
-    if [winfo exists $mbarname.b0] {
+    if {[winfo exists $mbarname.b0]} {
 	puts stderr "\nbuild_Menubar: NOT rebuilding $mbarname"
 	return
     }
@@ -216,20 +216,20 @@ proc build_Menubar {parent name helpmenu args} {
         #add other menubuttons on left side
         set i 0 ; set menubuttons {}
         foreach arg $args {
-	          if {[llength $arg] > 0} {
+	     if {[llength $arg] > 0} {
                 # hack to show all text cut short by popup indicator
                 # two spaces for long words
                 set menuname [lindex $arg 0]
                 set menuname "$menuname  "
 
-	              menubutton $mbarname.b$i -text $menuname \
-		                       -menu $mbarname.b$i.menu -font $FONT(button)
-	              lappend menubuttons $mbarname.b$i
-	              if {[llength $arg] > 1} {
+                menubutton $mbarname.b$i -text $menuname \
+		           -menu $mbarname.b$i.menu -font $FONT(button)
+	        lappend menubuttons $mbarname.b$i
+	        if {[llength $arg] > 1} {
                     eval build_Menu $mbarname.b$i [lrange $arg 1 end]
                 }
-	              incr i
-	          }
+	        incr i
+	     }
         }
         if {[llength $menubuttons] > 0} {
 	          eval pack $menubuttons -side left
@@ -259,7 +259,7 @@ proc build_Menubar {parent name helpmenu args} {
 	$mbarname add cascade -menu $mbarname.helpx -label [lindex $helpmenu 0] \
 	    -font $FONT(button)
 	eval build_Menu $mbarname.helpx [lrange $helpmenu 1 end]
-     }
+    }
 
     # display menubar across the top of the panel
     $parent configure -menu $mbarname
@@ -576,8 +576,8 @@ proc build_IPopupMenu { parent name label ivar command items } {
     if {![llength $items]} {
 	if {[winfo exists $wname.mb]} {destroy $wname.mb}
 	pack $wname.label -side left -padx 0.1c
-	pack $wname -fill x
-	return $wname -pady 0.1c
+	pack $wname -fill x -pady 0.1c
+	return $wname
     }
 
     # make menubutton
@@ -770,7 +770,7 @@ proc build_LabelEntryColumns {parent name args } {
 	    puts stderr "\nunknown widget name: $_type"
 	}
 
-	if $valid_type {
+	if {$valid_type} {
 	    # create column and header
 	    set obj $parent.$name.$_code
 	    if { ![winfo exists $obj] } {
@@ -778,14 +778,14 @@ proc build_LabelEntryColumns {parent name args } {
 		pack $obj -fill x -side left
 		# -padx 2 -pady 1
 	    }
-	    if [string length "$_head"] {
+	    if {[string length "$_head"]} {
 		if { ![winfo exists $obj.head] } {
 		    label $obj.head -anchor n -font $FONT(label)
 		    pack $obj.head -side top -padx 2 -pady 1
 		}
 		$obj.head configure -text "$_head"
 	    } else {
-		if [winfo exists $obj.head] {
+		if {[winfo exists $obj.head]} {
 		    destroy $obj.head
 		}
 	    }
@@ -794,7 +794,7 @@ proc build_LabelEntryColumns {parent name args } {
 	    set _n 0
 	    foreach l $_list {
 		set obj_n $obj.$_n
-		if { ![winfo exists $obj_n] } {
+		if {![winfo exists $obj_n]} {
 		    eval $col_entry
 		    pack $obj_n -side top -padx 0.1c -pady $pady -fill x
 		}
@@ -838,7 +838,7 @@ proc build_Label {parent name message} {
     set fname [build_StdFrame $parent $name]
     if {[winfo exists $fname.label]} {
         $fname.label configure -text $message
-    } {
+    } else {
       label $fname.label -text $message -font $FONT(label)
       pack $fname.label -expand 1 -fill both
     }
@@ -864,7 +864,9 @@ proc build_options_menu {owner args} {
     }
 
     # create menu
-    if [winfo exists $owner] {destroy $owner}
+    if {[winfo exists $owner]} {
+	destroy $owner
+    }
     if {$buttons_menu == 1} {
         menu $owner -font $FONT(label)
     } else {
@@ -901,7 +903,7 @@ proc longest list {
 #
 proc loadfile_into_text {textw filename} {
     set ok 0
-    if [file exists "$filename"] {
+    if {[file exists "$filename"]} {
 	set f [open "$filename"]
 	while {![eof $f]} {
 	    $textw insert end [read $f 1000]

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/savi.git



More information about the Pkg-grass-devel mailing list