[3depict] 02/02: * Fix git-import-orig wierdness

D Haley mycae-guest at moszumanska.debian.org
Thu Apr 24 20:38:55 UTC 2014


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

mycae-guest pushed a commit to branch master
in repository 3depict.

commit 8418d2b8e7be735e42290650a1225dda781be2d6
Author: D Haley <mycae at gmx.com>
Date:   Thu Apr 24 01:03:56 2014 +0100

    * Fix git-import-orig wierdness
    
    * Apply patches
---
 ChangeLog                                          |   44 +-
 Makefile.in                                        |    5 +-
 TODO                                               |   37 +-
 aclocal.m4                                         |    9 +-
 config.h.in                                        |    6 +-
 config.sub                                         |  299 +--
 configure                                          |  136 +-
 configure.ac                                       |   63 +-
 data/textures/plot_slide_x.png                     |  Bin 0 -> 7989 bytes
 data/textures/plot_zoom_reset.png                  |  Bin 0 -> 11891 bytes
 data/textures/plot_zoom_x.png                      |  Bin 0 -> 3833 bytes
 data/textures/plot_zoom_y.png                      |  Bin 0 -> 4338 bytes
 data/textures/tex-source/plot_slide_x.svg          | 1262 ++++++++++
 data/textures/tex-source/plot_zoom_reset.svg       | 1985 ++++++++++++++++
 data/textures/tex-source/plot_zoom_x.svg           | 1607 +++++++++++++
 data/textures/tex-source/plot_zoom_y.svg           | 1183 +++++++++
 debian/changelog                                   |    2 +-
 debian/patches/FTGL-lowercase.patch                |    8 +-
 debian/patches/mgl-header-dropped.patch            |    4 +-
 debian/patches/series                              |    4 +-
 debian/patches/upstream-patch                      |  490 ++++
 docs/manual-latex/3depictusermanual.kilepr         |   14 +-
 docs/manual-latex/manual.aux                       |  209 ++
 docs/manual-latex/manual.bbl                       |   43 +
 docs/manual-latex/manual.blg                       |   49 +
 docs/manual-latex/manual.log                       |  624 +++++
 docs/manual-latex/manual.out                       |   85 +
 docs/manual-latex/manual.pdf                       |  Bin 4517305 -> 4517180 bytes
 docs/manual-latex/manual.tex                       |    6 +-
 docs/manual-latex/manual.toc                       |   93 +
 install-sh                                         |  528 +----
 locales/de_DE/LC_MESSAGES/3Depict.mo               |  Bin 50590 -> 49844 bytes
 missing                                            |  460 ++--
 packaging/RPM/3Depict.spec                         |   20 +-
 packaging/debian/3depict.1                         |    0
 packaging/debian/3depict.install                   |    1 -
 packaging/debian/changelog                         |   34 +-
 packaging/debian/compat                            |    0
 packaging/debian/control                           |    9 +-
 packaging/debian/copyright                         |   12 +
 packaging/debian/docs                              |    0
 packaging/debian/manpages                          |    0
 packaging/debian/menu                              |    0
 packaging/debian/patches/FTGL-lowercase.patch      |    8 +-
 .../debian/patches/debian-desktop-naming.patch     |    6 +-
 .../debian/patches/lowercase-textdomain.patch      |   10 +-
 packaging/debian/patches/patch-caching-bug         |   35 +
 packaging/debian/patches/series                    |    1 +
 packaging/debian/rules                             |    5 +-
 packaging/debian/source/format                     |    0
 packaging/debian/tests/control                     |    2 -
 packaging/debian/tests/unittests                   |   68 -
 packaging/debian/watch                             |    0
 packaging/mac/1compile.sh                          |    2 +-
 packaging/mac/2compile.sh                          |    0
 packaging/mac/3Depict.app/Contents/Info.plist      |    4 +-
 packaging/mac/3Depict.app/Contents/PkgInfo         |    0
 .../mac/3Depict.app/Contents/Resources/Assets.car  |  Bin 0 -> 75320 bytes
 .../Contents/Resources/Base.lproj/MainMenu.nib     |  Bin 0 -> 35305 bytes
 .../Contents/Resources/en.lproj/Credits.rtf        |   29 +
 .../Contents/Resources/en.lproj/InfoPlist.strings  |  Bin 0 -> 92 bytes
 .../mac/3Depict.app/Contents/Resources/wxmac.icns  |  Bin 88172 -> 0 bytes
 packaging/mac/3package.sh                          |    9 +-
 packaging/mac/makeMacOSXApp                        |    8 +-
 packaging/makeTarball.sh                           |   13 +-
 packaging/mingw-debian-cross/bootstrap.sh          |   16 +
 packaging/mingw-debian-cross/windows-installer.nsi |   46 +-
 src/3Depict.cpp                                    |   12 +-
 src/Makefile.am                                    |   13 +-
 src/Makefile.in                                    |  108 +-
 src/backend/APT/APTFileIO.cpp                      |  471 +++-
 src/backend/APT/APTFileIO.h                        |   17 +-
 src/backend/APT/APTRanges.cpp                      |  115 +-
 src/backend/APT/abundanceParser.cpp                |    2 +-
 src/backend/APT/ionhit.cpp                         |    7 +
 src/backend/APT/ionhit.h                           |    1 +
 src/backend/animator.cpp                           |  182 +-
 src/backend/animator.h                             |   35 +
 src/backend/configFile.cpp                         |    2 +
 src/backend/filter.cpp                             |    2 +
 src/backend/filter.h                               |    3 +-
 src/backend/filters/algorithms/binomial.cpp        |    7 +-
 src/backend/filters/algorithms/rdf.cpp             |    5 +-
 src/backend/filters/annotation.cpp                 |    5 +-
 src/backend/filters/boundingBox.cpp                |   44 +-
 src/backend/filters/clusterAnalysis.cpp            |  313 ++-
 src/backend/filters/clusterAnalysis.h              |   10 +-
 src/backend/filters/compositionProfile.cpp         |  237 +-
 src/backend/filters/compositionProfile.h           |   13 +-
 src/backend/filters/dataLoad.cpp                   |  180 +-
 src/backend/filters/dataLoad.h                     |    7 +-
 src/backend/filters/externalProgram.cpp            |   16 +-
 src/backend/filters/filterCommon.cpp               |  106 +-
 src/backend/filters/filterCommon.h                 |    4 +-
 src/backend/filters/ionClip.cpp                    |    3 +
 src/backend/filters/ionColour.cpp                  |    6 +-
 src/backend/filters/ionInfo.cpp                    |    6 +-
 src/backend/filters/rangeFile.cpp                  |    2 +-
 src/backend/filters/spatialAnalysis.cpp            |    9 +-
 src/backend/filters/spectrumPlot.cpp               |    9 +-
 src/backend/filters/transform.cpp                  |   11 +-
 src/backend/filters/voxelise.cpp                   |   16 +-
 src/backend/filtertree.cpp                         |  104 +-
 src/backend/filtertree.h                           |   11 +-
 src/backend/filtertreeAnalyse.cpp                  |    3 +-
 src/backend/plot.cpp                               |  120 +-
 src/backend/plot.h                                 |   24 +-
 src/backend/state.cpp                              |  160 +-
 src/backend/state.h                                |   32 +-
 src/backend/viscontrol.cpp                         |   95 +-
 src/backend/viscontrol.h                           |   18 +
 src/common/assertion.cpp                           |   46 +
 src/common/assertion.h                             |   14 -
 src/common/basics.cpp                              |  111 +-
 src/common/basics.h                                |   13 +-
 src/common/mathfuncs.cpp                           |   93 +-
 src/common/mathfuncs.h                             |   12 +
 src/common/stringFuncs.h                           |    5 +-
 src/common/xmlHelper.cpp                           |   19 +-
 src/common/xmlHelper.h                             |    7 +-
 src/gl/cameras.cpp                                 |    1 +
 src/gl/drawables.cpp                               |  379 ++-
 src/gl/drawables.h                                 |    4 +-
 src/gl/effect.cpp                                  |    7 +
 src/gl/effect.h                                    |    1 +
 src/gl/scene.cpp                                   |   16 +
 src/gl/scene.h                                     |    7 +-
 src/gl/textures.cpp                                |    4 +
 src/gui/cropPanel.cpp                              |    3 +-
 src/gui/dialogs/ExportPos.cpp                      |    7 +
 src/gui/dialogs/animateFilterDialog.cpp            |  140 +-
 src/gui/dialogs/animateFilterDialog.h              |   17 +-
 src/gui/dialogs/prefDialog.cpp                     |    1 -
 src/gui/dialogs/prefDialog.h                       |    2 +-
 src/gui/dialogs/rangeEditDialog.cpp                |    2 +-
 src/gui/glPane.cpp                                 |   25 +-
 src/gui/glade-skeleton/prefDialog.cpp              |  272 ---
 src/gui/glade-skeleton/prefDialog.h                |   96 -
 src/gui/mainFrame.cpp                              |  199 +-
 src/gui/mainFrame.h                                |   11 +-
 src/gui/mathglPane.cpp                             |  518 ++--
 src/gui/mathglPane.h                               |   12 +
 src/testing/filtertesting.cpp                      |    4 +-
 src/testing/mglTesting.cpp                         |  159 ++
 src/testing/mglTesting.h                           |    7 +
 src/testing/testing.cpp                            |  141 ++
 src/testing/testing.h                              |    2 +-
 src/wx/wxcommon.cpp                                |  162 +-
 src/wx/wxcommon.h                                  |   36 +
 src/wx/wxcomponents.cpp                            |   98 +-
 src/wx/wxcomponents.h                              |   17 +
 test/dogtail/test.py                               |  494 ++++
 test/manifest.txt                                  |   31 +
 test/ref-images/plot-ref.png                       |  Bin 0 -> 21741 bytes
 translations/3Depict_base.pot                      | 2468 +++++++++++--------
 translations/3Depict_de_DE.mo                      |  Bin 50590 -> 49844 bytes
 translations/3Depict_de_DE.po                      | 2501 +++++++++++---------
 157 files changed, 15630 insertions(+), 4673 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 537f075..42b3ac6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,44 @@
-* 30 Oct 2013 : 0.0.15
+* 01 Mar 2014 : 0.0.16
+	Features:
+	- Added experimental LAWATAP (ATO) file support
+		- Please send sample files!
+
+	User Visible Changes:
+	- Animation state now saved/restored	
+	- Plot interaction should be much faster
+	- Minor UI improvements
+		- Filter tree now persistent when interacting, where possible
+		- Mouse hover shows name on plot regions (ranges)
+		- Show user prompt when no filters present
+		- Nicer text fonts
+		- Clustering filter properties simplified
+		- Nicer looking logarithmic plots
+		- Left plot panel now remembers size correctly
+	- Minor 3D drawing fixes
+		- Fixed inside-out cones on bounding box Z-axis
+		- Fixed line-overlap-arrow with large annotation arrow linewidths
+	- Allow loading text files with 3 columns
+	- Fixed random_shuffle not being seeded in transform relabel
+	- Composition profiles now have "min count" mode
+	- Rotating camera image output was broken in version 0.0.15 - fixed
+	- Prevent creation of "stretched" image output
+	
+	Technical bugfixes/changes:
+	- Linux automated UI checking, based on dogtail
+	- Bugfix for caching errors in 0.0.15 tarball (already fixed in binary releases, and in repo)
+		- many filters would incorrectly emit input data after caching
+	- Many minor memory leaks and bugs fixed, due to Coverity scan
+	- No longer launch 3Depict from windows installer
+		- Windows UAC bug : no API for launching unprivileged processes from privileged ones
+	- Fix crash with some tree configurations
+	- Unit tests now check for installed files presence
+	- Fix crash when linked against some mathgl-2 versions
+	- Fixed SVG saving under non-english locales
+	- Add support for qhull2012
+	- Fixed caching parameter ineffective, due to fraction->percent bug 
+	- Fixed packages with anaglyph effect not loading
+
+* 01 Dec 2013 : 0.0.15
 	Features
 	- Range editing dialog : Rangefiles can be modified via a dialog available from the "edit" menu
 		- A Range filter and a spectra filter must be present first
@@ -177,7 +217,7 @@
 	  callback re-entrancy, which caused some crashes.
 	- Fixed several small memory leaks
 	- More unit testing, and fix some non-working unit tests,
-	  eg transform shuffle, which wansn't checking shuffled state
+	  eg transform shuffle, which wasn't checking shuffled state
 	  correctly, and hence did very little
 	- Minor openMP fixes
 	- Many cppcheck fixes - mostly stylistic, or minor performance improvements
diff --git a/Makefile.in b/Makefile.in
index 1c02561..d645610 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -623,9 +623,10 @@ distcheck: dist
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
 	  && am__cwd=`pwd` \
 	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	  && ../configure \
 	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
diff --git a/TODO b/TODO
index de5b5ec..d425a18 100644
--- a/TODO
+++ b/TODO
@@ -5,15 +5,13 @@ TODO List - worlds simplest bugtracking system
 --Main app--
 	To Implement:
 		== Next version ==
-
+	
 		== Eventually == 
-		* Improved filter tree visibility behaviour 
 		* Support for XY scatter plots
 		* Status bar message queue
 		* Voxel export dialog 
 		* VTK voxel data export
 		* OPS and other 3DAP formats reader?
-		* Stream information filter (Easy fix, but needs time/thought)
 		* Polynomial error estimator in graph
 		* Shear-warp volume render mode for voxels
 			- This can be broken into two useful stages
@@ -24,51 +22,29 @@ TODO List - worlds simplest bugtracking system
 		  specify a consistent statefile structure
 			- How to ensure version compatibility in future
 			state files?
-		* VTK/xyzm output
-		* BB cache for ion data?
-		* Option to warn on file overwrite with save after merge (default off)
-		* Theora video?
-		* Multiple selection in filter tree for many to one stash/unstash operations
-		* We are using too many timers. There are limits to max. timers (win32?).
-		* Front-to back alpha blending ordering support for
-		 scene drawing of non-pointcloud objects
 		* Voxelisation filter needs progress
 		* Better progress during cluster ranging
 		* Billboard text
 		* Camera animation control (slerp?)
-		* Undo by timestream
-		* MD5sums could be used on filter input to determine cache-refreshingness! (clever!)
-		* Per ion type ion display sizes?
 		* CSR fit to NN Hist in spatial analysis 
-		* NN "shift" algorithm (delta sqrmag -> value)
 		* Bounding box tick values could be improved - scientific
 		  notation, better font size control, absol. coords, etc
 		* Voxelisation filter should not show ions disabled in upstream range
 		* Range file drag/drop ignores drop coordinates; this could be useful
 		  in trying to interpret where the user wants to drop the object
-		* Should allow loading of just XYZ files, but create dummy mass & warn
 		* Plots cannot currently be updated on name change. Need to add "needUpdate" to setUserString
 
 	Outstanding bugs:
 		== Next release==
+		* Colour bar drawing broken when tiling an output image
+		* Fix voxelisation "filter" option 
+			
+		== Eventually==
 		* Cluster filter wont save state correctly if parent
 		  rangefile has disabled ions. It will output incorrect
 		  number of enabled ions, and get wiped during next ::initFilter
-			
-		== Eventually==
 		* Lighting calculations on isosurfaces can be problematic. See example package
-		* Voxelisation "filter" option appears to be reducing voxel intensity
 		* Loading a full pos file directly onto the video card cannot be aborted.
-		* Scroll wheel on text area for camera drop down does
-		  not scroll cameras; only on button (wxGTK only??)
-		* Switching between fixed width and num bins in voxel
-		  repeatedly causes "drift" of values -- aliasing errors?
-		* Colour bar drawing broken when tiling an output image
-		* Error bar masking for graph (mathgl draws error bars outside plot boundary)
-		* Pos load add could always add to bottom of filter list,
-		 rather than default value
-		* Under mac osx, changing languages does not cause stock
-		  wx translation strings to change, even after app restart.
 		* Select an X-Y crop, camera coords, on a dataset,
 		  then view   target  (-9.14237,-0.995174,83.2904) origin
 		  (188.23,-0.995174,83.2904). Now press ctrl+space. Note
@@ -81,8 +57,6 @@ TODO List - worlds simplest bugtracking system
 			* icon on dock bounces very fast during some refreshes
 
 		== Needs reproducing ==
-		* External program loading from XML doesn't seem to
-		  restore command?
 
 	Auditing:
 		== Next release ==
@@ -94,6 +68,7 @@ TODO List - worlds simplest bugtracking system
 		* Pos limit loader could alter its behaviour when
 		 sampling rates some percentage to be determined (load
 		 file, skip buffer).
+		* KD tree could implement proper range queries, eg bounds overlaps box
 		* Clustering could be paralellised, but is complex. Split & weld along KD tree lines using 
 		  cluster BB interactions.
 		* Examine performance characteristics of HULL_GRAB in ioninfo
diff --git a/aclocal.m4 b/aclocal.m4
index 5d56c40..7bf2270 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.14 -*- Autoconf -*-
+# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
 
 # Copyright (C) 1996-2013 Free Software Foundation, Inc.
 
@@ -195,7 +195,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.14'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.14], [],
+m4_if([$1], [1.14.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -211,7 +211,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.14])dnl
+[AM_AUTOMAKE_VERSION([1.14.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -733,7 +733,8 @@ to "yes", and re-run configure.
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
-fi])
+fi
+])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
diff --git a/config.h.in b/config.h.in
old mode 100755
new mode 100644
index 7f630a9..60472de
--- a/config.h.in
+++ b/config.h.in
@@ -27,9 +27,6 @@
 /* MathGL compilation OK */
 #undef HAVE_MGL
 
-/* Have got mathgl headers */
-#undef HAVE_MGL_H
-
 /* PNG compilation OK */
 #undef HAVE_PNG
 
@@ -93,6 +90,9 @@
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
+/* "Enable mgl1 support" */
+#undef USE_MGL1
+
 /* "Enable mgl2 support" */
 #undef USE_MGL2
 
diff --git a/config.sub b/config.sub
old mode 100755
new mode 100644
index 9633db7..a39437d
--- a/config.sub
+++ b/config.sub
@@ -1,40 +1,44 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
 
-timestamp='2013-08-10'
+timestamp='2009-04-17'
 
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program.  This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
+# the same distribution terms that you use for the rest of that program.
 
 
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
 # If it is invalid, we print an error message on stderr and exit with code 1.
 # Otherwise, we print the canonical config type on stdout and succeed.
 
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
 # that are meaningful with *any* GNU software.
@@ -68,7 +72,8 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -115,18 +120,13 @@ esac
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
-  android-linux)
-    os=-linux-android
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
-    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -149,13 +149,10 @@ case $os in
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze*)
+	-apple | -axis | -knuth | -cray)
 		os=
 		basic_machine=$1
 		;;
-	-bluegene*)
-		os=-cnk
-		;;
 	-sim | -cisco | -oki | -wec | -winbond)
 		os=
 		basic_machine=$1
@@ -170,10 +167,10 @@ case $os in
 		os=-chorusos
 		basic_machine=$1
 		;;
-	-chorusrdb)
-		os=-chorusrdb
+ 	-chorusrdb)
+ 		os=-chorusrdb
 		basic_machine=$1
-		;;
+ 		;;
 	-hiux*)
 		os=-hiuxwe2
 		;;
@@ -218,12 +215,6 @@ case $os in
 	-isc*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
-	-lynx*178)
-		os=-lynxos178
-		;;
-	-lynx*5)
-		os=-lynxos5
-		;;
 	-lynx*)
 		os=-lynxos
 		;;
@@ -248,27 +239,20 @@ case $basic_machine in
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
-	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arceb \
-	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
-	| avr | avr32 \
-	| be32 | be64 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
 	| bfin \
-	| c4x | c8051 | clipper \
+	| c4x | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
 	| fido | fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
-	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| maxq | mb | microblaze | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
@@ -286,45 +270,32 @@ case $basic_machine in
 	| mipsisa64r2 | mipsisa64r2el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipsr5900 | mipsr5900el \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
 	| moxie \
 	| mt \
 	| msp430 \
-	| nds32 | nds32le | nds32be \
-	| nios | nios2 | nios2eb | nios2el \
+	| nios | nios2 \
 	| ns16k | ns32k \
-	| open8 \
-	| or1k | or32 \
+	| or32 \
 	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 	| pyramid \
-	| rl78 | rx \
 	| score \
 	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu \
-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
 	| we32k \
-	| x86 | xc16x | xstormy16 | xtensa \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
 	| z8k | z80)
 		basic_machine=$basic_machine-unknown
 		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -334,21 +305,6 @@ case $basic_machine in
 		basic_machine=mt-unknown
 		;;
 
-	strongarm | thumb | xscale)
-		basic_machine=arm-unknown
-		;;
-	xgate)
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	xscaleeb)
-		basic_machine=armeb-unknown
-		;;
-
-	xscaleel)
-		basic_machine=armel-unknown
-		;;
-
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
 	# (2) the word "unknown" tends to confuse beginning users.
@@ -363,30 +319,25 @@ case $basic_machine in
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
-	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
-	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| c8051-* | clipper-* | craynv-* | cydra-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
-	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
 	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
-	| microblaze-* | microblazeel-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
@@ -404,34 +355,28 @@ case $basic_machine in
 	| mipsisa64r2-* | mipsisa64r2el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipsr5900-* | mipsr5900el-* \
 	| mipstx39-* | mipstx39el-* \
 	| mmix-* \
 	| mt-* \
 	| msp430-* \
-	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| nios-* | nios2-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
-	| open8-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 	| pyramid-* \
-	| rl78-* | romp-* | rs6000-* | rx-* \
+	| romp-* | rs6000-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
-	| tahoe-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile*-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
 	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-	| vax-* \
+	| v850-* | v850e-* | vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
 	| xstormy16-* | xtensa*-* \
 	| ymp-* \
 	| z8k-* | z80-*)
@@ -456,7 +401,7 @@ case $basic_machine in
 		basic_machine=a29k-amd
 		os=-udi
 		;;
-	abacus)
+    	abacus)
 		basic_machine=abacus-unknown
 		;;
 	adobe68k)
@@ -522,24 +467,11 @@ case $basic_machine in
 		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
 		os=-linux
 		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
-	cegcc)
+        cegcc)
 		basic_machine=arm-unknown
 		os=-cegcc
 		;;
@@ -571,7 +503,7 @@ case $basic_machine in
 		basic_machine=craynv-cray
 		os=-unicosmp
 		;;
-	cr16 | cr16-*)
+	cr16)
 		basic_machine=cr16-unknown
 		os=-elf
 		;;
@@ -729,6 +661,7 @@ case $basic_machine in
 	i370-ibm* | ibm*)
 		basic_machine=i370-ibm
 		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
 	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
@@ -786,15 +719,8 @@ case $basic_machine in
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
-	microblaze*)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw64)
-		basic_machine=x86_64-pc
-		os=-mingw64
-		;;
 	mingw32)
-		basic_machine=i686-pc
+		basic_machine=i386-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -829,18 +755,10 @@ case $basic_machine in
 	ms1-*)
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
-	msys)
-		basic_machine=i686-pc
-		os=-msys
-		;;
 	mvs)
 		basic_machine=i370-ibm
 		os=-mvs
 		;;
-	nacl)
-		basic_machine=le32-unknown
-		os=-nacl
-		;;
 	ncr3000)
 		basic_machine=i486-ncr
 		os=-sysv4
@@ -905,12 +823,6 @@ case $basic_machine in
 	np1)
 		basic_machine=np1-gould
 		;;
-	neo-tandem)
-		basic_machine=neo-tandem
-		;;
-	nse-tandem)
-		basic_machine=nse-tandem
-		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -993,10 +905,9 @@ case $basic_machine in
 		;;
 	power)	basic_machine=power-ibm
 		;;
-	ppc | ppcbe)	basic_machine=powerpc-unknown
+	ppc)	basic_machine=powerpc-unknown
 		;;
-	ppc-* | ppcbe-*)
-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
 	ppcle | powerpclittle | ppc-le | powerpc-little)
 		basic_machine=powerpcle-unknown
@@ -1021,11 +932,7 @@ case $basic_machine in
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
-	rdos | rdos64)
-		basic_machine=x86_64-pc
-		os=-rdos
-		;;
-	rdos32)
+	rdos)
 		basic_machine=i386-pc
 		os=-rdos
 		;;
@@ -1094,9 +1001,6 @@ case $basic_machine in
 		basic_machine=i860-stratus
 		os=-sysv4
 		;;
-	strongarm-* | thumb-*)
-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
 	sun2)
 		basic_machine=m68000-sun
 		;;
@@ -1153,8 +1057,20 @@ case $basic_machine in
 		basic_machine=t90-cray
 		os=-unicos
 		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
 	tile*)
-		basic_machine=$basic_machine-unknown
+		basic_machine=tile-unknown
 		os=-linux-gnu
 		;;
 	tx39)
@@ -1224,9 +1140,6 @@ case $basic_machine in
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
-	xscale-* | xscalee[bl]-*)
-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
-		;;
 	ymp)
 		basic_machine=ymp-cray
 		os=-unicos
@@ -1324,12 +1237,9 @@ esac
 if [ x"$os" != x"" ]
 then
 case $os in
-	# First match some system type aliases
-	# that might get confused with valid system types.
+        # First match some system type aliases
+        # that might get confused with valid system types.
 	# -solaris* is a basic system type, with this one exception.
-	-auroraux)
-		os=-auroraux
-		;;
 	-solaris1 | -solaris1.*)
 		os=`echo $os | sed -e 's|solaris1|sunos4|'`
 		;;
@@ -1350,23 +1260,22 @@ case $os in
 	# Each alternative MUST END IN A *, to match a version number.
 	# -sysv* is not here because it comes later, after sysvr4.
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* | -plan9* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
 	      | -aos* | -aros* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -openbsd* | -solidbsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
 	      | -uxpv* | -beos* | -mpeix* | -udk* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
@@ -1374,7 +1283,7 @@ case $os in
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1413,7 +1322,7 @@ case $os in
 	-opened*)
 		os=-openedition
 		;;
-	-os400*)
+        -os400*)
 		os=-os400
 		;;
 	-wince*)
@@ -1462,7 +1371,7 @@ case $os in
 	-sinix*)
 		os=-sysv4
 		;;
-	-tpf*)
+        -tpf*)
 		os=-tpf
 		;;
 	-triton*)
@@ -1498,14 +1407,15 @@ case $os in
 	-aros*)
 		os=-aros
 		;;
+	-kaos*)
+		os=-kaos
+		;;
 	-zvmoe)
 		os=-zvmoe
 		;;
 	-dicos*)
 		os=-dicos
 		;;
-	-nacl*)
-		;;
 	-none)
 		;;
 	*)
@@ -1528,10 +1438,10 @@ else
 # system, and we'll never get to this point.
 
 case $basic_machine in
-	score-*)
+        score-*)
 		os=-elf
 		;;
-	spu-*)
+        spu-*)
 		os=-elf
 		;;
 	*-acorn)
@@ -1543,23 +1453,8 @@ case $basic_machine in
 	arm*-semi)
 		os=-aout
 		;;
-	c4x-* | tic4x-*)
-		os=-coff
-		;;
-	c8051-*)
-		os=-elf
-		;;
-	hexagon-*)
-		os=-elf
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		os=-coff
+        c4x-* | tic4x-*)
+        	os=-coff
 		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
@@ -1579,11 +1474,14 @@ case $basic_machine in
 		;;
 	m68000-sun)
 		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
 		;;
 	m68*-cisco)
 		os=-aout
 		;;
-	mep-*)
+        mep-*)
 		os=-elf
 		;;
 	mips*-cisco)
@@ -1592,9 +1490,6 @@ case $basic_machine in
 	mips*-*)
 		os=-elf
 		;;
-	or1k-*)
-		os=-elf
-		;;
 	or32-*)
 		os=-coff
 		;;
@@ -1613,7 +1508,7 @@ case $basic_machine in
 	*-ibm)
 		os=-aix
 		;;
-	*-knuth)
+    	*-knuth)
 		os=-mmixware
 		;;
 	*-wec)
@@ -1718,7 +1613,7 @@ case $basic_machine in
 			-sunos*)
 				vendor=sun
 				;;
-			-cnk*|-aix*)
+			-aix*)
 				vendor=ibm
 				;;
 			-beos*)
diff --git a/configure b/configure
index eecf070..62f3ce3 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for 3Depict 0.0.15.
+# Generated by GNU Autoconf 2.69 for 3Depict 0.0.16.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -577,8 +577,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='3Depict'
 PACKAGE_TARNAME='3depict'
-PACKAGE_VERSION='0.0.15'
-PACKAGE_STRING='3Depict 0.0.15'
+PACKAGE_VERSION='0.0.16'
+PACKAGE_STRING='3Depict 0.0.16'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -780,6 +780,7 @@ with_libqhull_link
 with_libpng_flags
 with_libpng_link
 enable_mgl2
+enable_mgl1
 with_mgl_flags
 with_mgl_libs
 with_gsl_flags
@@ -1351,7 +1352,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures 3Depict 0.0.15 to adapt to many kinds of systems.
+\`configure' configures 3Depict 0.0.16 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1421,7 +1422,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of 3Depict 0.0.15:";;
+     short | recursive ) echo "Configuration of 3Depict 0.0.16:";;
    esac
   cat <<\_ACEOF
 
@@ -1436,6 +1437,7 @@ Optional Features:
   --disable-dependency-tracking
                           speeds up one-time build
   --enable-mgl2 Enable mathgl 2.x support
+  --enable-mgl1 Enable mathgl 1.x support
   --disable-gsltest       Do not try to compile and run a test GSL program
   --enable-openmp-parallel  Enable OpenMP multi-CPU usage; requires GCC > 4.2 for parallel STL support
   --disable-debug-checks Disable any debug checking, provides faster operation, but less information needed to debug internal problems, or to provide problem reports to developers
@@ -1552,7 +1554,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-3Depict configure 0.0.15
+3Depict configure 0.0.16
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2362,7 +2364,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by 3Depict $as_me 0.0.15, which was
+It was created by 3Depict $as_me 0.0.16, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3225,7 +3227,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='3depict'
- VERSION='0.0.15'
+ VERSION='0.0.16'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3317,6 +3319,7 @@ END
     as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
   fi
 fi
+
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5543,23 +5546,18 @@ fi
 #Append the --gl-libs flag
 WX_LIBS="$WX_LIBS `$WX_CONFIG_PATH --gl-libs`"
 
+WANT_WINDRES="no"
 case "${host_os}" in
 	*w64_mingw*)
 		#wx-config is a little unreliable in cross-compile mode
 		# Manually append -DUNICODE to cppflags/cxxflags
 		WX_CXXFLAGS="$WX_CXXFLAGS -DUNICODE"
 		WX_CPPFLAGS="$WX_CPPFLAGS -DUNICODE"
-		 if test 1 ; then
-  HAVE_WINDRES_TRUE=
-  HAVE_WINDRES_FALSE='#'
-else
-  HAVE_WINDRES_TRUE='#'
-  HAVE_WINDRES_FALSE=
-fi
-
+		WANT_WINDRES="true"
 		;;
-	*)
-		 if  FALSE  ; then
+esac
+
+ if  test x$WANT_WINDRES= xtrue  ; then
   HAVE_WINDRES_TRUE=
   HAVE_WINDRES_FALSE='#'
 else
@@ -5567,8 +5565,6 @@ else
   HAVE_WINDRES_FALSE=
 fi
 
-	;;
-esac
 
 
 
@@ -6809,6 +6805,15 @@ if test "${enable_mgl2+set}" = set; then :
   enableval=$enable_mgl2;
 fi
 
+# Check whether --enable-mgl1 was given.
+if test "${enable_mgl1+set}" = set; then :
+  enableval=$enable_mgl1;
+fi
+
+
+if test x"${enable_mgl2}" == x"yes"  && test x"${enable_mgl1}" == x"yes"; then
+	as_fn_error $? "\"Can specify mgl1, or mgl2 - not both\"" "$LINENO" 5
+fi
 
 
 # Check whether --with-mgl-flags was given.
@@ -6836,56 +6841,76 @@ fi
 
 LDFLAGS="$LDFLAGS $MGL_LIBS"
 
-#mathgl 2, under linux (at least debian) installs headers
-#  into /usr/include/mgl2/
 #Note:
 #  mathgl1.x uses mgl_c.h as c functions.
 #  mathgl2.x uses mgl_cf.h for c functions.
-MGL_HEADER_TESTFILE=mgl/mgl_c.h
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 if test x"${enable_mgl2}" == x"yes" ; then
 
 $as_echo "#define USE_MGL2 1 " >>confdefs.h
 
+	as_ac_Header=`$as_echo "ac_cv_header_"mgl2/mgl_cf.h"" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" ""mgl2/mgl_cf.h"" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+else
+  as_fn_error $? "\"mgl2 specified, but header mgl2/mgl_cf.h not found\"" "$LINENO" 5
 fi
 
-case "${host_os}" in
-	mingw*|windows*|winnt)
-		;;
-	linux*|darwin*)
-		#if enable mgl2, substitute header
-		if test -z "${enable_mgl2}"  ; then
-				{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"mathgl check: assuming mathgl 1.x\"" >&5
-$as_echo "\"mathgl check: assuming mathgl 1.x\"" >&6; }
-		else
-				#note file rename under mgl2 mgl_c->mgl_cf
-				MGL_HEADER_TESTFILE="mgl2/mgl_cf.h"
-		fi
-		;;
-	*)
-		;;
-esac
 
+else
+	if test x"${enable_mgl1}" == x"yes" ; then
 
-#mgl2 is installed into different path (at least under debian)
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+$as_echo "#define USE_MGL1 0 " >>confdefs.h
 
-as_ac_Header=`$as_echo "ac_cv_header_${MGL_HEADER_TESTFILE}" | $as_tr_sh`
-ac_fn_cxx_check_header_mongrel "$LINENO" "${MGL_HEADER_TESTFILE}" "$as_ac_Header" "$ac_includes_default"
+		as_ac_Header=`$as_echo "ac_cv_header_"mgl/mgl_c.h"" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" ""mgl/mgl_c.h"" "$as_ac_Header" "$ac_includes_default"
 if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
 
-$as_echo "#define HAVE_MGL_H /**/" >>confdefs.h
+else
+  as_fn_error $? "\"mgl specified, but header mgl/mgl_c.h not found\"" "$LINENO" 5
+fi
+
+
+	else
+		#mgl2 is installed into different path (at least under debian)
+		#  /usr/include/mgl2/
+		MGL_TEST_HEADERS="mgl2/mgl_cf.h mgl/mgl_c.h"
+		for ac_header in $MGL_TEST_HEADERS
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ HAVE_MGL_H=1; break;
+fi
+
+done
+
+
+		#check our set HAVE_MGL_H for *any* mglh
+		if  test $HAVE_MGL_H -ne 1  ; then :
+   as_fn_error $? "\"MGL headers not found, looking for any of $MGL_TEST_HEADERS\"" "$LINENO" 5
+fi
+
+		#Check MGL 2:
+		if  test x"$ac_cv_header_mgl2_mgl_cf_h" == x"yes" ; then :
+   $as_echo "#define USE_MGL2 1" >>confdefs.h
 
 else
-  as_fn_error $? "Required MathGL headers not found (looking for ${MGL_HEADER_TESTFILE}) - is mathgl development code installed?" "$LINENO" 5
+   USE_MGL2=0
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mgl_set_def_param in -lmgl" >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mgl_set_def_param in -lmgl" >&5
 $as_echo_n "checking for mgl_set_def_param in -lmgl... " >&6; }
 if ${ac_cv_lib_mgl_mgl_set_def_param+:} false; then :
   $as_echo_n "(cached) " >&6
@@ -6929,6 +6954,9 @@ else
   as_fn_error $? "Required MathGL libraries not found" "$LINENO" 5
 fi
 
+
+	fi
+fi
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -7697,10 +7725,6 @@ if test -z "${HAVE_WINDRES_TRUE}" && test -z "${HAVE_WINDRES_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_WINDRES\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_WINDRES_TRUE}" && test -z "${HAVE_WINDRES_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_WINDRES\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${USE_XML_TRUE}" && test -z "${USE_XML_FALSE}"; then
   as_fn_error $? "conditional \"USE_XML\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -8102,7 +8126,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by 3Depict $as_me 0.0.15, which was
+This file was extended by 3Depict $as_me 0.0.16, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8168,7 +8192,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-3Depict config.status 0.0.15
+3Depict config.status 0.0.16
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index cb6d279..4a35591 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([3Depict], [0.0.15]) 
+AC_INIT([3Depict], [0.0.16]) 
 AM_INIT_AUTOMAKE([foreign subdir-objects])
 AC_PROG_CXX
 AC_PROG_CC
@@ -36,19 +36,19 @@ fi
 #Append the --gl-libs flag
 WX_LIBS="$WX_LIBS `$WX_CONFIG_PATH --gl-libs`"
 
+WANT_WINDRES="no"
 case "${host_os}" in 
 	*w64_mingw*)
 		#wx-config is a little unreliable in cross-compile mode
 		# Manually append -DUNICODE to cppflags/cxxflags
 		WX_CXXFLAGS="$WX_CXXFLAGS -DUNICODE"
 		WX_CPPFLAGS="$WX_CPPFLAGS -DUNICODE"
-		AM_CONDITIONAL([HAVE_WINDRES], [test 1] )
+		WANT_WINDRES="true"
 		;;
-	*)
-		AM_CONDITIONAL([HAVE_WINDRES], [ FALSE ] )
-	;;
 esac
 
+AM_CONDITIONAL([HAVE_WINDRES], [ test x$WANT_WINDRES= xtrue ] )
+
 
 AC_SUBST(WX_LIBS)
 dnl ----------
@@ -282,6 +282,12 @@ LDFLAGS_ORIG="$LDFLAGS"
 
 AC_ARG_ENABLE(mgl2,
   [  --enable-mgl2 Enable mathgl 2.x support])
+AC_ARG_ENABLE(mgl1,
+  [  --enable-mgl1 Enable mathgl 1.x support])
+
+if test x"${enable_mgl2}" == x"yes"  && test x"${enable_mgl1}" == x"yes"; then 
+	AC_MSG_ERROR(["Can specify mgl1, or mgl2 - not both"])
+fi
 
 AC_ARG_WITH(mgl-flags,
   [  --with-mgl-flags=PATH : specify compiler flags for mathgl])
@@ -301,39 +307,36 @@ fi
 AC_SUBST(MGL_LIBS)
 LDFLAGS="$LDFLAGS $MGL_LIBS"
 
-#mathgl 2, under linux (at least debian) installs headers 
-#  into /usr/include/mgl2/
 #Note:
 #  mathgl1.x uses mgl_c.h as c functions. 
 #  mathgl2.x uses mgl_cf.h for c functions.
-MGL_HEADER_TESTFILE=mgl/mgl_c.h
-
+AC_LANG_PUSH([C++])
 if test x"${enable_mgl2}" == x"yes" ; then 
 	AC_DEFINE(USE_MGL2, 1 , ["Enable mgl2 support"])
-fi
+	AC_CHECK_HEADER("mgl2/mgl_cf.h",[],[AC_MSG_ERROR(["mgl2 specified, but header mgl2/mgl_cf.h not found"])],[])
+else 
+	if test x"${enable_mgl1}" == x"yes" ; then
+		AC_DEFINE(USE_MGL1, 0 , ["Enable mgl1 support"])
+		AC_CHECK_HEADER("mgl/mgl_c.h",[],[AC_MSG_ERROR(["mgl specified, but header mgl/mgl_c.h not found"])],[])
+	else
+		#mgl2 is installed into different path (at least under debian)
+		#  /usr/include/mgl2/
+		MGL_TEST_HEADERS="mgl2/mgl_cf.h mgl/mgl_c.h"
+		AC_CHECK_HEADERS($MGL_TEST_HEADERS,[HAVE_MGL_H=1; break;], [])
 
-case "${host_os}" in
-	mingw*|windows*|winnt)
-		;;
-	linux*|darwin*)
-		#if enable mgl2, substitute header
-		if test -z "${enable_mgl2}"  ; then
-				AC_MSG_RESULT(["mathgl check: assuming mathgl 1.x"])
-		else
-				#note file rename under mgl2 mgl_c->mgl_cf
-				MGL_HEADER_TESTFILE="mgl2/mgl_cf.h"
-		fi
-		;;
-	*)
-		;;
-esac
+		#check our set HAVE_MGL_H for *any* mglh
+		AS_IF([ test $HAVE_MGL_H -ne 1 ] , [ AC_MSG_ERROR(["MGL headers not found, looking for any of $MGL_TEST_HEADERS"])]) 
 
+		#Check MGL 2:
+		AS_IF([ test x"$ac_cv_header_mgl2_mgl_cf_h" == x"yes" ], [ AC_DEFINE(USE_MGL2,1)  ], [ USE_MGL2=0 ])
 
-#mgl2 is installed into different path (at least under debian)
-AC_LANG_PUSH([C++])
-AC_CHECK_HEADER([${MGL_HEADER_TESTFILE}],[AC_DEFINE(HAVE_MGL_H,[],[Have got mathgl headers])],
-	[AC_MSG_ERROR([Required MathGL headers not found (looking for ${MGL_HEADER_TESTFILE}) - is mathgl development code installed?])])
-AC_CHECK_LIB(mgl, mgl_set_def_param, [AC_DEFINE(HAVE_MGL,[],[MathGL compilation OK])] , AC_MSG_ERROR([Required MathGL libraries not found]), -lmgl)
+		
+		
+		AC_CHECK_LIB(mgl, mgl_set_def_param, [AC_DEFINE(HAVE_MGL,[],[MathGL compilation OK])] , 
+				AC_MSG_ERROR([Required MathGL libraries not found]), -lmgl)
+
+	fi
+fi
 AC_LANG_POP([C++])
 
 
diff --git a/data/textures/plot_slide_x.png b/data/textures/plot_slide_x.png
new file mode 100644
index 0000000..43b58e8
Binary files /dev/null and b/data/textures/plot_slide_x.png differ
diff --git a/data/textures/plot_zoom_reset.png b/data/textures/plot_zoom_reset.png
new file mode 100644
index 0000000..12758de
Binary files /dev/null and b/data/textures/plot_zoom_reset.png differ
diff --git a/data/textures/plot_zoom_x.png b/data/textures/plot_zoom_x.png
new file mode 100644
index 0000000..bf61958
Binary files /dev/null and b/data/textures/plot_zoom_x.png differ
diff --git a/data/textures/plot_zoom_y.png b/data/textures/plot_zoom_y.png
new file mode 100644
index 0000000..c9527d4
Binary files /dev/null and b/data/textures/plot_zoom_y.png differ
diff --git a/data/textures/tex-source/plot_slide_x.svg b/data/textures/tex-source/plot_slide_x.svg
new file mode 100644
index 0000000..0ed969f
--- /dev/null
+++ b/data/textures/tex-source/plot_slide_x.svg
@@ -0,0 +1,1262 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Layer_1"
+   x="0px"
+   y="0px"
+   width="128px"
+   height="100px"
+   viewBox="0 0 128 100"
+   enable-background="new 0 0 128 100"
+   xml:space="preserve"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="plot-zoom-x.svg"><metadata
+     id="metadata68"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1366"
+     inkscape:window-height="715"
+     id="namedview66"
+     showgrid="false"
+     inkscape:zoom="2.8168444"
+     inkscape:cx="34.298471"
+     inkscape:cy="75.778381"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="Layer_1"
+     showguides="false"
+     inkscape:guide-bbox="true"><sodipodi:guide
+       orientation="1,0"
+       position="50.203052,73.886413"
+       id="guide2881" /><sodipodi:guide
+       orientation="1,0"
+       position="121.13781,105.35438"
+       id="guide2975" /><sodipodi:guide
+       orientation="0.70710678,0.70710678"
+       position="-143.62919,180.32566"
+       id="guide4403" /><sodipodi:guide
+       orientation="1,0"
+       position="0.68640467,264.54036"
+       id="guide4529" /></sodipodi:namedview><defs
+     id="defs3"><inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 50 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="128 : 50 : 1"
+       inkscape:persp3d-origin="64 : 33.333333 : 1"
+       id="perspective70" /><filter
+       id="Gaussian_Blur"><feGaussianBlur
+         in="SourceGraphic"
+         stdDeviation="2"
+         id="feGaussianBlur6" /></filter><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2907"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2909"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2911"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2915"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2917"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2919"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2921"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2923"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2925"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2927"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2929"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2932"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2935"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2942"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2946"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2983"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2985"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2987"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2989"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2993"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2995"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2997"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2999"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient3001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient3003"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3005"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2978"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2980"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2982"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2984"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2986"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2990"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2994"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2998"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2955"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2958"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2965"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2969"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2972"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4417"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4425"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4430"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4433"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4444"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4447"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4463"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4465"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4467"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4469"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4473"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4476"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4483"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4526"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4538"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4542"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4545"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4565"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4567"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4569"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4575"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4578"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4581"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4585"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4591"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4607"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4609"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4611"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4613"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4615"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4617"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><radialGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_1_"
+       id="radialGradient3003"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9508,0,0,-1.0004855,-27.387415,47.915188)"
+       cx="52.1642"
+       cy="1.0189"
+       r="15.0952" /><radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9508,0,0,-0.9951,-24.4029,15.4837)"
+       r="15.0952"
+       cy="1.0189"
+       cx="52.1642"
+       id="rect1539_1_"><stop
+         id="stop3082"
+         style="stop-color:#F2F4F1"
+         offset="0" /><stop
+         id="stop3084"
+         style="stop-color:#D3D7CF"
+         offset="1" /></radialGradient><linearGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_2_"
+       id="linearGradient3005-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.005412,-2.984515,32.34769)"
+       x1="-254.4203"
+       y1="385.84341"
+       x2="-254.4203"
+       y2="364.34341" /><linearGradient
+       y2="364.34341"
+       x2="-254.4203"
+       y1="385.84341"
+       x1="-254.4203"
+       gradientUnits="userSpaceOnUse"
+       id="rect1539_2_"><stop
+         id="stop3087"
+         style="stop-color:#EEEEEC"
+         offset="0" /><stop
+         id="stop3089"
+         style="stop-color:#FFFFFF"
+         offset="1" /></linearGradient><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1547_1_"
+       id="linearGradient3007"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-122.25932,-124.89191)"
+       x1="301.922"
+       y1="-298.24731"
+       x2="303.06491"
+       y2="-299.68979" /><linearGradient
+       gradientTransform="matrix(0.5242,0,0,-0.527,-119.2748,-156.3932)"
+       y2="-299.68979"
+       x2="303.06491"
+       y1="-298.24731"
+       x1="301.922"
+       gradientUnits="userSpaceOnUse"
+       id="path1547_1_"><stop
+         id="stop3096"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="0" /><stop
+         id="stop3098"
+         style="stop-color:#FFFFFF"
+         offset="0.5" /><stop
+         id="stop3100"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="1" /></linearGradient><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1549_1_"
+       id="linearGradient3009"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-133.88821,-124.86165)"
+       x1="270.80869"
+       y1="-299.65561"
+       x2="271.75931"
+       y2="-298.50659" /><linearGradient
+       gradientTransform="matrix(0.5242,0,0,-0.527,-130.9037,-156.3631)"
+       y2="-298.50659"
+       x2="271.75931"
+       y1="-299.65561"
+       x1="270.80869"
+       gradientUnits="userSpaceOnUse"
+       id="path1549_1_"><stop
+         id="stop3104"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="0" /><stop
+         id="stop3106"
+         style="stop-color:#FFFFFF"
+         offset="0.5" /><stop
+         id="stop3108"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="1" /></linearGradient><radialGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_1_"
+       id="radialGradient5236"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9508,0,0,-1.0004855,-27.387415,47.915188)"
+       cx="52.1642"
+       cy="1.0189"
+       r="15.0952" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_2_"
+       id="linearGradient5238"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.005412,-2.984515,32.34769)"
+       x1="-254.4203"
+       y1="385.84341"
+       x2="-254.4203"
+       y2="364.34341" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1547_1_"
+       id="linearGradient5240"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-122.25932,-124.89191)"
+       x1="301.922"
+       y1="-298.24731"
+       x2="303.06491"
+       y2="-299.68979" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1549_1_"
+       id="linearGradient5242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-133.88821,-124.86165)"
+       x1="270.80869"
+       y1="-299.65561"
+       x2="271.75931"
+       y2="-298.50659" /></defs><linearGradient
+     id="SVGID_1_"
+     gradientUnits="userSpaceOnUse"
+     x1="215.7656"
+     y1="-278.127"
+     x2="222.8434"
+     y2="-212.7417"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop11" /><stop
+       offset="0.5838"
+       style="stop-color:#1572DE"
+       id="stop13" /><stop
+       offset="0.8528"
+       style="stop-color:#0938BC"
+       id="stop15" /></linearGradient><linearGradient
+     id="SVGID_2_"
+     gradientUnits="userSpaceOnUse"
+     x1="186.625"
+     y1="-258.7021"
+     x2="186.625"
+     y2="-248.506"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20D4FF"
+       id="stop20" /><stop
+       offset="1"
+       style="stop-color:#20ADFF"
+       id="stop22" /></linearGradient><linearGradient
+     id="SVGID_3_"
+     gradientUnits="userSpaceOnUse"
+     x1="237.3691"
+     y1="-274.5654"
+     x2="237.3691"
+     y2="-223.0167"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#3AEFFF"
+       id="stop29" /><stop
+       offset="0.5482"
+       style="stop-color:#20ABFF"
+       id="stop31" /><stop
+       offset="0.619"
+       style="stop-color:#1EA1F9"
+       id="stop33" /><stop
+       offset="0.7399"
+       style="stop-color:#1986E9"
+       id="stop35" /><stop
+       offset="0.8955"
+       style="stop-color:#105AD0"
+       id="stop37" /><stop
+       offset="1"
+       style="stop-color:#0938BC"
+       id="stop39" /></linearGradient><linearGradient
+     id="SVGID_4_"
+     gradientUnits="userSpaceOnUse"
+     x1="199.0293"
+     y1="-265.7773"
+     x2="278.4434"
+     y2="-265.7773"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop44" /><stop
+       offset="1"
+       style="stop-color:#2057D9"
+       id="stop46" /></linearGradient><linearGradient
+     id="SVGID_5_"
+     gradientUnits="userSpaceOnUse"
+     x1="183.9668"
+     y1="-253.4766"
+     x2="183.9668"
+     y2="-250.6126"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop53" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop55" /></linearGradient><linearGradient
+     id="SVGID_6_"
+     gradientUnits="userSpaceOnUse"
+     x1="116.0586"
+     y1="-316.2344"
+     x2="116.0586"
+     y2="-313.3705"
+     gradientTransform="matrix(0.9448 -0.3275 -0.3275 -0.9448 -130.0903 -201.9744)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop60" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop62" /></linearGradient><g
+     id="g2885"
+     transform="matrix(0.4738187,0,0,0.44579674,71.051287,55.272028)"><path
+       id="path8"
+       style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:0;filter:url(#Gaussian_Blur)"
+       d="m 7.333,54.584 c 0,0 67.667,-15.334 114.544,3.387 0.996,1.155 0.379,2.506 -1.603,3.453 -1.978,0.945 -68.924,25.151 -68.924,25.151 0,0 -3.244,1.307 -4.803,1.264 -2.569,-0.069 -4.087,-0.8 -4.129,-6.866 -0.027,-3.962 1.748,-10.556 1.748,-10.556 l -35.2,-0.062 c 0,0 -2.428,0.155 -4.381,-1.938 C 2.71,66.406 7.333,54.584 7.333,54.584 z"
+       enable-background="new    "
+       inkscape:connector-curvature="0" /><path
+       sodipodi:nodetypes="csssccscscscsscccc"
+       id="path17"
+       d="m 3.269,61.407 c 0,0 -0.076,-6.572 -0.084,-8.765 C 3.173,49.495 2.9630708,45.841824 3.119964,40.223051 3.2753199,34.659322 2.9097365,33.850631 3.6088261,32.616747 4.2857123,31.422053 43.522164,32.212 43.522164,32.212 l 0.440961,-13.599474 c 0,0 -0.133193,-5.409473 1.764811,-4.767242 32.377673,10.955691 47.907618,16.637312 69.151144,25.83498 1.074,0.531 7.17692,2.91374 7.19692,4.03074 0.035,1.855 0.171,11.375 0.171,11.375 0,0 0.379,2.507 -1.603,3.454 -1.977,0.946 -68.924,25.151  [...]
+       style="fill:url(#linearGradient2978)"
+       inkscape:connector-curvature="0" /><path
+       id="path24"
+       d="M 49.463,65.747 8.933,65.832 6.91,64.566 c 0,0 -0.59,-3.116 -0.505,-6.571 0.085,-3.455 0.084,-3.455 0.084,-3.455 0,0 -0.084,-3.201 3.539,-3.286 3.623,-0.085 44.826,-0.253 44.826,-0.253 l -5.391,14.746 z"
+       style="fill:url(#linearGradient2980)"
+       inkscape:connector-curvature="0" /><path
+       sodipodi:nodetypes="csccscsscsc"
+       id="path26"
+       d="m 3.236,58.395 c 0,0 -0.758,5.311 1.833,7.395 1.324,1.064 2.948,1.703 4.192,1.729 8.595,0.168 34.621,0.379 34.621,0.379 0,0 1.384457,8.132064 1.472721,10.746974 0.147,4.355033 4.848331,2.380149 4.848331,2.380149 0,0 -1.353016,-4.527613 -0.503016,-7.034613 0.8,-2.358 2.716498,-8.859016 1.759498,-9.987016 C 50.638534,63.033494 9.64,64.714 9.64,64.714 c 0,0 -2.928,0.2 -4.382,-1.38 C 3.907,61.865 3.236,58.395 3.236,58.395 z"
+       style="fill:#20bfff"
+       inkscape:connector-curvature="0" /><path
+       sodipodi:nodetypes="cccscc"
+       id="path41"
+       d="m 50.203052,26.113587 0,-4.756487 68.346418,28.088531 c 0,0 1.72116,6.732531 -0.80684,7.742531 -2.526,1.011 -68.992202,24.028293 -68.992202,24.028293 l 1.452624,-55.102868 z"
+       style="fill:url(#linearGradient2982)"
+       inkscape:connector-curvature="0" /><path
+       sodipodi:nodetypes="cssscccc"
+       id="path48"
+       d="m 49.18,82.389 c 0,0 66.071,-24.488 67.683,-25.09 1.621,-0.604 5.135,-1.801 5.197,-3.775 0.111,-3.474 1.265,4.093 -1.068,4.979 -1.91,0.725 -69.642,25.362 -69.642,25.362 0,0 -2.232,1.096 -4.739,1.073 l 0.042,-1.918 c 1.011,0 2.527,-0.631 2.527,-0.631 z"
+       style="fill:url(#linearGradient2984)"
+       inkscape:connector-curvature="0" /><path
+       sodipodi:nodetypes="cscssssccscc"
+       id="path50"
+       d="m 6.0004496,47.314 c 0,0 0.038757,-6.162595 -0.00746,-9.178678 -0.050187,-3.274864 0.1910071,-3.6877 0.1910071,-3.6877 l 42.1591963,0.0088 c 3.348944,6.99e-4 1.492417,-9.805242 1.859863,-16.182488 0.127652,-2.215478 55.185994,20.929913 55.459994,22.015913 0.346,1.374 -5.32756,4.616004 -15.990899,10.489692 -9.733529,5.36152 -23.674244,8.996228 -34.497131,11.559206 -6.361723,1.382527 -5.095605,-1.219897 -4.45802,-7.040745 0,-1.69 -0.485,-3.55 -3.497,-5.708 C 43.724,47.083 33.967, [...]
+       enable-background="new    "
+       style="opacity:0.6;fill:#ffffff"
+       inkscape:connector-curvature="0" /><path
+       id="path57"
+       d="m 50.128,54.961 c 0,1.023 -0.83,1.854 -1.854,1.854 H 7.66 c -1.023,0 -1.854,-0.828 -1.854,-1.854 l 0,0 c 0,-1.023 0.83,-1.854 1.854,-1.854 h 40.614 c 1.024,0 1.854,0.831 1.854,1.854 l 0,0 z"
+       enable-background="new    "
+       style="opacity:0.7;fill:url(#linearGradient2986)"
+       inkscape:connector-curvature="0" /><path
+       id="path64"
+       d="m 119.632,44.537 c 0.335,0.968 -0.776,2.23 -2.487,2.824 L 49.334,70.866 c -1.709,0.593 -3.367,0.29 -3.703,-0.679 l 0,0 c -0.334,-0.967 0.78,-2.23 2.488,-2.823 l 67.813,-23.506 c 1.709,-0.593 3.364,-0.289 3.7,0.679 l 0,0 z"
+       enable-background="new    "
+       style="opacity:0.7;fill:url(#linearGradient2988)"
+       inkscape:connector-curvature="0" /></g><g
+     id="g2896"
+     transform="matrix(-0.4738187,0,0,0.44579674,57.827028,55.407771)"><path
+       enable-background="new    "
+       d="m 7.333,54.584 c 0,0 67.667,-15.334 114.544,3.387 0.996,1.155 0.379,2.506 -1.603,3.453 -1.978,0.945 -68.924,25.151 -68.924,25.151 0,0 -3.244,1.307 -4.803,1.264 -2.569,-0.069 -4.087,-0.8 -4.129,-6.866 -0.027,-3.962 1.748,-10.556 1.748,-10.556 l -35.2,-0.062 c 0,0 -2.428,0.155 -4.381,-1.938 C 2.71,66.406 7.333,54.584 7.333,54.584 z"
+       style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:0;filter:url(#Gaussian_Blur)"
+       id="path2898"
+       inkscape:connector-curvature="0" /><path
+       style="fill:url(#linearGradient2990)"
+       d="m 3.269,61.407 c 0,0 -0.076,-6.572 -0.084,-8.765 C 3.173,49.495 2.9630708,45.841824 3.119964,40.223051 3.2753199,34.659322 2.9097365,33.850631 3.6088261,32.616747 4.2857123,31.422053 43.522164,32.212 43.522164,32.212 l 0.440961,-13.599474 c 0,0 -0.133193,-5.409473 1.764811,-4.767242 32.377673,10.955691 47.907618,16.637312 69.151144,25.83498 1.074,0.531 7.17692,2.91374 7.19692,4.03074 0.035,1.855 0.171,11.375 0.171,11.375 0,0 0.379,2.507 -1.603,3.454 -1.977,0.946 -68.924,25.151  [...]
+       id="path2900"
+       sodipodi:nodetypes="csssccscscscsscccc"
+       inkscape:connector-curvature="0" /><path
+       style="fill:url(#linearGradient2992)"
+       d="M 49.463,65.747 8.933,65.832 6.91,64.566 c 0,0 -0.59,-3.116 -0.505,-6.571 0.085,-3.455 0.084,-3.455 0.084,-3.455 0,0 -0.084,-3.201 3.539,-3.286 3.623,-0.085 44.826,-0.253 44.826,-0.253 l -5.391,14.746 z"
+       id="path2902"
+       inkscape:connector-curvature="0" /><path
+       style="fill:#20bfff"
+       d="m 3.236,58.395 c 0,0 -0.758,5.311 1.833,7.395 1.324,1.064 2.948,1.703 4.192,1.729 8.595,0.168 34.621,0.379 34.621,0.379 0,0 1.384457,8.132064 1.472721,10.746974 0.147,4.355033 4.848331,2.380149 4.848331,2.380149 0,0 -1.353016,-4.527613 -0.503016,-7.034613 0.8,-2.358 2.716498,-8.859016 1.759498,-9.987016 C 50.638534,63.033494 9.64,64.714 9.64,64.714 c 0,0 -2.928,0.2 -4.382,-1.38 C 3.907,61.865 3.236,58.395 3.236,58.395 z"
+       id="path2904"
+       sodipodi:nodetypes="csccscsscsc"
+       inkscape:connector-curvature="0" /><path
+       style="fill:url(#linearGradient2994)"
+       d="m 50.203052,26.113587 0,-4.756487 68.346418,28.088531 c 0,0 1.72116,6.732531 -0.80684,7.742531 -2.526,1.011 -68.992202,24.028293 -68.992202,24.028293 l 1.452624,-55.102868 z"
+       id="path2906"
+       sodipodi:nodetypes="cccscc"
+       inkscape:connector-curvature="0" /><path
+       style="fill:url(#linearGradient2996)"
+       d="m 49.18,82.389 c 0,0 66.071,-24.488 67.683,-25.09 1.621,-0.604 5.135,-1.801 5.197,-3.775 0.111,-3.474 1.265,4.093 -1.068,4.979 -1.91,0.725 -69.642,25.362 -69.642,25.362 0,0 -2.232,1.096 -4.739,1.073 l 0.042,-1.918 c 1.011,0 2.527,-0.631 2.527,-0.631 z"
+       id="path2908"
+       sodipodi:nodetypes="cssscccc"
+       inkscape:connector-curvature="0" /><path
+       style="opacity:0.6;fill:#ffffff"
+       enable-background="new    "
+       d="m 6.0004496,47.314 c 0,0 0.038757,-6.162595 -0.00746,-9.178678 -0.050187,-3.274864 0.1910071,-3.6877 0.1910071,-3.6877 l 42.1591963,0.0088 c 3.348944,6.99e-4 1.492417,-9.805242 1.859863,-16.182488 0.127652,-2.215478 55.185994,20.929913 55.459994,22.015913 0.346,1.374 -5.32756,4.616004 -15.990899,10.489692 -9.733529,5.36152 -23.674244,8.996228 -34.497131,11.559206 -6.361723,1.382527 -5.095605,-1.219897 -4.45802,-7.040745 0,-1.69 -0.485,-3.55 -3.497,-5.708 C 43.724,47.083 33.967, [...]
+       id="path2910"
+       sodipodi:nodetypes="cscssssccscc"
+       inkscape:connector-curvature="0" /><path
+       style="opacity:0.7;fill:url(#linearGradient2998)"
+       enable-background="new    "
+       d="m 50.128,54.961 c 0,1.023 -0.83,1.854 -1.854,1.854 H 7.66 c -1.023,0 -1.854,-0.828 -1.854,-1.854 l 0,0 c 0,-1.023 0.83,-1.854 1.854,-1.854 h 40.614 c 1.024,0 1.854,0.831 1.854,1.854 l 0,0 z"
+       id="path2912"
+       inkscape:connector-curvature="0" /><path
+       style="opacity:0.7;fill:url(#linearGradient3000)"
+       enable-background="new    "
+       d="m 119.632,44.537 c 0.335,0.968 -0.776,2.23 -2.487,2.824 L 49.334,70.866 c -1.709,0.593 -3.367,0.29 -3.703,-0.679 l 0,0 c -0.334,-0.967 0.78,-2.23 2.488,-2.823 l 67.813,-23.506 c 1.709,-0.593 3.364,-0.289 3.7,0.679 l 0,0 z"
+       id="path2914"
+       inkscape:connector-curvature="0" /></g><g
+     id="g5216"
+     transform="matrix(2.9187946,0,0,2.2850643,-37.419071,89.067416)"><g
+       transform="translate(12.244246,-65.970646)"
+       id="g2992"><path
+         sodipodi:nodetypes="cccccccccc"
+         style="fill:#babdb6;stroke:#888a85;stroke-width:0.99999505"
+         d="m 8.299485,31.189455 15.944722,0 12.083278,0 c 1.417,0 2.566,1.149186 2.566,2.565812 l 0,15.925726 c 0,1.416625 -1.149,2.565811 -2.566,2.565811 l -28.028,0 c -1.417,0 -2.566,-1.14818 -2.566,-2.565811 l 0,-15.925726 c -0.001,-1.416626 1.148,-2.565812 2.566,-2.565812 z"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true"
+         id="rect1537"
+         inkscape:connector-curvature="0" /><path
+         style="fill:url(#radialGradient5236);stroke:url(#linearGradient5238);stroke-width:0.99999505"
+         d="m 9.878485,34.149388 24.658,0 c 0.729,0 1.321,0.591183 1.321,1.320106 l 0,10.480415 c 0,0.728924 -0.592,1.320106 -1.321,1.320106 l -24.658,0 c -0.729,0 -1.321,-0.592188 -1.321,-1.320106 l 0,-10.480415 c 10e-4,-0.728923 0.592,-1.320106 1.321,-1.320106 z"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true"
+         id="rect1539"
+         inkscape:connector-curvature="0" /><path
+         style="opacity:0.48890004;fill:none;stroke:#ffffff;stroke-width:0.99999505"
+         d="m 8.286485,32.125494 28.101,0 c 0.86,0 1.557,0.697756 1.557,1.556378 l 0,15.986051 c 0,0.859627 -0.696,1.556377 -1.557,1.556377 l -28.101,0 c -0.86,0 -1.557,-0.697756 -1.557,-1.556377 l 0,-15.986051 c 0,-0.858622 0.697,-1.556378 1.557,-1.556378 z"
+         enable-background="new    "
+         inkscape:r_cx="true"
+         inkscape:r_cy="true"
+         id="rect1541"
+         inkscape:connector-curvature="0" /><path
+         style="opacity:0.48890004;fill:#ffffff"
+         d="m 7.328485,49.712161 c -0.04,0.679658 0.771,1.058698 1.127,1.021498 l 1.038,-3.078571 -0.771,-0.588166 -1.394,2.645239 z"
+         enable-background="new    "
+         sodipodi:nodetypes="ccccc"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true"
+         id="path1543"
+         inkscape:connector-curvature="0" /><path
+         style="opacity:0.48890004;fill:#ffffff"
+         d="m 37.884485,49.618657 c -0.188,0.949109 -0.887,1.059705 -1.718,1.056688 l -0.814,-3.097674 0.668,-0.407192 1.864,2.448178 z"
+         enable-background="new    "
+         sodipodi:nodetypes="ccccc"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true"
+         id="path1545"
+         inkscape:connector-curvature="0" /><path
+         style="fill:url(#linearGradient5240)"
+         d="m 37.227485,33.66478 c -0.053,-0.584145 -0.379,-1.033564 -1.014,-1.086851 l -0.861,1.150192 0.602,0.637431 1.273,-0.700772 z"
+         sodipodi:nodetypes="ccccc"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true"
+         id="path1547"
+         inkscape:connector-curvature="0" /><path
+         style="fill:url(#linearGradient5242)"
+         d="m 7.352485,33.628585 c 0.141,-0.518793 0.545,-0.956147 1.114,-0.98832 l 0.762,1.194429 -0.559,0.638437 -1.317,-0.844546 z"
+         sodipodi:nodetypes="ccccc"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true"
+         id="path1549"
+         inkscape:connector-curvature="0" /><g
+         id="text3160"
+         style="font-size:15.68481159px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"><path
+           sodipodi:nodetypes="ccccccccccccccc"
+           id="path3477"
+           d="m 24.495766,40.439103 -2.606466,-4.416705 -2.385078,4.416705 1.446048,0 0,5.238526 2.067821,0 0,-5.238526 m -4.924479,0.76586 3.827315,-6.523098 3.953822,6.523098 -2.090798,0 0,5.238526 -3.599541,0 0,-5.238526 -2.090798,0"
+           inkscape:connector-curvature="0" /></g></g></g></svg>
\ No newline at end of file
diff --git a/data/textures/tex-source/plot_zoom_reset.svg b/data/textures/tex-source/plot_zoom_reset.svg
new file mode 100644
index 0000000..dcccf5b
--- /dev/null
+++ b/data/textures/tex-source/plot_zoom_reset.svg
@@ -0,0 +1,1985 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Layer_1"
+   x="0px"
+   y="0px"
+   width="128px"
+   height="100px"
+   viewBox="0 0 128 100"
+   enable-background="new 0 0 128 100"
+   xml:space="preserve"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="plot_zoom_reset.svg"
+   inkscape:export-filename="/home/pcuser/code/3Depict/data/textures/plot_zoom_reset.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"><metadata
+     id="metadata68"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1366"
+     inkscape:window-height="715"
+     id="namedview66"
+     showgrid="false"
+     inkscape:zoom="6.1618471"
+     inkscape:cx="81.646661"
+     inkscape:cy="81.707633"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="Layer_1"
+     showguides="false"
+     inkscape:guide-bbox="true"><sodipodi:guide
+       orientation="1,0"
+       position="50.203052,73.886413"
+       id="guide2881" /><sodipodi:guide
+       orientation="1,0"
+       position="121.13781,105.35438"
+       id="guide2975" /><sodipodi:guide
+       orientation="0.70710678,0.70710678"
+       position="-143.62919,180.32566"
+       id="guide4403" /><sodipodi:guide
+       orientation="1,0"
+       position="0.68640467,264.54036"
+       id="guide4529" /></sodipodi:namedview><defs
+     id="defs3"><inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 50 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="128 : 50 : 1"
+       inkscape:persp3d-origin="64 : 33.333333 : 1"
+       id="perspective70" /><filter
+       id="Gaussian_Blur"><feGaussianBlur
+         in="SourceGraphic"
+         stdDeviation="2"
+         id="feGaussianBlur6" /></filter><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2907"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2909"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2911"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2915"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2917"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2919"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2921"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2923"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2925"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2927"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2929"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2932"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2935"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2942"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2946"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2983"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2985"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2987"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2989"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2993"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2995"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2997"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2999"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient3001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient3003"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3005"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2978"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2980"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2982"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2984"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2986"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2990"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2994"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2998"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2955"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2958"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2965"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2969"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2972"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4417"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4425"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4430"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4433"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4444"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4447"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4463"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4465"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4467"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4469"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4473"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4476"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4483"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4526"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4538"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4542"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4545"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4565"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4567"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4569"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4575"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4578"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4581"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4585"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4591"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4607"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4609"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4611"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4613"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4615"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4617"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5429"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5431"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5433"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5435"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5439"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5441"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5443"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5445"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5447"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5449"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5471"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5473"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5475"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5477"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5479"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5481"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5483"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5485"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5487"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5489"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5491"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5493"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5495"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5497"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5499"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5501"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5503"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5505"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5507"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5509"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5511"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5513"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5515"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5517"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5561"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5563"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5565"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5567"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5569"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5575"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5577"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5579"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5581"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5583"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5585"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5587"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5589"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5591"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5593"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5595"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5597"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5599"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5601"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5603"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5605"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5607"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5661"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5663"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5667"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5715"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5723"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5725"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5727"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5731"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5733"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5735"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5737"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5739"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5741"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5743"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5745"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5747"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5749"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient5751"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient5753"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient5755"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient5757"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient5759"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient5761"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /></defs><linearGradient
+     id="SVGID_1_"
+     gradientUnits="userSpaceOnUse"
+     x1="215.7656"
+     y1="-278.127"
+     x2="222.8434"
+     y2="-212.7417"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop11" /><stop
+       offset="0.5838"
+       style="stop-color:#1572DE"
+       id="stop13" /><stop
+       offset="0.8528"
+       style="stop-color:#0938BC"
+       id="stop15" /></linearGradient><linearGradient
+     id="SVGID_2_"
+     gradientUnits="userSpaceOnUse"
+     x1="186.625"
+     y1="-258.7021"
+     x2="186.625"
+     y2="-248.506"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20D4FF"
+       id="stop20" /><stop
+       offset="1"
+       style="stop-color:#20ADFF"
+       id="stop22" /></linearGradient><linearGradient
+     id="SVGID_3_"
+     gradientUnits="userSpaceOnUse"
+     x1="237.3691"
+     y1="-274.5654"
+     x2="237.3691"
+     y2="-223.0167"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#3AEFFF"
+       id="stop29" /><stop
+       offset="0.5482"
+       style="stop-color:#20ABFF"
+       id="stop31" /><stop
+       offset="0.619"
+       style="stop-color:#1EA1F9"
+       id="stop33" /><stop
+       offset="0.7399"
+       style="stop-color:#1986E9"
+       id="stop35" /><stop
+       offset="0.8955"
+       style="stop-color:#105AD0"
+       id="stop37" /><stop
+       offset="1"
+       style="stop-color:#0938BC"
+       id="stop39" /></linearGradient><linearGradient
+     id="SVGID_4_"
+     gradientUnits="userSpaceOnUse"
+     x1="199.0293"
+     y1="-265.7773"
+     x2="278.4434"
+     y2="-265.7773"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop44" /><stop
+       offset="1"
+       style="stop-color:#2057D9"
+       id="stop46" /></linearGradient><linearGradient
+     id="SVGID_5_"
+     gradientUnits="userSpaceOnUse"
+     x1="183.9668"
+     y1="-253.4766"
+     x2="183.9668"
+     y2="-250.6126"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop53" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop55" /></linearGradient><linearGradient
+     id="SVGID_6_"
+     gradientUnits="userSpaceOnUse"
+     x1="116.0586"
+     y1="-316.2344"
+     x2="116.0586"
+     y2="-313.3705"
+     gradientTransform="matrix(0.9448 -0.3275 -0.3275 -0.9448 -130.0903 -201.9744)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop60" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop62" /></linearGradient><g
+     id="g5673"
+     transform="matrix(0.74374109,0,0,0.74374109,15.342271,20.288318)"><g
+       transform="matrix(0.43289124,0.43289124,-0.40728976,0.40728976,94.341426,25.981939)"
+       id="g2885"><path
+         inkscape:connector-curvature="0"
+         enable-background="new    "
+         d="m 7.333,54.584 c 0,0 67.667,-15.334 114.544,3.387 0.996,1.155 0.379,2.506 -1.603,3.453 -1.978,0.945 -68.924,25.151 -68.924,25.151 0,0 -3.244,1.307 -4.803,1.264 -2.569,-0.069 -4.087,-0.8 -4.129,-6.866 -0.027,-3.962 1.748,-10.556 1.748,-10.556 l -35.2,-0.062 c 0,0 -2.428,0.155 -4.381,-1.938 C 2.71,66.406 7.333,54.584 7.333,54.584 z"
+         style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:0;filter:url(#Gaussian_Blur)"
+         id="path8" /><path
+         inkscape:connector-curvature="0"
+         style="fill:url(#linearGradient5715)"
+         d="m 3.269,61.407 c 0,0 -0.076,-6.572 -0.084,-8.765 C 3.173,49.495 2.9630708,45.841824 3.119964,40.223051 3.2753199,34.659322 2.9097365,33.850631 3.6088261,32.616747 4.2857123,31.422053 43.522164,32.212 43.522164,32.212 l 0.440961,-13.599474 c 0,0 -0.133193,-5.409473 1.764811,-4.767242 32.377673,10.955691 47.907618,16.637312 69.151144,25.83498 1.074,0.531 7.17692,2.91374 7.19692,4.03074 0.035,1.855 0.171,11.375 0.171,11.375 0,0 0.379,2.507 -1.603,3.454 -1.977,0.946 -68.924,25.15 [...]
+         id="path17"
+         sodipodi:nodetypes="csssccscscscsscccc" /><path
+         inkscape:connector-curvature="0"
+         style="fill:url(#linearGradient5717)"
+         d="M 49.463,65.747 8.933,65.832 6.91,64.566 c 0,0 -0.59,-3.116 -0.505,-6.571 0.085,-3.455 0.084,-3.455 0.084,-3.455 0,0 -0.084,-3.201 3.539,-3.286 3.623,-0.085 44.826,-0.253 44.826,-0.253 l -5.391,14.746 z"
+         id="path24" /><path
+         inkscape:connector-curvature="0"
+         style="fill:#20bfff"
+         d="m 3.236,58.395 c 0,0 -0.758,5.311 1.833,7.395 1.324,1.064 2.948,1.703 4.192,1.729 8.595,0.168 34.621,0.379 34.621,0.379 0,0 1.384457,8.132064 1.472721,10.746974 0.147,4.355033 4.848331,2.380149 4.848331,2.380149 0,0 -1.353016,-4.527613 -0.503016,-7.034613 0.8,-2.358 2.716498,-8.859016 1.759498,-9.987016 C 50.638534,63.033494 9.64,64.714 9.64,64.714 c 0,0 -2.928,0.2 -4.382,-1.38 C 3.907,61.865 3.236,58.395 3.236,58.395 z"
+         id="path26"
+         sodipodi:nodetypes="csccscsscsc" /><path
+         inkscape:connector-curvature="0"
+         style="fill:url(#linearGradient5719)"
+         d="m 50.203052,26.113587 0,-4.756487 68.346418,28.088531 c 0,0 1.72116,6.732531 -0.80684,7.742531 -2.526,1.011 -68.992202,24.028293 -68.992202,24.028293 l 1.452624,-55.102868 z"
+         id="path41"
+         sodipodi:nodetypes="cccscc" /><path
+         inkscape:connector-curvature="0"
+         style="fill:url(#linearGradient5721)"
+         d="m 49.18,82.389 c 0,0 66.071,-24.488 67.683,-25.09 1.621,-0.604 5.135,-1.801 5.197,-3.775 0.111,-3.474 1.265,4.093 -1.068,4.979 -1.91,0.725 -69.642,25.362 -69.642,25.362 0,0 -2.232,1.096 -4.739,1.073 l 0.042,-1.918 c 1.011,0 2.527,-0.631 2.527,-0.631 z"
+         id="path48"
+         sodipodi:nodetypes="cssscccc" /><path
+         inkscape:connector-curvature="0"
+         style="opacity:0.6;fill:#ffffff"
+         enable-background="new    "
+         d="m 6.0004496,47.314 c 0,0 0.038757,-6.162595 -0.00746,-9.178678 -0.050187,-3.274864 0.1910071,-3.6877 0.1910071,-3.6877 l 42.1591963,0.0088 c 3.348944,6.99e-4 1.492417,-9.805242 1.859863,-16.182488 0.127652,-2.215478 55.185994,20.929913 55.459994,22.015913 0.346,1.374 -5.32756,4.616004 -15.990899,10.489692 -9.733529,5.36152 -23.674244,8.996228 -34.497131,11.559206 -6.361723,1.382527 -5.095605,-1.219897 -4.45802,-7.040745 0,-1.69 -0.485,-3.55 -3.497,-5.708 C 43.724,47.083 33.96 [...]
+         id="path50"
+         sodipodi:nodetypes="cscssssccscc" /><path
+         inkscape:connector-curvature="0"
+         style="opacity:0.7;fill:url(#linearGradient5723)"
+         enable-background="new    "
+         d="m 50.128,54.961 c 0,1.023 -0.83,1.854 -1.854,1.854 H 7.66 c -1.023,0 -1.854,-0.828 -1.854,-1.854 l 0,0 c 0,-1.023 0.83,-1.854 1.854,-1.854 h 40.614 c 1.024,0 1.854,0.831 1.854,1.854 l 0,0 z"
+         id="path57" /><path
+         inkscape:connector-curvature="0"
+         style="opacity:0.7;fill:url(#linearGradient5725)"
+         enable-background="new    "
+         d="m 119.632,44.537 c 0.335,0.968 -0.776,2.23 -2.487,2.824 L 49.334,70.866 c -1.709,0.593 -3.367,0.29 -3.703,-0.679 l 0,0 c -0.334,-0.967 0.78,-2.23 2.488,-2.823 l 67.813,-23.506 c 1.709,-0.593 3.364,-0.289 3.7,0.679 l 0,0 z"
+         id="path64" /></g><g
+       transform="matrix(-0.43289124,-0.43289124,-0.40728976,0.40728976,79.162298,13.037293)"
+       id="g2896"><path
+         inkscape:connector-curvature="0"
+         id="path2898"
+         style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:0;filter:url(#Gaussian_Blur)"
+         d="m 7.333,54.584 c 0,0 67.667,-15.334 114.544,3.387 0.996,1.155 0.379,2.506 -1.603,3.453 -1.978,0.945 -68.924,25.151 -68.924,25.151 0,0 -3.244,1.307 -4.803,1.264 -2.569,-0.069 -4.087,-0.8 -4.129,-6.866 -0.027,-3.962 1.748,-10.556 1.748,-10.556 l -35.2,-0.062 c 0,0 -2.428,0.155 -4.381,-1.938 C 2.71,66.406 7.333,54.584 7.333,54.584 z"
+         enable-background="new    " /><path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="csssccscscscsscccc"
+         id="path2900"
+         d="m 3.269,61.407 c 0,0 -0.076,-6.572 -0.084,-8.765 C 3.173,49.495 2.9630708,45.841824 3.119964,40.223051 3.2753199,34.659322 2.9097365,33.850631 3.6088261,32.616747 4.2857123,31.422053 43.522164,32.212 43.522164,32.212 l 0.440961,-13.599474 c 0,0 -0.133193,-5.409473 1.764811,-4.767242 32.377673,10.955691 47.907618,16.637312 69.151144,25.83498 1.074,0.531 7.17692,2.91374 7.19692,4.03074 0.035,1.855 0.171,11.375 0.171,11.375 0,0 0.379,2.507 -1.603,3.454 -1.977,0.946 -68.924,25.15 [...]
+         style="fill:url(#linearGradient5727)" /><path
+         inkscape:connector-curvature="0"
+         id="path2902"
+         d="M 49.463,65.747 8.933,65.832 6.91,64.566 c 0,0 -0.59,-3.116 -0.505,-6.571 0.085,-3.455 0.084,-3.455 0.084,-3.455 0,0 -0.084,-3.201 3.539,-3.286 3.623,-0.085 44.826,-0.253 44.826,-0.253 l -5.391,14.746 z"
+         style="fill:url(#linearGradient5729)" /><path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="csccscsscsc"
+         id="path2904"
+         d="m 3.236,58.395 c 0,0 -0.758,5.311 1.833,7.395 1.324,1.064 2.948,1.703 4.192,1.729 8.595,0.168 34.621,0.379 34.621,0.379 0,0 1.384457,8.132064 1.472721,10.746974 0.147,4.355033 4.848331,2.380149 4.848331,2.380149 0,0 -1.353016,-4.527613 -0.503016,-7.034613 0.8,-2.358 2.716498,-8.859016 1.759498,-9.987016 C 50.638534,63.033494 9.64,64.714 9.64,64.714 c 0,0 -2.928,0.2 -4.382,-1.38 C 3.907,61.865 3.236,58.395 3.236,58.395 z"
+         style="fill:#20bfff" /><path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccscc"
+         id="path2906"
+         d="m 50.203052,26.113587 0,-4.756487 68.346418,28.088531 c 0,0 1.72116,6.732531 -0.80684,7.742531 -2.526,1.011 -68.992202,24.028293 -68.992202,24.028293 l 1.452624,-55.102868 z"
+         style="fill:url(#linearGradient5731)" /><path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cssscccc"
+         id="path2908"
+         d="m 49.18,82.389 c 0,0 66.071,-24.488 67.683,-25.09 1.621,-0.604 5.135,-1.801 5.197,-3.775 0.111,-3.474 1.265,4.093 -1.068,4.979 -1.91,0.725 -69.642,25.362 -69.642,25.362 0,0 -2.232,1.096 -4.739,1.073 l 0.042,-1.918 c 1.011,0 2.527,-0.631 2.527,-0.631 z"
+         style="fill:url(#linearGradient5733)" /><path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cscssssccscc"
+         id="path2910"
+         d="m 6.0004496,47.314 c 0,0 0.038757,-6.162595 -0.00746,-9.178678 -0.050187,-3.274864 0.1910071,-3.6877 0.1910071,-3.6877 l 42.1591963,0.0088 c 3.348944,6.99e-4 1.492417,-9.805242 1.859863,-16.182488 0.127652,-2.215478 55.185994,20.929913 55.459994,22.015913 0.346,1.374 -5.32756,4.616004 -15.990899,10.489692 -9.733529,5.36152 -23.674244,8.996228 -34.497131,11.559206 -6.361723,1.382527 -5.095605,-1.219897 -4.45802,-7.040745 0,-1.69 -0.485,-3.55 -3.497,-5.708 C 43.724,47.083 33.96 [...]
+         enable-background="new    "
+         style="opacity:0.6;fill:#ffffff" /><path
+         inkscape:connector-curvature="0"
+         id="path2912"
+         d="m 50.128,54.961 c 0,1.023 -0.83,1.854 -1.854,1.854 H 7.66 c -1.023,0 -1.854,-0.828 -1.854,-1.854 l 0,0 c 0,-1.023 0.83,-1.854 1.854,-1.854 h 40.614 c 1.024,0 1.854,0.831 1.854,1.854 l 0,0 z"
+         enable-background="new    "
+         style="opacity:0.7;fill:url(#linearGradient5735)" /><path
+         inkscape:connector-curvature="0"
+         id="path2914"
+         d="m 119.632,44.537 c 0.335,0.968 -0.776,2.23 -2.487,2.824 L 49.334,70.866 c -1.709,0.593 -3.367,0.29 -3.703,-0.679 l 0,0 c -0.334,-0.967 0.78,-2.23 2.488,-2.823 l 67.813,-23.506 c 1.709,-0.593 3.364,-0.289 3.7,0.679 l 0,0 z"
+         enable-background="new    "
+         style="opacity:0.7;fill:url(#linearGradient5737)" /></g><g
+       id="g5365"
+       transform="matrix(0.43289124,-0.43289124,0.40728976,0.40728976,51.660866,11.823462)"><path
+         id="path5367"
+         style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:0;filter:url(#Gaussian_Blur)"
+         d="m 7.333,54.584 c 0,0 67.667,-15.334 114.544,3.387 0.996,1.155 0.379,2.506 -1.603,3.453 -1.978,0.945 -68.924,25.151 -68.924,25.151 0,0 -3.244,1.307 -4.803,1.264 -2.569,-0.069 -4.087,-0.8 -4.129,-6.866 -0.027,-3.962 1.748,-10.556 1.748,-10.556 l -35.2,-0.062 c 0,0 -2.428,0.155 -4.381,-1.938 C 2.71,66.406 7.333,54.584 7.333,54.584 z"
+         enable-background="new    "
+         inkscape:connector-curvature="0" /><path
+         sodipodi:nodetypes="csssccscscscsscccc"
+         id="path5369"
+         d="m 3.269,61.407 c 0,0 -0.076,-6.572 -0.084,-8.765 C 3.173,49.495 2.9630708,45.841824 3.119964,40.223051 3.2753199,34.659322 2.9097365,33.850631 3.6088261,32.616747 4.2857123,31.422053 43.522164,32.212 43.522164,32.212 l 0.440961,-13.599474 c 0,0 -0.133193,-5.409473 1.764811,-4.767242 32.377673,10.955691 47.907618,16.637312 69.151144,25.83498 1.074,0.531 7.17692,2.91374 7.19692,4.03074 0.035,1.855 0.171,11.375 0.171,11.375 0,0 0.379,2.507 -1.603,3.454 -1.977,0.946 -68.924,25.15 [...]
+         style="fill:url(#linearGradient5739)"
+         inkscape:connector-curvature="0" /><path
+         id="path5371"
+         d="M 49.463,65.747 8.933,65.832 6.91,64.566 c 0,0 -0.59,-3.116 -0.505,-6.571 0.085,-3.455 0.084,-3.455 0.084,-3.455 0,0 -0.084,-3.201 3.539,-3.286 3.623,-0.085 44.826,-0.253 44.826,-0.253 l -5.391,14.746 z"
+         style="fill:url(#linearGradient5741)"
+         inkscape:connector-curvature="0" /><path
+         sodipodi:nodetypes="csccscsscsc"
+         id="path5373"
+         d="m 3.236,58.395 c 0,0 -0.758,5.311 1.833,7.395 1.324,1.064 2.948,1.703 4.192,1.729 8.595,0.168 34.621,0.379 34.621,0.379 0,0 1.384457,8.132064 1.472721,10.746974 0.147,4.355033 4.848331,2.380149 4.848331,2.380149 0,0 -1.353016,-4.527613 -0.503016,-7.034613 0.8,-2.358 2.716498,-8.859016 1.759498,-9.987016 C 50.638534,63.033494 9.64,64.714 9.64,64.714 c 0,0 -2.928,0.2 -4.382,-1.38 C 3.907,61.865 3.236,58.395 3.236,58.395 z"
+         style="fill:#20bfff"
+         inkscape:connector-curvature="0" /><path
+         sodipodi:nodetypes="cccscc"
+         id="path5375"
+         d="m 50.203052,26.113587 0,-4.756487 68.346418,28.088531 c 0,0 1.72116,6.732531 -0.80684,7.742531 -2.526,1.011 -68.992202,24.028293 -68.992202,24.028293 l 1.452624,-55.102868 z"
+         style="fill:url(#linearGradient5743)"
+         inkscape:connector-curvature="0" /><path
+         sodipodi:nodetypes="cssscccc"
+         id="path5377"
+         d="m 49.18,82.389 c 0,0 66.071,-24.488 67.683,-25.09 1.621,-0.604 5.135,-1.801 5.197,-3.775 0.111,-3.474 1.265,4.093 -1.068,4.979 -1.91,0.725 -69.642,25.362 -69.642,25.362 0,0 -2.232,1.096 -4.739,1.073 l 0.042,-1.918 c 1.011,0 2.527,-0.631 2.527,-0.631 z"
+         style="fill:url(#linearGradient5745)"
+         inkscape:connector-curvature="0" /><path
+         sodipodi:nodetypes="cscssssccscc"
+         id="path5379"
+         d="m 6.0004496,47.314 c 0,0 0.038757,-6.162595 -0.00746,-9.178678 -0.050187,-3.274864 0.1910071,-3.6877 0.1910071,-3.6877 l 42.1591963,0.0088 c 3.348944,6.99e-4 1.492417,-9.805242 1.859863,-16.182488 0.127652,-2.215478 55.185994,20.929913 55.459994,22.015913 0.346,1.374 -5.32756,4.616004 -15.990899,10.489692 -9.733529,5.36152 -23.674244,8.996228 -34.497131,11.559206 -6.361723,1.382527 -5.095605,-1.219897 -4.45802,-7.040745 0,-1.69 -0.485,-3.55 -3.497,-5.708 C 43.724,47.083 33.96 [...]
+         enable-background="new    "
+         style="opacity:0.6;fill:#ffffff"
+         inkscape:connector-curvature="0" /><path
+         id="path5381"
+         d="m 50.128,54.961 c 0,1.023 -0.83,1.854 -1.854,1.854 H 7.66 c -1.023,0 -1.854,-0.828 -1.854,-1.854 l 0,0 c 0,-1.023 0.83,-1.854 1.854,-1.854 h 40.614 c 1.024,0 1.854,0.831 1.854,1.854 l 0,0 z"
+         enable-background="new    "
+         style="opacity:0.7;fill:url(#linearGradient5747)"
+         inkscape:connector-curvature="0" /><path
+         id="path5383"
+         d="m 119.632,44.537 c 0.335,0.968 -0.776,2.23 -2.487,2.824 L 49.334,70.866 c -1.709,0.593 -3.367,0.29 -3.703,-0.679 l 0,0 c -0.334,-0.967 0.78,-2.23 2.488,-2.823 l 67.813,-23.506 c 1.709,-0.593 3.364,-0.289 3.7,0.679 l 0,0 z"
+         enable-background="new    "
+         style="opacity:0.7;fill:url(#linearGradient5749)"
+         inkscape:connector-curvature="0" /></g><g
+       id="g5385"
+       transform="matrix(-0.43289124,0.43289124,0.40728976,0.40728976,34.262955,26.754622)"><path
+         enable-background="new    "
+         d="m 7.333,54.584 c 0,0 67.667,-15.334 114.544,3.387 0.996,1.155 0.379,2.506 -1.603,3.453 -1.978,0.945 -68.924,25.151 -68.924,25.151 0,0 -3.244,1.307 -4.803,1.264 -2.569,-0.069 -4.087,-0.8 -4.129,-6.866 -0.027,-3.962 1.748,-10.556 1.748,-10.556 l -35.2,-0.062 c 0,0 -2.428,0.155 -4.381,-1.938 C 2.71,66.406 7.333,54.584 7.333,54.584 z"
+         style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:0;filter:url(#Gaussian_Blur)"
+         id="path5387"
+         inkscape:connector-curvature="0" /><path
+         style="fill:url(#linearGradient5751)"
+         d="m 3.269,61.407 c 0,0 -0.076,-6.572 -0.084,-8.765 C 3.173,49.495 2.9630708,45.841824 3.119964,40.223051 3.2753199,34.659322 2.9097365,33.850631 3.6088261,32.616747 4.2857123,31.422053 43.522164,32.212 43.522164,32.212 l 0.440961,-13.599474 c 0,0 -0.133193,-5.409473 1.764811,-4.767242 32.377673,10.955691 47.907618,16.637312 69.151144,25.83498 1.074,0.531 7.17692,2.91374 7.19692,4.03074 0.035,1.855 0.171,11.375 0.171,11.375 0,0 0.379,2.507 -1.603,3.454 -1.977,0.946 -68.924,25.15 [...]
+         id="path5389"
+         sodipodi:nodetypes="csssccscscscsscccc"
+         inkscape:connector-curvature="0" /><path
+         style="fill:url(#linearGradient5753)"
+         d="M 49.463,65.747 8.933,65.832 6.91,64.566 c 0,0 -0.59,-3.116 -0.505,-6.571 0.085,-3.455 0.084,-3.455 0.084,-3.455 0,0 -0.084,-3.201 3.539,-3.286 3.623,-0.085 44.826,-0.253 44.826,-0.253 l -5.391,14.746 z"
+         id="path5391"
+         inkscape:connector-curvature="0" /><path
+         style="fill:#20bfff"
+         d="m 3.236,58.395 c 0,0 -0.758,5.311 1.833,7.395 1.324,1.064 2.948,1.703 4.192,1.729 8.595,0.168 34.621,0.379 34.621,0.379 0,0 1.384457,8.132064 1.472721,10.746974 0.147,4.355033 4.848331,2.380149 4.848331,2.380149 0,0 -1.353016,-4.527613 -0.503016,-7.034613 0.8,-2.358 2.716498,-8.859016 1.759498,-9.987016 C 50.638534,63.033494 9.64,64.714 9.64,64.714 c 0,0 -2.928,0.2 -4.382,-1.38 C 3.907,61.865 3.236,58.395 3.236,58.395 z"
+         id="path5393"
+         sodipodi:nodetypes="csccscsscsc"
+         inkscape:connector-curvature="0" /><path
+         style="fill:url(#linearGradient5755)"
+         d="m 50.203052,26.113587 0,-4.756487 68.346418,28.088531 c 0,0 1.72116,6.732531 -0.80684,7.742531 -2.526,1.011 -68.992202,24.028293 -68.992202,24.028293 l 1.452624,-55.102868 z"
+         id="path5395"
+         sodipodi:nodetypes="cccscc"
+         inkscape:connector-curvature="0" /><path
+         style="fill:url(#linearGradient5757)"
+         d="m 49.18,82.389 c 0,0 66.071,-24.488 67.683,-25.09 1.621,-0.604 5.135,-1.801 5.197,-3.775 0.111,-3.474 1.265,4.093 -1.068,4.979 -1.91,0.725 -69.642,25.362 -69.642,25.362 0,0 -2.232,1.096 -4.739,1.073 l 0.042,-1.918 c 1.011,0 2.527,-0.631 2.527,-0.631 z"
+         id="path5397"
+         sodipodi:nodetypes="cssscccc"
+         inkscape:connector-curvature="0" /><path
+         style="opacity:0.6;fill:#ffffff"
+         enable-background="new    "
+         d="m 6.0004496,47.314 c 0,0 0.038757,-6.162595 -0.00746,-9.178678 -0.050187,-3.274864 0.1910071,-3.6877 0.1910071,-3.6877 l 42.1591963,0.0088 c 3.348944,6.99e-4 1.492417,-9.805242 1.859863,-16.182488 0.127652,-2.215478 55.185994,20.929913 55.459994,22.015913 0.346,1.374 -5.32756,4.616004 -15.990899,10.489692 -9.733529,5.36152 -23.674244,8.996228 -34.497131,11.559206 -6.361723,1.382527 -5.095605,-1.219897 -4.45802,-7.040745 0,-1.69 -0.485,-3.55 -3.497,-5.708 C 43.724,47.083 33.96 [...]
+         id="path5399"
+         sodipodi:nodetypes="cscssssccscc"
+         inkscape:connector-curvature="0" /><path
+         style="opacity:0.7;fill:url(#linearGradient5759)"
+         enable-background="new    "
+         d="m 50.128,54.961 c 0,1.023 -0.83,1.854 -1.854,1.854 H 7.66 c -1.023,0 -1.854,-0.828 -1.854,-1.854 l 0,0 c 0,-1.023 0.83,-1.854 1.854,-1.854 h 40.614 c 1.024,0 1.854,0.831 1.854,1.854 l 0,0 z"
+         id="path5401"
+         inkscape:connector-curvature="0" /><path
+         style="opacity:0.7;fill:url(#linearGradient5761)"
+         enable-background="new    "
+         d="m 119.632,44.537 c 0.335,0.968 -0.776,2.23 -2.487,2.824 L 49.334,70.866 c -1.709,0.593 -3.367,0.29 -3.703,-0.679 l 0,0 c -0.334,-0.967 0.78,-2.23 2.488,-2.823 l 67.813,-23.506 c 1.709,-0.593 3.364,-0.289 3.7,0.679 l 0,0 z"
+         id="path5403"
+         inkscape:connector-curvature="0" /></g></g></svg>
\ No newline at end of file
diff --git a/data/textures/tex-source/plot_zoom_x.svg b/data/textures/tex-source/plot_zoom_x.svg
new file mode 100644
index 0000000..e6ac4ca
--- /dev/null
+++ b/data/textures/tex-source/plot_zoom_x.svg
@@ -0,0 +1,1607 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Layer_1"
+   x="0px"
+   y="0px"
+   width="128px"
+   height="100px"
+   viewBox="0 0 128 100"
+   enable-background="new 0 0 128 100"
+   xml:space="preserve"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="plot_zoom_x.svg"
+   inkscape:export-filename="/home/pcuser/code/3Depict/data/textures/plot_zoom_x.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"><metadata
+     id="metadata68"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1366"
+     inkscape:window-height="715"
+     id="namedview66"
+     showgrid="false"
+     inkscape:zoom="13.604567"
+     inkscape:cx="79.715222"
+     inkscape:cy="31.41739"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g14399"
+     showguides="false"
+     inkscape:guide-bbox="true"><sodipodi:guide
+       orientation="1,0"
+       position="50.203052,73.886413"
+       id="guide2881" /><sodipodi:guide
+       orientation="1,0"
+       position="121.13781,105.35438"
+       id="guide2975" /><sodipodi:guide
+       orientation="0.70710678,0.70710678"
+       position="-143.62919,180.32566"
+       id="guide4403" /><sodipodi:guide
+       orientation="1,0"
+       position="0.68640467,264.54036"
+       id="guide4529" /></sodipodi:namedview><defs
+     id="defs3"><inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 50 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="128 : 50 : 1"
+       inkscape:persp3d-origin="64 : 33.333333 : 1"
+       id="perspective70" /><filter
+       id="Gaussian_Blur"><feGaussianBlur
+         in="SourceGraphic"
+         stdDeviation="2"
+         id="feGaussianBlur6" /></filter><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2907"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2909"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2911"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2915"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2917"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2919"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2921"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2923"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2925"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2927"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2929"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2932"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2935"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2942"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2946"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2983"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2985"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2987"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2989"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2993"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2995"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2997"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2999"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient3001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient3003"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3005"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2978"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2980"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2982"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2984"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2986"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2990"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2994"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2998"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2955"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2958"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2965"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2969"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2972"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4417"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4425"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4430"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4433"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4444"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4447"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4463"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4465"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4467"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4469"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4473"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4476"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4483"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4526"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4538"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4542"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4545"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4565"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4567"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4569"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4575"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4578"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4581"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4585"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4591"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4607"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4609"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4611"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4613"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4615"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4617"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9508,0,0,-0.9951,-24.4029,15.4837)"
+       r="15.0952"
+       cy="1.0189"
+       cx="52.1642"
+       id="rect1539_1_"><stop
+         id="stop3082"
+         style="stop-color:#F2F4F1"
+         offset="0" /><stop
+         id="stop3084"
+         style="stop-color:#D3D7CF"
+         offset="1" /></radialGradient><linearGradient
+       y2="364.34341"
+       x2="-254.4203"
+       y1="385.84341"
+       x1="-254.4203"
+       gradientUnits="userSpaceOnUse"
+       id="rect1539_2_"><stop
+         id="stop3087"
+         style="stop-color:#EEEEEC"
+         offset="0" /><stop
+         id="stop3089"
+         style="stop-color:#FFFFFF"
+         offset="1" /></linearGradient><linearGradient
+       gradientTransform="matrix(0.5242,0,0,-0.527,-119.2748,-156.3932)"
+       y2="-299.68979"
+       x2="303.06491"
+       y1="-298.24731"
+       x1="301.922"
+       gradientUnits="userSpaceOnUse"
+       id="path1547_1_"><stop
+         id="stop3096"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="0" /><stop
+         id="stop3098"
+         style="stop-color:#FFFFFF"
+         offset="0.5" /><stop
+         id="stop3100"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="1" /></linearGradient><linearGradient
+       gradientTransform="matrix(0.5242,0,0,-0.527,-130.9037,-156.3631)"
+       y2="-298.50659"
+       x2="271.75931"
+       y1="-299.65561"
+       x1="270.80869"
+       gradientUnits="userSpaceOnUse"
+       id="path1549_1_"><stop
+         id="stop3104"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="0" /><stop
+         id="stop3106"
+         style="stop-color:#FFFFFF"
+         offset="0.5" /><stop
+         id="stop3108"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="1" /></linearGradient><radialGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_1_"
+       id="radialGradient5236"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9508,0,0,-1.0004855,-27.387415,47.915188)"
+       cx="52.1642"
+       cy="1.0189"
+       r="15.0952" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_2_"
+       id="linearGradient5238"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.005412,-2.984515,32.34769)"
+       x1="-254.4203"
+       y1="385.84341"
+       x2="-254.4203"
+       y2="364.34341" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1547_1_"
+       id="linearGradient5240"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-122.25932,-124.89191)"
+       x1="301.922"
+       y1="-298.24731"
+       x2="303.06491"
+       y2="-299.68979" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1549_1_"
+       id="linearGradient5242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-133.88821,-124.86165)"
+       x1="270.80869"
+       y1="-299.65561"
+       x2="271.75931"
+       y2="-298.50659" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient14049"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient14051"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient14053"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient14055"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient14057"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient14059"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient14061"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient14063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient14065"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient14067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient14069"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient14071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient14263"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient14265"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient14267"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient14269"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient14271"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient14273"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient14275"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient14277"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient14279"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient14281"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient14283"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient14285"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient14339"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient14341"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient14343"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient14345"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient14347"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient14349"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient14351"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient14353"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient14355"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient14357"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient14359"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient14361"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient17101"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient17103"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient17105"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient17107"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient17109"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient17111"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient17113"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient17115"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient17117"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient17119"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient17121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient17123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /></defs><linearGradient
+     id="SVGID_1_"
+     gradientUnits="userSpaceOnUse"
+     x1="215.7656"
+     y1="-278.127"
+     x2="222.8434"
+     y2="-212.7417"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop11" /><stop
+       offset="0.5838"
+       style="stop-color:#1572DE"
+       id="stop13" /><stop
+       offset="0.8528"
+       style="stop-color:#0938BC"
+       id="stop15" /></linearGradient><linearGradient
+     id="SVGID_2_"
+     gradientUnits="userSpaceOnUse"
+     x1="186.625"
+     y1="-258.7021"
+     x2="186.625"
+     y2="-248.506"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20D4FF"
+       id="stop20" /><stop
+       offset="1"
+       style="stop-color:#20ADFF"
+       id="stop22" /></linearGradient><linearGradient
+     id="SVGID_3_"
+     gradientUnits="userSpaceOnUse"
+     x1="237.3691"
+     y1="-274.5654"
+     x2="237.3691"
+     y2="-223.0167"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#3AEFFF"
+       id="stop29" /><stop
+       offset="0.5482"
+       style="stop-color:#20ABFF"
+       id="stop31" /><stop
+       offset="0.619"
+       style="stop-color:#1EA1F9"
+       id="stop33" /><stop
+       offset="0.7399"
+       style="stop-color:#1986E9"
+       id="stop35" /><stop
+       offset="0.8955"
+       style="stop-color:#105AD0"
+       id="stop37" /><stop
+       offset="1"
+       style="stop-color:#0938BC"
+       id="stop39" /></linearGradient><linearGradient
+     id="SVGID_4_"
+     gradientUnits="userSpaceOnUse"
+     x1="199.0293"
+     y1="-265.7773"
+     x2="278.4434"
+     y2="-265.7773"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop44" /><stop
+       offset="1"
+       style="stop-color:#2057D9"
+       id="stop46" /></linearGradient><linearGradient
+     id="SVGID_5_"
+     gradientUnits="userSpaceOnUse"
+     x1="183.9668"
+     y1="-253.4766"
+     x2="183.9668"
+     y2="-250.6126"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop53" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop55" /></linearGradient><linearGradient
+     id="SVGID_6_"
+     gradientUnits="userSpaceOnUse"
+     x1="116.0586"
+     y1="-316.2344"
+     x2="116.0586"
+     y2="-313.3705"
+     gradientTransform="matrix(0.9448 -0.3275 -0.3275 -0.9448 -130.0903 -201.9744)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop60" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop62" /></linearGradient><path
+     style="fill:none;stroke:#0d4cc8;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     d="m 28.207145,56.35641 22.786833,0 L 63.925,2.0229047 76.277032,55.66802 l 23.844788,0"
+     id="path13188"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="ccccc" /><g
+     style="stroke-width:2.50488949;stroke-miterlimit:4;stroke-dasharray:none"
+     id="g14399"
+     transform="matrix(1.1976576,0,0,1.1976576,-11.823019,-9.1621633)"><path
+       style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 25.72141,64.536569 0,6.75 -0.03258,-6.737034 77.09592,0.01296 -77.1285,0 m 77.0625,-1.474242 0,8.880488 z"
+       transform="matrix(0.83496318,0,0,0.83496318,9.8717856,7.650069)"
+       id="path13821"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13827"
+       d="m 37.456334,62.097402 0,5.656854"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 43.274514,62.097402 0,5.656854"
+       id="path13829"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 49.092698,62.097402 0,5.656854"
+       id="path13831"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13833"
+       d="m 54.910878,62.097402 0,5.656854"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13835"
+       d="m 60.729062,62.097402 0,5.656854"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 66.547246,62.097402 0,5.656854"
+       id="path13837"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 72.36543,62.097402 0,5.656854"
+       id="path13839"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13841"
+       d="m 78.183606,62.097402 0,5.656854"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13843"
+       d="m 84.001797,62.097402 0,5.656854"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 89.81997,62.097402 0,5.656854"
+       id="path13845"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path13866"
+       d="m 109.76136,84.310606 -92.988734,0 92.988734,0 0,6.1875"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 41.459576,84.847402 0,5.656854"
+       id="path13876"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13880"
+       d="m 66.238555,84.847402 0,5.656854"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 91.017539,84.847402 0,5.656854"
+       id="path13884"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13906"
+       d="m 16.680597,84.321345 0,6.098796"
+       style="fill:none;stroke:#000000;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path13969"
+       d="m 54.914539,57.121266 -37.278175,26.68934 -0.25,-0.25"
+       style="fill:#a7e1ff;fill-opacity:1;stroke:#0d4cc8;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.49819503;stroke-dasharray:none" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13971"
+       d="m 71.648927,57.173043 38.235273,28.375"
+       style="fill:#a7e1ff;fill-opacity:1;stroke:#0d4cc8;stroke-width:2.50488949;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.49819503;stroke-dasharray:none" /></g></svg>
\ No newline at end of file
diff --git a/data/textures/tex-source/plot_zoom_y.svg b/data/textures/tex-source/plot_zoom_y.svg
new file mode 100644
index 0000000..c796f50
--- /dev/null
+++ b/data/textures/tex-source/plot_zoom_y.svg
@@ -0,0 +1,1183 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Layer_1"
+   x="0px"
+   y="0px"
+   width="128px"
+   height="100px"
+   viewBox="0 0 128 100"
+   enable-background="new 0 0 128 100"
+   xml:space="preserve"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="plot-zoom-y.svg"
+   inkscape:export-filename="/home/pcuser/code/3Depict/data/textures/tex-source/plot-zoom-x.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"><metadata
+     id="metadata68"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1366"
+     inkscape:window-height="715"
+     id="namedview66"
+     showgrid="false"
+     inkscape:zoom="2.64"
+     inkscape:cx="34.717636"
+     inkscape:cy="51.44301"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="Layer_1"
+     showguides="false"
+     inkscape:guide-bbox="true"><sodipodi:guide
+       orientation="1,0"
+       position="50.203052,73.886413"
+       id="guide2881" /><sodipodi:guide
+       orientation="1,0"
+       position="121.13781,105.35438"
+       id="guide2975" /><sodipodi:guide
+       orientation="0.70710678,0.70710678"
+       position="-143.62919,180.32566"
+       id="guide4403" /><sodipodi:guide
+       orientation="1,0"
+       position="0.68640467,264.54036"
+       id="guide4529" /></sodipodi:namedview><defs
+     id="defs3"><inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 50 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="128 : 50 : 1"
+       inkscape:persp3d-origin="64 : 33.333333 : 1"
+       id="perspective70" /><filter
+       id="Gaussian_Blur"><feGaussianBlur
+         in="SourceGraphic"
+         stdDeviation="2"
+         id="feGaussianBlur6" /></filter><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2907"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2909"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2911"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2915"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2917"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2919"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2921"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2923"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2925"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2927"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2929"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2932"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2935"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2942"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2946"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2983"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2985"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2987"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2989"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2993"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2995"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2997"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2999"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient3001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient3003"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3005"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2978"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2980"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2982"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2984"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2986"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2990"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2994"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2998"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,-1,-156,-197)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9448,-0.3275,-0.3275,-0.9448,-130.0903,-201.9744)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient2955"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient2958"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient2962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient2965"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient2969"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2972"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4417"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4425"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4430"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4433"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4440"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4444"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4447"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4463"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4465"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4467"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="237.3691"
+       y2="-223.0167" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4469"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4471"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4473"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,65.124614,-251.41487)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4476"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4483"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4526"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4538"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4542"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4545"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4565"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4567"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4569"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.61220066,0,0,-0.5759947,80.986549,-248.54964)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4575"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.57840718,-0.18863826,0.20049572,-0.54419979,63.086096,-247.53198)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4578"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4581"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4585"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4591"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient4607"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="215.7656"
+       y1="-278.127"
+       x2="222.8434"
+       y2="-212.7417" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_2_"
+       id="linearGradient4609"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="186.625"
+       y1="-258.7021"
+       x2="186.625"
+       y2="-248.506" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_3_"
+       id="linearGradient4611"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="237.3691"
+       y1="-274.5654"
+       x2="234.67352"
+       y2="-144.4818" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4_"
+       id="linearGradient4613"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="199.0293"
+       y1="-265.7773"
+       x2="278.4434"
+       y2="-265.7773" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_5_"
+       id="linearGradient4615"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61008496,0.05085264,-0.04784518,0.57400413,-167.44514,30.392627)"
+       x1="183.9668"
+       y1="-253.4766"
+       x2="183.9668"
+       y2="-250.6126" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_6_"
+       id="linearGradient4617"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.56073897,0.23603192,-0.24500695,0.52566486,-149.52202,30.865391)"
+       x1="116.0586"
+       y1="-316.2344"
+       x2="116.0586"
+       y2="-313.3705" /><radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9508,0,0,-0.9951,-24.4029,15.4837)"
+       r="15.0952"
+       cy="1.0189"
+       cx="52.1642"
+       id="rect1539_1_"><stop
+         id="stop3082"
+         style="stop-color:#F2F4F1"
+         offset="0" /><stop
+         id="stop3084"
+         style="stop-color:#D3D7CF"
+         offset="1" /></radialGradient><linearGradient
+       y2="364.34341"
+       x2="-254.4203"
+       y1="385.84341"
+       x1="-254.4203"
+       gradientUnits="userSpaceOnUse"
+       id="rect1539_2_"><stop
+         id="stop3087"
+         style="stop-color:#EEEEEC"
+         offset="0" /><stop
+         id="stop3089"
+         style="stop-color:#FFFFFF"
+         offset="1" /></linearGradient><linearGradient
+       gradientTransform="matrix(0.5242,0,0,-0.527,-119.2748,-156.3932)"
+       y2="-299.68979"
+       x2="303.06491"
+       y1="-298.24731"
+       x1="301.922"
+       gradientUnits="userSpaceOnUse"
+       id="path1547_1_"><stop
+         id="stop3096"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="0" /><stop
+         id="stop3098"
+         style="stop-color:#FFFFFF"
+         offset="0.5" /><stop
+         id="stop3100"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="1" /></linearGradient><linearGradient
+       gradientTransform="matrix(0.5242,0,0,-0.527,-130.9037,-156.3631)"
+       y2="-298.50659"
+       x2="271.75931"
+       y1="-299.65561"
+       x1="270.80869"
+       gradientUnits="userSpaceOnUse"
+       id="path1549_1_"><stop
+         id="stop3104"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="0" /><stop
+         id="stop3106"
+         style="stop-color:#FFFFFF"
+         offset="0.5" /><stop
+         id="stop3108"
+         style="stop-color:#FFFFFF;stop-opacity:0"
+         offset="1" /></linearGradient><radialGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_1_"
+       id="radialGradient5236"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9508,0,0,-1.0004855,-27.387415,47.915188)"
+       cx="52.1642"
+       cy="1.0189"
+       r="15.0952" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#rect1539_2_"
+       id="linearGradient5238"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.005412,-2.984515,32.34769)"
+       x1="-254.4203"
+       y1="385.84341"
+       x2="-254.4203"
+       y2="364.34341" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1547_1_"
+       id="linearGradient5240"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-122.25932,-124.89191)"
+       x1="301.922"
+       y1="-298.24731"
+       x2="303.06491"
+       y2="-299.68979" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#path1549_1_"
+       id="linearGradient5242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.5242,0,0,-0.52985212,-133.88821,-124.86165)"
+       x1="270.80869"
+       y1="-299.65561"
+       x2="271.75931"
+       y2="-298.50659" /></defs><linearGradient
+     id="SVGID_1_"
+     gradientUnits="userSpaceOnUse"
+     x1="215.7656"
+     y1="-278.127"
+     x2="222.8434"
+     y2="-212.7417"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop11" /><stop
+       offset="0.5838"
+       style="stop-color:#1572DE"
+       id="stop13" /><stop
+       offset="0.8528"
+       style="stop-color:#0938BC"
+       id="stop15" /></linearGradient><linearGradient
+     id="SVGID_2_"
+     gradientUnits="userSpaceOnUse"
+     x1="186.625"
+     y1="-258.7021"
+     x2="186.625"
+     y2="-248.506"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20D4FF"
+       id="stop20" /><stop
+       offset="1"
+       style="stop-color:#20ADFF"
+       id="stop22" /></linearGradient><linearGradient
+     id="SVGID_3_"
+     gradientUnits="userSpaceOnUse"
+     x1="237.3691"
+     y1="-274.5654"
+     x2="237.3691"
+     y2="-223.0167"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#3AEFFF"
+       id="stop29" /><stop
+       offset="0.5482"
+       style="stop-color:#20ABFF"
+       id="stop31" /><stop
+       offset="0.619"
+       style="stop-color:#1EA1F9"
+       id="stop33" /><stop
+       offset="0.7399"
+       style="stop-color:#1986E9"
+       id="stop35" /><stop
+       offset="0.8955"
+       style="stop-color:#105AD0"
+       id="stop37" /><stop
+       offset="1"
+       style="stop-color:#0938BC"
+       id="stop39" /></linearGradient><linearGradient
+     id="SVGID_4_"
+     gradientUnits="userSpaceOnUse"
+     x1="199.0293"
+     y1="-265.7773"
+     x2="278.4434"
+     y2="-265.7773"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#20ABFF"
+       id="stop44" /><stop
+       offset="1"
+       style="stop-color:#2057D9"
+       id="stop46" /></linearGradient><linearGradient
+     id="SVGID_5_"
+     gradientUnits="userSpaceOnUse"
+     x1="183.9668"
+     y1="-253.4766"
+     x2="183.9668"
+     y2="-250.6126"
+     gradientTransform="matrix(1 0 0 -1 -156 -197)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop53" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop55" /></linearGradient><linearGradient
+     id="SVGID_6_"
+     gradientUnits="userSpaceOnUse"
+     x1="116.0586"
+     y1="-316.2344"
+     x2="116.0586"
+     y2="-313.3705"
+     gradientTransform="matrix(0.9448 -0.3275 -0.3275 -0.9448 -130.0903 -201.9744)"><stop
+       offset="0"
+       style="stop-color:#A3E0FF"
+       id="stop60" /><stop
+       offset="1"
+       style="stop-color:#FFFFFF"
+       id="stop62" /></linearGradient><g
+     id="g14506"
+     transform="translate(10,-2)"><path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path13188"
+       d="m 40.241894,81.599535 19.026167,0 10.796927,-61.275567 10.313492,60.700787 19.90952,0"
+       style="fill:none;stroke:#0d4cc8;stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13821"
+       d="m 35.469523,19.211451 0,64.70027"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13823"
+       d="m 34.939193,19.565004 -5.656854,0"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13827"
+       d="m 34.939193,25.383188 -5.656854,0"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 34.939193,31.201368 -5.656854,0"
+       id="path13829"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 34.939193,37.019552 -5.656854,0"
+       id="path13831"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13833"
+       d="m 34.939193,42.837732 -5.656854,0"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13835"
+       d="m 34.939193,48.655916 -5.656854,0"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 34.939193,54.4741 -5.656854,0"
+       id="path13837"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 34.939193,60.292284 -5.656854,0"
+       id="path13839"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13841"
+       d="m 34.939193,66.11046 -5.656854,0"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13843"
+       d="m 34.939193,71.928651 -5.656854,0"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 34.939193,77.746824 -5.656854,0"
+       id="path13845"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 34.939193,83.565008 -5.656854,0"
+       id="path13847"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path13866"
+       d="m 12.725989,97.688214 0,-92.988734 0,92.988734 -6.1875,0"
+       style="fill:none;stroke:#000000;stroke-width:1.4334352px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       style="fill:none;stroke:#000000;stroke-width:1.4334352px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 12.189193,29.38643 -5.656854,0"
+       id="path13876"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13880"
+       d="m 12.189193,54.165409 -5.656854,0"
+       style="fill:none;stroke:#000000;stroke-width:1.4334352px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       style="fill:none;stroke:#000000;stroke-width:1.4334352px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 12.189193,78.944393 -5.656854,0"
+       id="path13884"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" /><path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path13906"
+       d="m 12.71525,4.607451 -6.098796,0"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path13969"
+       d="m 13.475989,5.313218 -0.25,0.25 26.68934,37.278175 50.993762,-0.417151"
+       style="fill:none;stroke:#0d4cc8;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49819503" /><path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path13971"
+       d="m 11.488552,97.811054 28.375,-38.235273 50.666751,-0.295478"
+       style="fill:none;stroke:#0d4cc8;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49819503" /></g></svg>
\ No newline at end of file
diff --git a/debian/changelog b/debian/changelog
index 8b4b35c..78ca4c0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,7 +2,7 @@
 
   * Update to upstream 0.0.16
 
- -- D Haley <mycae at gmx.com> Thu, 24 Apr 2014 00:56:00 +0100
+ -- D Haley <mycae at gmx.com>  Thu, 24 Apr 2014 00:56:00 +0100
 
 3depict (0.0.15-3) unstable; urgency=medium
 
diff --git a/debian/patches/FTGL-lowercase.patch b/debian/patches/FTGL-lowercase.patch
index 2db3025..61b934a 100644
--- a/debian/patches/FTGL-lowercase.patch
+++ b/debian/patches/FTGL-lowercase.patch
@@ -1,11 +1,9 @@
 Description: Debian uses lowercase lib names.
 Forwarded: not-needed
 Author: D Haley <mycae - gmx - com>
-Index: 3depict-0.0.15/configure
-===================================================================
---- 3depict-0.0.15.orig/configure	2013-12-01 19:12:05.000000000 +0100
-+++ 3depict-0.0.15/configure	2013-12-01 19:12:14.000000000 +0100
-@@ -6129,7 +6129,7 @@
+--- a/configure
++++ b/configure
+@@ -6125,7 +6125,7 @@
  if test "x$ftgl_prefix" != "x" ; then
  	#use the supplied CFLAGS. assume LIBS
  	FTGL_CFLAGS="-I$ftgl_prefix/include/ -L$ftgl_prefix/lib/"
diff --git a/debian/patches/mgl-header-dropped.patch b/debian/patches/mgl-header-dropped.patch
index 59eedbe..764c4b8 100644
--- a/debian/patches/mgl-header-dropped.patch
+++ b/debian/patches/mgl-header-dropped.patch
@@ -1,6 +1,6 @@
 In mathgl-dev, 2.1.3.1-4+b1, there is mgl_cf.h. In 1.x series, and in 2-2, there is not. 
---- 3depict-0.0.15.orig/configure
-+++ 3depict-0.0.15/configure
+--- a/configure
++++ b/configure
 @@ -6858,8 +6858,7 @@
  				{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"mathgl check: assuming mathgl 1.x\"" >&5
  $as_echo "\"mathgl check: assuming mathgl 1.x\"" >&6; }
diff --git a/debian/patches/series b/debian/patches/series
index 60fb02b..f1e710f 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,6 +1,4 @@
-fix-mgl-overlay-title
 debian-desktop-naming.patch
 lowercase-textdomain.patch
 FTGL-lowercase.patch
-patch-caching-bug
-mgl-header-dropped.patch
+upstream-patch
diff --git a/debian/patches/upstream-patch b/debian/patches/upstream-patch
new file mode 100644
index 0000000..a953101
--- /dev/null
+++ b/debian/patches/upstream-patch
@@ -0,0 +1,490 @@
+--- a/src/backend/plot.cpp
++++ b/src/backend/plot.cpp
+@@ -47,118 +47,8 @@
+ // perform a little "push off" by this fudge factor
+ const float AXIS_MIN_TOLERANCE=10*sqrtf(std::numeric_limits<float>::epsilon());
+ 
+-int MGLColourFixer::maxCols=-1;
++const unsigned int MGL_RESERVED_COLOURS=2;
+ 
+-void MGLColourFixer::reset()
+-{
+-	rs.clear();
+-	gs.clear();
+-	bs.clear();
+-}
+-
+-char MGLColourFixer::haveExactColour(float r, float g, float b) const
+-{
+-	ASSERT(rs.size() == gs.size())
+-	ASSERT(gs.size() == bs.size())
+-
+-	ASSERT(rs.size() <=getMaxColours());
+-
+-	for(unsigned int ui=0; ui<rs.size(); ui++)
+-	{
+-		if( fabs(r-rs[ui]) <std::numeric_limits<float>::epsilon()
+-			&& fabs(g-gs[ui]) <std::numeric_limits<float>::epsilon()
+-			&& fabs(b-bs[ui]) <std::numeric_limits<float>::epsilon())
+-			return mglColorIds[ui+1].id; //Add one to offset to avoid the reserved "k" 
+-	}
+-
+-	return 0;
+-}
+-
+-unsigned int MGLColourFixer::getMaxColours() 
+-{
+-	//Used cached value if available
+-	if(maxCols!=-1)
+-		return maxCols;
+-
+-	//The array is statically defined in
+-	//mgl/mgl_main.cpp, and must end with an id of zero.
+-	//
+-	//this is not documented at all.
+-	maxCols=0;
+-	while(mglColorIds[maxCols].id)
+-		maxCols++;
+-
+-	return maxCols;
+-}
+-
+-char MGLColourFixer::getNextBestColour(float r, float g, float b) 
+-{
+-	ASSERT(rs.size() == gs.size());
+-	ASSERT(gs.size() == bs.size());
+-	
+-
+-	//As a special case, mgl has its own black
+-	if(r == 0.0f && g == 0.0f && b == 0.0f)
+-		return mglColorIds[0].id;
+-
+-
+-	unsigned int best=0;
+-	if(rs.size() == getMaxColours())
+-	{
+-		ASSERT(getMaxColours());
+-		//Looks like we ran out of palette colours.
+-		//lets just give up and try to match this against our existing colours
+-
+-		//TODO: let this modify the existing palette
+-		// to find a better match.
+-		float distanceSqr=std::numeric_limits<float>::max();
+-		for(unsigned int ui=0; ui<rs.size(); ui++)
+-		{
+-			float distanceTmp;
+-			if(r <= 0.5)
+-			{
+-				//3,4,2 weighted euclidean distance. Weights allow for closer human perception
+-				distanceTmp= 3.0*(rs[ui] - r )*(rs[ui] - r ) +4.0*(gs[ui] - g )*(gs[ui] - g )
+-					     + 2.0*(bs[ui] - b )*(bs[ui] - b );
+-			}
+-			else
+-			{
+-				//use alternate weighting for closer colour perception in "non-red" half of colour cube
+-				distanceTmp= 2.0*(rs[ui] - r )*(rs[ui] - r ) +4.0*(gs[ui] - g )*(gs[ui] - g )
+-					     + 3.0*(bs[ui] - b )*(bs[ui] - b );
+-			}
+-
+-			if(distanceTmp < distanceSqr)
+-			{
+-				distanceSqr = (distanceTmp);
+-				best=ui+1; //offset by 1 because mathgl colour 0 is special
+-			}
+-
+-		}
+-	}
+-	else
+-	{
+-		char exactMatch;
+-		//Check to see if we don't already have this
+-		// no use wasting palette positions on existing
+-		// colours
+-		exactMatch=haveExactColour(r,g,b);
+-
+-		if(exactMatch)
+-			return exactMatch;
+-
+-		//Offset zero is special, for black things, like axes
+-		best=rs.size()+1;
+-		mglColorIds[best].col = mglColor(r,g,b);
+-		
+-		rs.push_back(r);
+-		gs.push_back(g);
+-		bs.push_back(b);
+-	}
+-
+-	ASSERT(mglColorIds[best].id != 'k');
+-	return mglColorIds[best].id;
+-}
+ 
+ //Mathgl uses some internal for(float=...) constructions, 
+ // which are just generally a bad idea, as they often won't terminate
+@@ -209,6 +99,18 @@
+ }
+ 
+ 
++std::string mglColourCode(float r, float g, float b)
++{
++	ASSERT(r >=0.0f && g >=0.0f && b >=0.0f)
++	ASSERT(r <=255.0f && g <=255.0f && b <=255.0f)
++	std::string s;
++	genColString((unsigned char)(r*255),
++		(unsigned char)(g*255),(unsigned char)(b*255),s);
++	s=s.substr(1);
++
++	return string("{x") + uppercase(s) + string("}");
++}
++
+ //TODO: Refactor these functions to use a common string map
+ //-----------
+ string plotString(unsigned int traceType)
+@@ -806,7 +708,6 @@
+ 	}
+ 
+ 	//Un-fudger for mathgl plots
+-	MGLColourFixer colourFixer;
+ 
+ 	bool haveMultiTitles=false;
+ 	float minX,maxX,minY,maxY;
+@@ -994,17 +895,15 @@
+ 				if(!curPlot->visible)
+ 					continue;
+ 
+-				curPlot->drawRegions(gr,colourFixer,min,max);
+-				curPlot->drawPlot(gr,colourFixer);
++				curPlot->drawRegions(gr,min,max);
++				curPlot->drawPlot(gr);
+ 				
+ 				if(drawLegend)
+ 				{
+ 					//Fake an mgl colour code
+-					char colourCode[2];
+-					colourCode[0]=colourFixer.getNextBestColour(
+-							curPlot->r,curPlot->g,curPlot->b);
+-					colourCode[1]='\0';
+-					gr->AddLegend(curPlot->title.c_str(),colourCode);
++					std::string mglColStr;
++					mglColStr= mglColourCode(curPlot->r,curPlot->g,curPlot->b);
++					gr->AddLegend(curPlot->title.c_str(),mglColStr.c_str());
+ 				}
+ 			}
+ 
+@@ -1017,7 +916,7 @@
+ 				vector<pair<size_t,size_t> > overlapId;
+ 				vector<pair<float,float> > overlapXCoords;
+ 
+-				char colourCode=colourFixer.getNextBestColour(1.0f,0.0f,0.0f);
++				string colourCode=mglColourCode(1.0f,0.0f,0.0f);
+ 				getRegionOverlaps(overlapId,overlapXCoords);
+ 
+ 				float rMinY,rMaxY;
+@@ -1045,10 +944,10 @@
+ 
+ #ifdef USE_MGL2
+ 					gr->FaceZ(mglPoint(rMinX,rMinY,-1),rMaxX-rMinX,rMaxY-rMinY,
+-							&colourCode);
++							colourCode.c_str());
+ #else
+ 					gr->FaceZ(rMinX,rMinY,-1,rMaxX-rMinX,rMaxY-rMinY,
+-							&colourCode);
++							colourCode.c_str());
+ #endif
+ 				}
+ 
+@@ -1082,7 +981,7 @@
+ #endif
+ 	}
+ 	
+-	overlays.draw(gr,colourFixer,min,max,haveUsedLog);
++	overlays.draw(gr,min,max,haveUsedLog);
+ }
+ 
+ void PlotWrapper::hideAll()
+@@ -1405,7 +1304,7 @@
+ 	return xValues.empty();
+ }
+ 
+-void Plot1D::drawPlot(mglGraph *gr,MGLColourFixer &fixer) const
++void Plot1D::drawPlot(mglGraph *gr) const
+ {
+ 	bool showErrs;
+ 
+@@ -1453,9 +1352,8 @@
+ 	
+ 	//Obtain a colour code to use for the plot, based upon
+ 	// the actual colour we wish to use
+-	char colourCode[2];
+-	colourCode[0]=fixer.getNextBestColour(r,g,b);
+-	colourCode[1]='\0';
++	string colourCode;
++	colourCode=mglColourCode(r,g,b);
+ 	//---
+ 
+ 
+@@ -1467,23 +1365,23 @@
+ 			//rather than linear interpolating them back along their paths. I have emailed the author.
+ 			//for now, we shall have to put up with missing lines :( Absolute worst case, I may have to draw them myself.
+ 			gr->SetCut(true);
+-			
+-			gr->Plot(xDat,yDat,colourCode);
++		
++			gr->Plot(xDat,yDat,colourCode.c_str());
+ 			if(showErrs)
+-				gr->Error(xDat,yDat,eDat,colourCode);
++				gr->Error(xDat,yDat,eDat,colourCode.c_str());
+ 			gr->SetCut(false);
+ 			break;
+ 		case PLOT_TRACE_BARS:
+-			gr->Bars(xDat,yDat,colourCode);
++			gr->Bars(xDat,yDat,colourCode.c_str());
+ 			break;
+ 		case PLOT_TRACE_STEPS:
+ 			//Same problem as for line plot. 
+ 			gr->SetCut(true);
+-			gr->Step(xDat,yDat,colourCode);
++			gr->Step(xDat,yDat,colourCode.c_str());
+ 			gr->SetCut(false);
+ 			break;
+ 		case PLOT_TRACE_STEM:
+-			gr->Stem(xDat,yDat,colourCode);
++			gr->Stem(xDat,yDat,colourCode.c_str());
+ 			break;
+ 
+ 		case PLOT_TRACE_POINTS:
+@@ -1557,13 +1455,11 @@
+ 	regionGroup.clear();
+ }
+ 
+-void Plot1D::drawRegions(mglGraph *gr,MGLColourFixer &fixer,
++void Plot1D::drawRegions(mglGraph *gr,
+ 		const mglPoint &min,const mglPoint &max) const
+ {
+ 	//Mathgl palette colour name
+-	char colourCode[2];
+-	colourCode[1]='\0';
+-
++	string colourCode;
+ 
+ 	for(unsigned int uj=0;uj<regionGroup.regions.size();uj++)
+ 	{
+@@ -1577,16 +1473,15 @@
+ 		//Prevent drawing inverted regionGroup.regions
+ 		if(rMaxX > rMinX && rMaxY > rMinY)
+ 		{
+-			colourCode[0] = fixer.getNextBestColour(regionGroup.regions[uj].r,
++			colourCode = mglColourCode(regionGroup.regions[uj].r,
+ 						regionGroup.regions[uj].g,
+ 						regionGroup.regions[uj].b);
+-			colourCode[1] = '\0';
+ #ifdef USE_MGL2
+ 			gr->FaceZ(mglPoint(rMinX,rMinY,-1),rMaxX-rMinX,rMaxY-rMinY,
+-					colourCode);
++					colourCode.c_str());
+ #else
+ 			gr->FaceZ(rMinX,rMinY,-1,rMaxX-rMinX,rMaxY-rMinY,
+-					colourCode);
++					colourCode.c_str());
+ #endif
+ 					
+ 		}
+@@ -1791,18 +1686,17 @@
+ }
+ 
+ 
+-void PlotOverlays::draw(mglGraph *gr,MGLColourFixer &fixer, 
++void PlotOverlays::draw(mglGraph *gr,
+ 		const mglPoint &boundMin, const mglPoint &boundMax,bool logMode ) const
+ {
+ 
+ 	if(!isEnabled)
+ 		return;
+ 
+-	char colourCode[2];
++	string colourCode;
+ 
+ 	//Draw the overlays in black
+-	colourCode[0] = fixer.getNextBestColour(0.0,0.0,0.0);
+-	colourCode[1]='\0';
++	colourCode = mglColourCode(0.0,0.0,0.0);
+ 	
+ 	for(size_t ui=0;ui<overlayData.size();ui++)
+ 	{
+@@ -1841,6 +1735,7 @@
+ 			}
+ 		}
+ 
++		//TODO: Deprecate me. Upstream now allows single stems
+ 		//Draw stems. can't use stem plot due to mathgl bug whereby single stems
+ 		// will not be drawn
+ 		for(size_t uj=0;uj<overlayData[ui].coordData.size();uj++)
+@@ -1849,7 +1744,7 @@
+ 					boundMin.y < bufY[uj])
+ 			{
+ 				gr->Line (mglPoint(bufX[uj],std::max(0.0f,(float)boundMin.y)),
+-					mglPoint(bufX[uj],bufY[uj]),colourCode,100);
++					mglPoint(bufX[uj],bufY[uj]),colourCode.c_str(),100);
+ 
+ 				//Print labels near to the text
+ 				const float STANDOFF_FACTOR=1.05;
+--- a/src/backend/plot.h
++++ b/src/backend/plot.h
+@@ -64,26 +64,6 @@
+ //!Return the error mode type, given the human readable string
+ unsigned int plotErrmodeID(const std::string &s);
+ 		
+-//!Nasty hack class to change mathgl API from named char palette to rgb specification
+-class MGLColourFixer
+-{
+-	private:
+-		vector<float> rs,gs,bs;
+-		static int maxCols;
+-	public:
+-		//Restore the MGL colour strings
+-		void reset();
+-		//Return the exact colour, if there is one
+-		char haveExactColour(float r, float g, float b) const;
+-		//Get the best colour that is available
+-		// returns the char to give to mathgl; may be exact,
+-		// maybe nearest match, depending upon number of colours used
+-		// and mgl palette size
+-		char getNextBestColour(float r, float g, float b);
+-
+-		static unsigned int getMaxColours();
+-};
+-
+ 
+ //!Data class  for holding info about non-overlapping 
+ // interactive rectilinear "zones" overlaid on plots 
+@@ -199,7 +179,7 @@
+ 		//Add a new overlay to the plot
+ 		void add(const OVERLAY_DATA &overlay) {overlayData.push_back(overlay);}
+ 		//Draw the overlay on the current plot
+-		void draw(mglGraph *g,MGLColourFixer &fixer, 
++		void draw(mglGraph *g,
+ 			const mglPoint &boundMin, const mglPoint &boundMax,bool logMode) const;
+ 		//Enable the specified overlay
+ 		void setEnabled(size_t offset,bool isEnabled) 
+@@ -262,7 +242,7 @@
+ 		virtual bool empty() const=0;
+ 
+ 		//Draw the plot onto a given MGL graph
+-		virtual void drawPlot(mglGraph *graph, MGLColourFixer &fixer) const=0;
++		virtual void drawPlot(mglGraph *graph) const=0;
+ 
+ 		//!Scan for the data bounds.
+ 		virtual void getBounds(float &xMin,float &xMax,
+@@ -309,11 +289,10 @@
+ 		
+ 		
+ 		//Draw the plot onto a given MGL graph
+-		virtual void drawPlot(mglGraph *graph,MGLColourFixer &fixer) const;
++		virtual void drawPlot(mglGraph *graph) const;
+ 
+ 		//Draw the associated regions		
+-		void drawRegions(mglGraph *graph, MGLColourFixer &fixer,
+-				const mglPoint &min, const mglPoint &max) const;
++		void drawRegions(mglGraph *graph,const mglPoint &min, const mglPoint &max) const;
+ 
+ 
+ 		//!Retrieve the raw data associated with the currently visible plots. 
+--- a/src/common/stringFuncs.cpp
++++ b/src/common/stringFuncs.cpp
+@@ -457,6 +457,16 @@
+ 	return s;
+ }
+ 
++std::string uppercase(std::string s)
++{
++	for(unsigned int ui=0;ui<s.size();ui++)
++	{
++		if(isascii(s[ui]) && islower(s[ui]))
++			s[ui] = toupper(s[ui]);
++	}
++	return s;
++}
++
+ //Split strings around a delimiter
+ void splitStrsRef(const char *cpStr, const char delim,std::vector<string> &v )
+ {
+--- a/src/common/stringFuncs.h
++++ b/src/common/stringFuncs.h
+@@ -61,6 +61,8 @@
+ std::string stripChars(const std::string &Str, const char *chars);
+ //!Return a lowercase version for a given string
+ std::string lowercase(std::string s);
++//!Return a uppercase version for a given string
++std::string uppercase(std::string s);
+ 
+ //Drop empty entries from a string of vector
+ void stripZeroEntries(std::vector<std::string> &s);
+@@ -71,9 +73,11 @@
+ 	unsigned char &r, unsigned char &g, unsigned char &b, unsigned char &a);
+ 
+ //Convert an RGBA 8-bit/channel quadruplet into its hexadecimal colour string
++// format is "#rrggbbaa" such as "#11ee00aa"
+ void genColString(unsigned char r, unsigned char g, 
+ 			unsigned char b, unsigned char a, std::string &s);
+ //Convert an RGB 8-bit/channel quadruplet into its hexadecimal colour string
++// format is "#rrggbb" such as "#11ee00"
+ void genColString(unsigned char r, unsigned char g, 
+ 			unsigned char b, std::string &s);
+ 
+--- a/src/gui/dialogs/rangeEditDialog.cpp
++++ b/src/gui/dialogs/rangeEditDialog.cpp
+@@ -288,7 +288,7 @@
+     EVT_CHECKLISTBOX(ID_LIST_OVERLAY, RangeEditorDialog::OnListOverlayCheck)
+     EVT_BUTTON(wxID_OK, RangeEditorDialog::OnBtnOK)
+     EVT_BUTTON(wxID_CANCEL, RangeEditorDialog::OnBtnCancel)
+-    EVT_SPLITTER_UNSPLIT(ID_SPLIT_LEFTRIGHT, RangeEditorDialog::OnSashVerticalUnsplit)
++    EVT_SPLITTER_DCLICK(ID_SPLIT_LEFTRIGHT, RangeEditorDialog::OnSashVerticalDClick)
+     // end wxGlade
+ END_EVENT_TABLE();
+ 
+@@ -1438,7 +1438,7 @@
+ 	plotPanel->Refresh();
+ }
+ 
+-void RangeEditorDialog::OnSashVerticalUnsplit(wxSplitterEvent &event)
++void RangeEditorDialog::OnSashVerticalDClick(wxSplitterEvent &event)
+ {
+ 	event.Veto();
+ }
+--- a/src/gui/dialogs/rangeEditDialog.h
++++ b/src/gui/dialogs/rangeEditDialog.h
+@@ -210,7 +210,7 @@
+     virtual void OnCheckShowOverlay(wxCommandEvent &event); // wxGlade: <event_handler>
+     virtual void OnBtnOK(wxCommandEvent &event); // wxGlade: <event_handler>
+     virtual void OnBtnCancel(wxCommandEvent &event); // wxGlade: <event_handler>
+-    virtual void OnSashVerticalUnsplit(wxSplitterEvent &event); // wxGlade: <event_handler>
++    virtual void OnSashVerticalDClick(wxSplitterEvent &event); // wxGlade: <event_handler>
+     virtual void OnListOverlayCheck(wxCommandEvent &event);
+     virtual void OnListOverlayKeyDown(wxListEvent &event);
+     virtual void OnTextOverlay(wxCommandEvent &event);
+--- a/src/gui/mainFrame.cpp
++++ b/src/gui/mainFrame.cpp
+@@ -1143,9 +1143,12 @@
+ 					f->setRangeData(rng);
+ 					f->setRangeFilename(s.c_str());
+ 
+-					//Get the parent filter pointer	
++					//Add the filter, using the seelcted
++					// item as the parent
+ 					visControl.addFilter(f,false,filterId);
+ 
++					//update the tree control
++					visControl.updateWxTreeCtrl(treeFilters);
+ 				}
+ 				else
+ 				{
+@@ -1398,6 +1401,10 @@
+ 		}
+ 		
+ 		setSaveStatus();
++
++		//make sure camera is properly centred
++		if(visControl.numCams() == 1)
++			visControl.ensureSceneVisible(3);
+ 	}
+ 
+ }
diff --git a/docs/manual-latex/3depictusermanual.kilepr b/docs/manual-latex/3depictusermanual.kilepr
index 7cdbe90..2e33cb1 100644
--- a/docs/manual-latex/3depictusermanual.kilepr
+++ b/docs/manual-latex/3depictusermanual.kilepr
@@ -17,7 +17,7 @@ MakeIndex=
 QuickBuild=
 
 [document-settings,item:manual.tex]
-Bookmarks=1020,423
+Bookmarks=988,423
 Encoding=UTF-8
 FoldedColumns=
 FoldedLines=
@@ -68,16 +68,16 @@ order=-1
 
 [item:manual.tex]
 archive=true
-column=270
+column=172
 encoding=UTF-8
 highlight=LaTeX
-line=1891
+line=664
 mode=LaTeX
-open=true
+open=false
 order=0
 
 [view-settings,view=0,item:manual.tex]
-CursorColumn=270
-CursorLine=1891
+CursorColumn=172
+CursorLine=664
 JumpList=
-ViMarks=a,423,0,b,1020,0
+ViMarks=a,423,0,b,988,0
diff --git a/docs/manual-latex/manual.aux b/docs/manual-latex/manual.aux
new file mode 100644
index 0000000..f9d6972
--- /dev/null
+++ b/docs/manual-latex/manual.aux
@@ -0,0 +1,209 @@
+\relax 
+\providecommand\hyper at newdestlabel[2]{}
+\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
+\HyperFirstAtBeginDocument{\ifx\hyper at anchor\@undefined
+\global\let\oldcontentsline\contentsline
+\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
+\global\let\oldnewlabel\newlabel
+\gdef\newlabel#1#2{\newlabelxx{#1}#2}
+\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
+\AtEndDocument{\ifx\hyper at anchor\@undefined
+\let\contentsline\oldcontentsline
+\let\newlabel\oldnewlabel
+\fi}
+\fi}
+\global\let\hyper at last\relax 
+\gdef\HyperFirstAtBeginDocument#1{#1}
+\providecommand\HyField at AuxAddToFields[1]{}
+\providecommand\HyField at AuxAddToCoFields[2]{}
+\@writefile{toc}{\contentsline {section}{\numberline {1}Foreword}{1}{section.1}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Introduction}{1}{subsection.1.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}Background}{1}{subsubsection.1.1.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}What is Open Source?}{1}{subsubsection.1.1.2}}
+\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Closed-source programs only provide the final application, are neither human readable nor modifiable, and will only work on a specific platform. By contrast open source programs distribute the source-code as well as the application. The source code is the core logic which can be made to work on many platforms due to the invariance of the program logic.}}{1}{figure.1}}
+\newlabel{fig:compilation}{{1}{1}{Closed-source programs only provide the final application, are neither human readable nor modifiable, and will only work on a specific platform. By contrast open source programs distribute the source-code as well as the application. The source code is the core logic which can be made to work on many platforms due to the invariance of the program logic}{figure.1}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Requirements}{2}{subsection.1.2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Platform specific notes}{2}{subsection.1.3}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.4}Getting help}{3}{subsection.1.4}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.5}Who wrote this program?}{3}{subsection.1.5}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.6}Alternate documentation}{3}{subsection.1.6}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.7}Helping out}{3}{subsection.1.7}}
+\@writefile{toc}{\contentsline {section}{\numberline {2}Basics}{3}{section.2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Getting started}{3}{subsection.2.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.1.1}Licence}{3}{subsubsection.2.1.1}}
+\newlabel{sec:licence}{{2.1.1}{3}{Licence}{subsubsection.2.1.1}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.1.2}Installing the program}{4}{subsubsection.2.1.2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Understanding the interface}{4}{subsection.2.2}}
+\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Interface layout. The 3D view, plot panel and filter tree are labelled.}}{4}{figure.2}}
+\newlabel{fig:interfaceLayout}{{2}{4}{Interface layout. The 3D view, plot panel and filter tree are labelled}{figure.2}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.1}The Filter Tree}{5}{subsubsection.2.2.1}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces General concept for the tree layout. Trees have ``parent'' and ``child'' relationships betwene members}}{5}{figure.3}}
+\newlabel{fig:treelayout}{{3}{5}{General concept for the tree layout. Trees have ``parent'' and ``child'' relationships betwene members}{figure.3}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.2}The 3D View}{5}{subsubsection.2.2.2}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces Basic camera layout. Each camera has a position, an up direction and a target. The 3D view is as seen by the camera. Cameras may be saved and recalled to return to specific views. Try to realise it is not the object that moves, but rather yourself.}}{6}{figure.4}}
+\newlabel{fig:camera-basics}{{4}{6}{Basic camera layout. Each camera has a position, an up direction and a target. The 3D view is as seen by the camera. Cameras may be saved and recalled to return to specific views. Try to realise it is not the object that moves, but rather yourself}{figure.4}{}}
+\@writefile{toc}{\contentsline {paragraph}{Basic movement}{6}{figure.4}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.3}Plot area}{7}{subsubsection.2.2.3}}
+\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces Raw data pane, with associated spectrum displayed. Data can be selected, and saved for external manipulation as desired.}}{7}{figure.5}}
+\newlabel{fig:raw-basics}{{5}{7}{Raw data pane, with associated spectrum displayed. Data can be selected, and saved for external manipulation as desired}{figure.5}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.4}Console}{7}{subsubsection.2.2.4}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.5}Tools panel}{7}{subsubsection.2.2.5}}
+\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces Console tab, with sample console messages. The inset shows how the tab will appear if messages are pending whilst the console itself is hidden.}}{8}{figure.6}}
+\newlabel{fig:console-basics}{{6}{8}{Console tab, with sample console messages. The inset shows how the tab will appear if messages are pending whilst the console itself is hidden}{figure.6}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Usage fundamentals}{9}{subsection.2.3}}
+\@writefile{toc}{\contentsline {section}{\numberline {3}Quick start}{9}{section.3}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Loading data}{10}{subsection.3.1}}
+\newlabel{sec:quickStartLoadData}{{3.1}{10}{Loading data}{subsection.3.1}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Loading an analysis}{10}{subsection.3.2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Ranging}{10}{subsection.3.3}}
+\newlabel{sec:quickStartRangedData}{{3.3}{10}{Ranging}{subsection.3.3}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Spectrum}{10}{subsection.3.4}}
+\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces Opening a range file can be done from either the filter drop down, or by dropping a rangefile onto the program. You must first have data loaded (as shown by the red points).}}{11}{figure.7}}
+\newlabel{fig:rangeDropdown}{{7}{11}{Opening a range file can be done from either the filter drop down, or by dropping a rangefile onto the program. You must first have data loaded (as shown by the red points)}{figure.7}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Composition profiles}{11}{subsection.3.5}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Counting Points and measuring volume}{11}{subsection.3.6}}
+\@writefile{lof}{\contentsline {figure}{\numberline {8}{\ignorespaces Ranged spectrum shown only the data that is within the selected ranging windows. The ``Drop unranged'' option can be used to show all the data, and thus the complete spectrum.}}{12}{figure.8}}
+\newlabel{fig:rangedSpectrum}{{8}{12}{Ranged spectrum shown only the data that is within the selected ranging windows. The ``Drop unranged'' option can be used to show all the data, and thus the complete spectrum}{figure.8}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Concentration surface and slices}{12}{subsection.3.7}}
+\@writefile{lof}{\contentsline {figure}{\numberline {9}{\ignorespaces This layout can be used to simultaneously display both the point cloud and the ranged spectrum.}}{13}{figure.9}}
+\newlabel{fig:rangedSpectrumWithCloud}{{9}{13}{This layout can be used to simultaneously display both the point cloud and the ranged spectrum}{figure.9}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {10}{\ignorespaces This layout can be used to show both point data and a concentration profile simultaneously.}}{13}{figure.10}}
+\newlabel{fig:quickStartConcLayout}{{10}{13}{This layout can be used to show both point data and a concentration profile simultaneously}{figure.10}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {11}{\ignorespaces Ion count and volume data can be displayed from the ion information filter. The output is displayed in the console window.}}{14}{figure.11}}
+\newlabel{fig:quickStartIonInfoLayout}{{11}{14}{Ion count and volume data can be displayed from the ion information filter. The output is displayed in the console window}{figure.11}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {4}Understanding the program}{15}{section.4}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Filters}{15}{subsection.4.1}}
+\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces Basic concept of a filter. Data goes in, data comes out. The filter may perform any operation on the data coming in or out as it chooses. The data streams coming in are restricted to certain types of data, as shown. }}{15}{figure.12}}
+\newlabel{fig:basic-filter}{{12}{15}{Basic concept of a filter. Data goes in, data comes out. The filter may perform any operation on the data coming in or out as it chooses. The data streams coming in are restricted to certain types of data, as shown}{figure.12}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Trees}{15}{subsection.4.2}}
+\newlabel{sec:treebehaviour}{{4.2}{15}{Trees}{subsection.4.2}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces Data propagation in a tree for a particular arrangement of filters. Data is propagated from a parent filter to its children.}}{16}{figure.13}}
+\newlabel{fig:datapropagate}{{13}{16}{Data propagation in a tree for a particular arrangement of filters. Data is propagated from a parent filter to its children}{figure.13}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Stashes}{16}{subsection.4.3}}
+\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces Creating a stash from the filter tree. New stashes will appear in the dropdown and can be selected to recall subtrees to insert into the filter tree.}}{17}{figure.14}}
+\newlabel{fig:stash-creation}{{14}{17}{Creating a stash from the filter tree. New stashes will appear in the dropdown and can be selected to recall subtrees to insert into the filter tree}{figure.14}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Plots}{17}{subsection.4.4}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.5}Cameras}{17}{subsection.4.5}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.6}Effects}{18}{subsection.4.6}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.7}Program actions}{18}{subsection.4.7}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.1}Save}{18}{subsubsection.4.7.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.2}Undo}{18}{subsubsection.4.7.2}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.3}Raw Data}{18}{subsubsection.4.7.3}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.4}Export Menu}{18}{subsubsection.4.7.4}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.5}Ranging dialog}{19}{subsubsection.4.7.5}}
+\@writefile{lof}{\contentsline {figure}{\numberline {15}{\ignorespaces Range editing dialog, showing clash between species}}{20}{figure.15}}
+\newlabel{fig:rangeEditClash}{{15}{20}{Range editing dialog, showing clash between species}{figure.15}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {16}{\ignorespaces Range editing dialog, showing molecular overlays.}}{20}{figure.16}}
+\newlabel{fig:rangeEditOverlay}{{16}{20}{Range editing dialog, showing molecular overlays}{figure.16}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {17}{\ignorespaces Overview of animation dialog with ``filter view'' active; left hand area of the window shows standard tree view, right hand window shows properties that are to be animated.}}{21}{figure.17}}
+\newlabel{fig:animateFilterView}{{17}{21}{Overview of animation dialog with ``filter view'' active; left hand area of the window shows standard tree view, right hand window shows properties that are to be animated}{figure.17}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.6}Autosave}{21}{subsubsection.4.7.6}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.7}Export Animation}{21}{subsubsection.4.7.7}}
+\newlabel{sec:animationExport}{{4.7.7}{21}{Export Animation}{subsubsection.4.7.7}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {18}{\ignorespaces Numerical input window for setting parameters for animation}}{22}{figure.18}}
+\newlabel{fig:animateParamDialog}{{18}{22}{Numerical input window for setting parameters for animation}{figure.18}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {19}{\ignorespaces Conflicting filter properties shown, highlighted to show the conflicting values in the animation property grid.}}{23}{figure.19}}
+\newlabel{fig:animateParamConflict}{{19}{23}{Conflicting filter properties shown, highlighted to show the conflicting values in the animation property grid}{figure.19}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {20}{\ignorespaces Setting string properties using the string input dialog, via manual entry.}}{23}{figure.20}}
+\newlabel{fig:animatePropString}{{20}{23}{Setting string properties using the string input dialog, via manual entry}{figure.20}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {21}{\ignorespaces Overview of animation dialog with ``frame view'' active; right hand region of the window shows the values of the animation for each frame, on the left hand side are the outputs that the user wishes to obtain.}}{24}{figure.21}}
+\newlabel{fig:animateFrameView}{{21}{24}{Overview of animation dialog with ``frame view'' active; right hand region of the window shows the values of the animation for each frame, on the left hand side are the outputs that the user wishes to obtain}{figure.21}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {5}Detailed Reference}{25}{section.5}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Data types}{25}{subsection.5.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.1}Ions}{25}{subsubsection.5.1.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.2}Plots}{25}{subsubsection.5.1.2}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.3}Range}{25}{subsubsection.5.1.3}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.4}Voxels}{25}{subsubsection.5.1.4}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.5}Drawables}{25}{subsubsection.5.1.5}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Filters}{25}{subsection.5.2}}
+\newlabel{sec:filter}{{5.2}{26}{Filters}{subsection.5.2}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.1}Data load}{26}{subsubsection.5.2.1}}
+\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Propagation matrix for Data load.}}{27}{table.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.2}Downsampling}{27}{subsubsection.5.2.2}}
+\@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces Propagation matrix for Downsampling.}}{27}{table.2}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.3}Ion Information}{27}{subsubsection.5.2.3}}
+\newlabel{sec:FilterIonInformation}{{5.2.3}{27}{Ion Information}{subsubsection.5.2.3}{}}
+\@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces Propagation matrix for Ion Information.}}{28}{table.3}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.4}Ranging}{28}{subsubsection.5.2.4}}
+\newlabel{sec:rangeFilter}{{5.2.4}{28}{Ranging}{subsubsection.5.2.4}{}}
+\@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces Propagation matrix for Ranging.}}{28}{table.4}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.5}Bounding Box}{29}{subsubsection.5.2.5}}
+\@writefile{lot}{\contentsline {table}{\numberline {5}{\ignorespaces Propagation matrix for Bounding Box.}}{29}{table.5}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.6}Clipping}{29}{subsubsection.5.2.6}}
+\@writefile{lot}{\contentsline {table}{\numberline {6}{\ignorespaces Propagation matrix for Clipping.}}{29}{table.6}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.7}Spectrum}{29}{subsubsection.5.2.7}}
+\@writefile{lot}{\contentsline {table}{\numberline {7}{\ignorespaces Propagation matrix for Spectrum.}}{30}{table.7}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.8}Profile}{30}{subsubsection.5.2.8}}
+\@writefile{lot}{\contentsline {table}{\numberline {8}{\ignorespaces Propagation matrix for Profile.}}{30}{table.8}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.9}Spatial Analysis}{30}{subsubsection.5.2.9}}
+\@writefile{toc}{\contentsline {paragraph}{Algorithms}{30}{section*.3}}
+\citation{Moody2008}
+\citation{Gault2012}
+\citation{Geiser2007}
+\citation{Boll2007}
+\@writefile{lot}{\contentsline {table}{\numberline {9}{\ignorespaces Propagation matrix for Spatial Analysis.}}{31}{table.9}}
+\citation{Stephenson07}
+\citation{Hyde10}
+\citation{Vaumousse03}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.10}Clustering analysis}{32}{subsubsection.5.2.10}}
+\@writefile{lot}{\contentsline {table}{\numberline {10}{\ignorespaces Propagation matrix for Clustering Analysis.}}{33}{table.10}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.11}External Program}{33}{subsubsection.5.2.11}}
+\@writefile{toc}{\contentsline {paragraph}{Command syntax: }{33}{section*.4}}
+\@writefile{toc}{\contentsline {paragraph}{Prior to program execution:}{33}{section*.5}}
+\@writefile{toc}{\contentsline {paragraph}{After program execution:}{33}{section*.6}}
+\@writefile{lot}{\contentsline {table}{\numberline {11}{\ignorespaces Propagation matrix for External Program.}}{34}{table.11}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.12}Annotation}{34}{subsubsection.5.2.12}}
+\@writefile{toc}{\contentsline {paragraph}{Text}{34}{section*.7}}
+\@writefile{toc}{\contentsline {paragraph}{Arrow, Arrow with Text}{34}{section*.8}}
+\@writefile{toc}{\contentsline {paragraph}{Angle Measurement}{34}{section*.9}}
+\@writefile{lot}{\contentsline {table}{\numberline {12}{\ignorespaces Propagation matrix for Annotation.}}{35}{table.12}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.13}Voxels}{35}{subsubsection.5.2.13}}
+\@writefile{lot}{\contentsline {table}{\numberline {13}{\ignorespaces Propagation matrix for Voxels.}}{35}{table.13}}
+\@writefile{lof}{\contentsline {figure}{\numberline {22}{\ignorespaces Voxelisation filter, showing different representations. Left to right shows point cloud, axial slice and isosurface mode on the same dataset}}{36}{figure.22}}
+\newlabel{fig:voxeliseDisplayType}{{22}{36}{Voxelisation filter, showing different representations. Left to right shows point cloud, axial slice and isosurface mode on the same dataset}{figure.22}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.14}Ion Colour}{36}{subsubsection.5.2.14}}
+\@writefile{lot}{\contentsline {table}{\numberline {14}{\ignorespaces Propagation matrix for Ion Colour.}}{36}{table.14}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.2.15}Ion Transform}{36}{subsubsection.5.2.15}}
+\@writefile{lot}{\contentsline {table}{\numberline {15}{\ignorespaces Propagation matrix for Ion Transform.}}{37}{table.15}}
+\@writefile{toc}{\contentsline {section}{\numberline {6}Attributions}{37}{section.6}}
+\@writefile{toc}{\contentsline {section}{\numberline {7}Licence}{37}{section.7}}
+\@writefile{toc}{\contentsline {section}{\numberline {8}Appendices}{37}{section.8}}
+\newlabel{sec:appendix}{{8}{37}{Appendices}{section.8}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {8.1}Paths}{37}{subsection.8.1}}
+\newlabel{sec:3DepictPaths}{{8.1}{37}{Paths}{subsection.8.1}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {8.2}File formats}{38}{subsection.8.2}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.2.1}State file}{38}{subsubsection.8.2.1}}
+\newlabel{sec:xmlstatefile}{{8.2.1}{38}{State file}{subsubsection.8.2.1}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.2.2}Range files}{39}{subsubsection.8.2.2}}
+\newlabel{sec:rangeFormat}{{8.2.2}{39}{Range files}{subsubsection.8.2.2}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.2.3}POS files}{40}{subsubsection.8.2.3}}
+\newlabel{sec:posformat}{{8.2.3}{40}{POS files}{subsubsection.8.2.3}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.2.4}Text files}{40}{subsubsection.8.2.4}}
+\newlabel{sec:textformat}{{8.2.4}{40}{Text files}{subsubsection.8.2.4}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {8.3}External Program Examples}{40}{subsection.8.3}}
+\newlabel{sec:externalProgExample}{{8.3}{40}{External Program Examples}{subsection.8.3}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {23}{\ignorespaces Example program screenshot using the \emph  {Scilab} sample script. The \%i value in the command line instructs \emph  {3Depict} to take the first (and only the first) ion stream, and save it as an input file for the external program. }}{41}{figure.23}}
+\newlabel{fig:externalProgScilabSample}{{23}{41}{Example program screenshot using the \emph {Scilab} sample script. The \%i value in the command line instructs \emph {3Depict} to take the first (and only the first) ion stream, and save it as an input file for the external program}{figure.23}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.3.1}Scilab}{41}{subsubsection.8.3.1}}
+\@writefile{lof}{\contentsline {figure}{\numberline {24}{\ignorespaces Example program screenshot without and with the Python test example present. Note that the program merges ion streams into a single pos file, which is re-loaded as a single ion stream, as marked by the arrows.}}{45}{figure.24}}
+\newlabel{fig:externalProgPythonSample}{{24}{45}{Example program screenshot without and with the Python test example present. Note that the program merges ion streams into a single pos file, which is re-loaded as a single ion stream, as marked by the arrows}{figure.24}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.3.2}Python}{45}{subsubsection.8.3.2}}
+\@writefile{lof}{\contentsline {figure}{\numberline {25}{\ignorespaces Example program screenshot when using the BASH test example.}}{47}{figure.25}}
+\newlabel{fig:externalProgBashSample}{{25}{47}{Example program screenshot when using the BASH test example}{figure.25}{}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.3.3}Bash}{47}{subsubsection.8.3.3}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.3.4}C/C++}{48}{subsubsection.8.3.4}}
+\@writefile{lof}{\contentsline {figure}{\numberline {26}{\ignorespaces Example program screenshot without and with the C++ test example present..}}{49}{figure.26}}
+\newlabel{fig:externalProgCppSample}{{26}{49}{Example program screenshot without and with the C++ test example present.}{figure.26}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {8.4}Modifying the program}{53}{subsection.8.4}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.4.1}Development tools}{53}{subsubsection.8.4.1}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.4.2}Getting yourself set up}{53}{subsubsection.8.4.2}}
+\bibstyle{unsrt}
+\bibdata{manual}
+\bibcite{Moody2008}{1}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.4.3}Changing stuff}{54}{subsubsection.8.4.3}}
+\bibcite{Gault2012}{2}
+\bibcite{Geiser2007}{3}
+\bibcite{Boll2007}{4}
+\bibcite{Stephenson07}{5}
+\bibcite{Hyde10}{6}
+\bibcite{Vaumousse03}{7}
diff --git a/docs/manual-latex/manual.bbl b/docs/manual-latex/manual.bbl
new file mode 100644
index 0000000..40c1dc3
--- /dev/null
+++ b/docs/manual-latex/manual.bbl
@@ -0,0 +1,43 @@
+\begin{thebibliography}{1}
+
+\bibitem{Moody2008}
+Michael~P. Moody, Leigh Stephenson, Anna~V. Ceguerra, and S.~P. Ringer.
+\newblock Quantitative binomial distribution analyses of nanoscale like-solute
+  atom clustering and segregation in atom probe tomography data.
+\newblock (71):542--550, 2008.
+
+\bibitem{Gault2012}
+B.~Gault, M.~Moody, J.~Cairney, and Ringer~S. P.
+\newblock {\em Atom Probe Microscopy}.
+\newblock Springer Series in Materials science. Springer, 2012.
+
+\bibitem{Geiser2007}
+B.P. Geiser, T.F. Kelly, D.J. Larson, J.~Schneir, and J.P. Roberts.
+\newblock Spatial distribution maps for atom probe tomography.
+\newblock {\em Microscopy and Microanalysis}, 13(6):437--447, 2007.
+
+\bibitem{Boll2007}
+T.~Boll, T.~Al-Kassab, Y.~Yuan, and Z.G. Liu.
+\newblock Investigation of the site occupation of atoms in pure and doped
+  tial/ti3al intermetallic.
+\newblock {\em Ultramicroscopy}, 2007.
+
+\bibitem{Stephenson07}
+Leigh~T. Stephenson, Michael~P. Moody, Peter~V. Liddicoat, and Simon~P. Ringer.
+\newblock {New Techniques for the Analysis of Fine-Scaled Clustering Phenomena
+  within Atom Probe Tomography (APT) Data}.
+\newblock {\em Microscopy and Microanalysis}, 13(06):448--463, 2007.
+
+\bibitem{Hyde10}
+J.M. Hyde, E.A. Marquis, K.B. Wilford, and T.J. Williams.
+\newblock A sensitivity analysis of the maximum separation method for the
+  characterisation of solute clusters.
+\newblock {\em Ultramicroscopy}, 111(6):440--447, 2011.
+
+\bibitem{Vaumousse03}
+D.~Vaumousse, A.~Cerezo, and P.J. Warren.
+\newblock A procedure for quantification of precipitates microstructures from
+  three-dimensional atom probe data.
+\newblock {\em Ultramicroscopy}, 95:215--221, 2003.
+
+\end{thebibliography}
diff --git a/docs/manual-latex/manual.blg b/docs/manual-latex/manual.blg
new file mode 100644
index 0000000..6f03a0c
--- /dev/null
+++ b/docs/manual-latex/manual.blg
@@ -0,0 +1,49 @@
+This is BibTeX, Version 0.99d (TeX Live 2013/Debian)
+Capacity: max_strings=35307, hash_size=35307, hash_prime=30011
+The top-level auxiliary file: manual.aux
+The style file: unsrt.bst
+Database file #1: manual.bib
+Warning--empty journal in Moody2008
+Warning--there's a number but no volume in Moody2008
+You've used 7 entries,
+            1791 wiz_defined-function locations,
+            491 strings with 4839 characters,
+and the built_in function-call counts, 1681 in all, are:
+= -- 136
+> -- 98
+< -- 0
++ -- 35
+- -- 28
+* -- 137
+:= -- 287
+add.period$ -- 22
+call.type$ -- 7
+change.case$ -- 6
+chr.to.int$ -- 0
+cite$ -- 9
+duplicate$ -- 63
+empty$ -- 153
+format.name$ -- 28
+if$ -- 362
+int.to.chr$ -- 0
+int.to.str$ -- 7
+missing$ -- 8
+newline$ -- 38
+num.names$ -- 7
+pop$ -- 16
+preamble$ -- 1
+purify$ -- 0
+quote$ -- 0
+skip$ -- 18
+stack$ -- 0
+substring$ -- 109
+swap$ -- 6
+text.length$ -- 0
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 0
+warning$ -- 2
+while$ -- 13
+width$ -- 8
+write$ -- 77
+(There were 2 warnings)
diff --git a/docs/manual-latex/manual.log b/docs/manual-latex/manual.log
new file mode 100644
index 0000000..6eb8f8e
--- /dev/null
+++ b/docs/manual-latex/manual.log
@@ -0,0 +1,624 @@
+This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) (format=pdflatex 2014.4.17)  17 APR 2014 22:03
+entering extended mode
+ restricted \write18 enabled.
+ %&-line parsing enabled.
+**manual.tex
+(./manual.tex
+LaTeX2e <2011/06/27>
+Babel <3.9k> and hyphenation patterns for 2 languages loaded.
+(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
+(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option)
+)
+\c at part=\count79
+\c at section=\count80
+\c at subsection=\count81
+\c at subsubsection=\count82
+\c at paragraph=\count83
+\c at subparagraph=\count84
+\c at figure=\count85
+\c at table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/usr/share/texlive/texmf-dist/tex/latex/preprint/fullpage.sty
+Package: fullpage 1999/02/23 1.1 (PWD)
+\FP at margin=\skip43
+)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR)
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+Package: keyval 1999/03/16 v1.13 key=value parser (DPC)
+\KV at toks@=\toks14
+)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR)
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+Package: trig 1999/03/16 v1.09 sin cos tan (DPC)
+)
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg
+File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live
+)
+Package graphics Info: Driver file: pdftex.def on input line 91.
+
+(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def
+File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX
+
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty
+Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO)
+)
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty
+Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO)
+)
+\Gread at gobject=\count87
+))
+\Gin at req@height=\dimen103
+\Gin at req@width=\dimen104
+)
+(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+\Urlmuskip=\muskip10
+Package: url 2013/09/16  ver 3.4  Verb mode for urls, etc.
+)
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX
+
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty
+Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO)
+
+
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty
+Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO)
+Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO)
+Package hobsub Info: Skipping package `infwarerr' (already loaded).
+Package hobsub Info: Skipping package `ltxcmds' (already loaded).
+Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO)
+Package ifluatex Info: LuaTeX not detected.
+Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO)
+Package ifvtex Info: VTeX not detected.
+Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO)
+Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO)
+Package ifpdf Info: pdfTeX in PDF mode is detected.
+Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO)
+Package etexcmds Info: Could not find \expanded.
+(etexcmds)             That can mean that you are not using pdfTeX 1.50 or
+(etexcmds)             that some package has redefined \expanded.
+(etexcmds)             In the latter case, load this package earlier.
+Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO)
+Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO)
+Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO
+)
+Package pdftexcmds Info: LuaTeX not detected.
+Package pdftexcmds Info: \pdf at primitive is available.
+Package pdftexcmds Info: \pdf at ifprimitive is available.
+Package pdftexcmds Info: \pdfdraftmode found.
+Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO)
+Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO
+)
+Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO)
+Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO)
+)
+Package hobsub Info: Skipping package `hobsub' (already loaded).
+Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO)
+Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO)
+Package: xcolor-patch 2011/01/30 xcolor patch
+Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO)
+Package atveryend Info: \enddocument detected (standard20110627).
+Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO)
+Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO)
+Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO)
+)
+(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty
+Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional
+)
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty
+Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO)
+)
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty
+Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO)
+)
+\@linkdim=\dimen105
+\Hy at linkcounter=\count88
+\Hy at pagecounter=\count89
+
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO)
+)
+\Hy at SavedSpaceFactor=\count90
+
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg
+File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive
+)
+Package hyperref Info: Hyper figures OFF on input line 4443.
+Package hyperref Info: Link nesting OFF on input line 4448.
+Package hyperref Info: Hyper index ON on input line 4451.
+Package hyperref Info: Plain pages OFF on input line 4458.
+Package hyperref Info: Backreferencing OFF on input line 4463.
+Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
+Package hyperref Info: Bookmarks ON on input line 4688.
+\c at Hy@tempcnt=\count91
+LaTeX Info: Redefining \url on input line 5041.
+\XeTeXLinkMargin=\dimen106
+\Fld at menulength=\count92
+\Field at Width=\dimen107
+\Fld at charsize=\dimen108
+Package hyperref Info: Hyper figures OFF on input line 6295.
+Package hyperref Info: Link nesting OFF on input line 6300.
+Package hyperref Info: Hyper index ON on input line 6303.
+Package hyperref Info: backreferencing OFF on input line 6310.
+Package hyperref Info: Link coloring OFF on input line 6315.
+Package hyperref Info: Link coloring with OCG OFF on input line 6320.
+Package hyperref Info: PDF/A mode OFF on input line 6325.
+LaTeX Info: Redefining \ref on input line 6365.
+LaTeX Info: Redefining \pageref on input line 6369.
+\Hy at abspage=\count93
+\c at Item=\count94
+\c at Hfootnote=\count95
+)
+
+Package hyperref Message: Driver (autodetected): hpdftex.
+
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX
+\Fld at listcount=\count96
+\c at bookmark@seq at number=\count97
+
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty
+Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO)
+Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
+82.
+)
+\Hy at SectionHShift=\skip44
+)
+(/usr/share/texlive/texmf-dist/tex/latex/placeins/placeins.sty
+Package: placeins 2005/04/18  v 2.2
+)
+(/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty
+\wrapoverhang=\dimen109
+\WF at size=\dimen110
+\c at WF@wrappedlines=\count98
+\WF at box=\box26
+\WF at everypar=\toks15
+Package: wrapfig 2003/01/31  v 3.6
+) (./manual.aux)
+\openout1 = `manual.aux'.
+
+LaTeX Font Info:    Checking defaults for OML/cmm/m/it on input line 14.
+LaTeX Font Info:    ... okay on input line 14.
+LaTeX Font Info:    Checking defaults for T1/cmr/m/n on input line 14.
+LaTeX Font Info:    ... okay on input line 14.
+LaTeX Font Info:    Checking defaults for OT1/cmr/m/n on input line 14.
+LaTeX Font Info:    ... okay on input line 14.
+LaTeX Font Info:    Checking defaults for OMS/cmsy/m/n on input line 14.
+LaTeX Font Info:    ... okay on input line 14.
+LaTeX Font Info:    Checking defaults for OMX/cmex/m/n on input line 14.
+LaTeX Font Info:    ... okay on input line 14.
+LaTeX Font Info:    Checking defaults for U/cmr/m/n on input line 14.
+LaTeX Font Info:    ... okay on input line 14.
+LaTeX Font Info:    Checking defaults for PD1/pdf/m/n on input line 14.
+LaTeX Font Info:    ... okay on input line 14.
+
+(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii
+[Loading MPS to PDF converter (version 2006.09.02).]
+\scratchcounter=\count99
+\scratchdimen=\dimen111
+\scratchbox=\box27
+\nofMPsegments=\count100
+\nofMParguments=\count101
+\everyMPshowfont=\toks16
+\MPscratchCnt=\count102
+\MPscratchDim=\dimen112
+\MPnumerator=\count103
+\makeMPintoPDFobject=\count104
+\everyMPtoPDFconversion=\toks17
+) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty
+Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf
+
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty
+Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO)
+)
+Package grfext Info: Graphics extension search list:
+(grfext)             [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE
+G,.JBIG2,.JB2,.eps]
+(grfext)             \AppendGraphicsExtensions on input line 452.
+
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
+e
+))
+\AtBeginShipoutBox=\box28
+Package hyperref Info: Link coloring OFF on input line 14.
+
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section
+
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty
+Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO)
+)
+\c at section@level=\count105
+)
+LaTeX Info: Redefining \ref on input line 14.
+LaTeX Info: Redefining \pageref on input line 14.
+LaTeX Info: Redefining \nameref on input line 14.
+
+(./manual.out) (./manual.out)
+\@outlinefile=\write3
+\openout3 = `manual.out'.
+
+
+<./figures/CoverImage.png, id=345, 1312.905pt x 974.64125pt>
+File: ./figures/CoverImage.png Graphic file (type png)
+
+<use ./figures/CoverImage.png>
+Package pdftex.def Info: ./figures/CoverImage.png used on input line 25.
+(pdftex.def)             Requested size: 469.75502pt x 348.72903pt.
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <12> on input line 38.
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <8> on input line 38.
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <6> on input line 38.
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <24.88> on input line 39.
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <20.74> on input line 39.
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <17.28> on input line 39.
+ [1
+
+{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./figures/CoverImage.png>]
+ (./manual.toc
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <7> on input line 2.
+LaTeX Font Info:    External font `cmex10' loaded for size
+(Font)              <5> on input line 2.
+ [1
+
+] [2])
+\tf at toc=\write4
+\openout4 = `manual.toc'.
+
+ [3]
+<./figures/compilation.pdf, id=460, 489.83pt x 262.58101pt>
+File: ./figures/compilation.pdf Graphic file (type pdf)
+
+<use ./figures/compilation.pdf>
+Package pdftex.def Info: ./figures/compilation.pdf used on input line 77.
+(pdftex.def)             Requested size: 328.82707pt x 176.27693pt.
+
+Underfull \hbox (badness 3260) in paragraph at lines 82--83
+[]\OT1/cmr/m/n/10 Open source pro-grams are
+ []
+
+
+Underfull \hbox (badness 6477) in paragraph at lines 82--83
+\OT1/cmr/m/n/10 only the ex-e-cutable code,
+ []
+
+pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has 
+been already used, duplicate ignored
+<to be read again> 
+                   \relax 
+l.88 N
+      ote that there are restrictions on what may be done with the program, ...
+[1
+
+ <./figures/compilation.pdf>]
+LaTeX Font Info:    Try loading font information for OMS+cmr on input line 104.
+
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/omscmr.fd
+File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info:    Font shape `OMS/cmr/m/n' in size <10> not available
+(Font)              Font shape `OMS/cmsy/m/n' tried instead on input line 104.
+
+Overfull \hbox (3.63295pt too wide) in paragraph at lines 115--116
+\OT1/cmr/m/n/10 Assistance with this pro-gram may be freely ob-tained over the 
+In-ter-net at []$\OT1/cmtt/m/n/10 http : / / threedepict . sourceforge .
+ []
+
+[2] [3] <./figures/interface.png, id=779, 1026.83624pt x 682.55pt>
+File: ./figures/interface.png Graphic file (type png)
+
+<use ./figures/interface.png>
+Package pdftex.def Info: ./figures/interface.png used on input line 148.
+(pdftex.def)             Requested size: 399.29463pt x 265.41231pt.
+ [4 <./figures/interface.png>]
+<./figures/tree-layout.png, id=786, 804.39651pt x 578.94554pt>
+File: ./figures/tree-layout.png Graphic file (type png)
+
+<use ./figures/tree-layout.png>
+Package pdftex.def Info: ./figures/tree-layout.png used on input line 165.
+(pdftex.def)             Requested size: 281.85587pt x 202.86365pt.
+
+<./figures/camera.pdf, id=788, 579.76598pt x 383.834pt>
+File: ./figures/camera.pdf Graphic file (type pdf)
+
+<use ./figures/camera.pdf>
+Package pdftex.def Info: ./figures/camera.pdf used on input line 191.
+(pdftex.def)             Requested size: 328.82707pt x 217.70413pt.
+ [5 <./figures/tree-layout.png>] [6 <./figures/camera.pdf>] <./figures/spectrum
+-raw.png, id=879, 1199.48125pt x 848.16875pt>
+File: ./figures/spectrum-raw.png Graphic file (type png)
+
+<use ./figures/spectrum-raw.png>
+Package pdftex.def Info: ./figures/spectrum-raw.png used on input line 221.
+(pdftex.def)             Requested size: 399.29463pt x 282.34259pt.
+
+<./figures/console.png, id=882, 1199.48125pt x 848.16875pt>
+File: ./figures/console.png Graphic file (type png)
+
+<use ./figures/console.png>
+Package pdftex.def Info: ./figures/console.png used on input line 238.
+(pdftex.def)             Requested size: 399.29463pt x 282.34259pt.
+ [7 <./figures/spectrum-raw.png>] [8 <./figures/console.png>] [9] <./figures/ra
+ngeDropdown.png, id=907, 954.56625pt x 804.00375pt>
+File: ./figures/rangeDropdown.png Graphic file (type png)
+
+<use ./figures/rangeDropdown.png>
+Package pdftex.def Info: ./figures/rangeDropdown.png used on input line 304.
+(pdftex.def)             Requested size: 399.29463pt x 336.30525pt.
+
+
+LaTeX Warning: `h' float specifier changed to `ht'.
+
+<./figures/rangedSpectrum.png, id=911, 1087.06125pt x 625.33624pt>
+File: ./figures/rangedSpectrum.png Graphic file (type png)
+
+<use ./figures/rangedSpectrum.png>
+Package pdftex.def Info: ./figures/rangedSpectrum.png used on input line 323.
+(pdftex.def)             Requested size: 399.29463pt x 229.70096pt.
+
+
+LaTeX Warning: `h' float specifier changed to `ht'.
+
+<./figures/rangedSpectrumCloud.png, id=914, 1087.06125pt x 625.33624pt>
+File: ./figures/rangedSpectrumCloud.png Graphic file (type png)
+
+<use ./figures/rangedSpectrumCloud.png>
+Package pdftex.def Info: ./figures/rangedSpectrumCloud.png used on input line 3
+34.
+(pdftex.def)             Requested size: 399.29463pt x 229.70096pt.
+
+
+LaTeX Warning: `h' float specifier changed to `ht'.
+
+[10] <./figures/quickStartConcLayout.png, id=924, 1373.13pt x 905.3825pt>
+File: ./figures/quickStartConcLayout.png Graphic file (type png)
+
+<use ./figures/quickStartConcLayout.png>
+Package pdftex.def Info: ./figures/quickStartConcLayout.png used on input line 
+346.
+(pdftex.def)             Requested size: 399.29463pt x 263.27258pt.
+
+
+LaTeX Warning: `h' float specifier changed to `ht'.
+
+<./figures/quickStartIonInfoLayout.png, id=928, 869.2475pt x 629.35126pt>
+File: ./figures/quickStartIonInfoLayout.png Graphic file (type png)
+
+<use ./figures/quickStartIonInfoLayout.png>
+Package pdftex.def Info: ./figures/quickStartIonInfoLayout.png used on input li
+ne 360.
+(pdftex.def)             Requested size: 399.29463pt x 289.10176pt.
+
+
+LaTeX Warning: `h' float specifier changed to `ht'.
+
+[11 <./figures/rangeDropdown.png (PNG copy)>] [12 <./figures/rangedSpectrum.png
+>] [13 <./figures/rangedSpectrumCloud.png> <./figures/quickStartConcLayout.png>
+] [14 <./figures/quickStartIonInfoLayout.png>]
+<./figures/generic-filter.png, id=953, 4353.20471pt x 2563.45941pt>
+File: ./figures/generic-filter.png Graphic file (type png)
+
+<use ./figures/generic-filter.png>
+Package pdftex.def Info: ./figures/generic-filter.png used on input line 385.
+(pdftex.def)             Requested size: 399.29463pt x 235.12141pt.
+ [15
+
+ <./figures/generic-filter.png>]
+<./figures/tree-propagate.pdf, id=963, 1518.55293pt x 800.81699pt>
+File: ./figures/tree-propagate.pdf Graphic file (type pdf)
+
+<use ./figures/tree-propagate.pdf>
+Package pdftex.def Info: ./figures/tree-propagate.pdf used on input line 404.
+(pdftex.def)             Requested size: 399.29463pt x 210.56586pt.
+
+<./figures/Stash-operation.png, id=965, 1068.99374pt x 608.2725pt>
+File: ./figures/Stash-operation.png Graphic file (type png)
+
+<use ./figures/Stash-operation.png>
+Package pdftex.def Info: ./figures/Stash-operation.png used on input line 426.
+(pdftex.def)             Requested size: 399.29463pt x 227.20132pt.
+ [16 <./figures/tree-propagate.pdf>]
+[17 <./figures/Stash-operation.png>] [18]
+<./figures/rangeedit-clash.png, id=1289, 1609.01125pt x 825.0825pt>
+File: ./figures/rangeedit-clash.png Graphic file (type png)
+
+<use ./figures/rangeedit-clash.png>
+Package pdftex.def Info: ./figures/rangeedit-clash.png used on input line 488.
+(pdftex.def)             Requested size: 422.77664pt x 216.79514pt.
+
+<./figures/rangeEditOverlay.png, id=1292, 1609.01125pt x 825.0825pt>
+File: ./figures/rangeEditOverlay.png Graphic file (type png)
+
+<use ./figures/rangeEditOverlay.png>
+Package pdftex.def Info: ./figures/rangeEditOverlay.png used on input line 500.
+
+(pdftex.def)             Requested size: 422.77664pt x 216.79514pt.
+ [19] [20 <./figures/rangeedit-clash.png> <./figures/rangeEditOverlay.png>]
+<./figures/exportanimDialogFilterView.png, id=1310, 1380.15625pt x 800.9925pt>
+File: ./figures/exportanimDialogFilterView.png Graphic file (type png)
+
+<use ./figures/exportanimDialogFilterView.png>
+Package pdftex.def Info: ./figures/exportanimDialogFilterView.png used on input
+ line 522.
+(pdftex.def)             Requested size: 422.77664pt x 245.35957pt.
+
+<./figures/exportanimParamDialog.png, id=1311, 1376.14125pt x 801.99625pt>
+File: ./figures/exportanimParamDialog.png Graphic file (type png)
+
+<use ./figures/exportanimParamDialog.png>
+Package pdftex.def Info: ./figures/exportanimParamDialog.png used on input line
+ 532.
+(pdftex.def)             Requested size: 422.77664pt x 246.38904pt.
+ [21 <./figures/exportanimDialogFilterView.png (PNG copy)>]
+<./figures/exportanimDialogConflict.png, id=1320, 1382.16376pt x 801.99625pt>
+File: ./figures/exportanimDialogConflict.png Graphic file (type png)
+
+<use ./figures/exportanimDialogConflict.png>
+Package pdftex.def Info: ./figures/exportanimDialogConflict.png used on input l
+ine 542.
+(pdftex.def)             Requested size: 422.77664pt x 245.31215pt.
+
+<./figures/exportanimDialogPropString.png, id=1322, 1237.62375pt x 763.85374pt>
+File: ./figures/exportanimDialogPropString.png Graphic file (type png)
+<use ./figures/exportanimDialogPropString.png>
+Package pdftex.def Info: ./figures/exportanimDialogPropString.png used on input
+ line 554.
+(pdftex.def)             Requested size: 422.77664pt x 260.93065pt.
+
+<./figures/exportanimDialogFrameView.png, id=1323, 1237.62375pt x 763.85374pt>
+File: ./figures/exportanimDialogFrameView.png Graphic file (type png)
+
+<use ./figures/exportanimDialogFrameView.png>
+Package pdftex.def Info: ./figures/exportanimDialogFrameView.png used on input 
+line 568.
+(pdftex.def)             Requested size: 422.77664pt x 260.93065pt.
+ [22 <./figures/exportanimParamDialog.png (PNG copy)>] [23 <./figures/exportani
+mDialogConflict.png (PNG copy)> <./figures/exportanimDialogPropString.png (PNG 
+copy)>] [24 <./figures/exportanimDialogFrameView.png (PNG copy)>] [25] [26] [27
+] [28] [29] [30]
+
+LaTeX Warning: Citation `Moody2008' on page 31 undefined on input line 905.
+
+
+LaTeX Warning: Citation `Gault2012' on page 31 undefined on input line 908.
+
+
+LaTeX Warning: Citation `Geiser2007' on page 31 undefined on input line 910.
+
+
+LaTeX Warning: Citation `Boll2007' on page 31 undefined on input line 910.
+
+[31]
+
+LaTeX Warning: Citation `Stephenson07' on page 32 undefined on input line 947.
+
+
+LaTeX Warning: Citation `Hyde10' on page 32 undefined on input line 947.
+
+
+LaTeX Warning: Citation `Vaumousse03' on page 32 undefined on input line 947.
+
+[32]
+
+LaTeX Warning: `!h' float specifier changed to `!ht'.
+
+[33] [34]
+<./figures/voxel-representations.png, id=1411, 1615.03375pt x 1027.84pt>
+File: ./figures/voxel-representations.png Graphic file (type png)
+
+<use ./figures/voxel-representations.png>
+Package pdftex.def Info: ./figures/voxel-representations.png used on input line
+ 1099.
+(pdftex.def)             Requested size: 422.77664pt x 269.06708pt.
+ [35] [36 <./figures/voxel-representations.png>] [37] [38] [39] [40]
+<./figures/externalProgScilab.png, id=1461, 1686.3pt x 847.165pt>
+File: ./figures/externalProgScilab.png Graphic file (type png)
+
+<use ./figures/externalProgScilab.png>
+Package pdftex.def Info: ./figures/externalProgScilab.png used on input line 13
+46.
+(pdftex.def)             Requested size: 422.77664pt x 212.38535pt.
+ [41 <./figures/externalProgScilab.png>]
+[42] [43] [44]
+<./figures/externalProgPython.png, id=1482, 1465.475pt x 856.19875pt>
+File: ./figures/externalProgPython.png Graphic file (type png)
+
+<use ./figures/externalProgPython.png>
+Package pdftex.def Info: ./figures/externalProgPython.png used on input line 15
+27.
+(pdftex.def)             Requested size: 399.29463pt x 233.28014pt.
+ [45 <./figures/externalProgPython.png>]
+[46] <./figures/externalProgBash.png, id=1495, 1385.175pt x 876.27374pt>
+File: ./figures/externalProgBash.png Graphic file (type png)
+
+<use ./figures/externalProgBash.png>
+Package pdftex.def Info: ./figures/externalProgBash.png used on input line 1601
+.
+(pdftex.def)             Requested size: 399.29463pt x 252.5886pt.
+ [47 <./figures/externalProgBash.png>]
+LaTeX Font Info:    Try loading font information for OMS+cmtt on input line 165
+8.
+
+(/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd
+File: omscmtt.fd 
+)
+LaTeX Font Info:    Font shape `OMS/cmtt/m/n' in size <10> not available
+(Font)              Font shape `OMS/cmsy/m/n' tried instead on input line 1658.
+
+
+<./figures/externalProgCpp.png, id=1502, 2123.935pt x 839.135pt>
+File: ./figures/externalProgCpp.png Graphic file (type png)
+
+<use ./figures/externalProgCpp.png>
+Package pdftex.def Info: ./figures/externalProgCpp.png used on input line 1666.
+
+(pdftex.def)             Requested size: 399.29463pt x 157.74715pt.
+ [48] [49 <./figures/externalProgCpp.png>]
+[50] [51] [52] [53] (./manual.bbl [54])
+Package atveryend Info: Empty hook `BeforeClearDocument' on input line 1911.
+ [55]
+Package atveryend Info: Empty hook `AfterLastShipout' on input line 1911.
+ (./manual.aux)
+Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 1911.
+Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 1911.
+
+Package rerunfilecheck Info: File `manual.out' has not changed.
+(rerunfilecheck)             Checksum: 5D9DF5F8101C21D1BE54E57385EA4596;5634.
+
+
+LaTeX Warning: There were undefined references.
+
+
+LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
+
+Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 1911.
+ ) 
+Here is how much of TeX's memory you used:
+ 5708 strings out of 495028
+ 87083 string characters out of 6181497
+ 165098 words of memory out of 5000000
+ 8634 multiletter control sequences out of 15000+600000
+ 13156 words of font info for 46 fonts, out of 8000000 for 9000
+ 14 hyphenation exceptions out of 8191
+ 29i,11n,28p,1058b,447s stack positions out of 5000i,500n,10000p,200000b,80000s
+</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></us
+r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/shar
+e/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbxti10.pfb></usr/share/te
+xlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmcsc10.pfb></usr/share/texlive
+/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texlive/texmf
+-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texlive/texmf-dist/f
+onts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texlive/texmf-dist/fonts/ty
+pe1/public/amsfonts/cm/cmr12.pfb></usr/share/texlive/texmf-dist/fonts/type1/pub
+lic/amsfonts/cm/cmr6.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsf
+onts/cm/cmr7.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/
+cmr8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.p
+fb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></u
+sr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti12.pfb></usr/sha
+re/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/share/texl
+ive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr/share/texlive/te
+xmf-dist/fonts/type1/public/amsfonts/cm/cmtt12.pfb></usr/share/texlive/texmf-di
+st/fonts/type1/public/amsfonts/cm/cmtt8.pfb>
+Output written on manual.pdf (59 pages, 4517180 bytes).
+PDF statistics:
+ 1660 PDF objects out of 1728 (max. 8388607)
+ 1281 compressed objects within 13 object streams
+ 209 named destinations out of 1000 (max. 500000)
+ 816 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/docs/manual-latex/manual.out b/docs/manual-latex/manual.out
new file mode 100644
index 0000000..4314dcf
--- /dev/null
+++ b/docs/manual-latex/manual.out
@@ -0,0 +1,85 @@
+\BOOKMARK [1][-]{section.1}{Foreword}{}% 1
+\BOOKMARK [2][-]{subsection.1.1}{Introduction}{section.1}% 2
+\BOOKMARK [3][-]{subsubsection.1.1.1}{Background}{subsection.1.1}% 3
+\BOOKMARK [3][-]{subsubsection.1.1.2}{What is Open Source?}{subsection.1.1}% 4
+\BOOKMARK [2][-]{subsection.1.2}{Requirements}{section.1}% 5
+\BOOKMARK [2][-]{subsection.1.3}{Platform specific notes}{section.1}% 6
+\BOOKMARK [2][-]{subsection.1.4}{Getting help}{section.1}% 7
+\BOOKMARK [2][-]{subsection.1.5}{Who wrote this program?}{section.1}% 8
+\BOOKMARK [2][-]{subsection.1.6}{Alternate documentation}{section.1}% 9
+\BOOKMARK [2][-]{subsection.1.7}{Helping out}{section.1}% 10
+\BOOKMARK [1][-]{section.2}{Basics}{}% 11
+\BOOKMARK [2][-]{subsection.2.1}{Getting started}{section.2}% 12
+\BOOKMARK [3][-]{subsubsection.2.1.1}{Licence}{subsection.2.1}% 13
+\BOOKMARK [3][-]{subsubsection.2.1.2}{Installing the program}{subsection.2.1}% 14
+\BOOKMARK [2][-]{subsection.2.2}{Understanding the interface}{section.2}% 15
+\BOOKMARK [3][-]{subsubsection.2.2.1}{The Filter Tree}{subsection.2.2}% 16
+\BOOKMARK [3][-]{subsubsection.2.2.2}{The 3D View}{subsection.2.2}% 17
+\BOOKMARK [3][-]{subsubsection.2.2.3}{Plot area}{subsection.2.2}% 18
+\BOOKMARK [3][-]{subsubsection.2.2.4}{Console}{subsection.2.2}% 19
+\BOOKMARK [3][-]{subsubsection.2.2.5}{Tools panel}{subsection.2.2}% 20
+\BOOKMARK [2][-]{subsection.2.3}{Usage fundamentals}{section.2}% 21
+\BOOKMARK [1][-]{section.3}{Quick start}{}% 22
+\BOOKMARK [2][-]{subsection.3.1}{Loading data}{section.3}% 23
+\BOOKMARK [2][-]{subsection.3.2}{Loading an analysis}{section.3}% 24
+\BOOKMARK [2][-]{subsection.3.3}{Ranging}{section.3}% 25
+\BOOKMARK [2][-]{subsection.3.4}{Spectrum}{section.3}% 26
+\BOOKMARK [2][-]{subsection.3.5}{Composition profiles}{section.3}% 27
+\BOOKMARK [2][-]{subsection.3.6}{Counting Points and measuring volume}{section.3}% 28
+\BOOKMARK [2][-]{subsection.3.7}{Concentration surface and slices}{section.3}% 29
+\BOOKMARK [1][-]{section.4}{Understanding the program}{}% 30
+\BOOKMARK [2][-]{subsection.4.1}{Filters}{section.4}% 31
+\BOOKMARK [2][-]{subsection.4.2}{Trees}{section.4}% 32
+\BOOKMARK [2][-]{subsection.4.3}{Stashes}{section.4}% 33
+\BOOKMARK [2][-]{subsection.4.4}{Plots}{section.4}% 34
+\BOOKMARK [2][-]{subsection.4.5}{Cameras}{section.4}% 35
+\BOOKMARK [2][-]{subsection.4.6}{Effects}{section.4}% 36
+\BOOKMARK [2][-]{subsection.4.7}{Program actions}{section.4}% 37
+\BOOKMARK [3][-]{subsubsection.4.7.1}{Save}{subsection.4.7}% 38
+\BOOKMARK [3][-]{subsubsection.4.7.2}{Undo}{subsection.4.7}% 39
+\BOOKMARK [3][-]{subsubsection.4.7.3}{Raw Data}{subsection.4.7}% 40
+\BOOKMARK [3][-]{subsubsection.4.7.4}{Export Menu}{subsection.4.7}% 41
+\BOOKMARK [3][-]{subsubsection.4.7.5}{Ranging dialog}{subsection.4.7}% 42
+\BOOKMARK [3][-]{subsubsection.4.7.6}{Autosave}{subsection.4.7}% 43
+\BOOKMARK [3][-]{subsubsection.4.7.7}{Export Animation}{subsection.4.7}% 44
+\BOOKMARK [1][-]{section.5}{Detailed Reference}{}% 45
+\BOOKMARK [2][-]{subsection.5.1}{Data types}{section.5}% 46
+\BOOKMARK [3][-]{subsubsection.5.1.1}{Ions}{subsection.5.1}% 47
+\BOOKMARK [3][-]{subsubsection.5.1.2}{Plots}{subsection.5.1}% 48
+\BOOKMARK [3][-]{subsubsection.5.1.3}{Range}{subsection.5.1}% 49
+\BOOKMARK [3][-]{subsubsection.5.1.4}{Voxels}{subsection.5.1}% 50
+\BOOKMARK [3][-]{subsubsection.5.1.5}{Drawables}{subsection.5.1}% 51
+\BOOKMARK [2][-]{subsection.5.2}{Filters}{section.5}% 52
+\BOOKMARK [3][-]{subsubsection.5.2.1}{Data load}{subsection.5.2}% 53
+\BOOKMARK [3][-]{subsubsection.5.2.2}{Downsampling}{subsection.5.2}% 54
+\BOOKMARK [3][-]{subsubsection.5.2.3}{Ion Information}{subsection.5.2}% 55
+\BOOKMARK [3][-]{subsubsection.5.2.4}{Ranging}{subsection.5.2}% 56
+\BOOKMARK [3][-]{subsubsection.5.2.5}{Bounding Box}{subsection.5.2}% 57
+\BOOKMARK [3][-]{subsubsection.5.2.6}{Clipping}{subsection.5.2}% 58
+\BOOKMARK [3][-]{subsubsection.5.2.7}{Spectrum}{subsection.5.2}% 59
+\BOOKMARK [3][-]{subsubsection.5.2.8}{Profile}{subsection.5.2}% 60
+\BOOKMARK [3][-]{subsubsection.5.2.9}{Spatial Analysis}{subsection.5.2}% 61
+\BOOKMARK [3][-]{subsubsection.5.2.10}{Clustering analysis}{subsection.5.2}% 62
+\BOOKMARK [3][-]{subsubsection.5.2.11}{External Program}{subsection.5.2}% 63
+\BOOKMARK [3][-]{subsubsection.5.2.12}{Annotation}{subsection.5.2}% 64
+\BOOKMARK [3][-]{subsubsection.5.2.13}{Voxels}{subsection.5.2}% 65
+\BOOKMARK [3][-]{subsubsection.5.2.14}{Ion Colour}{subsection.5.2}% 66
+\BOOKMARK [3][-]{subsubsection.5.2.15}{Ion Transform}{subsection.5.2}% 67
+\BOOKMARK [1][-]{section.6}{Attributions}{}% 68
+\BOOKMARK [1][-]{section.7}{Licence}{}% 69
+\BOOKMARK [1][-]{section.8}{Appendices}{}% 70
+\BOOKMARK [2][-]{subsection.8.1}{Paths}{section.8}% 71
+\BOOKMARK [2][-]{subsection.8.2}{File formats}{section.8}% 72
+\BOOKMARK [3][-]{subsubsection.8.2.1}{State file}{subsection.8.2}% 73
+\BOOKMARK [3][-]{subsubsection.8.2.2}{Range files}{subsection.8.2}% 74
+\BOOKMARK [3][-]{subsubsection.8.2.3}{POS files}{subsection.8.2}% 75
+\BOOKMARK [3][-]{subsubsection.8.2.4}{Text files}{subsection.8.2}% 76
+\BOOKMARK [2][-]{subsection.8.3}{External Program Examples}{section.8}% 77
+\BOOKMARK [3][-]{subsubsection.8.3.1}{Scilab}{subsection.8.3}% 78
+\BOOKMARK [3][-]{subsubsection.8.3.2}{Python}{subsection.8.3}% 79
+\BOOKMARK [3][-]{subsubsection.8.3.3}{Bash}{subsection.8.3}% 80
+\BOOKMARK [3][-]{subsubsection.8.3.4}{C/C++}{subsection.8.3}% 81
+\BOOKMARK [2][-]{subsection.8.4}{Modifying the program}{section.8}% 82
+\BOOKMARK [3][-]{subsubsection.8.4.1}{Development tools}{subsection.8.4}% 83
+\BOOKMARK [3][-]{subsubsection.8.4.2}{Getting yourself set up}{subsection.8.4}% 84
+\BOOKMARK [3][-]{subsubsection.8.4.3}{Changing stuff}{subsection.8.4}% 85
diff --git a/docs/manual-latex/manual.pdf b/docs/manual-latex/manual.pdf
index 31a9433..b81c71a 100644
Binary files a/docs/manual-latex/manual.pdf and b/docs/manual-latex/manual.pdf differ
diff --git a/docs/manual-latex/manual.tex b/docs/manual-latex/manual.tex
index 7f4580c..5f4f518 100644
--- a/docs/manual-latex/manual.tex
+++ b/docs/manual-latex/manual.tex
@@ -40,7 +40,7 @@
 \begin{minipage}{0.3\textwidth}
 \begin{flushright} \large
 \emph{Version:} \\
- 0.0.15, Nov 2013\end{flushright}
+ 0.0.16, Apr 2014\end{flushright}
 \end{minipage}
 
 \vfill
@@ -1329,8 +1329,8 @@ Files for the sample programs can be generated from the following inline example
 
 \begin{itemize}
  \item Scilab - \url{http://threedepict.sourceforge.net/samples/externalprogram/loadPos.sci}
- \item Python - \url{http://threedepict.sourceforge.net/samples/externalprogram/python-example.shs}
- \item BASH - \url{http://threedepict.sourceforge.net/samples/externalprogram/bash-example.py}
+ \item Python - \url{http://threedepict.sourceforge.net/samples/externalprogram/python-example.py}
+ \item BASH - \url{http://threedepict.sourceforge.net/samples/externalprogram/bash-example.sh}
  \item C++ - \url{http://threedepict.sourceforge.net/samples/externalprogram/cpp-example.cpp}
 \end{itemize}
 
diff --git a/docs/manual-latex/manual.toc b/docs/manual-latex/manual.toc
new file mode 100644
index 0000000..4012a83
--- /dev/null
+++ b/docs/manual-latex/manual.toc
@@ -0,0 +1,93 @@
+\contentsline {section}{\numberline {1}Foreword}{1}{section.1}
+\contentsline {subsection}{\numberline {1.1}Introduction}{1}{subsection.1.1}
+\contentsline {subsubsection}{\numberline {1.1.1}Background}{1}{subsubsection.1.1.1}
+\contentsline {subsubsection}{\numberline {1.1.2}What is Open Source?}{1}{subsubsection.1.1.2}
+\contentsline {subsection}{\numberline {1.2}Requirements}{2}{subsection.1.2}
+\contentsline {subsection}{\numberline {1.3}Platform specific notes}{2}{subsection.1.3}
+\contentsline {subsection}{\numberline {1.4}Getting help}{3}{subsection.1.4}
+\contentsline {subsection}{\numberline {1.5}Who wrote this program?}{3}{subsection.1.5}
+\contentsline {subsection}{\numberline {1.6}Alternate documentation}{3}{subsection.1.6}
+\contentsline {subsection}{\numberline {1.7}Helping out}{3}{subsection.1.7}
+\contentsline {section}{\numberline {2}Basics}{3}{section.2}
+\contentsline {subsection}{\numberline {2.1}Getting started}{3}{subsection.2.1}
+\contentsline {subsubsection}{\numberline {2.1.1}Licence}{3}{subsubsection.2.1.1}
+\contentsline {subsubsection}{\numberline {2.1.2}Installing the program}{4}{subsubsection.2.1.2}
+\contentsline {subsection}{\numberline {2.2}Understanding the interface}{4}{subsection.2.2}
+\contentsline {subsubsection}{\numberline {2.2.1}The Filter Tree}{5}{subsubsection.2.2.1}
+\contentsline {subsubsection}{\numberline {2.2.2}The 3D View}{5}{subsubsection.2.2.2}
+\contentsline {paragraph}{Basic movement}{6}{figure.4}
+\contentsline {subsubsection}{\numberline {2.2.3}Plot area}{7}{subsubsection.2.2.3}
+\contentsline {subsubsection}{\numberline {2.2.4}Console}{7}{subsubsection.2.2.4}
+\contentsline {subsubsection}{\numberline {2.2.5}Tools panel}{7}{subsubsection.2.2.5}
+\contentsline {subsection}{\numberline {2.3}Usage fundamentals}{9}{subsection.2.3}
+\contentsline {section}{\numberline {3}Quick start}{9}{section.3}
+\contentsline {subsection}{\numberline {3.1}Loading data}{10}{subsection.3.1}
+\contentsline {subsection}{\numberline {3.2}Loading an analysis}{10}{subsection.3.2}
+\contentsline {subsection}{\numberline {3.3}Ranging}{10}{subsection.3.3}
+\contentsline {subsection}{\numberline {3.4}Spectrum}{10}{subsection.3.4}
+\contentsline {subsection}{\numberline {3.5}Composition profiles}{11}{subsection.3.5}
+\contentsline {subsection}{\numberline {3.6}Counting Points and measuring volume}{11}{subsection.3.6}
+\contentsline {subsection}{\numberline {3.7}Concentration surface and slices}{12}{subsection.3.7}
+\contentsline {section}{\numberline {4}Understanding the program}{15}{section.4}
+\contentsline {subsection}{\numberline {4.1}Filters}{15}{subsection.4.1}
+\contentsline {subsection}{\numberline {4.2}Trees}{15}{subsection.4.2}
+\contentsline {subsection}{\numberline {4.3}Stashes}{16}{subsection.4.3}
+\contentsline {subsection}{\numberline {4.4}Plots}{17}{subsection.4.4}
+\contentsline {subsection}{\numberline {4.5}Cameras}{17}{subsection.4.5}
+\contentsline {subsection}{\numberline {4.6}Effects}{18}{subsection.4.6}
+\contentsline {subsection}{\numberline {4.7}Program actions}{18}{subsection.4.7}
+\contentsline {subsubsection}{\numberline {4.7.1}Save}{18}{subsubsection.4.7.1}
+\contentsline {subsubsection}{\numberline {4.7.2}Undo}{18}{subsubsection.4.7.2}
+\contentsline {subsubsection}{\numberline {4.7.3}Raw Data}{18}{subsubsection.4.7.3}
+\contentsline {subsubsection}{\numberline {4.7.4}Export Menu}{18}{subsubsection.4.7.4}
+\contentsline {subsubsection}{\numberline {4.7.5}Ranging dialog}{19}{subsubsection.4.7.5}
+\contentsline {subsubsection}{\numberline {4.7.6}Autosave}{21}{subsubsection.4.7.6}
+\contentsline {subsubsection}{\numberline {4.7.7}Export Animation}{21}{subsubsection.4.7.7}
+\contentsline {section}{\numberline {5}Detailed Reference}{25}{section.5}
+\contentsline {subsection}{\numberline {5.1}Data types}{25}{subsection.5.1}
+\contentsline {subsubsection}{\numberline {5.1.1}Ions}{25}{subsubsection.5.1.1}
+\contentsline {subsubsection}{\numberline {5.1.2}Plots}{25}{subsubsection.5.1.2}
+\contentsline {subsubsection}{\numberline {5.1.3}Range}{25}{subsubsection.5.1.3}
+\contentsline {subsubsection}{\numberline {5.1.4}Voxels}{25}{subsubsection.5.1.4}
+\contentsline {subsubsection}{\numberline {5.1.5}Drawables}{25}{subsubsection.5.1.5}
+\contentsline {subsection}{\numberline {5.2}Filters}{25}{subsection.5.2}
+\contentsline {subsubsection}{\numberline {5.2.1}Data load}{26}{subsubsection.5.2.1}
+\contentsline {subsubsection}{\numberline {5.2.2}Downsampling}{27}{subsubsection.5.2.2}
+\contentsline {subsubsection}{\numberline {5.2.3}Ion Information}{27}{subsubsection.5.2.3}
+\contentsline {subsubsection}{\numberline {5.2.4}Ranging}{28}{subsubsection.5.2.4}
+\contentsline {subsubsection}{\numberline {5.2.5}Bounding Box}{29}{subsubsection.5.2.5}
+\contentsline {subsubsection}{\numberline {5.2.6}Clipping}{29}{subsubsection.5.2.6}
+\contentsline {subsubsection}{\numberline {5.2.7}Spectrum}{29}{subsubsection.5.2.7}
+\contentsline {subsubsection}{\numberline {5.2.8}Profile}{30}{subsubsection.5.2.8}
+\contentsline {subsubsection}{\numberline {5.2.9}Spatial Analysis}{30}{subsubsection.5.2.9}
+\contentsline {paragraph}{Algorithms}{30}{section*.3}
+\contentsline {subsubsection}{\numberline {5.2.10}Clustering analysis}{32}{subsubsection.5.2.10}
+\contentsline {subsubsection}{\numberline {5.2.11}External Program}{33}{subsubsection.5.2.11}
+\contentsline {paragraph}{Command syntax: }{33}{section*.4}
+\contentsline {paragraph}{Prior to program execution:}{33}{section*.5}
+\contentsline {paragraph}{After program execution:}{33}{section*.6}
+\contentsline {subsubsection}{\numberline {5.2.12}Annotation}{34}{subsubsection.5.2.12}
+\contentsline {paragraph}{Text}{34}{section*.7}
+\contentsline {paragraph}{Arrow, Arrow with Text}{34}{section*.8}
+\contentsline {paragraph}{Angle Measurement}{34}{section*.9}
+\contentsline {subsubsection}{\numberline {5.2.13}Voxels}{35}{subsubsection.5.2.13}
+\contentsline {subsubsection}{\numberline {5.2.14}Ion Colour}{36}{subsubsection.5.2.14}
+\contentsline {subsubsection}{\numberline {5.2.15}Ion Transform}{36}{subsubsection.5.2.15}
+\contentsline {section}{\numberline {6}Attributions}{37}{section.6}
+\contentsline {section}{\numberline {7}Licence}{37}{section.7}
+\contentsline {section}{\numberline {8}Appendices}{37}{section.8}
+\contentsline {subsection}{\numberline {8.1}Paths}{37}{subsection.8.1}
+\contentsline {subsection}{\numberline {8.2}File formats}{38}{subsection.8.2}
+\contentsline {subsubsection}{\numberline {8.2.1}State file}{38}{subsubsection.8.2.1}
+\contentsline {subsubsection}{\numberline {8.2.2}Range files}{39}{subsubsection.8.2.2}
+\contentsline {subsubsection}{\numberline {8.2.3}POS files}{40}{subsubsection.8.2.3}
+\contentsline {subsubsection}{\numberline {8.2.4}Text files}{40}{subsubsection.8.2.4}
+\contentsline {subsection}{\numberline {8.3}External Program Examples}{40}{subsection.8.3}
+\contentsline {subsubsection}{\numberline {8.3.1}Scilab}{41}{subsubsection.8.3.1}
+\contentsline {subsubsection}{\numberline {8.3.2}Python}{45}{subsubsection.8.3.2}
+\contentsline {subsubsection}{\numberline {8.3.3}Bash}{47}{subsubsection.8.3.3}
+\contentsline {subsubsection}{\numberline {8.3.4}C/C++}{48}{subsubsection.8.3.4}
+\contentsline {subsection}{\numberline {8.4}Modifying the program}{53}{subsection.8.4}
+\contentsline {subsubsection}{\numberline {8.4.1}Development tools}{53}{subsubsection.8.4.1}
+\contentsline {subsubsection}{\numberline {8.4.2}Getting yourself set up}{53}{subsubsection.8.4.2}
+\contentsline {subsubsection}{\numberline {8.4.3}Changing stuff}{54}{subsubsection.8.4.3}
diff --git a/install-sh b/install-sh
old mode 100755
new mode 100644
index 377bb86..0bd91ae
--- a/install-sh
+++ b/install-sh
@@ -1,527 +1 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2011-11-20.07; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	# Protect names problematic for 'test' and other utilities.
-	case $dst_arg in
-	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
-	esac
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-    # Protect names problematic for 'test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call 'install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names problematic for 'test' and other utilities.
-  case $src in
-    -* | [=\(\)!]) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-    dst=$dst_arg
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	[-=\(\)!]*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test X"$d" = X && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
+install-sh
diff --git a/locales/de_DE/LC_MESSAGES/3Depict.mo b/locales/de_DE/LC_MESSAGES/3Depict.mo
index e9ff0b8..cf1c383 100644
Binary files a/locales/de_DE/LC_MESSAGES/3Depict.mo and b/locales/de_DE/LC_MESSAGES/3Depict.mo differ
diff --git a/missing b/missing
old mode 100755
new mode 100644
index cdea514..1c8ff70
--- a/missing
+++ b/missing
@@ -1,10 +1,11 @@
 #! /bin/sh
-# Common wrapper for a few potentially missing GNU programs.
+# Common stub for a few missing GNU programs while installing.
 
-scriptversion=2012-06-26.16; # UTC
+scriptversion=2006-05-10.23
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
-# Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
+#   Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,7 +18,9 @@ scriptversion=2012-06-26.16; # UTC
 # GNU General Public License for more details.
 
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -25,40 +28,66 @@ scriptversion=2012-06-26.16; # UTC
 # the same distribution terms that you use for the rest of that program.
 
 if test $# -eq 0; then
-  echo 1>&2 "Try '$0 --help' for more information"
+  echo 1>&2 "Try \`$0 --help' for more information"
   exit 1
 fi
 
-case $1 in
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
 
-  --is-lightweight)
-    # Used by our autoconf macros to check whether the available missing
-    # script is modern enough.
-    exit 0
-    ;;
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
 
-  --run)
-    # Back-compat with the calling convention used by older automake.
-    shift
-    ;;
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
 
   -h|--h|--he|--hel|--help)
     echo "\
 $0 [OPTION]... PROGRAM [ARGUMENT]...
 
-Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
-to PROGRAM being missing or too old.
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
 
 Options:
   -h, --help      display this help and exit
   -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
 
 Supported PROGRAM values:
-  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
-  bison     yacc      flex         lex       help2man
-
-Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
-'g' are ignored when checking the name.
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
 
 Send bug reports to <bug-automake at gnu.org>."
     exit $?
@@ -70,146 +99,269 @@ Send bug reports to <bug-automake at gnu.org>."
     ;;
 
   -*)
-    echo 1>&2 "$0: unknown '$1' option"
-    echo 1>&2 "Try '$0 --help' for more information"
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
     exit 1
     ;;
 
 esac
 
-# Run the given program, remember its exit status.
-"$@"; st=$?
-
-# If it succeeded, we are done.
-test $st -eq 0 && exit 0
-
-# Also exit now if we it failed (or wasn't found), and '--version' was
-# passed; such an option is passed most likely to detect whether the
-# program is present and works.
-case $2 in --version|--help) exit $st;; esac
-
-# Exit code 63 means version mismatch.  This often happens when the user
-# tries to use an ancient version of a tool on a file that requires a
-# minimum version.
-if test $st -eq 63; then
-  msg="probably too old"
-elif test $st -eq 127; then
-  # Program was missing.
-  msg="missing on your system"
-else
-  # Program was found and executed, but failed.  Give up.
-  exit $st
-fi
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case $1 in
+  lex|yacc)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $1 in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
 
-perl_URL=http://www.perl.org/
-flex_URL=http://flex.sourceforge.net/
-gnu_software_URL=http://www.gnu.org/software
-
-program_details ()
-{
-  case $1 in
-    aclocal|automake)
-      echo "The '$1' program is part of the GNU Automake package:"
-      echo "<$gnu_software_URL/automake>"
-      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
-      echo "<$gnu_software_URL/autoconf>"
-      echo "<$gnu_software_URL/m4/>"
-      echo "<$perl_URL>"
-      ;;
-    autoconf|autom4te|autoheader)
-      echo "The '$1' program is part of the GNU Autoconf package:"
-      echo "<$gnu_software_URL/autoconf/>"
-      echo "It also requires GNU m4 and Perl in order to run:"
-      echo "<$gnu_software_URL/m4/>"
-      echo "<$perl_URL>"
-      ;;
-  esac
-}
-
-give_advice ()
-{
-  # Normalize program name to check for.
-  normalized_program=`echo "$1" | sed '
-    s/^gnu-//; t
-    s/^gnu//; t
-    s/^g//; t'`
-
-  printf '%s\n' "'$1' is $msg."
-
-  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
-  case $normalized_program in
-    autoconf*)
-      echo "You should only need it if you modified 'configure.ac',"
-      echo "or m4 files included by it."
-      program_details 'autoconf'
-      ;;
-    autoheader*)
-      echo "You should only need it if you modified 'acconfig.h' or"
-      echo "$configure_deps."
-      program_details 'autoheader'
-      ;;
-    automake*)
-      echo "You should only need it if you modified 'Makefile.am' or"
-      echo "$configure_deps."
-      program_details 'automake'
-      ;;
-    aclocal*)
-      echo "You should only need it if you modified 'acinclude.m4' or"
-      echo "$configure_deps."
-      program_details 'aclocal'
-      ;;
-   autom4te*)
-      echo "You might have modified some maintainer files that require"
-      echo "the 'automa4te' program to be rebuilt."
-      program_details 'autom4te'
-      ;;
-    bison*|yacc*)
-      echo "You should only need it if you modified a '.y' file."
-      echo "You may want to install the GNU Bison package:"
-      echo "<$gnu_software_URL/bison/>"
-      ;;
-    lex*|flex*)
-      echo "You should only need it if you modified a '.l' file."
-      echo "You may want to install the Fast Lexical Analyzer package:"
-      echo "<$flex_URL>"
-      ;;
-    help2man*)
-      echo "You should only need it if you modified a dependency" \
-           "of a man page."
-      echo "You may want to install the GNU Help2man package:"
-      echo "<$gnu_software_URL/help2man/>"
-    ;;
-    makeinfo*)
-      echo "You should only need it if you modified a '.texi' file, or"
-      echo "any other file indirectly affecting the aspect of the manual."
-      echo "You might want to install the Texinfo package:"
-      echo "<$gnu_software_URL/texinfo/>"
-      echo "The spurious makeinfo call might also be the consequence of"
-      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
-      echo "want to install GNU make:"
-      echo "<$gnu_software_URL/make/>"
-      ;;
-    *)
-      echo "You might have modified some files without having the proper"
-      echo "tools for further handling them.  Check the 'README' file, it"
-      echo "often tells you about the needed prerequisites for installing"
-      echo "this package.  You may also peek at any GNU archive site, in"
-      echo "case some other package contains this missing '$1' program."
-      ;;
-  esac
-}
-
-give_advice "$1" | sed -e '1s/^/WARNING: /' \
-                       -e '2,$s/^/         /' >&2
-
-# Propagate the correct exit status (expected to be 127 for a program
-# not found, 63 for a program that failed due to version mismatch).
-exit $st
+exit 0
 
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
+# time-stamp-end: "$"
 # End:
diff --git a/packaging/RPM/3Depict.spec b/packaging/RPM/3Depict.spec
old mode 100755
new mode 100644
index c2b9b68..7d943cf
--- a/packaging/RPM/3Depict.spec
+++ b/packaging/RPM/3Depict.spec
@@ -1,5 +1,5 @@
 Name:		3Depict
-Version:	0.0.15
+Version:	0.0.16
 Release:	1%{?dist}
 Summary:	Valued 3D point cloud visualization and analysis
 Group:		Applications/Engineering
@@ -36,6 +36,8 @@ BuildRequires: qhull-devel
 Patch0: %{name}-%{version}-manual-pdf-loc.patch
 #Fedora specific font dir
 Patch1: %{name}-%{version}-font-path.patch
+#Upstream patches from 0.0.15 release tarball
+Patch2: %{name}-0.0.15-upstream.patch
 
 %description
 This software is designed to help users visualize and analyze 3D point clouds
@@ -49,6 +51,7 @@ useful for general scalar valued point data purposes.
 
 %patch0
 %patch1
+%patch2
 
 %build
 %configure --disable-debug-checks --enable-openmp-parallel --enable-mgl2
@@ -109,7 +112,20 @@ rm -rf %{buildroot}
 
 
 %changelog
-* Fri Nov 15 2013 D Haley <mycae(a!t)gmx.com> - 0.0.15-1
+* Sun Apr 06 2014 D Haley <mycae(a!t)gmx.com> - 0.0.16-1
+- Update to 0.0.16
+
+* Wed Feb 12 2014 D Haley <mycae(a!t)gmx.com> - 0.0.15-4
+- Rebuild for mgl
+
+* Wed Feb 05 2014 D Haley <mycae(a!t)gmx.com> - 0.0.15-3
+- Rebuild for new mgl
+- Add upstream patches 
+
+* Sun Jan 26 2014 D Haley <mycae(a!t)gmx.com> - 0.0.15-2
+- Rebuild for new mgl
+
+* Sun Dec 01 2013 D Haley <mycae(a!t)gmx.com> - 0.0.15-1
 - Update to 0.0.15
 
 * Fri Aug 02 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.0.14-2
diff --git a/packaging/debian/3depict.1 b/packaging/debian/3depict.1
old mode 100755
new mode 100644
diff --git a/packaging/debian/3depict.install b/packaging/debian/3depict.install
old mode 100755
new mode 100644
index 4d0595d..7979f4d
--- a/packaging/debian/3depict.install
+++ b/packaging/debian/3depict.install
@@ -1,5 +1,4 @@
 data/textures/*png usr/share/3depict/textures/
-docs/manual-latex/manual.pdf usr/share/3depict/
 data/*dtd usr/share/3depict/
 data/*txt usr/share/3depict/
 data/*xml usr/share/3depict/
diff --git a/packaging/debian/changelog b/packaging/debian/changelog
index cb610f6..2b680f4 100644
--- a/packaging/debian/changelog
+++ b/packaging/debian/changelog
@@ -1,21 +1,39 @@
-3depict (0.0.15-1) unstable; urgency=low
+3depict (0.0.16-1) UNRELEASED; urgency=medium
 
-  * Update to 0.0.15
+  * Update to upstream 0.0.16
 
- -- D Haley <mycae at gmx.com>  Fri, 15 Nov 2013 20:42:37 +0100
+ -- D Haley <mycae at gmx.com>  Sun, 06 Apr 2014 23:11:51 +0100
 
-3depict (0.0.14-1) unstable; urgency=low
+3depict (0.0.15-3) unstable; urgency=medium
 
-  * Update to upstream
+  * Adjust dependencies to force mgl>=2 (Closes: #737284)
 
- -- D Haley <mycae at gmx.com>  Sat, 20 Jul 2013 18:31:32 +0200
+ -- D Haley <mycae at gmx.com>  Wed, 12 Feb 2014 22:14:51 +0100
+
+3depict (0.0.15-2) unstable; urgency=medium
+
+  * Really remove unit tests (Closes: #730100)
+  * Adjust ac_header for mgl detection
+  * Apply upstream patch for cache bug
+  * Add missing files to debian/copyright
+
+ -- D Haley <mycae at gmx.com>  Mon, 20 Jan 2014 06:25:38 +0100
 
-3depict (0.0.13-2) unstable; urgency=low
+3depict (0.0.15-1) unstable; urgency=low
+
+  * update to upstream
+  * Remove unit tests (Closes: #730100)
+  * Upstream has updated autotools (Closes: #727842)
+
+ -- D Haley <mycae at gmx.com>  Sun, 01 Dec 2013 18:25:12 +0100
 
+3depict (0.0.14-1) unstable; urgency=low
+
+  * Update to upstream, 0.0.14
   * Enable mathgl2.x configure option
   * Modify build-depends, libmgl-dev >= 2.1.32
 
- -- D Haley <mycae at gmx.com>  Sat, 15 Jun 2013 20:44:01 +0200
+ -- D Haley <mycae at gmx.com>  Sat, 20 Jul 2013 18:31:32 +0200
 
 3depict (0.0.13-1) unstable; urgency=low
 
diff --git a/packaging/debian/compat b/packaging/debian/compat
old mode 100755
new mode 100644
diff --git a/packaging/debian/control b/packaging/debian/control
old mode 100755
new mode 100644
index 7133e77..86e3834
--- a/packaging/debian/control
+++ b/packaging/debian/control
@@ -3,12 +3,11 @@ Section: science
 Priority: optional
 Maintainer: Debian Science Maintainers <debian-science-maintainers at lists.alioth.debian.org>
 Uploaders: D Haley <mycae at gmx.com>
-Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1~), libgl1-mesa-dev | libgl-dev, libpng-dev | libpng15-dev, libqhull-dev, libwxgtk2.8-dev, libftgl-dev, libxml2-dev, libmgl-dev (>= 2.1.3.1)
-Standards-Version: 3.9.4
+Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1~), libgl1-mesa-dev | libgl-dev, libpng-dev | libpng15-dev, libqhull-dev, libwxgtk2.8-dev, libftgl-dev, libxml2-dev, libmgl-dev (>= 2.0)
+Standards-Version: 3.9.5
 Homepage: http://threedepict.sourceforge.net/index.html
-Vcs-Git: git://git.debian.org/debian-science/packages/3depict.git
-Vcs-Browser: http://git.debian.org/?p=debian-science/packages/3depict.git
-XS-Testsuite: autopkgtest
+Vcs-Git: git://anonscm.debian.org/debian-science/packages/3depict.git
+Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debian-science/packages/3depict.git
 
 
 Package: 3depict
diff --git a/packaging/debian/copyright b/packaging/debian/copyright
old mode 100755
new mode 100644
index 1b4e28a..4b2bee7
--- a/packaging/debian/copyright
+++ b/packaging/debian/copyright
@@ -55,4 +55,16 @@ License: GPL-2+
  On Debian systems the full text of the Lesser GNU General Public License
  v2 can be found in the `/usr/share/common-licenses/LGPL-2' file.
 
+Files: src/gl/tr.cpp src/gl/tr.h
+Copyright: Copyright 2005, Brian Paul 
+Source: http://www.mesa3d.org/brianp/TR.html
+License: GPL-2+
+ On Debian systems the full text of the GNU General Public License v2
+ can be found in the `/usr/share/common-licenses/GPL-2' file.
 
+Files: data/naturalAbundance.xml
+Copyright: Copyright 2008, Metamolecular
+Source: http://metamolecular.com 
+License: expat
+ On Debian systems the full text of th expat license can be found in the
+ `/usr/share/common-licenses/expat' file.
diff --git a/packaging/debian/docs b/packaging/debian/docs
old mode 100755
new mode 100644
diff --git a/packaging/debian/manpages b/packaging/debian/manpages
old mode 100755
new mode 100644
diff --git a/packaging/debian/menu b/packaging/debian/menu
old mode 100755
new mode 100644
diff --git a/packaging/debian/patches/FTGL-lowercase.patch b/packaging/debian/patches/FTGL-lowercase.patch
old mode 100755
new mode 100644
index b8f079d..de67913
--- a/packaging/debian/patches/FTGL-lowercase.patch
+++ b/packaging/debian/patches/FTGL-lowercase.patch
@@ -1,11 +1,9 @@
 Description: Debian uses lowercase lib names.
 Forwarded: not-needed
 Author: D Haley <mycae - gmx - com>
-Index: 3depict-0.0.15/configure
-===================================================================
---- 3depict-0.0.15.orig/configure	2013-11-15 21:19:07.000000000 +0100
-+++ 3depict-0.0.15/configure	2013-11-15 21:19:10.000000000 +0100
-@@ -6121,7 +6121,7 @@
+--- 3depict-0.0.16.orig/configure
++++ 3depict-0.0.16/configure
+@@ -6129,7 +6129,7 @@
  if test "x$ftgl_prefix" != "x" ; then
  	#use the supplied CFLAGS. assume LIBS
  	FTGL_CFLAGS="-I$ftgl_prefix/include/ -L$ftgl_prefix/lib/"
diff --git a/packaging/debian/patches/debian-desktop-naming.patch b/packaging/debian/patches/debian-desktop-naming.patch
old mode 100755
new mode 100644
index fce3ae7..63b49e2
--- a/packaging/debian/patches/debian-desktop-naming.patch
+++ b/packaging/debian/patches/debian-desktop-naming.patch
@@ -2,10 +2,8 @@ Description: Debian packages are lowercase, but upstream uses uppercase
  "D"
 Forwarded: not-needed
 Author: D Haley <mycae - gmx - com>
-Index: 3depict-0.0.14/packaging/3Depict.desktop
-===================================================================
---- 3depict-0.0.14.orig/packaging/3Depict.desktop	2013-03-22 19:31:39.000000000 +0100
-+++ 3depict-0.0.14/packaging/3Depict.desktop	2013-07-20 18:36:33.000000000 +0200
+--- 3depict-0.0.16.orig/packaging/3Depict.desktop
++++ 3depict-0.0.16/packaging/3Depict.desktop
 @@ -2,8 +2,8 @@
  Version=1.0
  Type=Application
diff --git a/packaging/debian/patches/lowercase-textdomain.patch b/packaging/debian/patches/lowercase-textdomain.patch
old mode 100755
new mode 100644
index 7b59388..8817934
--- a/packaging/debian/patches/lowercase-textdomain.patch
+++ b/packaging/debian/patches/lowercase-textdomain.patch
@@ -1,11 +1,9 @@
 Description: Debian uses different text domain for the lang files
 Forwarded: not-needed
 Author: D Haley <mycae - gmx - com>
-Index: 3depict-0.0.14/src/3Depict.cpp
-===================================================================
---- 3depict-0.0.14.orig/src/3Depict.cpp	2013-07-20 14:41:45.000000000 +0200
-+++ 3depict-0.0.14/src/3Depict.cpp	2013-07-20 18:36:33.000000000 +0200
-@@ -165,7 +165,7 @@
+--- 3depict-0.0.16.orig/src/3Depict.cpp
++++ 3depict-0.0.16/src/3Depict.cpp
+@@ -166,7 +166,7 @@
  		else
  		{
  			//Set the gettext language
@@ -14,7 +12,7 @@ Index: 3depict-0.0.14/src/3Depict.cpp
  			setlocale (LC_ALL, "");
  #ifdef __WXMAC__
  			bindtextdomain( PROGRAM_NAME, paths->GetResourcesDir().mb_str(wxConvUTF8) );
-@@ -197,8 +197,8 @@
+@@ -198,8 +198,8 @@
  					break;
  			}			
  #else
diff --git a/packaging/debian/patches/patch-caching-bug b/packaging/debian/patches/patch-caching-bug
new file mode 100644
index 0000000..0b845b4
--- /dev/null
+++ b/packaging/debian/patches/patch-caching-bug
@@ -0,0 +1,35 @@
+Bug fix for 0.0.15, from upstream : http://hg.code.sf.net/p/threedepict/code/rev/7fba7ef21117
+--- 3depict-0.0.16.orig/src/backend/filters/ionColour.cpp
++++ 3depict-0.0.16/src/backend/filters/ionColour.cpp
+@@ -82,7 +82,7 @@
+ 	if(cacheOK)
+ 	{
+ 		ASSERT(filterOutputs.size());
+-		propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,false);
++		propagateStreams(dataIn,getOut,getRefreshBlockMask(),true);
+ 
+ 		propagateCache(getOut);
+ 
+--- 3depict-0.0.16.orig/src/backend/filters/rangeFile.cpp
++++ 3depict-0.0.16/src/backend/filters/rangeFile.cpp
+@@ -107,7 +107,7 @@
+ 		//We don't cache anything but our modification
+ 		//to the ion stream data types. so we propagate
+ 		//these.
+-		propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,false);
++		propagateStreams(dataIn,getOut,getRefreshBlockMask(),true);
+ 			
+ 		return 0;
+ 	}
+--- 3depict-0.0.16.orig/src/backend/filters/transform.cpp
++++ 3depict-0.0.16/src/backend/filters/transform.cpp
+@@ -189,7 +189,8 @@
+ 	//use the cached copy if we have it.
+ 	if(cacheOK)
+ 	{
+-		propagateStreams(dataIn,getOut, STREAM_TYPE_IONS,false);
++		//Propagate non-ion-types into output
++		propagateStreams(dataIn,getOut, getRefreshBlockMask(),true);
+ 		propagateCache(getOut);
+ 		return 0;
+ 	}
diff --git a/packaging/debian/patches/series b/packaging/debian/patches/series
old mode 100755
new mode 100644
index bfecdd4..90196aa
--- a/packaging/debian/patches/series
+++ b/packaging/debian/patches/series
@@ -1,3 +1,4 @@
 debian-desktop-naming.patch
 lowercase-textdomain.patch
 FTGL-lowercase.patch
+patch-caching-bug
diff --git a/packaging/debian/rules b/packaging/debian/rules
index 748ab77..867f70e 100755
--- a/packaging/debian/rules
+++ b/packaging/debian/rules
@@ -20,7 +20,6 @@ override_dh_clean:
 
 	dh_clean 
 
-
 override_dh_auto_install: 
 	dh_auto_install
 	
@@ -28,7 +27,7 @@ override_dh_auto_install:
 	mv $(CURDIR)/debian/3depict/usr/bin/3Depict $(CURDIR)/debian/3depict/usr/bin/3depict
 
 	mkdir -p $(CURDIR)/debian/3depict/usr/share/doc/3depict/
-	echo "Copyright 2013 D Haley <mycae at yahoo.com>" > $(CURDIR)/debian/3depict/usr/share/doc/3depict/copyright
+	echo "Copyright" `date +%Y`" D Haley <mycae at yahoo.com>" > $(CURDIR)/debian/3depict/usr/share/doc/3depict/copyright
 	echo "See /usr/share/common-licenses/GPL-1 for copyright info" >> $(CURDIR)/debian/3depict/usr/share/doc/3depict/copyright
 
 	#Install files that cannot be handled by .install due to rename
@@ -38,7 +37,7 @@ override_dh_auto_install:
 	#install icon (both SVG and XPM) into pixmaps
 	install -Dp -m 644 $(CURDIR)/data/3Depict.xpm $(CURDIR)/debian/3depict/usr/share/pixmaps/3depict.xpm
 	install -Dp -m 644 $(CURDIR)/data/textures/tex-source/3Depict-icon.svg $(CURDIR)/debian/3depict/usr/share/pixmaps/3depict.svg
-	install -Dp -m 644 $(CURDIR)/data/manual.pdf $(CURDIR)/debian/3depict/usr/share/3depict/3depict-manual.pdf
+	install -Dp -m 644 $(CURDIR)/docs/manual-latex/manual.pdf $(CURDIR)/debian/3depict/usr/share/3depict/3depict-manual.pdf
 	#---
 	
 	#Install the pre-built locale files that are shipped with the tarball.
diff --git a/packaging/debian/source/format b/packaging/debian/source/format
old mode 100755
new mode 100644
diff --git a/packaging/debian/tests/control b/packaging/debian/tests/control
deleted file mode 100755
index 4a7d9b2..0000000
--- a/packaging/debian/tests/control
+++ /dev/null
@@ -1,2 +0,0 @@
-Tests: unittests
-
diff --git a/packaging/debian/tests/unittests b/packaging/debian/tests/unittests
deleted file mode 100755
index 4016e55..0000000
--- a/packaging/debian/tests/unittests
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/bin/bash
-
-CONFIGURE_PARAMS="--enable-mgl2"
-
-#apply all quilt patches, recording current status
-QUILT_APPLIED=`quilt applied`
-quilt push -a 
-
-#If manually running outside autopkgtest, then
-# just use /tmp
-if [ x"$ADTDMP" == x"" ] ; then
-	if [ x"$TMP" == x"" ] ; then
-		ADTDMP=/tmp/
-	else
-		ADTDMP=/tmp/
-	fi
-fi
-
-REBUILD_DIR=$ADTDMP/3depict-debug/
-
-#Go to top level dir
-#---
-TOP_LEVEL=` git rev-parse --show-toplevel`
-if [ $? -ne 0 ] ; then
-	$TOP_LEVEL=""
-else
-	pushd $TOP_LEVEL
-fi
-
-
-
-rm -rf $REBUILD_DIR || exit 1;
-mkdir  $REBUILD_DIR || exit 1;
-cp -R ./ $REBUILD_DIR 
-
-pushd $REBUILD_DIR
-
-#Rebuild program with debugging enabled.
-# Run tests in both single and multithreaded modes
-#----
-make clean ||  exit 1;
-./configure  $CONFIGURE_PARAMS ||  exit 1;   
-make -j2  ||  exit 1;
-./src/3Depict -t || exit 1; 
-
-make clean || exit 1;
-./configure $CONFIGURE_PARAMS --enable-openmp-parallel
-make -j2
-./src/3Depict -t || exit 1;
-make clean
-#----
-
-rm -rf $REBUILD_DIR/
-
-popd 
-
-#Restore patches to previous state
-quilt pop -a
-for i in $QUILT_APPLIED
-do
-	quilt push
-done
-
-if [ x"$TOP_LEVEL" != x"" ] ; then
-	popd
-fi
-
-
diff --git a/packaging/debian/watch b/packaging/debian/watch
old mode 100755
new mode 100644
diff --git a/packaging/mac/1compile.sh b/packaging/mac/1compile.sh
index d4caa4b..4084a8b 100755
--- a/packaging/mac/1compile.sh
+++ b/packaging/mac/1compile.sh
@@ -2,7 +2,7 @@
 cp makeMacOSXApp ../..
 cp -R 3Depict.app ../..
 cd ../..
-time ./makeMacOSXApp --update-config=yes --parallel=yes --debug=yes > out.txt 2>&1
+time ./makeMacOSXApp --update-config=yes --parallel=no --debug=yes > out.txt 2>&1
 
 #check compile OK
 if [ $? -eq 0 ] ; then
diff --git a/packaging/mac/2compile.sh b/packaging/mac/2compile.sh
old mode 100755
new mode 100644
diff --git a/packaging/mac/3Depict.app/Contents/Info.plist b/packaging/mac/3Depict.app/Contents/Info.plist
old mode 100755
new mode 100644
index 8b11627..97532e1
--- a/packaging/mac/3Depict.app/Contents/Info.plist
+++ b/packaging/mac/3Depict.app/Contents/Info.plist
@@ -11,7 +11,7 @@
 	<key>CFBundleIconFile</key>
 	<string>3Depict-icon</string>
 	<key>CFBundleIdentifier</key>
-	<string>net.sourceforge.threedepict.3Depict</string>
+	<string>net.sourceforge.threedepict.-Depict</string>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<key>CFBundleName</key>
@@ -41,7 +41,7 @@
 	<key>LSMinimumSystemVersion</key>
 	<string>MAC_OS_VER</string>
 	<key>NSHumanReadableCopyright</key>
-	<string>3Depict Copyright (C) 2013  3Depict team
+	<string>3Depict Copyright (C) 2011  3Depict team
 This program comes with ABSOLUTELY NO WARRANTY
 This is free software, and you are welcome to redistribute it
 under certain conditions</string>
diff --git a/packaging/mac/3Depict.app/Contents/PkgInfo b/packaging/mac/3Depict.app/Contents/PkgInfo
old mode 100755
new mode 100644
diff --git a/packaging/mac/3Depict.app/Contents/Resources/Assets.car b/packaging/mac/3Depict.app/Contents/Resources/Assets.car
new file mode 100644
index 0000000..563e500
Binary files /dev/null and b/packaging/mac/3Depict.app/Contents/Resources/Assets.car differ
diff --git a/packaging/mac/3Depict.app/Contents/Resources/Base.lproj/MainMenu.nib b/packaging/mac/3Depict.app/Contents/Resources/Base.lproj/MainMenu.nib
new file mode 100644
index 0000000..a530169
Binary files /dev/null and b/packaging/mac/3Depict.app/Contents/Resources/Base.lproj/MainMenu.nib differ
diff --git a/packaging/mac/3Depict.app/Contents/Resources/en.lproj/Credits.rtf b/packaging/mac/3Depict.app/Contents/Resources/en.lproj/Credits.rtf
new file mode 100644
index 0000000..46576ef
--- /dev/null
+++ b/packaging/mac/3Depict.app/Contents/Resources/en.lproj/Credits.rtf
@@ -0,0 +1,29 @@
+{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\paperw9840\paperh8400
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Engineering:
+\b0 \
+	Some people\
+\
+
+\b Human Interface Design:
+\b0 \
+	Some other people\
+\
+
+\b Testing:
+\b0 \
+	Hopefully not nobody\
+\
+
+\b Documentation:
+\b0 \
+	Whoever\
+\
+
+\b With special thanks to:
+\b0 \
+	Mom\
+}
diff --git a/packaging/mac/3Depict.app/Contents/Resources/en.lproj/InfoPlist.strings b/packaging/mac/3Depict.app/Contents/Resources/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..5e45963
Binary files /dev/null and b/packaging/mac/3Depict.app/Contents/Resources/en.lproj/InfoPlist.strings differ
diff --git a/packaging/mac/3Depict.app/Contents/Resources/wxmac.icns b/packaging/mac/3Depict.app/Contents/Resources/wxmac.icns
deleted file mode 100755
index 7cbd7fe..0000000
Binary files a/packaging/mac/3Depict.app/Contents/Resources/wxmac.icns and /dev/null differ
diff --git a/packaging/mac/3package.sh b/packaging/mac/3package.sh
index 870de0b..4d9b529 100755
--- a/packaging/mac/3package.sh
+++ b/packaging/mac/3package.sh
@@ -17,14 +17,15 @@ YEAR=`date | awk '{print $NF}'`
 #===
 INFO_PLIST="./3Depict.app/Contents/Info.plist"
 #Set program version
-sed -i "s/BUNDLE_VERSION/${VERSION}/" ${INFO_PLIST}
+sed "s/BUNDLE_VERSION/${VERSION}/" ${INFO_PLIST} > tmp.txt
 #Set year
-sed -i "s/3Depict Copyright (C) 20[123][0-9]/${DATEYEAR}/" ${INFO_PLIST}
+sed "s/3Depict Copyright (C) 20[123][0-9]/${DATEYEAR}/" tmp.txt > tmp2.txt
 #Set minimum OS numbber
-sed -i "s/MIN_OS_VER/${MAC_OS_VER}/"  ${INFO_PLIST}
+sed "s/MIN_OS_VER/${MAC_OS_VER}/"  tmp2.txt > ${INFO_PLIST}
+rm tmp.txt tmp2.txt
 #===
 
-time ./makeMacOSXApp --update-config=yes --parallel=yes --debug=no > out.txt 2>&1
+time ./makeMacOSXApp --update-config=yes --parallel=no --debug=no > out.txt 2>&1
 if [ x"`tail -1 out.txt`" == x"Done" ] ; then
 	echo "Finished compiling"
 else
diff --git a/packaging/mac/makeMacOSXApp b/packaging/mac/makeMacOSXApp
index d5d12b5..054b4b8 100755
--- a/packaging/mac/makeMacOSXApp
+++ b/packaging/mac/makeMacOSXApp
@@ -16,11 +16,15 @@ if [ $1 = '--update-config=yes' ]; then
 		DISABLE_DEBUG="--disable-debug-checks"
 	fi
 
-	CXX="`wx-config --cxx` " \
+#	CFLAGS="$CFLAGS -std=c++11"
+
+	CXX=g++ #"`wx-config --cxx` " \
 	CFLAGS="$CFLAGS -I/opt/local/include -I/usr/local/include " \
 	CXXFLAGS="$CXXFLAGS -I/opt/local/include -I/usr/local/include " \
 	LDFLAGS="$LDFLAGS -L/opt/local/lib -L/usr/local/lib" \
-	./configure $SHOULD_PARALLEL $DISABLE_DEBUG --enable-mgl2=yes
+	./configure $SHOULD_PARALLEL $DISABLE_DEBUG --enable-mgl2=yes \
+		--with-libpng-flag="-I/opt/local/include/libpng16" \
+		--with-libpng-link="-L/opt/local/lib/ -lpng16"
 
 	if [ $? -ne 0 ]; then
 		echo "Configure unsuccessful - exiting"
diff --git a/packaging/makeTarball.sh b/packaging/makeTarball.sh
index 4d31b73..6b3c18e 100755
--- a/packaging/makeTarball.sh
+++ b/packaging/makeTarball.sh
@@ -15,12 +15,15 @@ do
 	MSG_FILE=tmp-$MSG_FILE
 done
 	
-#Check build for all 4 combinations of enable/disable parallel and debug checking
+#Check build for combinations of 
+#	- enable/disable parallel 
+#	- debug checking
+#	- C++11
 #-------
-CONF_ARGS=" --enable-openmp-parallel, --disable-debug-checks, --enable-debug-checks, --enable-openmp-parallel --disable-debug-checks"
+CONF_ARGS=" --enable-openmp-parallel | --disable-debug-checks | --enable-debug-checks | --enable-openmp-parallel --disable-debug-checks | --enable-c++11 --enable-openmp-parallel | --enable-c++11 --disable-debug-checks"
 
 OLD_IFS=$IFS
-IFS=","
+IFS="|"
 for i in ${CONF_ARGS[*]}
 do
 	echo "$i"
@@ -29,12 +32,12 @@ do
 
 	./configure
 	if [ $? -ne 0 ] ; then
-		echo "no-debug mode failed to configure"
+		echo "test-configuration failed to configure: arguments are $i"
 	fi
 
 	make -j $NUM_PROCS
 	if [ $? -ne 0 ] ; then
-		echo "no-debug mode failed to build"
+		echo "failed to build: argumens are $i"
 	fi
 
 	#Check for unit test availability, and run them
diff --git a/packaging/mingw-debian-cross/bootstrap.sh b/packaging/mingw-debian-cross/bootstrap.sh
index a1661a7..0a7acf7 100755
--- a/packaging/mingw-debian-cross/bootstrap.sh
+++ b/packaging/mingw-debian-cross/bootstrap.sh
@@ -1190,6 +1190,22 @@ function make_package()
 		exit 1
 	fi
 
+	
+	#Check that each file in the data/textures/ dir is listed in the NSI file
+	FILE_MISSED=0
+	for i in  data/textures/*png
+	do
+		FILE_GREP=`grep "data\\textures\\$i" windows-installer.nsi`
+		if [ x${FILE_GREP} == x"" ] ; then
+			echo "MISSING FILE: " $i
+			FILE_MISSED=1
+		fi
+	done
+
+	if [ $FILE_MISSED -ne 0 ] ; then
+		exit 1
+	fi
+
 	#Insert DLL names automatically
 	cp windows-installer.nsi tmp.nsi
 	echo $FOUND_DLLS | sed 's/ /\n/g' |  sed 's@^@  File \"src\\@' | sed 's/$/\"/' > tmp-insert
diff --git a/packaging/mingw-debian-cross/windows-installer.nsi b/packaging/mingw-debian-cross/windows-installer.nsi
index 1af8a14..0d9e106 100755
--- a/packaging/mingw-debian-cross/windows-installer.nsi
+++ b/packaging/mingw-debian-cross/windows-installer.nsi
@@ -2,13 +2,16 @@
 
 ; HM NIS Edit Wizard helper defines
 !define PRODUCT_NAME "3Depict"
-!define PRODUCT_VERSION "0.0.15"
+!define PRODUCT_VERSION "0.0.16"
 !define PRODUCT_PUBLISHER "D. Haley, A. Ceguerra"
 !define PRODUCT_WEB_SITE "http://threedepict.sourceforge.net"
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\3Depict.exe"
 !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
 !define PRODUCT_UNINST_ROOT_KEY "HKLM"
 
+SetCompressor /FINAL /SOLID lzma
+SetCompressorDictSize 64
+
 ; MUI 1.67 compatible ------
 !include "MUI.nsh"
 
@@ -26,8 +29,8 @@
 ; Instfiles page
 !insertmacro MUI_PAGE_INSTFILES
 ; Finish page
-!define MUI_FINISHPAGE_RUN "$INSTDIR\3Depict.exe"
-!insertmacro MUI_PAGE_FINISH
+;!define MUI_FINISHPAGE_RUN "$INSTDIR\3Depict.exe"
+;!insertmacro MUI_PAGE_FINISH
 
 ; Uninstaller pages
 !insertmacro MUI_UNPAGE_INSTFILES
@@ -64,6 +67,10 @@ Section "3Depict program" SEC01
   File /r locales\*.*
   
   SetOutPath "$INSTDIR\textures\"
+  File "data\textures\Left-Right-arrow.png"
+  File "data\textures\Left_clicked_mouse.png"
+  File "data\textures\Right-arrow.png"
+  File "data\textures\Right_clicked_mouse.png"
   File "data\textures\animProgress0.png"
   File "data\textures\animProgress1.png"
   File "data\textures\animProgress2.png"
@@ -73,21 +80,18 @@ Section "3Depict program" SEC01
   File "data\textures\keyboard-ctrl.png"
   File "data\textures\keyboard-shift.png"
   File "data\textures\keyboard-tab.png"
-  File "data\textures\Left_clicked_mouse.png"
-  File "data\textures\Left-Right-arrow.png"
   File "data\textures\middle_clicked_mouse.png"
-  File "data\textures\Right-arrow.png"
-  File "data\textures\Right_clicked_mouse.png"
+  File "data\textures\plot_slide_x.png"
+  File "data\textures\plot_zoom_reset.png"
+  File "data\textures\plot_zoom_x.png"
+  File "data\textures\plot_zoom_y.png"
   File "data\textures\rotateArrow.png"
   File "data\textures\scroll_wheel_mouse.png"
-  File "data/3Depict.xpm"
-  File "data/atomic-mass-table.dtd"
-  File "data/checked_dis.xpm"
-  File "data/checked.xpm"
-  File "data/naturalAbundance.xml"
-  File "data/startup-tips.txt"
-  File "data/unchecked_dis.xpm"
-  File "data/unchecked.xpm"
+  SetOutPath "$INSTDIR"
+  File "data\3Depict.xpm"
+  File "data\atomic-mass-table.dtd"
+  File "data\naturalAbundance.xml"
+  File "data\startup-tips.txt"
 SectionEnd
 
 Section -AdditionalIcons
@@ -139,14 +143,10 @@ Section Uninstall
   Delete "$INSTDIR\textures\keyboard-alt.png"
   Delete "$INSTDIR\textures\enlarge.png"
   
-  Delete "$INSTDIR/3Depict.xpm"
-  Delete "$INSTDIR/atomic-mass-table.dtd"
-  Delete "$INSTDIR/checked_dis.xpm"
-  Delete "$INSTDIR/checked.xpm"
-  Delete "$INSTDIR/naturalAbundance.xml"
-  Delete "$INSTDIR/startup-tips.txt"
-  Delete "$INSTDIR/unchecked_dis.xpm"
-  Delete "$INSTDIR/unchecked.xpm"
+  Delete "3Depict.xpm"
+  Delete "atomic-mass-table.dtd"
+  Delete "naturalAbundance.xml"
+  Delete "startup-tips.txt"
  
   Delete "$INSTDIR\3Depict.exe"
 
diff --git a/src/3Depict.cpp b/src/3Depict.cpp
index 8681cf3..1c66435 100644
--- a/src/3Depict.cpp
+++ b/src/3Depict.cpp
@@ -42,9 +42,9 @@ private:
 	MainWindowFrame* MainFrame ;
 	wxArrayString commandLineFiles;
 	wxLocale* usrLocale;
-	long language;
+	//long language;
 
-	void initLanguageSupport();
+	//void initLanguageSupport();
 
 
 public:
@@ -128,12 +128,12 @@ threeDepictApp::threeDepictApp()
 }
 
 
-void threeDepictApp::initLanguageSupport()
+/*void threeDepictApp::initLanguageSupport()
 {
 	language =  wxLANGUAGE_DEFAULT;
 
 	// load language if possible, fall back to English otherwise
-	if(wxLocale::IsAvailable(language))
+	if(false)// (wxLocale::IsAvailable(language))
 	{
 		//Wx 2.9 and above are now unicode, so locale encoding
 		//conversion is deprecated.
@@ -210,7 +210,7 @@ void threeDepictApp::initLanguageSupport()
 		language = wxLANGUAGE_ENGLISH;
 	}
 }
-
+*/
 //Catching key events globally.
 int threeDepictApp::FilterEvent(wxEvent& event)
 {
@@ -411,7 +411,7 @@ void threeDepictApp::MacReopenFile(const wxString &filename)
 bool threeDepictApp::OnInit()
 {
 
-    initLanguageSupport();
+    //initLanguageSupport();
 	
 
     //Set the gettext language
diff --git a/src/Makefile.am b/src/Makefile.am
index 8e63f0a..9ca6bb9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -20,7 +20,7 @@ MSYS_PATH=/c/msys/1.0/local/include/
 bin_PROGRAMS= 3Depict
 
 #------- Common header files for all sub-modules
-COMMON_SOURCE_FILES = common/pngread.c common/stringFuncs.cpp common/xmlHelper.cpp common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp common/basics.cpp
+COMMON_SOURCE_FILES = common/pngread.c common/stringFuncs.cpp common/xmlHelper.cpp common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp common/basics.cpp common/assertion.cpp
 COMMON_HEADER_FILES = common/pngread.h common/stringFuncs.h  common/constants.h  common/xmlHelper.h common/colourmap.h \
 		      	common/mathfuncs.h common/basics.h common/translation.h common/endianTest.h common/assertion.h common/voxels.h
 
@@ -94,8 +94,11 @@ DIALOG_HEADER_FILES = gui/dialogs/ExportPos.h gui/dialogs/ExportRngDialog.h gui/
 GUI_SOURCE_FILES=gui/mainFrame.cpp gui/mathglPane.cpp gui/cropPanel.cpp gui/glPane.cpp  $(DIALOG_SOURCE_FILES)
 GUI_HEADER_FILES=gui/mainFrame.h gui/mathglPane.h gui/cropPanel.h gui/art.h gui/glPane.h $(DIALOG_HEADER_FILES)
 
-BASE_SOURCE_FILES=   3Depict.cpp testing/testing.cpp  wx/wxcomponents.cpp wx/wxcommon.cpp winconsole.cpp 
-BASE_HEADER_FILES=   testing/testing.h winconsole.h   wx/wxcomponents.h  wx/wxcommon.h 
+BASE_SOURCE_FILES=   3Depict.cpp testing/testing.cpp wx/wxcommon.cpp  wx/wxcomponents.cpp winconsole.cpp 
+BASE_HEADER_FILES=   testing/testing.h  wx/wxcommon.h  wx/wxcomponents.h   winconsole.h
+
+TEST_SOURCE_FILES = testing/mglTesting.cpp
+TEST_HEADER_FILES = testing/mglTesting.h
 #-----------
 
 
@@ -103,7 +106,7 @@ BASE_HEADER_FILES=   testing/testing.h winconsole.h   wx/wxcomponents.h  wx/wxco
 SOURCE_FILES=  $(BASE_SOURCE_FILES) $(BASE_HEADER_FILES) $(GUI_SOURCE_FILES) $(GUI_HEADER_FILES) \
 	       $(FILTER_FILES) $(FILTER_HEADER_FILES) \
 	       ${BACKEND_SOURCE_FILES} ${BACKEND_HEADER_FILES} $(OPENGL_SOURCE_FILES) $(OPENGL_HEADER_FILES) \
-	       $(COMMON_SOURCE_FILES) $(COMMON_HEADER_FILES)
+	       $(COMMON_SOURCE_FILES) $(COMMON_HEADER_FILES) $(TEST_SOURCE_FILES) $(TEST_HEADER_FILES)
 
 3Depict_SOURCES=$(SOURCE_FILES)
 
@@ -114,6 +117,6 @@ if HAVE_WINDRES
 endif
 
 #Tarball options
-EXTRA_DIST = gui/glade-skeleton myAppIcon.ico testing/filtertesting.cpp
+EXTRA_DIST = gui/glade-skeleton myAppIcon.ico testing/filtertesting.cpp 
  
 
diff --git a/src/Makefile.in b/src/Makefile.in
index 2b5d5fb..0fc9cfb 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -99,8 +99,8 @@ CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
 am__3Depict_SOURCES_DIST = 3Depict.cpp testing/testing.cpp \
-	wx/wxcomponents.cpp wx/wxcommon.cpp winconsole.cpp \
-	testing/testing.h winconsole.h wx/wxcomponents.h wx/wxcommon.h \
+	wx/wxcommon.cpp wx/wxcomponents.cpp winconsole.cpp \
+	testing/testing.h wx/wxcommon.h wx/wxcomponents.h winconsole.h \
 	gui/mainFrame.cpp gui/mathglPane.cpp gui/cropPanel.cpp \
 	gui/glPane.cpp gui/dialogs/ExportPos.cpp \
 	gui/dialogs/ExportRngDialog.cpp gui/dialogs/prefDialog.cpp \
@@ -168,16 +168,17 @@ am__3Depict_SOURCES_DIST = 3Depict.cpp testing/testing.cpp \
 	gl/select.h gl/cameras.h gl/isoSurface.h gl/tr.h gl/glDebug.h \
 	common/pngread.c common/stringFuncs.cpp common/xmlHelper.cpp \
 	common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp \
-	common/basics.cpp common/pngread.h common/stringFuncs.h \
-	common/constants.h common/xmlHelper.h common/colourmap.h \
-	common/mathfuncs.h common/basics.h common/translation.h \
-	common/endianTest.h common/assertion.h common/voxels.h \
+	common/basics.cpp common/assertion.cpp common/pngread.h \
+	common/stringFuncs.h common/constants.h common/xmlHelper.h \
+	common/colourmap.h common/mathfuncs.h common/basics.h \
+	common/translation.h common/endianTest.h common/assertion.h \
+	common/voxels.h testing/mglTesting.cpp testing/mglTesting.h \
 	3Depict.rc
 am__dirstamp = $(am__leading_dot)dirstamp
 am__objects_1 = 3Depict-3Depict.$(OBJEXT) \
 	testing/3Depict-testing.$(OBJEXT) \
-	wx/3Depict-wxcomponents.$(OBJEXT) \
-	wx/3Depict-wxcommon.$(OBJEXT) 3Depict-winconsole.$(OBJEXT)
+	wx/3Depict-wxcommon.$(OBJEXT) \
+	wx/3Depict-wxcomponents.$(OBJEXT) 3Depict-winconsole.$(OBJEXT)
 am__objects_2 =
 am__objects_3 = gui/dialogs/3Depict-ExportPos.$(OBJEXT) \
 	gui/dialogs/3Depict-ExportRngDialog.$(OBJEXT) \
@@ -240,12 +241,15 @@ am__objects_9 = common/3Depict-pngread.$(OBJEXT) \
 	common/3Depict-colourmap.$(OBJEXT) \
 	common/3Depict-voxels.$(OBJEXT) \
 	common/3Depict-mathfuncs.$(OBJEXT) \
-	common/3Depict-basics.$(OBJEXT)
-am__objects_10 = $(am__objects_1) $(am__objects_2) $(am__objects_4) \
+	common/3Depict-basics.$(OBJEXT) \
+	common/3Depict-assertion.$(OBJEXT)
+am__objects_10 = testing/3Depict-mglTesting.$(OBJEXT)
+am__objects_11 = $(am__objects_1) $(am__objects_2) $(am__objects_4) \
 	$(am__objects_5) $(am__objects_6) $(am__objects_2) \
 	$(am__objects_7) $(am__objects_2) $(am__objects_8) \
-	$(am__objects_2) $(am__objects_9) $(am__objects_2)
-am_3Depict_OBJECTS = $(am__objects_10) $(am__objects_2)
+	$(am__objects_2) $(am__objects_9) $(am__objects_2) \
+	$(am__objects_10) $(am__objects_2)
+am_3Depict_OBJECTS = $(am__objects_11) $(am__objects_2)
 3Depict_OBJECTS = $(am_3Depict_OBJECTS)
 am__DEPENDENCIES_1 =
 3Depict_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
@@ -477,7 +481,7 @@ MSYS_PATH = /c/msys/1.0/local/include/
 	$(GLU_LIBS) $(QHULL_LIBS) $(PNG_LIBS) $(am__append_2)
 
 #------- Common header files for all sub-modules
-COMMON_SOURCE_FILES = common/pngread.c common/stringFuncs.cpp common/xmlHelper.cpp common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp common/basics.cpp
+COMMON_SOURCE_FILES = common/pngread.c common/stringFuncs.cpp common/xmlHelper.cpp common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp common/basics.cpp common/assertion.cpp
 COMMON_HEADER_FILES = common/pngread.h common/stringFuncs.h  common/constants.h  common/xmlHelper.h common/colourmap.h \
 		      	common/mathfuncs.h common/basics.h common/translation.h common/endianTest.h common/assertion.h common/voxels.h
 
@@ -549,18 +553,20 @@ DIALOG_HEADER_FILES = gui/dialogs/ExportPos.h gui/dialogs/ExportRngDialog.h gui/
 
 GUI_SOURCE_FILES = gui/mainFrame.cpp gui/mathglPane.cpp gui/cropPanel.cpp gui/glPane.cpp  $(DIALOG_SOURCE_FILES)
 GUI_HEADER_FILES = gui/mainFrame.h gui/mathglPane.h gui/cropPanel.h gui/art.h gui/glPane.h $(DIALOG_HEADER_FILES)
-BASE_SOURCE_FILES = 3Depict.cpp testing/testing.cpp  wx/wxcomponents.cpp wx/wxcommon.cpp winconsole.cpp 
-BASE_HEADER_FILES = testing/testing.h winconsole.h   wx/wxcomponents.h  wx/wxcommon.h 
+BASE_SOURCE_FILES = 3Depict.cpp testing/testing.cpp wx/wxcommon.cpp  wx/wxcomponents.cpp winconsole.cpp 
+BASE_HEADER_FILES = testing/testing.h  wx/wxcommon.h  wx/wxcomponents.h   winconsole.h
+TEST_SOURCE_FILES = testing/mglTesting.cpp
+TEST_HEADER_FILES = testing/mglTesting.h
 #-----------
 SOURCE_FILES = $(BASE_SOURCE_FILES) $(BASE_HEADER_FILES) $(GUI_SOURCE_FILES) $(GUI_HEADER_FILES) \
 	       $(FILTER_FILES) $(FILTER_HEADER_FILES) \
 	       ${BACKEND_SOURCE_FILES} ${BACKEND_HEADER_FILES} $(OPENGL_SOURCE_FILES) $(OPENGL_HEADER_FILES) \
-	       $(COMMON_SOURCE_FILES) $(COMMON_HEADER_FILES)
+	       $(COMMON_SOURCE_FILES) $(COMMON_HEADER_FILES) $(TEST_SOURCE_FILES) $(TEST_HEADER_FILES)
 
 3Depict_SOURCES = $(SOURCE_FILES) $(am__append_1)
 
 #Tarball options
-EXTRA_DIST = gui/glade-skeleton myAppIcon.ico testing/filtertesting.cpp
+EXTRA_DIST = gui/glade-skeleton myAppIcon.ico testing/filtertesting.cpp 
 all: all-am
 
 .SUFFIXES:
@@ -651,10 +657,10 @@ wx/$(am__dirstamp):
 wx/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) wx/$(DEPDIR)
 	@: > wx/$(DEPDIR)/$(am__dirstamp)
-wx/3Depict-wxcomponents.$(OBJEXT): wx/$(am__dirstamp) \
-	wx/$(DEPDIR)/$(am__dirstamp)
 wx/3Depict-wxcommon.$(OBJEXT): wx/$(am__dirstamp) \
 	wx/$(DEPDIR)/$(am__dirstamp)
+wx/3Depict-wxcomponents.$(OBJEXT): wx/$(am__dirstamp) \
+	wx/$(DEPDIR)/$(am__dirstamp)
 gui/$(am__dirstamp):
 	@$(MKDIR_P) gui
 	@: > gui/$(am__dirstamp)
@@ -872,6 +878,10 @@ common/3Depict-mathfuncs.$(OBJEXT): common/$(am__dirstamp) \
 	common/$(DEPDIR)/$(am__dirstamp)
 common/3Depict-basics.$(OBJEXT): common/$(am__dirstamp) \
 	common/$(DEPDIR)/$(am__dirstamp)
+common/3Depict-assertion.$(OBJEXT): common/$(am__dirstamp) \
+	common/$(DEPDIR)/$(am__dirstamp)
+testing/3Depict-mglTesting.$(OBJEXT): testing/$(am__dirstamp) \
+	testing/$(DEPDIR)/$(am__dirstamp)
 
 3Depict$(EXEEXT): $(3Depict_OBJECTS) $(3Depict_DEPENDENCIES) $(EXTRA_3Depict_DEPENDENCIES) 
 	@rm -f 3Depict$(EXEEXT)
@@ -930,6 +940,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/3Depict-assertion.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/3Depict-basics.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/3Depict-colourmap.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/3Depict-mathfuncs.Po at am__quote@
@@ -961,6 +972,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at testing/$(DEPDIR)/3Depict-mglTesting.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at testing/$(DEPDIR)/3Depict-testing.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at wx/$(DEPDIR)/3Depict-wxcommon.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at wx/$(DEPDIR)/3Depict-wxcomponents.Po at am__quote@
@@ -1039,20 +1051,6 @@ testing/3Depict-testing.obj: testing/testing.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o testing/3Depict-testing.obj `if test -f 'testing/testing.cpp'; then $(CYGPATH_W) 'testing/testing.cpp'; else $(CYGPATH_W) '$(srcdir)/testing/testing.cpp'; fi`
 
-wx/3Depict-wxcomponents.o: wx/wxcomponents.cpp
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcomponents.o -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcomponents.Tpo -c -o wx/3Depict-wxcomponents.o `test -f 'wx/wxcomponents.cpp' || echo '$(srcdir)/'`wx/wxcomponents.cpp
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcomponents.Tpo wx/$(DEPDIR)/3Depict-wxcomponents.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wx/wxcomponents.cpp' object='wx/3Depict-wxcomponents.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcomponents.o `test -f 'wx/wxcomponents.cpp' || echo '$(srcdir)/'`wx/wxcomponents.cpp
-
-wx/3Depict-wxcomponents.obj: wx/wxcomponents.cpp
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcomponents.obj -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcomponents.Tpo -c -o wx/3Depict-wxcomponents.obj `if test -f 'wx/wxcomponents.cpp'; then $(CYGPATH_W) 'wx/wxcomponents.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcomponents.cpp'; fi`
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcomponents.Tpo wx/$(DEPDIR)/3Depict-wxcomponents.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wx/wxcomponents.cpp' object='wx/3Depict-wxcomponents.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcomponents.obj `if test -f 'wx/wxcomponents.cpp'; then $(CYGPATH_W) 'wx/wxcomponents.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcomponents.cpp'; fi`
-
 wx/3Depict-wxcommon.o: wx/wxcommon.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcommon.o -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcommon.Tpo -c -o wx/3Depict-wxcommon.o `test -f 'wx/wxcommon.cpp' || echo '$(srcdir)/'`wx/wxcommon.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcommon.Tpo wx/$(DEPDIR)/3Depict-wxcommon.Po
@@ -1067,6 +1065,20 @@ wx/3Depict-wxcommon.obj: wx/wxcommon.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcommon.obj `if test -f 'wx/wxcommon.cpp'; then $(CYGPATH_W) 'wx/wxcommon.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcommon.cpp'; fi`
 
+wx/3Depict-wxcomponents.o: wx/wxcomponents.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcomponents.o -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcomponents.Tpo -c -o wx/3Depict-wxcomponents.o `test -f 'wx/wxcomponents.cpp' || echo '$(srcdir)/'`wx/wxcomponents.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcomponents.Tpo wx/$(DEPDIR)/3Depict-wxcomponents.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wx/wxcomponents.cpp' object='wx/3Depict-wxcomponents.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcomponents.o `test -f 'wx/wxcomponents.cpp' || echo '$(srcdir)/'`wx/wxcomponents.cpp
+
+wx/3Depict-wxcomponents.obj: wx/wxcomponents.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcomponents.obj -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcomponents.Tpo -c -o wx/3Depict-wxcomponents.obj `if test -f 'wx/wxcomponents.cpp'; then $(CYGPATH_W) 'wx/wxcomponents.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcomponents.cpp'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcomponents.Tpo wx/$(DEPDIR)/3Depict-wxcomponents.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wx/wxcomponents.cpp' object='wx/3Depict-wxcomponents.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcomponents.obj `if test -f 'wx/wxcomponents.cpp'; then $(CYGPATH_W) 'wx/wxcomponents.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcomponents.cpp'; fi`
+
 3Depict-winconsole.o: winconsole.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT 3Depict-winconsole.o -MD -MP -MF $(DEPDIR)/3Depict-winconsole.Tpo -c -o 3Depict-winconsole.o `test -f 'winconsole.cpp' || echo '$(srcdir)/'`winconsole.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/3Depict-winconsole.Tpo $(DEPDIR)/3Depict-winconsole.Po
@@ -1977,6 +1989,34 @@ common/3Depict-basics.obj: common/basics.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-basics.obj `if test -f 'common/basics.cpp'; then $(CYGPATH_W) 'common/basics.cpp'; else $(CYGPATH_W) '$(srcdir)/common/basics.cpp'; fi`
 
+common/3Depict-assertion.o: common/assertion.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-assertion.o -MD -MP -MF common/$(DEPDIR)/3Depict-assertion.Tpo -c -o common/3Depict-assertion.o `test -f 'common/assertion.cpp' || echo '$(srcdir)/'`common/assertion.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-assertion.Tpo common/$(DEPDIR)/3Depict-assertion.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='common/assertion.cpp' object='common/3Depict-assertion.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-assertion.o `test -f 'common/assertion.cpp' || echo '$(srcdir)/'`common/assertion.cpp
+
+common/3Depict-assertion.obj: common/assertion.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-assertion.obj -MD -MP -MF common/$(DEPDIR)/3Depict-assertion.Tpo -c -o common/3Depict-assertion.obj `if test -f 'common/assertion.cpp'; then $(CYGPATH_W) 'common/assertion.cpp'; else $(CYGPATH_W) '$(srcdir)/common/assertion.cpp'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-assertion.Tpo common/$(DEPDIR)/3Depict-assertion.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='common/assertion.cpp' object='common/3Depict-assertion.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-assertion.obj `if test -f 'common/assertion.cpp'; then $(CYGPATH_W) 'common/assertion.cpp'; else $(CYGPATH_W) '$(srcdir)/common/assertion.cpp'; fi`
+
+testing/3Depict-mglTesting.o: testing/mglTesting.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT testing/3Depict-mglTesting.o -MD -MP -MF testing/$(DEPDIR)/3Depict-mglTesting.Tpo -c -o testing/3Depict-mglTesting.o `test -f 'testing/mglTesting.cpp' || echo '$(srcdir)/'`testing/mglTesting.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) testing/$(DEPDIR)/3Depict-mglTesting.Tpo testing/$(DEPDIR)/3Depict-mglTesting.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='testing/mglTesting.cpp' object='testing/3Depict-mglTesting.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o testing/3Depict-mglTesting.o `test -f 'testing/mglTesting.cpp' || echo '$(srcdir)/'`testing/mglTesting.cpp
+
+testing/3Depict-mglTesting.obj: testing/mglTesting.cpp
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT testing/3Depict-mglTesting.obj -MD -MP -MF testing/$(DEPDIR)/3Depict-mglTesting.Tpo -c -o testing/3Depict-mglTesting.obj `if test -f 'testing/mglTesting.cpp'; then $(CYGPATH_W) 'testing/mglTesting.cpp'; else $(CYGPATH_W) '$(srcdir)/testing/mglTesting.cpp'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) testing/$(DEPDIR)/3Depict-mglTesting.Tpo testing/$(DEPDIR)/3Depict-mglTesting.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='testing/mglTesting.cpp' object='testing/3Depict-mglTesting.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o testing/3Depict-mglTesting.obj `if test -f 'testing/mglTesting.cpp'; then $(CYGPATH_W) 'testing/mglTesting.cpp'; else $(CYGPATH_W) '$(srcdir)/testing/mglTesting.cpp'; fi`
+
 ID: $(am__tagged_files)
 	$(am__define_uniq_tagged_files); mkid -fID $$unique
 tags: tags-am
diff --git a/src/backend/APT/APTFileIO.cpp b/src/backend/APT/APTFileIO.cpp
index 9739b96..d37984e 100644
--- a/src/backend/APT/APTFileIO.cpp
+++ b/src/backend/APT/APTFileIO.cpp
@@ -35,6 +35,7 @@ using std::make_pair;
 
 const size_t PROGRESS_REDUCE=5000;
 
+//---------
 const char *POS_ERR_STRINGS[] = { "",
        				NTRANS("Memory allocation failure on POS load"),
 				NTRANS("Error opening pos file"),
@@ -44,7 +45,10 @@ const char *POS_ERR_STRINGS[] = { "",
 				NTRANS("Error - Found NaN in pos file"),
 				NTRANS("Pos load aborted by interrupt.")
 };
+//---------
 
+//Text file error codes and strings
+//---------
 enum
 {
 	TEXT_ERR_OPEN=1,
@@ -66,7 +70,30 @@ const char *ION_TEXT_ERR_STRINGS[] = { "",
 					NTRANS("Incorrect number of fields in file"),
 					NTRANS("Unable to allocate memory to store data"),
 					};
+//---------
 
+//ATO formatted files error codes and asscoiated strings
+//---------
+enum
+{
+	LAWATAP_ATO_OPEN_FAIL=1,
+	LAWATAP_ATO_EMPTY_FAIL,
+	LAWATAP_ATO_SIZE_ERR,
+	LAWATAP_ATO_VERSIONCHECK_ERR,
+	LAWATAP_ATO_MEM_ERR,
+	LAWATAP_ATO_BAD_ENDIAN_DETECT,
+	LAWATAP_ATO_ENUM_END
+};
+
+const char *LAWATAP_ATO_ERR_STRINGS[] = { "",
+				NTRANS("Error opening file"),
+				NTRANS("File is empty"),
+				NTRANS("Filesize does not match expected format"),
+				NTRANS("File version number not <4, as expected"),
+				NTRANS("Unable to allocate memory to store data"),
+				NTRANS("Unable to detect endian-ness in file")
+				};
+//---------
 
 unsigned int LimitLoadPosFile(unsigned int inputnumcols, unsigned int outputnumcols, unsigned int index[], vector<IonHit> &posIons,const char *posFile, size_t limitCount,
 	       	unsigned int &progress, bool (*callback)(bool),bool strongSampling)
@@ -183,7 +210,11 @@ unsigned int LimitLoadPosFile(unsigned int inputnumcols, unsigned int outputnumc
 			memcpy(&(buffer2[i * sizeof(float)]), &(buffer[index[i] * sizeof(float)]), sizeof(float));
 		
 		if(!CFile.good())
+		{
+			delete[] buffer;
+			delete[] buffer2;
 			return POS_READ_FAIL;
+		}
 		posIons[ui].setHit((float*)buffer2);
 		//Data bytes stored in pos files are big
 		//endian. flip as required
@@ -207,6 +238,7 @@ unsigned int LimitLoadPosFile(unsigned int inputnumcols, unsigned int outputnumc
 			if(!(*callback)(false))
 			{
 				delete[] buffer;
+				delete[] buffer2;
 				posIons.clear();
 				return POS_ABORT_FAIL;
 				
@@ -372,12 +404,12 @@ unsigned int GenericLoadFloatFile(unsigned int inputnumcols, unsigned int output
 
 
 //TODO: Add progress
-unsigned int limitLoadTextFile(unsigned int numColsTotal, unsigned int selectedCols[], 
-			vector<IonHit> &posIons,const char *textFile, const char *delim, const size_t limitCount,
+unsigned int limitLoadTextFile(unsigned int maxCols, 
+			vector<vector<float> > &data,const char *textFile, const char *delim, const size_t limitCount,
 				unsigned int &progress, bool (*callback)(bool),bool strongRandom)
 {
 
-	ASSERT(numColsTotal);
+	ASSERT(maxCols);
 	ASSERT(textFile);
 
 	vector<size_t> newLinePositions;
@@ -388,17 +420,6 @@ unsigned int limitLoadTextFile(unsigned int numColsTotal, unsigned int selectedC
 	char *buffer;
 	const int BUFFER_SIZE=16384; //This is totally a guess. I don't know what is best.
 
-
-	//sort the selected columns into increasing order
-	vector<int> sortedCols;
-	for(unsigned int ui=0;ui<numColsTotal;ui++)
-		sortedCols.push_back(selectedCols[ui]);
-
-	std::sort(sortedCols.begin(),sortedCols.end());
-	//the last entry in the sorted list tells us how many
-	// entries we need in each line at a minimum
-	unsigned int maxCol=sortedCols[sortedCols.size()-1];
-
 	ifstream CFile(textFile,std::ios::binary);
 
 	if(!CFile)
@@ -434,32 +455,13 @@ unsigned int limitLoadTextFile(unsigned int numColsTotal, unsigned int selectedC
 		splitStrsRef(s.c_str(),delim,subStrs);	
 		stripZeroEntries(subStrs);
 
-		//Not enough entries in this line
-		//to be interpretable
-		if(subStrs.size() <maxCol)
-			continue;
-
-		bool enoughSubStrs;
-		enoughSubStrs=true;
-		for(unsigned int ui=0;ui<numColsTotal; ui++)
-		{
-			if(selectedCols[ui] >=subStrs.size())
-			{
-				enoughSubStrs=false;
-				break;	
-			}
-		}
-
-		if(!enoughSubStrs)
-			continue;
-
-		//Unable to stream
+		//Skip unstreamable lines
 		bool unStreamable;
 		unStreamable=false;
-		for(unsigned int ui=0; ui<numColsTotal; ui++)
+		for(unsigned int ui=0; ui<subStrs.size(); ui++)
 		{
 			float f;
-			if(stream_cast(f,subStrs[selectedCols[ui]]))
+			if(stream_cast(f,subStrs[ui]))
 			{
 				unStreamable=true;
 				break;
@@ -546,30 +548,12 @@ unsigned int limitLoadTextFile(unsigned int numColsTotal, unsigned int selectedC
 	{
 		delete[] buffer;
 
-		vector<vector<float> > data;
 		vector<string> header;
 	
 		//Just use the non-sampling method to load.	
 		if(loadTextData(textFile,data,header,delim))
 			return TEXT_ERR_FORMAT;
 
-		if(data.size() !=4)
-			return TEXT_ERR_NUM_FIELDS;
-
-		posIons.resize(data[0].size());
-		for(size_t ui=0;ui<data[0].size();ui++)
-		{
-
-			ASSERT(numColsTotal==4);
-			//This is output specific
-			//and assumes that we have exactly 4 input cols
-			//to match ot our output vector of pos ions
-			posIons[ui].setPos(Point3D(data[selectedCols[0]][ui],
-						data[selectedCols[1]][ui],
-						data[selectedCols[2]][ui]));
-			posIons[ui].setMassToCharge(data[selectedCols[3]][ui]);
-		}
-
 		return 0;	
 	}
 
@@ -577,7 +561,7 @@ unsigned int limitLoadTextFile(unsigned int numColsTotal, unsigned int selectedC
 	std::vector<size_t> dataToLoad;
 	try
 	{
-		posIons.resize(limitCount);
+		data.resize(limitCount);
 
 		RandNumGen rng;
 		rng.initTimer();
@@ -637,33 +621,384 @@ unsigned int limitLoadTextFile(unsigned int numColsTotal, unsigned int selectedC
 		//split around whatever delimiter we can find
 		splitStrsRef(s.c_str(),delim,subStrs);	
 
-		if(subStrs.size() < numColsTotal)
+		size_t maxStrs;
+		maxStrs=std::min(subStrs.size(),(size_t)maxCols);
+		if(data.size() < maxStrs)
+			data.resize(maxStrs);
+		
+		for(size_t uj=0;uj<maxStrs;uj++)
 		{
-			//FIXME: Allow skipping of bad lines
-			delete[] buffer;
-			return TEXT_ERR_NUM_FIELDS;
+			float tmp;
+			if(stream_cast(tmp,subStrs[uj]))
+			{
+				//FIXME: Allow skipping bad lines
+				//Can't parse line.. Abort.
+				delete[] buffer;
+				return TEXT_ERR_FORMAT;
+			}
+
+			data[uj].push_back(tmp);
 		}
+	}
+
+	delete[] buffer;
+	return 0;
+
+}
+
+
+
+unsigned int LoadATOFile(const char *fileName, vector<IonHit> &ions, unsigned int &progress, bool (*callback)(bool),unsigned int forceEndian)
+{
+
+
+	//open pos file
+	std::ifstream CFile(fileName,std::ios::binary);
+
+	if(!CFile)
+		return LAWATAP_ATO_OPEN_FAIL;
+
+	//Get the filesize
+	CFile.seekg(0,std::ios::end);
+	size_t fileSize=CFile.tellg();
+
+
+	//There are differences in the format, unfortunately.
+	// Gault et al, Atom Probe Microscopy says 
+	// - there are 14 entries of 4 bytes, 
+	//   totalling "44" bytes - which cannot be correct. They however,
+	//   say that the XYZ is added later.
+	// - Header is 2 32 binary
+	// - File is serialised as little-endian
+	// - Various incompatible versions exist. Unclear how to distinguish
+
+	// Larson et al say that 
+	// - there are 14 fields
+	// - Header byte 0x05 (0-indexed) is version number, and only version 3 is outlined
+	// - Pulsenumber can be subject to FP aliasing (bad storage, occurs for values > ~16.7M ), 
+	//	- Aliasing errors must be handled, if reading this field
+	// - File is in big-endian
+
+
+	//In summary, we assume there are 14 entries, 4 bytes each, after an 8 byte header.
+	// we assume that the endian-ness must be auto-detected somehow, as no sources
+	// agree on file endian-ness. If we cannot detect it, we assume little endian
+
+	//Header (8 bytes), record 14 entries, 4 bytes each
+
+	const size_t LAWATAP_ATO_HEADER_SIZE=8;
+	const size_t LAWATAP_ATO_RECORD_SIZE = 14*4;
+	const size_t LAWATAP_ATO_MIN_FILESIZE = 8 + LAWATAP_ATO_RECORD_SIZE;
+
+	if(fileSize < LAWATAP_ATO_MIN_FILESIZE)
+		return LAWATAP_ATO_EMPTY_FAIL;
+	
+	
+	//calculate the number of points stored in the POS file
+	IonHit hit;
+	size_t pointCount=0;
+	if((fileSize - LAWATAP_ATO_HEADER_SIZE)  % (LAWATAP_ATO_RECORD_SIZE))
+		return LAWATAP_ATO_SIZE_ERR;	
+
+
+	//Check that the version number, stored at offxet 0x05 (1-indexed), is 3.
+	CFile.seekg(4);
+	unsigned int versionByte;
+	CFile.read((char*)&versionByte,sizeof(unsigned int));
+
+	//Assume that we can have a new version that doesn't affect the readout
+	// assume that earlier versions are compatible. This means, for a random byte
+	// in a random length (modulo) file, 
+	// we have a 1-4/255 chance of rejection from this test, and a 1/56 chance of
+	// rejection from filesize, giving a ~0.02% chance of incorrect acceptance.
+	if(!versionByte || versionByte > 4)
+		return LAWATAP_ATO_VERSIONCHECK_ERR;
+
+
+	pointCount = (fileSize-LAWATAP_ATO_HEADER_SIZE)/LAWATAP_ATO_RECORD_SIZE;
+	
+	try
+	{
+		ions.resize(pointCount);
+	}
+	catch(std::bad_alloc)
+	{
+		return LAWATAP_ATO_MEM_ERR;
+	}
+
+
+	//Heuristic fo detect endianness.
+	// - Randomly sample 100 pts from file, and check to see if, when interpreted either wa
+	// there are any NaN
+	//   
+
+
+	bool endianFlip;
+	
+	if(forceEndian)
+	{
+		ASSERT(forceEndian < 3);
+#ifdef __LITTLE_ENDIAN__
+		endianFlip=(forceEndian == 2);
+#elif __BIG_ENDIAN
+		endianFlip=(forceEndian == 1);
+#endif
+	}
+	else
+	{
+		//Auto-detect endianness from file content
+		size_t numToCheck=std::min(pointCount,(size_t)100);
+	
+		//Indicies of points to check
+		vector<unsigned int> randomNumbers;
+		unsigned int dummy;
+		RandNumGen rng;
+		rng.initTimer();
+		randomDigitSelection(randomNumbers,pointCount,rng, 
+					numToCheck,dummy,dummyCallback);
 
-		float f[4];
+		//Make the travese in ascending order
+		std::sort(randomNumbers.begin(),randomNumbers.end());
 
-		for(size_t uj=0;uj<sortedCols.size();uj++)
+		//One for no endian-flip, one for flip
+		bool badFloat[2]={ false,false };
+		//Track the presence of unreasonably large numbers
+		bool veryLargeNumber[2] = { false,false };
+	
+		//Skip through several records, looking for bad float data,
+		float *buffer = new float[LAWATAP_ATO_RECORD_SIZE/4];
+		for(size_t ui=0;ui<numToCheck;ui++)
 		{
+			size_t offset;
+			offset=randomNumbers[ui];
+			
+			CFile.seekg(LAWATAP_ATO_HEADER_SIZE + LAWATAP_ATO_RECORD_SIZE*offset);
+			CFile.read((char*)buffer,LAWATAP_ATO_RECORD_SIZE);
+
+			const unsigned int BYTES_TO_CHECK[] = { 0,1,2,3,5,6,8,9,10 };
+			const size_t CHECKBYTES = 9;
 
-			if(stream_cast(f[uj],subStrs[sortedCols[uj]]))
+			//Check each field for inf/nan presence
+			for(size_t uj=0;uj<CHECKBYTES;uj++)
 			{
-				//FIXME: Allow skipping bad lines
-				//Can't parse line.. Abort.
-				delete[] buffer;
-				return TEXT_ERR_FORMAT;
+				if(std::isnan(buffer[BYTES_TO_CHECK[uj]]) ||
+					std::isinf(buffer[BYTES_TO_CHECK[uj]]))
+					badFloat[0]=true;
+
+				//Flip the endian-ness
+				floatSwapBytes(buffer+BYTES_TO_CHECK[uj]);
+
+				if(std::isnan(buffer[BYTES_TO_CHECK[uj]]) ||
+					std::isinf(buffer[BYTES_TO_CHECK[uj]]))
+					badFloat[1]=true;
+				
+				//Swap it back
+				floatSwapBytes(buffer+BYTES_TO_CHECK[uj]);
+
+
 			}
+		
+			
+			//Check for some very likely values.
+			//Check for large negative masses
+			if( buffer[3] < -1000.0f)
+				veryLargeNumber[0] = true;
+
+			// unlikely to exceed 1000 kV
+			if( fabs(buffer[6]) > 1000.0f || fabs(buffer[10]) > 1000.0f)
+				veryLargeNumber[0] = true;
+
+			//Swap and try again
+			floatSwapBytes(buffer+3);
+			floatSwapBytes(buffer+6);
+			floatSwapBytes(buffer+10);
+			if( buffer[3] < -1000.0f) 
+				veryLargeNumber[1] = true;
+
+			if( fabs(buffer[6]) > 1000.0f || fabs(buffer[10]) > 1000.0f)
+				veryLargeNumber[1] = true;
+		}
+
+		delete[] buffer;
+
+
+		//Now summarise the results
+
+		//If we have a disagreement about bad-float-ness,
+		// or stupid-number ness.  then choose the good one.
+		// Otherwise abandon detection
+		if(badFloat[0] != badFloat[1])
+		{
+			endianFlip=(badFloat[0]);
+		}
+		else if(veryLargeNumber[0] != veryLargeNumber[1])
+		{
+			endianFlip=veryLargeNumber[0];
 		}
+		else
+		{
+			//Assume little endian
+#ifdef __LITTLE_ENDIAN__
+			endianFlip= false;
+#else
+			endianFlip=true;
+#endif
+		}
+	}
 
-		ASSERT(ui<posIons.size());
-		posIons[ui].setHit(f);
+	//File records consist of 14 fields, some of which may not be initialised.
+	// each being 4-byte IEEE little-endian float
+	// It is unknown how to detect initalisated state.
+	// Field 	Data	
+	// 0-3		x,y,z,m/c in Angstrom (x,yz) or Da (m/c)
+	// 4		clusterID, if set
+	//			- Ignore this field, as this information is redundant
+	// 5 		Approximate Pulse #, due to Float. Pt. limitation 
+	// 6		Standing Voltage (kV)
+	// 7		TOF (us) (maybe corrected? maybe not?)
+	// 8-9		Detector position (cm)
+	// 10		Pulse voltage (kV)
+	// 11		"Virtual voltage" for reconstruction.
+	//			- Ignore this field, as this information is redundant
+	// 12,13	Fourier intensity
+	//			- Ignore theese fields, as this information is redundant
+	//Attempt to detect
+	CFile.seekg(8);
+
+	float *buffer = new float[LAWATAP_ATO_RECORD_SIZE/4];
+	size_t curPos=0;	
+
+	if(endianFlip)
+	{
+		//Read and swap
+		while((size_t)CFile.tellg() < fileSize)
+		{
+			CFile.read((char*)buffer,LAWATAP_ATO_RECORD_SIZE);
+
+			for(size_t ui=0;ui<LAWATAP_ATO_RECORD_SIZE;ui++)
+				floatSwapBytes(buffer+ui);
+
+			ions[curPos] = IonHit(buffer);
+			curPos++;
+			
+		}
+	}
+	else
+	{
+		//read wthout swapping
+		while((size_t)CFile.tellg() < fileSize)
+		{	
+			CFile.read((char*)buffer,LAWATAP_ATO_RECORD_SIZE);
+			ions[curPos] = IonHit(buffer);
+			curPos++;
+		}
 	}
 
 	delete[] buffer;
+
+
 	return 0;
+}
+
+
+
+#ifdef DEBUG
+bool testATOFormat();
+
+
+bool testFileIO()
+{
+	if(!testATOFormat())
+		return false;
+
+	return true;
+}
+
+
+bool writeATO(const std::string &filename,bool flip, unsigned int nPoints)
+{
+	std::ofstream outF(filename.c_str(),std::ios::binary);
+
+	if(!outF)
+		return false;
+
+
+	IonHit h;
+	h.setMassToCharge(100);
+	h.setPos(Point3D(1,1,0));
+
+	const unsigned int LAWATAP_ATO_RECORD_COUNT=14;
+
+	float *buffer = new float[LAWATAP_ATO_RECORD_COUNT];
+	//zero buffer
+	memset(buffer,0,LAWATAP_ATO_RECORD_COUNT*sizeof(float));
+
+	//unpack ion data into buffer, in big-endian form
+	h.makePosData(buffer);
+
+	if(!flip)
+	{
+		//Fkip the endinanness
+		for(size_t ui=0;ui<4;ui++)
+			floatSwapBytes(buffer+ui);
+	}
+	unsigned int intData=0;
+	
+	outF.write((char*)&intData,4);
+
+	intData=3;
+	//Write out verion num  as "3"
+	outF.write((char*)&intData,4);
+
+	for(size_t ui=0;ui<nPoints;ui++)
+	{
+
+		outF.write((char*)buffer,LAWATAP_ATO_RECORD_COUNT*sizeof(float));
+	}
+	delete[] buffer;
+
+	return true;
+}
+
+bool testATOFormat()
+{
+	std::string filename;
+	genRandomFilename(filename);
+
+	if(!writeATO(filename,0,100))
+	{
+		//Assume we couldn't write due to some non-terminal problem
+		// like missing write permissions
+		WARN(false,"Unable to create file for testing ATO format. skipping");
+		return true;
+	}
+	unsigned int dummyProgress;
+
+
+	vector<IonHit> ions;
+	//Load using auto-detection of endinanness
+	TEST(!LoadATOFile(filename.c_str(),ions,dummyProgress,dummyCallback),"ATO load test  (auto endianness)");
+
+	TEST(ions.size() == 100,"ion size check");
+
+	TEST((ions[0].getPos().sqrDist(Point3D(1,1,0)) < sqrt(std::numeric_limits<float>::epsilon())),"Checking read/write OK");
+	//Load using auto-detection of endinanness
+
+	//Load, forcing assuming cont4ents are little endianness as requried
+	TEST(!LoadATOFile(filename.c_str(),ions,dummyProgress,dummyCallback,1),"ATO load test (forced endianness)");
+	TEST(ions.size() == 100,"ion size check");
+	TEST((ions[0].getPos().sqrDist(Point3D(1,1,0)) < sqrt(std::numeric_limits<float>::epsilon())),"checking read/write OK");
+
+
+	
+
+	rmFile(filename.c_str());
+
+
+
+
+	return true;
 
 }
 
+#endif
diff --git a/src/backend/APT/APTFileIO.h b/src/backend/APT/APTFileIO.h
index ffa443a..b2b00c2 100644
--- a/src/backend/APT/APTFileIO.h
+++ b/src/backend/APT/APTFileIO.h
@@ -37,6 +37,8 @@ extern const char *POS_ERR_STRINGS[];
 
 extern const char *ION_TEXT_ERR_STRINGS[];
 
+extern const char *LAWATAP_ATO_ERR_STRINGS[];
+
 //!Errors that can be encountered when openning pos files
 enum posErrors
 {
@@ -70,9 +72,20 @@ unsigned int LimitLoadPosFile(unsigned int inputnumcols, unsigned int outputnumc
 
 
 
-unsigned int limitLoadTextFile(unsigned int numColsTotal, unsigned int selectedCols[], 
-			vector<IonHit> &posIons,const char *posFile, const char *deliminator, const size_t limitCount,
+unsigned int limitLoadTextFile(unsigned int numColsTotal, 
+			vector<vector<float> > &data,const char *posFile, const char *deliminator, const size_t limitCount,
 					       	unsigned int &progress, bool (*callback)(bool),bool strongRandom);
 
 
+//Load a CAMECA LAWATAP "ATO" formatted file.
+//	- This is a totally different format to the "FlexTAP" ato format
+//Supported versions are "version 3"
+//	Force endian : 0 - do not force, autodetect, 1 - force little, 2- force big
+unsigned int LoadATOFile(const char *fileName, vector<IonHit> &ions, unsigned int &progressm, bool (*callback)(bool), unsigned int forceEndian=0);
+
+
+#ifdef DEBUG
+bool testFileIO();
+#endif
+
 #endif
diff --git a/src/backend/APT/APTRanges.cpp b/src/backend/APT/APTRanges.cpp
index d744788..9f45a8d 100644
--- a/src/backend/APT/APTRanges.cpp
+++ b/src/backend/APT/APTRanges.cpp
@@ -24,9 +24,9 @@
 #include "../../common/stringFuncs.h"
 #include "../../common/translation.h"
 
+#include <set>
 #include <map>
 #include <fstream>
-#include <clocale>
 #include <numeric>
 #include <cstring>
 
@@ -35,6 +35,7 @@ using std::vector;
 using std::pair;
 using std::make_pair;
 using std::map;
+using std::set;
 using std::accumulate;
 
 //Arbitrary maximum range file line size
@@ -69,6 +70,30 @@ const char *RANGE_EXTS[] = { "rng",
 			  "rrng",
 				""};
 
+//List of symbols in the periodic table
+const char *elementList[] = { 
+"H", "He", "Li", "Be",  "B", "C", "N",  "O",  "F", "Ne",
+
+"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", 
+
+"K", "Ca", "Sc","Ti",  "V", "Cr",  "Mn", "Fe",  "Co", "Ni",  
+   "Cu",  "Zn", "Ga", "Ge", "As", "Se",  "Br", "Kr",
+
+"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd",
+   "Ag",  "Cd", "In", "Sn", "Sb", "Te",  "I", "Xe",
+
+"Cs",  "Ba", "La",  "Ce", "Pr",  "Nd", "Pm", "Sm",  "Eu", "Gd",
+    "Tb",  "Dy",  "Ho", "Er",  "Tm", "Yb", "Lu",  "Hf", "Ta",
+    "W",  "Re", "Os",  "Ir", "Pt", "Au", "Hg",  "Tl", "Pb",
+     "Bi",  "Po", "At", "Rn",
+
+"Fr", "Ra",  "Ac", "Th",  "Pa", "U",  "Np", "Pu",  "Am", "Cm",
+    "Bk", "Cf",  "Es", "Fm",  "Md",  "No",  "Lr",  "Rf",  "Db",
+    "Sg",  "Bh",  "Hs",  "Mt",  "Ds",  "Rg",  "Cn",  "Uut",  "Fl",
+     "Uup",  "Lv",  "Uus", "Uuo", ""
+};	
+
+
 bool RangeFile::decomposeIonNames(const std::string &name,
 		std::vector<pair<string,size_t> > &fragments)
 {
@@ -417,6 +442,19 @@ unsigned int RangeFile::write(std::ostream &f, size_t format) const
 		}
 		case RANGE_FORMAT_RRNG:
 		{
+	
+			set<string> elementSet;
+
+			{
+			size_t offset=0;
+			while(strlen(elementList[offset]))
+			{
+				elementSet.insert(elementList[offset]);
+				offset++;
+			}
+
+			}
+
 			f << "[Ions]" << endl;
 			f << "Number=" << ionNames.size() << endl;
 			
@@ -427,6 +465,9 @@ unsigned int RangeFile::write(std::ostream &f, size_t format) const
 		
 			f << "[Ranges] " << endl;
 			f << "Number=" << ranges.size() << endl;
+
+
+
 			for(size_t ui=0;ui<ranges.size();ui++)
 			{
 				std::string colString;
@@ -438,10 +479,25 @@ unsigned int RangeFile::write(std::ostream &f, size_t format) const
 				colString=colString.substr(1);
 				ASSERT(colString.size() == 6);
 
-				f << "Range" << ui+1 <<"=" 
-				<< ranges[ui].first << " " << ranges[ui].second <<
-				" " << ionNames[ionIDs[ui]].first<< ":1" << 
-				" Color:" << colString << endl;
+				//FIXME: This is incomplete. we need to break the species apart into its 
+				// compponents, then decide to use the Element:count notation, or the Name:species notation
+				string strName;
+				strName=ionNames[ionIDs[ui]].first;
+				if(elementSet.find(strName) != elementSet.end())
+				{
+					f << "Range" << ui+1 <<"=" 
+					<< ranges[ui].first << " " << ranges[ui].second <<
+					" " << strName << ":1" << 
+					" Color:" << colString << endl;
+				}
+				else
+				{
+					f << "Range" << ui+1 <<"=" 
+					<< ranges[ui].first << " " << ranges[ui].second <<
+					" " << "Name:" << strName << ":1" << 
+					" Color:" << colString << endl;
+
+				}
 			}
 
 			break;
@@ -484,15 +540,7 @@ unsigned int RangeFile::open(const char *rangeFilename, unsigned int fileFormat)
 	}
 
 
-	//switch to "C" style decimal notation (English),
-	//as needed
-	char *oldLocale=setlocale(LC_NUMERIC,NULL);
-
-	//setlocale reserves the right to trash the returned pointer
-	//on subsequent calls (it totally makes sense, or something..).
-	oldLocale=strdup(oldLocale);
-	if(strcmp(oldLocale,"C"))
-		setlocale(LC_NUMERIC,"C");	
+	pushLocale("C",LC_NUMERIC);
 		
 	size_t errCode;
 	switch(fileFormat)
@@ -521,31 +569,19 @@ unsigned int RangeFile::open(const char *rangeFilename, unsigned int fileFormat)
 		default:
 			ASSERT(false);
 			fclose(fpRange);
-			if(strcmp(oldLocale,"C"))
-				setlocale(LC_NUMERIC,oldLocale);
-			free(oldLocale);
+			popLocale();
 			return RANGE_ERR_FORMAT;
 	}
 
+	popLocale();
 	fclose(fpRange);
 	if(errCode)
 	{
 		errState=errCode;
-		
-		if(strcmp(oldLocale,"C"))
-			setlocale(LC_NUMERIC,oldLocale);
-		free(oldLocale);
 
 		return errState;
 	}
 
-	//revert back to user's locale, as needed
-	if(strcmp(oldLocale,"C"))
-		setlocale(LC_NUMERIC,oldLocale);
-
-	free(oldLocale);
-	
-	
 	//Run self consistency check on freshly loaded data
 	if(!isSelfConsistent())
 	{
@@ -1259,7 +1295,13 @@ unsigned int RangeFile::readRNGHeader(FILE *fpRange, vector<pair<string,string>
 			//eat another char if we are using 
 			//windows newlines
 			if(peekVal== '\r')
-				fgetc(fpRange);
+			{
+				if(fgetc(fpRange) == EOF)
+				{
+					delete[] inBuffer;
+					return RANGE_ERR_FORMAT_COLOUR;
+				}
+			}
 		}
 		//Read the input for long name (max 255 chars)
 		if(!fscanf(fpRange, " %255s", inBuffer))
@@ -1358,8 +1400,9 @@ unsigned int RangeFile::readRNGFreqTable(FILE *fpRange, char *inBuffer,const uns
 	{
 
 		//grab the line
-		fgets(inBuffer,MAX_LINE_SIZE,fpRange);
-
+		if(fgets(inBuffer,MAX_LINE_SIZE,fpRange) == NULL)
+			return RANGE_ERR_FORMAT_RANGETABLE;
+		
 	
 		vector<string> entries;
 		std::string tmpStr;
@@ -1658,9 +1701,15 @@ unsigned int RangeFile::openENV(FILE *fpRange)
 	}	
 
 	delete[] inBuffer;
-	//Note that the in-file reported number of ions might actually be too bug
+
+	//Must have encountered a name and range sections,
+	// with at least one range
+	if(!haveNumRanges || ! haveNameBlock)
+		return RANGE_ERR_FORMAT;
+
+	//Note that the in-file reported number of ions might actually be too big
 	//as we "fold" some ions together (eg Si_+ and Si_2+ for us are both considered Si)
-	if(ionNames.size() > numIons || ranges.size() > numRanges)
+	if(ionNames.empty() || ionNames.size() > numIons || ranges.size() > numRanges)
 		return RANGE_ERR_FORMAT;
 
 	//There should be more data following the range information.
diff --git a/src/backend/APT/abundanceParser.cpp b/src/backend/APT/abundanceParser.cpp
index 477dfe5..49f5aac 100644
--- a/src/backend/APT/abundanceParser.cpp
+++ b/src/backend/APT/abundanceParser.cpp
@@ -35,7 +35,7 @@ using std::vector;
 using std::pair;
 using std::make_pair;
 using std::map;
-
+using std::string;
 const char *ABUNDANCE_ERROR[] = { "Unable to read abundance data (opening file)",
 				 "Unable to create XML reader.",
 				 "Bad property found in XML file",
diff --git a/src/backend/APT/ionhit.cpp b/src/backend/APT/ionhit.cpp
index 829096e..dcd2e59 100644
--- a/src/backend/APT/ionhit.cpp
+++ b/src/backend/APT/ionhit.cpp
@@ -44,6 +44,13 @@ IonHit::IonHit()
 	//as in DEBUG mode, the point class will catch failure to init
 }
 
+IonHit::IonHit(float *buffer)
+{
+	pos.setValueArr(buffer);
+	massToCharge=buffer[3];
+}
+
+
 IonHit::IonHit(const IonHit &obj2) : massToCharge(obj2.massToCharge), pos(obj2.pos)
 {
 }
diff --git a/src/backend/APT/ionhit.h b/src/backend/APT/ionhit.h
index 1d4c012..e90947a 100644
--- a/src/backend/APT/ionhit.h
+++ b/src/backend/APT/ionhit.h
@@ -33,6 +33,7 @@ class IonHit
 		Point3D pos; //position (xyz) in nm
 	public:
 		IonHit();
+		IonHit(float *);
 		//copy constructor
 		IonHit(const IonHit &);
 		IonHit(const Point3D &p, float massToCharge);
diff --git a/src/backend/animator.cpp b/src/backend/animator.cpp
index cdce457..e69ce06 100644
--- a/src/backend/animator.cpp
+++ b/src/backend/animator.cpp
@@ -18,7 +18,7 @@
 
 #include "animator.h"
 #include "common/stringFuncs.h"
-
+#include "common/basics.h"
 #include <map>
 
 const char *INTERP_NAME[] ={ "Step",
@@ -33,6 +33,11 @@ PropertyAnimator::PropertyAnimator()
 {
 }
 
+PropertyAnimator::PropertyAnimator(const PropertyAnimator &p)
+{
+	keyFrames=p.keyFrames;
+}
+
 void PropertyAnimator::getNthKeyFrame(size_t frameNum,FrameProperties &f) const 
 {
 	ASSERT(frameNum < keyFrames.size());
@@ -253,6 +258,146 @@ std::string PropertyAnimator::getInterpolatedFilterData(size_t filterId,
 
 }
 
+bool PropertyAnimator::writeState(std::ostream &f, unsigned int format, unsigned int depth) const
+{
+	
+	f << tabs(depth) << "<propertyanimator>" << endl;
+	
+	for(size_t ui=0;ui<keyFrames.size();ui++)
+	{
+		keyFrames[ui].writeState(f,format,depth+1);
+	}
+
+	f << tabs(depth) << "</propertyanimator>" << endl;
+
+	return true;
+}
+
+
+//Should be pointing to a propertyanimator node
+bool PropertyAnimator::loadState(xmlNodePtr &nodePtr)
+{
+	keyFrames.clear();	
+	
+	
+	while(!XMLHelpFwdToElem(nodePtr, "frame"))
+	{
+
+		xmlNodePtr childPtr;
+		size_t filterId, propKey;
+	
+		//obtain the frame content XML pointer
+		childPtr=nodePtr->xmlChildrenNode;
+		if(!childPtr)
+			return false;
+
+		//Read the contents of this frame
+		if(XMLHelpFwdToElem(childPtr,"filterid"))
+			return false;
+	
+		if(XMLHelpGetProp(filterId,childPtr,"val"))
+			return false;
+
+
+		if(XMLHelpFwdToElem(childPtr,"propertykey"))
+			return false;
+	
+		if(XMLHelpGetProp(propKey,childPtr,"val"))
+			return false;
+
+		//Read the <framedata> tag and its children
+		{
+		FrameProperties fp(filterId,propKey);
+		
+		if(XMLHelpFwdToElem(childPtr,"framedata"))
+			return false;
+
+
+		xmlNodePtr framePtr;
+		framePtr=childPtr->xmlChildrenNode;
+		
+		if(!framePtr)
+			return false;
+
+		do
+		{
+			size_t offsetVal;
+			string data;
+
+			if(XMLHelpFwdToElem(framePtr,"frame"))
+				return false;
+
+			if(XMLHelpGetProp(offsetVal,framePtr,"offset"))
+				return false;
+			
+			if(XMLHelpGetProp(data,framePtr,"data"))
+				return false;
+			
+			fp.addKeyFrame(offsetVal,data);
+
+		} while(!XMLHelpFwdToElem(childPtr, "frame")) ;
+
+
+		if(XMLHelpFwdToElem(framePtr,"interpdata"))
+			return false;
+
+		size_t mode;
+		if(XMLHelpGetProp(mode,framePtr,"mode"))
+			return false;
+		
+		fp.setInterpMode(mode);
+
+
+		//save the keyframe
+		keyFrames.push_back(fp);
+		}
+
+
+		
+	} 
+
+	return true;
+}
+
+void PropertyAnimator::getIdList(vector<unsigned int> &ids) const
+{
+	set<unsigned int> s;
+	for(size_t ui=0;ui<keyFrames.size();ui++)
+		s.insert(keyFrames[ui].getFilterId());
+
+	ids.resize(s.size());
+	std::copy(s.begin(),s.end(),ids.begin());
+}
+
+void PropertyAnimator::updateMappings(const map<size_t,size_t> &newIdMap)
+{
+	vector<bool> killItems;
+	killItems.resize(keyFrames.size(),false);
+
+	//Remap the keyframes that we can map
+	for(size_t ui=0;ui<keyFrames.size();ui++)
+	{
+		size_t oldId;
+		oldId=keyFrames[ui].getFilterId();
+
+		map<size_t,size_t>::const_iterator it;
+		it=newIdMap.find(oldId);
+
+		//Update the mappings we can,
+		// Delete keyFrames we cannot remap
+		if(it == newIdMap.end()) 
+			killItems[ui]=true;
+		else
+			keyFrames[ui].remapId(it->second);
+
+	}
+
+	//Perform erase
+	vectorMultiErase(keyFrames,killItems);
+}
+
+
+
 FrameProperties::FrameProperties(size_t idFilt,size_t idKey)
 {
 	filterId=idFilt;
@@ -269,6 +414,10 @@ void FrameProperties::setInterpMode(size_t mode)
 	interpData.interpMode=mode;
 }
 
+void FrameProperties::remapId(size_t newId)
+{
+	filterId=newId;
+}
 
 size_t FrameProperties::getMinFrame() const
 {
@@ -294,6 +443,36 @@ void FrameProperties::addKeyFrame(size_t frame,
 	frameData.push_back(make_pair(frame,p.data));	
 }
 
+void FrameProperties::addKeyFrame(size_t frame, 
+		const std::string &s)
+{
+	frameData.push_back(make_pair(frame,s));	
+}
+
+bool FrameProperties::writeState(std::ostream &f, unsigned int format, unsigned int depth) const
+{
+	f << tabs(depth) << "<frame>" << endl;
+	
+	f <<tabs(depth+1) << "<filterid val=\"" << filterId << "\"/>" << endl; 
+	f <<tabs(depth+1) << "<propertykey val=\"" << propertyKey<< "\"/>" << endl; 
+
+	//Dump the frame data vector
+	f << tabs(depth+1) << "<framedata>" << endl;
+	for(unsigned int ui=0;ui<frameData.size();ui++)
+	{
+		f << tabs(depth+2) << "<frame offset=\"" << 
+			frameData[ui].first << "\" data=\"" <<
+				frameData[ui].second << "\"/>" << endl;
+	}
+	f << tabs(depth+2) << "<interpdata mode=\"" << getInterpMode() <<  "\"/>" << endl; 
+	f << tabs(depth+1) << "</framedata>" << endl;
+
+
+	f << tabs(depth) << "</frame>" << endl;
+	return true;
+}
+
+
 std::string InterpData::getInterpolatedData(const vector<pair<size_t,
  					std::string>  > &keyData,size_t frame) const
 {
@@ -478,3 +657,4 @@ float InterpData::interpLinearRamp(size_t startFrame, size_t endFrame, size_t cu
 
 	return frac*(b-a) + a;
 }
+
diff --git a/src/backend/animator.h b/src/backend/animator.h
index db5ba31..47d80d9 100644
--- a/src/backend/animator.h
+++ b/src/backend/animator.h
@@ -19,8 +19,11 @@
 #define ANIMATOR_H
 
 #include "filter.h"
+#include "common/xmlHelper.h"
+
 
 #include <set>
+#include <map>
 
 enum
 {
@@ -80,6 +83,9 @@ class FrameProperties
 	
 		//!Add a key frame to the dataset
 		void addKeyFrame(size_t frame, const FilterProperty &p);
+		//!Add a key frame to the dataset
+		void addKeyFrame(size_t frame, const std::string &p);
+
 		
 		//Set the interpolation mode
 		void setInterpMode(size_t mode) ;
@@ -92,7 +98,18 @@ class FrameProperties
 		
 		std::string getInterpolatedData(size_t frame) const 
 			{ return interpData.getInterpolatedData(frameData,frame);}
+	
+		//!Dump state to output stream, using specified format
+		/* Current supported formats are STATE_FORMAT_XML.
+		 * Depth is indentation depth (for pretty-printing) 
+		 */ 
+		bool writeState(std::ostream &f, unsigned int format,
+			       	unsigned int depth=0) const ;
+
+
+		bool loadState(xmlNodePtr &nodePtr ) ;
 
+		void remapId(size_t newId);
 };
 
 //!Animation of filter properties
@@ -105,6 +122,8 @@ class PropertyAnimator
 	public:
 		PropertyAnimator();
 
+		PropertyAnimator(const PropertyAnimator &p);
+
 		//!Are the properties self-consistent - returns true if OK
 		bool checkSelfConsistent(std::set<size_t> &conflictingFrames) const;
 		
@@ -146,6 +165,22 @@ class PropertyAnimator
 		//Remove the specified key frames. Input vector contents will be sorted.
 		void removeKeyFrames(vector<size_t> &vec);
 
+		//!Dump state to output stream, using specified format
+		/* Current supported formats are STATE_FORMAT_XML.
+		 * Depth is indentation depth (for pretty-printing) 
+		 */ 
+		bool writeState(std::ostream &f, unsigned int format,
+			       	unsigned int depth=0) const;
+
+
+		bool loadState(xmlNodePtr &nodePtr);
+
+
+		//!Obtain the complete listing of IDs used internally
+		void getIdList(vector<unsigned int> &ids) const;
+
+		//!Force the internal IDs for filters to a new value
+		void updateMappings(const std::map<size_t,size_t> &newMap);
 };
 
 
diff --git a/src/backend/configFile.cpp b/src/backend/configFile.cpp
index 1b4f034..1bdea7e 100644
--- a/src/backend/configFile.cpp
+++ b/src/backend/configFile.cpp
@@ -307,6 +307,8 @@ unsigned int ConfigFile::read()
 			if(xmlString)
 			{
 				tmpStr=(char*)xmlString;
+				
+				panelMode=CONFIG_PANELMODE_NONE;
 				stream_cast(panelMode,tmpStr);
 			
 				if(panelMode >=CONFIG_PANELMODE_END_ENUM)	
diff --git a/src/backend/filter.cpp b/src/backend/filter.cpp
index 746d150..fc58788 100644
--- a/src/backend/filter.cpp
+++ b/src/backend/filter.cpp
@@ -711,6 +711,8 @@ const ProgressData &ProgressData::operator=(const ProgressData &oth)
 	maxStep=oth.maxStep;
 	curFilter=oth.curFilter;
 	stepName=oth.stepName;
+
+	return *this;
 }
 
 #ifdef DEBUG
diff --git a/src/backend/filter.h b/src/backend/filter.h
index 0e956f8..bdc09cc 100644
--- a/src/backend/filter.h
+++ b/src/backend/filter.h
@@ -334,6 +334,7 @@ class PlotStreamData : public FilterStreamData
 		std::vector<std::pair<float,float> > xyData;
 		//!Rectangular marked regions
 		vector<std::pair<float,float> > regions;
+		vector<string> regionTitle;
 		//!Region colours
 		vector<float> regionR,regionB,regionG;
 
@@ -631,7 +632,7 @@ class ProgressData
 		bool operator==(const ProgressData &o) const;
 		const ProgressData &operator=(const ProgressData &o);
 
-		void reset() { filterProgress=totalProgress=step=maxStep=0;curFilter=0; stepName.clear();};
+		void reset() { filterProgress=totalProgress=step=maxStep=0;curFilter=0; totalNumFilters=1; stepName.clear();};
 		void clock() { filterProgress=step=maxStep=0;curFilter=0;totalProgress++; stepName.clear();};
 };
 
diff --git a/src/backend/filters/algorithms/binomial.cpp b/src/backend/filters/algorithms/binomial.cpp
index 0951647..5df28dd 100644
--- a/src/backend/filters/algorithms/binomial.cpp
+++ b/src/backend/filters/algorithms/binomial.cpp
@@ -61,7 +61,6 @@ int countBinnedIons(const std::vector<IonHit> &ions, const RangeFile *rng,
 			const std::vector<size_t> &selectedIons, const SEGMENT_OPTION &segmentOptions,
 			vector<GRID_ENTRY> &completedGridEntries)
 {
-	ASSERT(rng);
 
 	//Step 1 - filter the ions to only the ranges we want to examine
 	std::vector<IonHit> filteredIons;
@@ -164,16 +163,12 @@ int countBinnedIons(const std::vector<IonHit> &ions, const RangeFile *rng,
 #pragma omp parallel for 
 	for(size_t ui=0;ui<nGrids;ui++)
 	{
-		//Set the end 
+		//Set the start and end 
 		gridEntries[ui].nIons.resize(selectedIons.size(),0);
 		gridEntries[ui].totalIons=0;
 		gridEntries[ui].startPt[extrusionAxis]=gridEntries[ui].endPt[extrusionAxis]=zStart;
 
 		setGridABCoords(ui,direction,nBins,binLen,totalBound,gridEntries[ui]);
-	
-		//Set the start, but not the end - as we do that when we have
-		// finished extruding
-		gridEntries[ui].startPt[extrusionAxis]=gridEntries[ui].startPt[extrusionAxis];
 	}
 	//--
 
diff --git a/src/backend/filters/algorithms/rdf.cpp b/src/backend/filters/algorithms/rdf.cpp
index 08e5666..de87559 100644
--- a/src/backend/filters/algorithms/rdf.cpp
+++ b/src/backend/filters/algorithms/rdf.cpp
@@ -364,7 +364,7 @@ reduced_loop_next:
 	;
 	}
 
-	FREE_QHULL();
+	freeConvexHull();
 
 	return 0;
 }
@@ -815,10 +815,9 @@ unsigned int generate1DAxialNNHist(const vector<Point3D> &pointList, const K3DTr
 		{
 			float temp;
 			temp=(*nnPoints[uj]-pointList[ui]).dotProd(axisDir);
-			//Use int type to catch small underflows
 			int offset=(int)(((0.5f*temp)/maxOfMaxDists+0.5f)*numBins);
 
-			if(offset < (int)numBins && offset >=0)	
+			if(offset < numBins && offset >=0)	
 			{
 				//TODO: OpenMP could use multiple histograms
 				// rather than locking
diff --git a/src/backend/filters/annotation.cpp b/src/backend/filters/annotation.cpp
index c010451..8563a4a 100644
--- a/src/backend/filters/annotation.cpp
+++ b/src/backend/filters/annotation.cpp
@@ -1035,7 +1035,7 @@ bool AnnotateFilter::setProperty(  unsigned int key,
 			if(!newPt.parse(value))
 				return false;
 
-			if(!(acrossVec == newPt))
+			if(!(position == newPt))
 			{
 				position=newPt;
 				needUpdate=true;
@@ -1262,7 +1262,8 @@ bool AnnotateFilter::setProperty(  unsigned int key,
 		case KEY_LINEAR_NUMTICKS:
 		{
 			unsigned int tmp;
-			stream_cast(tmp,value);
+			if(stream_cast(tmp,value))
+				return false;
 
 			if(tmp == linearMeasureTicks)
 				return false;
diff --git a/src/backend/filters/boundingBox.cpp b/src/backend/filters/boundingBox.cpp
index 6e2ebe4..e729479 100644
--- a/src/backend/filters/boundingBox.cpp
+++ b/src/backend/filters/boundingBox.cpp
@@ -283,34 +283,27 @@ void BoundingBoxFilter::drawDimension(const BoundCube &bTotal, DrawStreamData *d
 	{
 		float len;
 		len=(tickEnd[ui]-tickOrigin[ui])*0.5f;
-		
-		for(unsigned int uj=0;uj<2;uj++)
-		{
-			DrawVector *dV;
-		        dV= new DrawVector;
+	
+		//Draw vector for the axis, and set arrow mode
+		DrawVector *dV;
+		dV= new DrawVector;
 
-			dV->setColour(rLine,gLine,bLine,aLine);	
-			dV->wantsLight=true;
-			dV->setOrigin(centrePt[ui]);
-			
-			switch(ui)
-			{
-				case 0:
-					dV->setVector(Point3D(2.0*len*(float)(uj-0.5f),0,0));
-					break;
-				case 1:
-					dV->setVector(Point3D(0,2.0*len*(float)(uj-0.5f),0));
-					break;
-				case 2:
-					dV->setVector(Point3D(0,0,2.0*len*(float)(uj-0.5f)));
-					break;
-			}
+		dV->setColour(rLine,gLine,bLine,aLine);	
+		dV->wantsLight=true;
+		
+		dV->setArrowSize(maxLen*ARROW_SCALE_FACTOR);
+		dV->setDoubleEnded();
+		
+		Point3D p;
+		p.setValue(0,0,0);
+		p.setValue(ui,len);
+		
+		dV->setOrigin(centrePt[ui]-p);
+		dV->setVector(p*2.0f);
 
 
-			dV->setArrowSize(maxLen*ARROW_SCALE_FACTOR);
 
-			d->drawables.push_back(dV);
-		}
+		d->drawables.push_back(dV);
 
 	}
 
@@ -355,7 +348,8 @@ void BoundingBoxFilter::drawDimension(const BoundCube &bTotal, DrawStreamData *d
 
 		d->drawables.push_back(dT);
 	}
-	
+
+	delete[] buffer;
 
 
 }
diff --git a/src/backend/filters/clusterAnalysis.cpp b/src/backend/filters/clusterAnalysis.cpp
index 5f78578..a33c6ef 100644
--- a/src/backend/filters/clusterAnalysis.cpp
+++ b/src/backend/filters/clusterAnalysis.cpp
@@ -32,10 +32,13 @@
 enum
 {
 	KEY_CLUSTERANALYSIS_ALGORITHM,
+	KEY_CORECLASSIFY_ENABLE,
 	KEY_CORECLASSIFYDIST,
 	KEY_CORECLASSIFYKNN,
 	KEY_LINKDIST,
+	KEY_BULKLINK_ENABLE,
 	KEY_BULKLINK,
+	KEY_ERODE_ENABLE,
 	KEY_ERODEDIST,
 	KEY_WANT_CLUSTERSIZEDIST,
 	KEY_WANT_LOGSIZEDIST,
@@ -125,6 +128,7 @@ void makeFrequencyTable(const IonStreamData *i ,const RangeFile *r,
 	}
 
 
+#ifdef _OPENMP
 	//we have to re-count the total, and tally the different threads
 	//in the histogram
 	for(size_t uj=0;uj<r->getNumIons();uj++)
@@ -132,6 +136,7 @@ void makeFrequencyTable(const IonStreamData *i ,const RangeFile *r,
 		for(size_t ui=1;ui<numThreads;ui++)
 			ionHist[0][uj]+=ionHist[ui][uj];
 	}
+#endif
 
 	freqTable.clear();
 	for(size_t uj=0;uj<r->getNumIons();uj++)
@@ -256,9 +261,10 @@ void ClusterAnalysisFilter::buildRangeEnabledMap(const RangeStreamData *r,
 }
 
 ClusterAnalysisFilter::ClusterAnalysisFilter() : algorithm(CLUSTER_LINK_ERODE),
-	coreDist(0.0f), coreKNN(1), linkDist(0.5f), bulkLink(1), dErosion(0.25),
+	enableCoreClassify(false), coreDist(0.0f), coreKNN(1), linkDist(0.5f), 
+	enableBulkLink(false), bulkLink(1), enableErosion(false), dErosion(0.25),
 	wantCropSize(false), nMin(0),nMax(std::numeric_limits<size_t>::max()),
-	sizeCountBulk(true),wantClusterSizeDist(false),logClusterSize(false),
+	wantClusterSizeDist(false),logClusterSize(false),
 	wantClusterComposition(true),normaliseComposition(true),
 	wantClusterMorphology(false), haveRangeParent(false)
 
@@ -289,7 +295,6 @@ Filter *ClusterAnalysisFilter::cloneUncached() const
 	p->wantCropSize=wantCropSize;
 	p->nMin=nMin;
 	p->nMax=nMax;
-	p->sizeCountBulk=sizeCountBulk;
 
 	p->wantClusterSizeDist = wantClusterSizeDist;
 	p->logClusterSize= logClusterSize;
@@ -500,15 +505,11 @@ unsigned int ClusterAnalysisFilter::refresh(const std::vector<const FilterStream
 
 
 	//Check that the user has enabled something as matrix/bulk. 
-	if(!haveABulk )
+	if(!haveABulk && enableBulkLink)
 	{
-		//TODO: Refactor - we are really asking if algorithm needs bulk
-		if(bulkLink >std::numeric_limits<float>::epsilon())
-		{
-			consoleOutput.push_back(
-				string(TRANS("No ranges selected for cluster \"bulk\". Cannot continue with clustering.")));
-			return NOBULK_ERR;
-		}
+		consoleOutput.push_back(
+			string(TRANS("No ranges selected for cluster \"bulk\". Cannot continue with clustering.")));
+		return NOBULK_ERR;
 	}
 
 #ifdef DEBUG
@@ -909,22 +910,32 @@ void ClusterAnalysisFilter::getProperties(FilterPropGroup &propertyList) const
 	curGroup++;
 	
 	if(algorithm == CLUSTER_LINK_ERODE)
+	
 	{
-		stream_cast(tmpStr,coreDist);
-		p.name=TRANS("Core Classify Dist");
-		p.data=tmpStr;
-		p.type=PROPERTY_TYPE_REAL;
-		p.helpText=TRANS("Restrict only atoms by distance to be cluster sources");
-		p.key=KEY_CORECLASSIFYDIST;
+		p.name=TRANS("Core Classify");
+		p.data=boolStrEnc(enableCoreClassify);
+		p.type=PROPERTY_TYPE_BOOL;
+		p.helpText=TRANS("Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)");
+		p.key=KEY_CORECLASSIFY_ENABLE;
 		propertyList.addProperty(p,curGroup);
+		if(enableCoreClassify)
+		{
+			stream_cast(tmpStr,coreDist);
+			p.name=TRANS("Core Classify Dist");
+			p.data=tmpStr;
+			p.type=PROPERTY_TYPE_REAL;
+			p.helpText=TRANS("Restrict only atoms by distance to be cluster sources");
+			p.key=KEY_CORECLASSIFYDIST;
+			propertyList.addProperty(p,curGroup);
 		
-		stream_cast(tmpStr,coreKNN);
-		p.name=TRANS("Classify Knn Max");
-		p.data=tmpStr;
-		p.type=PROPERTY_TYPE_INTEGER;
-		p.helpText=TRANS("Require that the kth NN (this number) is within the classify distance, to be a cluster source");
-		p.key=KEY_CORECLASSIFYKNN;
-		propertyList.addProperty(p,curGroup);
+			stream_cast(tmpStr,coreKNN);
+			p.name=TRANS("Classify Knn Max");
+			p.data=tmpStr;
+			p.type=PROPERTY_TYPE_INTEGER;
+			p.helpText=TRANS("Require that the kth NN (this number) is within the classify distance, to be a cluster source");
+			p.key=KEY_CORECLASSIFYKNN;
+			propertyList.addProperty(p,curGroup);
+		}
 		
 		stream_cast(tmpStr,linkDist);
 		p.name=TRANS("Core Link Dist");
@@ -933,44 +944,53 @@ void ClusterAnalysisFilter::getProperties(FilterPropGroup &propertyList) const
 		p.helpText=TRANS("Distance between clusters to allow linking");
 		p.key=KEY_LINKDIST;
 		propertyList.addProperty(p,curGroup);
-		
-		stream_cast(tmpStr,bulkLink);
-		p.name=TRANS("Bulk Link (Envelope) Dist");
-		p.data=tmpStr;
-		p.type=PROPERTY_TYPE_REAL;
-		p.helpText=TRANS("Distance from core points that form cluster that is used to grab surrounding bulk points");
-		p.key=KEY_BULKLINK;
+
+
+		p.name=TRANS("Bulk Link");
+		p.data=boolStrEnc(enableBulkLink);
+		p.type=PROPERTY_TYPE_BOOL;
+		p.helpText=TRANS("Enable  linking of non-cluster species - eg for composition analysis ");
+		p.key=KEY_BULKLINK_ENABLE;
 		propertyList.addProperty(p,curGroup);
 		
-		stream_cast(tmpStr,dErosion);
-		p.name=TRANS("Erode Dist");
-		p.data=tmpStr;
-		p.type=PROPERTY_TYPE_REAL;
-		p.helpText=TRANS("Distance from unclustered material in which bulk points are eroded from cluster");
-		p.key=KEY_ERODEDIST;
+		if(enableBulkLink)
+		{
+			stream_cast(tmpStr,bulkLink);
+			p.name=TRANS("Bulk Link (Envelope) Dist");
+			p.data=tmpStr;
+			p.type=PROPERTY_TYPE_REAL;
+			p.helpText=TRANS("Distance from core points that form cluster that is used to grab surrounding bulk points");
+			p.key=KEY_BULKLINK;
+			propertyList.addProperty(p,curGroup);
+		}
+		
+		p.name=TRANS("Erosion");
+		p.data=boolStrEnc(enableErosion);
+		p.type=PROPERTY_TYPE_BOOL;
+		p.helpText=TRANS("Enable  linking of non-cluster species - eg for composition analysis ");
+		p.key=KEY_ERODE_ENABLE;
 		propertyList.addProperty(p,curGroup);
+		if(enableErosion)
+		{
+			stream_cast(tmpStr,dErosion);
+			p.name=TRANS("Erode Dist");
+			p.data=tmpStr;
+			p.type=PROPERTY_TYPE_REAL;
+			p.helpText=TRANS("Distance from unclustered material in which bulk points are eroded from cluster");
+			p.key=KEY_ERODEDIST;
+			propertyList.addProperty(p,curGroup);
+		}
 	}
 	
 	propertyList.setGroupTitle(curGroup,TRANS("Clustering Params"));
 
 	curGroup++;
 
-	if(bulkLink > 0.0f)
-	{
-		tmpStr=boolStrEnc(sizeCountBulk);
-		p.name=TRANS("Count bulk");
-		p.data=tmpStr;
-		p.type=PROPERTY_TYPE_BOOL;
-		p.helpText=TRANS("Include bulk ions in size distribution.");
-		p.key=KEY_SIZE_COUNT_BULK;
-		propertyList.addProperty(p,curGroup);
-	}
-
 	tmpStr=boolStrEnc(wantCropSize);
 	p.name=TRANS("Size Cropping");
 	p.data=tmpStr;
 	p.type=PROPERTY_TYPE_BOOL;
-	p.helpText=TRANS("Perform removal of clusters based upon size distribution");
+	p.helpText=TRANS("Remove clusters based upon size distribution");
 	p.key=KEY_CROP_SIZE;
 	propertyList.addProperty(p,curGroup);
 
@@ -1017,7 +1037,7 @@ void ClusterAnalysisFilter::getProperties(FilterPropGroup &propertyList) const
 	p.name=TRANS("Morphology Dist.");
 	p.data=tmpStr;
 	p.type=PROPERTY_TYPE_BOOL;
-	p.helpText=TRANS("Create a plot showing cluster aspect ratio data");
+	p.helpText=TRANS("Create a plot showing cluster aspect ratio");
 	p.key=KEY_WANT_CLUSTERMORPHOLOGY;
 	propertyList.addProperty(p,curGroup);
 	*/
@@ -1067,22 +1087,25 @@ void ClusterAnalysisFilter::getProperties(FilterPropGroup &propertyList) const
 		
 		propertyList.setGroupTitle(curGroup,TRANS("Core Ranges"));
 		curGroup++;	
-	
-		for(size_t ui=0;ui<ionNames.size();ui++)
+
+		if(enableBulkLink)
 		{
-			if(ionBulkEnabled[ui])
-				tmpStr="1";
-			else
-				tmpStr="0";
-			p.name=ionNames[ui];
-			p.data=tmpStr;
-			p.type=PROPERTY_TYPE_BOOL;
-			p.helpText=TRANS("If selected, use as \"bulk\" ion type (can be included in existing clusters)");
-			p.key=KEY_BULK_OFFSET+ui;
-			propertyList.addProperty(p,curGroup);
+			for(size_t ui=0;ui<ionNames.size();ui++)
+			{
+				if(ionBulkEnabled[ui])
+					tmpStr="1";
+				else
+					tmpStr="0";
+				p.name=ionNames[ui];
+				p.data=tmpStr;
+				p.type=PROPERTY_TYPE_BOOL;
+				p.helpText=TRANS("If selected, use as \"bulk\" ion type (can be included in existing clusters)");
+				p.key=KEY_BULK_OFFSET+ui;
+				propertyList.addProperty(p,curGroup);
+			}
+			
+			propertyList.setGroupTitle(curGroup,TRANS("Bulk Ranges"));
 		}
-		
-		propertyList.setGroupTitle(curGroup,TRANS("Bulk Ranges"));
 	}	
 
 }
@@ -1108,6 +1131,22 @@ bool ClusterAnalysisFilter::setProperty(unsigned int key,
 
 			break;
 		}
+		case KEY_CORECLASSIFY_ENABLE:
+		{
+			string stripped=stripWhite(value);
+		
+			bool newVal;
+			if(!boolStrDec(stripped,newVal))
+				return false;
+
+			if(newVal!=enableCoreClassify)
+			{
+				enableCoreClassify=newVal;
+				clearCache(); 
+				needUpdate=true;
+			}
+			break;
+		}
 		case KEY_CORECLASSIFYDIST:
 		{
 			float ltmp;
@@ -1153,6 +1192,22 @@ bool ClusterAnalysisFilter::setProperty(unsigned int key,
 
 			break;
 		}	
+		case KEY_BULKLINK_ENABLE:
+		{
+			string stripped=stripWhite(value);
+		
+			bool newVal;
+			if(!boolStrDec(stripped,newVal))
+				return false;
+
+			if(newVal!=enableBulkLink)
+			{
+				enableBulkLink=newVal;
+				clearCache(); 
+				needUpdate=true;
+			}
+			break;
+		}
 		case KEY_BULKLINK:
 		{
 			float ltmp;
@@ -1168,6 +1223,22 @@ bool ClusterAnalysisFilter::setProperty(unsigned int key,
 
 			break;
 		}	
+		case KEY_ERODE_ENABLE:
+		{
+			string stripped=stripWhite(value);
+		
+			bool newVal;
+			if(!boolStrDec(stripped,newVal))
+				return false;
+
+			if(newVal!=enableErosion)
+			{
+				enableErosion=newVal;
+				clearCache(); 
+				needUpdate=true;
+			}
+			break;
+		}
 		case KEY_ERODEDIST:
 		{
 			float ltmp;
@@ -1403,29 +1474,6 @@ bool ClusterAnalysisFilter::setProperty(unsigned int key,
 
 			break;
 		}	
-		case KEY_SIZE_COUNT_BULK:
-		{
-			string stripped=stripWhite(value);
-
-			if(!(stripped == "1"|| stripped == "0"))
-				return false;
-
-			bool lastVal=sizeCountBulk;
-			if(stripped=="1")
-				sizeCountBulk=true;
-			else
-				sizeCountBulk=false;
-
-			//if the result is different, the
-			//cache should be invalidated
-			if(lastVal!=sizeCountBulk)
-			{
-				needUpdate=true;
-				clearCache();
-			}
-			
-			break;
-		}
 		case KEY_WANT_CLUSTERMORPHOLOGY:
 		{
 			string stripped=stripWhite(value);
@@ -1521,10 +1569,10 @@ bool ClusterAnalysisFilter::writeState(std::ostream &f,unsigned int format,
 		
 			//Core-linkage algorithm parameters	
 			f << tabs(depth+1) << "<coredist value=\""<<coreDist<< "\"/>"  << endl;
-			f << tabs(depth+1) << "<coringknn value=\""<<coreKNN<< "\"/>"  << endl;
+			f << tabs(depth+1) << "<coringknn value=\""<<coreKNN<< "\" enabled=\"" <<  boolStrEnc(enableCoreClassify) << "\"/>"  << endl;
 			f << tabs(depth+1) << "<linkdist value=\""<<linkDist<< "\"/>"  << endl;
-			f << tabs(depth+1) << "<bulklink value=\""<<bulkLink<< "\"/>"  << endl;
-			f << tabs(depth+1) << "<derosion value=\""<<dErosion<< "\"/>"  << endl;
+			f << tabs(depth+1) << "<bulklink value=\""<<bulkLink<< "\" enabled=\"" << boolStrEnc(enableBulkLink) << "\"/>"  << endl;
+			f << tabs(depth+1) << "<derosion value=\""<<dErosion<< "\" enabled=\"" << boolStrEnc(enableErosion) << "\"/>"  << endl;
 			
 			//Cropping control
 			f << tabs(depth+1) << "<wantcropsize value=\""<<wantCropSize<< "\"/>"  << endl;
@@ -1533,7 +1581,7 @@ bool ClusterAnalysisFilter::writeState(std::ostream &f,unsigned int format,
 			
 			//Postprocessing
 			f << tabs(depth+1) << "<wantclustersizedist value=\""<<wantClusterSizeDist<< "\" logarithmic=\"" << 
-					logClusterSize <<  "\" sizecountbulk=\""<<sizeCountBulk<< "\"/>"  << endl;
+					logClusterSize << "\"/>"  << endl;
 			f << tabs(depth+1) << "<wantclustercomposition value=\"" <<wantClusterComposition<< "\" normalise=\"" << 
 					normaliseComposition<< "\"/>"  << endl;
 			
@@ -1542,7 +1590,7 @@ bool ClusterAnalysisFilter::writeState(std::ostream &f,unsigned int format,
 
 			f << tabs(depth+1) << "<enabledions>"  << endl;
 			writeIonsEnabledXML(f,"core",ionCoreEnabled,ionNames,depth+2);
-			writeIonsEnabledXML(f,"bulk",ionCoreEnabled,ionNames,depth+2);
+			writeIonsEnabledXML(f,"bulk",ionBulkEnabled,ionNames,depth+2);
 			f << tabs(depth+1) << "</enabledions>"  << endl;
 			
 			f << tabs(depth) << "</" << trueName() << ">" << endl;
@@ -1599,6 +1647,12 @@ bool ClusterAnalysisFilter::readState(xmlNodePtr &nodePtr, const std::string &pa
 				return false;
 			if(!coreKNN)
 				return false;
+			if(!XMLHelpGetProp(enableCoreClassify,nodePtr,"enabled"))
+			{
+				//FIXME : Deprecate this check - previously the enabled setting was specfied by
+				// setting a value of zero for the link distance
+				enableCoreClassify=!(bulkLink == 0);
+			}
 
 			if(!XMLGetNextElemAttrib(nodePtr,linkDist,"linkdist","value"))
 				return false;
@@ -1608,10 +1662,22 @@ bool ClusterAnalysisFilter::readState(xmlNodePtr &nodePtr, const std::string &pa
 				return false;
 			if(bulkLink<0)
 				return false;
+			if(!XMLHelpGetProp(enableBulkLink,nodePtr,"enabled"))
+			{
+				//FIXME : Deprecate this check - previously the enabled setting was specfied by
+				// setting a value of zero for the link distance
+				enableBulkLink=!(bulkLink == 0);
+			}
 			if(!XMLGetNextElemAttrib(nodePtr,dErosion,"derosion","value"))
 				return false;
 			if(dErosion<0)
 				return false;
+			if(!XMLHelpGetProp(enableErosion,nodePtr,"enabled"))
+			{
+				//FIXME : Deprecate this check - previously the enabled setting was specfied by
+				// setting a value of zero for the link distance
+				enableErosion=!(dErosion== 0);
+			}
 			break;
 		}
 		default:
@@ -1643,9 +1709,6 @@ bool ClusterAnalysisFilter::readState(xmlNodePtr &nodePtr, const std::string &pa
 	nodePtr=tmpPtr;
 	if(!XMLGetNextElemAttrib(nodePtr,logClusterSize,"wantclustersizedist","logarithmic"))
 		return false;
-	nodePtr=tmpPtr;
-	if(!XMLGetNextElemAttrib(nodePtr,sizeCountBulk,"wantclustersizedist","sizecountbulk"))
-		return false;
 	
 	tmpPtr=nodePtr;
 	if(!XMLGetNextElemAttrib(nodePtr,wantClusterComposition,"wantclustercomposition","value"))
@@ -1699,6 +1762,17 @@ bool ClusterAnalysisFilter::readState(xmlNodePtr &nodePtr, const std::string &pa
 		ionBulkEnabled.push_back(enabled);
 	}
 
+	//Enforce that core and bulk cannot be on at the same time
+	// - Check for overlaps between core and bulk enabling,
+	//   then turn off bulk if both are enabled
+	size_t minSize=std::min(ionBulkEnabled.size(),ionCoreEnabled.size());
+	for(size_t ui=0;ui<minSize;ui++)
+	{
+		if(ionBulkEnabled[ui] && ionCoreEnabled[ui])
+			ionBulkEnabled[ui]=false;
+	}
+	
+
 	return true;
 }
 
@@ -1776,15 +1850,15 @@ unsigned int ClusterAnalysisFilter::refreshLinkClustering(const std::vector<cons
 	//4*) Bulk Erosion step
 	//	- Each unclustered bulk ion has a sphere placed around it. This sphere
 	//	 strips out ions from the cluster. This is only done once (ie, not iterative)
+	//	 requires the bulk inclusion step from (3).
 	//
 	// In the implementation, there are more steps, due to data structure construction
 	// and other computational concerns
 	
-	bool needCoring=coreDist> std::numeric_limits<float>::epsilon();
-	bool needBulkLink=bulkLink > std::numeric_limits<float>::epsilon();
-	bool needErosion=dErosion> std::numeric_limits<float>::epsilon() && needBulkLink;
+	bool needCoring=enableCoreClassify;
+	bool needErosion=enableErosion && enableBulkLink;
 	unsigned int numClusterSteps=4;
-	if(needBulkLink)
+	if(enableBulkLink)
 		numClusterSteps+=2;
 	if(needErosion)
 		numClusterSteps++;
@@ -1794,7 +1868,7 @@ unsigned int ClusterAnalysisFilter::refreshLinkClustering(const std::vector<cons
 
 
 	//Quick sanity check
-	if(needBulkLink)
+	if(enableBulkLink)
 	{
 		//It is mildly dodgy to use a "bulk" distance larger than your core distance
 		//with relative dodgyness, depending upon cluster number density.
@@ -1952,7 +2026,7 @@ unsigned int ClusterAnalysisFilter::refreshLinkClustering(const std::vector<cons
 
 
 	//Build the bulk tree (eg matrix ions.), as needed
-	if(needBulkLink)
+	if(enableBulkLink)
 	{
 		progress.step++;
 		progress.stepName=TRANS("Build Bulk");
@@ -2091,7 +2165,7 @@ unsigned int ClusterAnalysisFilter::refreshLinkClustering(const std::vector<cons
 	// computation.
 	// The advantage to doing it now is that we can (potentially) drop lots of clusters
 	// from or analysis before we do the following steps, saving lots of time
-	if(!sizeCountBulk && (nMin > 0 || nMax <(size_t)-1) && wantCropSize )
+	if(!enableBulkLink && (nMin > 0 || nMax <(size_t)-1) && wantCropSize )
 	{
 		for(size_t ui=0;ui<allCoreClusters.size();)
 		{
@@ -2115,7 +2189,7 @@ unsigned int ClusterAnalysisFilter::refreshLinkClustering(const std::vector<cons
 	//====
 	//If there is no bulk link step, we don't need to do that.,
 	//or any of the following stages
-	if(needBulkLink)
+	if(enableBulkLink)
 	{
 
 		//Update progress stuff
@@ -2543,7 +2617,7 @@ PlotStreamData* ClusterAnalysisFilter::clusterSizeDistribution(const vector<vect
 	//Map that maps input number to frequency
 	map<size_t,size_t> countMap;
 	size_t maxSize=0;
-	if(sizeCountBulk && bulk.size())
+	if(bulk.size())
 	{
 		ASSERT(bulk.size() == core.size());
 		for(size_t ui=0;ui<core.size();ui++)
@@ -2617,7 +2691,7 @@ bool ClusterAnalysisFilter::stripClusterBySize(vector<vector<IonHit> > &clustere
 	// spin through, find the ones we want to kill, then do a cull.
 	// Progress reporting would be a bit more difficult.
 
-	if(clusteredBulk.size() && sizeCountBulk)
+	if(clusteredBulk.size())
 	{
 		//should be the same numbers of bulk as core
 		ASSERT(clusteredBulk.size() == clusteredCore.size());
@@ -2644,30 +2718,9 @@ bool ClusterAnalysisFilter::stripClusterBySize(vector<vector<IonHit> > &clustere
 			}
 		}
 	}
-	else if(sizeCountBulk)
-	{
-		//OK, we don't have any bulk, but we wanted it.. Just work on core.
-		for(size_t ui=clusteredCore.size();ui;)
-		{
-			ui--;
-
-			if(clusteredCore[ui].size() <  nMin || clusteredCore[ui].size() > nMax)
-			{
-				clusteredCore[ui].swap(clusteredCore.back());
-				clusteredCore.pop_back();
-			}
-			if(!(ui%PROGRESS_REDUCE) )
-			{
-				progress.filterProgress= (unsigned int)(((float)ui/(float)clusteredCore.size()+1)*100.0f);
-				
-				if(!(*callback)(false))
-					return ABORT_ERR;
-			}
-		}
-	}
 	else
 	{
-		//OK, we have bulk, but we just want to count core;
+		//OK, we haven't any bulkbut we just want to count core;
 		//but operate on both
 		for(size_t ui=clusteredCore.size();ui;)
 		{
@@ -2677,8 +2730,6 @@ bool ClusterAnalysisFilter::stripClusterBySize(vector<vector<IonHit> > &clustere
 			{
 				clusteredCore[ui].swap(clusteredCore.back());
 				clusteredCore.pop_back();
-				clusteredBulk[ui].swap(clusteredBulk.back());
-				clusteredBulk.pop_back();
 			}
 			if(!(ui%PROGRESS_REDUCE) )
 			{
@@ -2704,7 +2755,7 @@ void ClusterAnalysisFilter::genCompositionVersusSize(const vector<vector<IonHit>
 	//for this particular sie for each ion (ie, the array is of size rng->getNumIons)
 	map<size_t,vector<size_t> > countMap;
 	
-	bool needCountBulk=clusteredBulk.size() && sizeCountBulk;
+	bool needCountBulk=clusteredBulk.size();
 
 
 	vector<size_t> ionFreq;
@@ -3301,8 +3352,10 @@ bool coreClusterTest()
 	bool needUp;
 	TEST(f->setProperty(KEY_CORE_OFFSET,"1",needUp),"Set core range");
 
+	TEST(f->setProperty(KEY_CORECLASSIFY_ENABLE,"1",needUp),"Enable core-classification");
 	TEST(f->setProperty(KEY_CORECLASSIFYDIST,"1.1",needUp),"Set core classification dist");
 	TEST(f->setProperty(KEY_CORECLASSIFYKNN,"1",needUp),"Set core classfication kNN");
+	
 	TEST(f->setProperty(KEY_LINKDIST,"2.0",needUp),"set link distance");
 	TEST(f->setProperty(KEY_BULKLINK,"0",needUp),"set bulk distance");
 	TEST(f->setProperty(KEY_ERODEDIST,"0",needUp),"set erode distance");
diff --git a/src/backend/filters/clusterAnalysis.h b/src/backend/filters/clusterAnalysis.h
index 9ee4d04..7bc42bf 100644
--- a/src/backend/filters/clusterAnalysis.h
+++ b/src/backend/filters/clusterAnalysis.h
@@ -31,14 +31,23 @@ class ClusterAnalysisFilter : public Filter
 	
 		//Algorithm parameters
 		//---	
+
+		//Do we want to enable the core-classification pre-step
+		bool enableCoreClassify;
 		//Core-linkage "core" classification distance
 		float coreDist;
 		//Coring kNN maximum
 		unsigned int coreKNN;
 		//Link distance for core
 		float linkDist;
+		
+		//Enable bulk linking step
+		bool enableBulkLink;
 		//Link distance for bulk
 		float bulkLink;
+
+		//Enable erosion step
+		bool enableErosion;
 		//Erosion distance for bulk from nonclustered bulk
 		float dErosion;
 		//---	
@@ -48,7 +57,6 @@ class ClusterAnalysisFilter : public Filter
 		//well, a meaningful cluster
 		bool wantCropSize;
 		size_t nMin,nMax;
-		bool sizeCountBulk;
 		
 		bool wantClusterSizeDist,logClusterSize;
 
diff --git a/src/backend/filters/compositionProfile.cpp b/src/backend/filters/compositionProfile.cpp
index 1397058..684331f 100644
--- a/src/backend/filters/compositionProfile.cpp
+++ b/src/backend/filters/compositionProfile.cpp
@@ -45,10 +45,12 @@ const char *PRIMITIVE_NAME[]={
 
 const float DEFAULT_RADIUS = 10.0f;
 
+const unsigned int MINEVENTS_DEFAULT =10;
+
 
 CompositionProfileFilter::CompositionProfileFilter() : primitiveType(PRIMITIVE_CYLINDER),
 	showPrimitive(true), lockAxisMag(false),normalise(true), fixedBins(0),
-	nBins(1000), binWidth(0.5f), r(0.0f),g(0.0f),b(1.0f),a(1.0f), plotStyle(0)
+	nBins(1000), binWidth(0.5f), minEvents(MINEVENTS_DEFAULT), r(0.0f),g(0.0f),b(1.0f),a(1.0f), plotStyle(0)
 {
 	COMPILE_ASSERT(THREEDEP_ARRAYSIZE(PRIMITIVE_NAME) == PRIMITIVE_END);
 	
@@ -288,6 +290,9 @@ unsigned int CompositionProfileFilter::refresh(const std::vector<const FilterStr
 	}
 
 
+	//Propagate all the incoming data (excluding ions)
+	propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,true);
+	
 	//use the cached copy of the data if we have it.
 	if(cacheOK)
 	{
@@ -296,11 +301,10 @@ unsigned int CompositionProfileFilter::refresh(const std::vector<const FilterStr
 
 		ASSERT(filterOutputs.back()->getStreamType() == STREAM_TYPE_PLOT);
 
-		//Propagate all the incoming data (excluding ions)
-		propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,true);
 			
 		return 0;
 	}
+			
 
 	//Ion Frequencies (composition specific if rangefile present)
 	vector<vector<size_t> > ionFrequencies;
@@ -438,8 +442,91 @@ unsigned int CompositionProfileFilter::refresh(const std::vector<const FilterStr
 				
 	}
 
+#ifdef DEBUG
+	ASSERT(ionFrequencies.size());
+	//Ion frequencies must be of equal length
+	for(unsigned int ui=1;ui<ionFrequencies.size();ui++)
+	{
+		ASSERT(ionFrequencies[ui].size() == ionFrequencies[0].size());
+	}
+#endif
+	
+
+	vector<float> normalisationFactor;
+	vector<unsigned int> normalisationCount;
+	normalisationFactor.resize(ionFrequencies[0].size());
+	normalisationCount.resize(ionFrequencies[0].size());
+	bool needNormalise=false;
+	bool needNormaliseCount=false;
+
+	//Perform the appropriate normalisation
+	if(!rngData && normalise)
+	{
+		float dx;
+		if(fixedBins)
+			dx=(length/(float)numBins);
+		else
+			dx=binWidth;
+		// For density plots, normalise by
+		//  the volume of the primitive's shell
+		switch(primitiveType)
+		{
+			case PRIMITIVE_CYLINDER:
+			{
+				needNormalise=true;
+				for(unsigned int uj=0;uj<ionFrequencies[0].size(); uj++)
+				{
+					//Normalise by cylinder volume, pi*r^2*h
+					normalisationFactor[uj] = 1.0/(M_PI*
+						scalarParams[0]*scalarParams[0]*dx);
+				}
+				break;
+			}
+			case PRIMITIVE_SPHERE:
+			{
+				for(unsigned int uj=0;uj<ionFrequencies[0].size(); uj++)
+				{
+					//Normalise by sphere shell volume, 
+					// 4/3 *PI*dx^3*((n+1)^3-n^3)
+					//  note -> (n+1)^3 -n^3  = (3*n^2) + (3*n) + 1
+					normalisationFactor[uj] = 1.0/(4.0/3.0*M_PI*
+						dx*(3.0*((float)uj*(float)uj + uj) + 1.0));
+				}
+				break;
+			}
+			default:
+				ASSERT(false);
+		}
+	}
+	else if(normalise && rngData) //compute normalisation values, if we are in composition mode
+	{
+		// the loops' nesting is reversed as we need to sum over distinct plots
+		//Density profiles (non-ranged plots) have a fixed normalisation factor
+		needNormalise=true;
+		needNormaliseCount = true; // we also need to have at least one count to normalise
+
+		for(unsigned int uj=0;uj<ionFrequencies[0].size(); uj++)
+		{
+			float sum;
+			sum=0;
+			//Loop across each bin type, summing result
+			for(unsigned int uk=0;uk<ionFrequencies.size();uk++)
+				sum +=(float)ionFrequencies[uk][uj];
+			normalisationCount[uj]=sum;
+
+	
+			//Compute the normalisation factor
+			if(sum)
+				normalisationFactor[uj]=1.0/sum;
+			else
+				normalisationFactor[uj] = 0;
+		}
+
+	}
+
+	
+	//Create the plots
 	PlotStreamData *plotData[ionFrequencies.size()];
-	float normFactor=1.0f;
 	for(unsigned int ui=0;ui<ionFrequencies.size();ui++)
 	{
 		plotData[ui] = new PlotStreamData;
@@ -490,75 +577,37 @@ unsigned int CompositionProfileFilter::refresh(const std::vector<const FilterStr
 			plotData[ui]->a = a;
 		}
 
-		plotData[ui]->xyData.resize(ionFrequencies[ui].size());
+		plotData[ui]->xyData.reserve(ionFrequencies[ui].size());
 	
-		//Density profiles (non-ranged plots) have a fixed normalisation factor
-		if(!rngData && normalise)
-		{
-			switch(primitiveType)
-			{
-				case PRIMITIVE_CYLINDER:
-					if(fixedBins)
-						normFactor = 1.0/(M_PI*scalarParams[0]*scalarParams[0]*(length/(float)numBins));
-					else
-						normFactor = 1.0/(M_PI*scalarParams[0]*scalarParams[0]*binWidth);
-					break;
-				case PRIMITIVE_SPHERE:
-					break;
-				default:
-					ASSERT(false);
-			}
-		}	
 
 		//Go through each bin, then perform the appropriate normalisation
 		for(unsigned int uj=0;uj<ionFrequencies[ui].size(); uj++)
 		{
 			float xPos;
 			xPos = (((float)uj+0.5f)/(float)ionFrequencies[ui].size())*length;
-			if(rngData)
+			//Recompute normalisation value for this bin, if needed
+			if(needNormalise)
 			{
-				//Composition profile: do inter bin normalisation
-				//Recompute normalisation value for this bin
-				if(normalise)
-				{
-					float sum;
-					sum=0;
-
-					//Loop across each bin type, summing result
-					for(unsigned int uk=0;uk<ionFrequencies.size();uk++)
-						sum +=(float)ionFrequencies[uk][uj];
+				float normFactor=normalisationFactor[uj];
 
-					if(sum)
-						normFactor=1.0/sum;
+				//keep the data if we are not using minimum threshold for normalisation, or we met the 
+				// threhsold
+				if(!needNormaliseCount || normalisationCount[uj] > minEvents)
+				{
+					plotData[ui]->xyData.push_back(
+						std::make_pair(xPos,
+						normFactor*(float)ionFrequencies[ui][uj]));
 				}
-
-				plotData[ui]->xyData[uj] = std::make_pair(xPos,normFactor*(float)ionFrequencies[ui][uj]);
 			}
 			else
-			{
-				//This is a frequency profile (factor ==1), or density profile 
-			
-				//Update the normalisation factor, if required
-				if(normalise)
-				{
-					switch(primitiveType)
-					{
-						case PRIMITIVE_SPHERE:
-							normFactor=1.0/(xPos*xPos);
-							break;
-						case PRIMITIVE_CYLINDER:
-							break;
-						default:
-							ASSERT(false);
-					}
-				}
-				
-				plotData[ui]->xyData[uj] = std::make_pair(
-					xPos,normFactor*(float)ionFrequencies[ui][uj]);
-
+			{	
+				plotData[ui]->xyData.push_back(
+					std::make_pair(xPos,ionFrequencies[ui][uj]) );
 			}
 		}
 
+
+
 		if(cache)
 		{
 			plotData[ui]->cached=1;
@@ -569,10 +618,18 @@ unsigned int CompositionProfileFilter::refresh(const std::vector<const FilterStr
 
 		plotData[ui]->plotStyle = plotStyle;
 		plotData[ui]->plotMode=PLOT_MODE_1D;
-		getOut.push_back(plotData[ui]);
+
+		//If we ended up with any data, display it
+		// otherwise, trash the plot info
+		if(plotData[ui]->xyData.size())
+		{
+			cacheOK=cache;
+			getOut.push_back(plotData[ui]);
+		}
+		else
+			delete plotData[ui];
 	}
 
-	cacheOK=cache;
 	return 0;
 }
 
@@ -659,6 +716,26 @@ bool CompositionProfileFilter::setProperty( unsigned int key,
 			}
 			return true;
 		}
+		case COMPOSITION_KEY_MINEVENTS:
+		{
+			unsigned int valueInt;
+			if(stream_cast(valueInt,value))
+				return false;
+
+			if(minEvents!= valueInt)
+			{
+				needUpdate=true;
+				minEvents=valueInt;
+			}
+			else
+				needUpdate=false;
+
+			clearCache();
+			needUpdate=true;	
+			break;	
+		}
+	
+		
 		case COMPOSITION_KEY_NUMBINS:
 		{
 			unsigned int newNumBins;
@@ -873,9 +950,11 @@ bool CompositionProfileFilter::setProperty( unsigned int key,
 		case COMPOSITION_KEY_AVGWINSIZE:
 		{
 			unsigned int tmpNum;
-			stream_cast(tmpNum,value);
+			if(stream_cast(tmpNum,value))
+				return false;
+
 			if(tmpNum<=1)
-				return 1;
+				return false;
 
 			errMode.movingAverageNum=tmpNum;
 			needUpdate=true;
@@ -1032,6 +1111,17 @@ void CompositionProfileFilter::getProperties(FilterPropGroup &propertyList) cons
 	p.helpText=TRANS("Convert bin counts into relative frequencies in each bin");
 	propertyList.addProperty(p,curGroup);
 
+	stream_cast(tmpStr,minEvents);
+	p.name= TRANS("Min. events");	
+	p.data=tmpStr;
+	p.key=COMPOSITION_KEY_MINEVENTS;
+	p.type=PROPERTY_TYPE_INTEGER;
+	p.helpText=TRANS("Drop data that does not have this many events");
+	propertyList.addProperty(p,curGroup);
+
+
+
+
 	curGroup++;
 	
 	//use set 2 to store the plot properties
@@ -1187,7 +1277,7 @@ bool CompositionProfileFilter::writeState(std::ostream &f,unsigned int format, u
 				f << tabs(depth+2) << "<scalar value=\"" << scalarParams[0] << "\"/>" << endl; 
 			
 			f << tabs(depth+1) << "</scalarparams>" << endl;
-			f << tabs(depth+1) << "<normalise value=\"" << normalise << "\"/>" << endl;
+			f << tabs(depth+1) << "<normalise value=\"" << normalise << "\" minevents=\"" << minEvents << "\" />" << endl;
 			f << tabs(depth+1) << "<fixedbins value=\"" << (int)fixedBins << "\"/>" << endl;
 			f << tabs(depth+1) << "<nbins value=\"" << nBins << "\"/>" << endl;
 			f << tabs(depth+1) << "<binwidth value=\"" << binWidth << "\"/>" << endl;
@@ -1431,15 +1521,16 @@ bool CompositionProfileFilter::readState(xmlNodePtr &nodePtr, const std::string
 	if(XMLHelpFwdToElem(nodePtr,"nbins"))
 		return false;
 
-	xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value");
-	if(!xmlString)
+	
+	if(XMLHelpGetProp(nBins,nodePtr,"value"))
 		return false;
-	tmpStr=(char *)xmlString;
 
-	if(stream_cast(nBins,tmpStr))
-		return false;
 
-	xmlFree(xmlString);
+	if(XMLHelpGetProp(minEvents,nodePtr,"minevents"))
+	{
+		//FIXME: Deprecate me.
+		minEvents=MINEVENTS_DEFAULT;
+	}
 	//====
 
 	//Retrieve bin width
@@ -1637,13 +1728,15 @@ bool testCompositionCylinder()
 	ProgressData p;
 	TEST(!f->refresh(streamIn,streamOut,p,dummyCallback),"Refresh error code");
 
-	TEST(streamOut.size() == 3, "output stream count");
+	//2* plot, 1*rng, 1*draw
+	TEST(streamOut.size() == 4, "output stream count");
 
 	delete d;
 
 	std::map<unsigned int, unsigned int> countMap;
 	countMap[STREAM_TYPE_PLOT] = 0;
 	countMap[STREAM_TYPE_DRAW] = 0;
+	countMap[STREAM_TYPE_RANGE] = 0;
 
 	for(unsigned int ui=0;ui<streamOut.size();ui++)
 	{
@@ -1653,6 +1746,7 @@ bool testCompositionCylinder()
 
 	TEST(countMap[STREAM_TYPE_PLOT] == 2,"Plot count");
 	TEST(countMap[STREAM_TYPE_DRAW] == 1,"Draw count");
+	TEST(countMap[STREAM_TYPE_RANGE] == 1,"Range count");
 	
 	const PlotStreamData* plotData=0;
 	for(unsigned int ui=0;ui<streamOut.size();ui++)
@@ -1672,13 +1766,12 @@ bool testCompositionCylinder()
 			plotData->xyData[ui].second >=0.0f,"normalised data range test"); 
 	}
 
+	delete rngStream->rangeFile;
 	for(unsigned int ui=0;ui<streamOut.size();ui++)
 		delete streamOut[ui];
 
 
 	delete f;
-	delete rngStream->rangeFile;
-	delete rngStream;
 
 	return true;
 }
diff --git a/src/backend/filters/compositionProfile.h b/src/backend/filters/compositionProfile.h
index eb47d72..2799828 100644
--- a/src/backend/filters/compositionProfile.h
+++ b/src/backend/filters/compositionProfile.h
@@ -27,6 +27,7 @@ enum
 	COMPOSITION_KEY_BINWIDTH=1,
 	COMPOSITION_KEY_FIXEDBINS,
 	COMPOSITION_KEY_NORMAL,
+	COMPOSITION_KEY_MINEVENTS,
 	COMPOSITION_KEY_NUMBINS,
 	COMPOSITION_KEY_ORIGIN,
 	COMPOSITION_KEY_PLOTTYPE,
@@ -65,19 +66,25 @@ class CompositionProfileFilter : public Filter
 		
 		//!number of bins (if using fixed bins)
 		unsigned int nBins;
-	//!Width of each bin (if using fixed width)
+		//!Width of each bin (if using fixed width)
 		float binWidth;
+
+		//!Number of events required for an entry to be logged in a normalised
+		// histogram
+		unsigned int minEvents;
 		
 		//Plotting stuff
-		//Vector of spectra. Each spectra is comprised of a sorted Y data
-		std::vector< std::vector<float > > spectraCache;
+		//--
+		//colour of plot
 		float r,g,b,a;
+		//Mode for plotting (eg lines, steps)
 		unsigned int plotStyle;
 	
 		PLOT_ERROR errMode;
 
 		//!Do we have a range file above us in our filter tree? This is set by ::initFilter
 		bool haveRangeParent;
+		//--
 		
 		//!internal function for binning an ion dependant upon range data
 		static void binIon(unsigned int targetBin, const RangeStreamData* rng, const std::map<unsigned int,unsigned int> &ionIDMapping,
diff --git a/src/backend/filters/dataLoad.cpp b/src/backend/filters/dataLoad.cpp
index 9edbe98..5fc4809 100644
--- a/src/backend/filters/dataLoad.cpp
+++ b/src/backend/filters/dataLoad.cpp
@@ -41,19 +41,36 @@ enum
 {
 	FILEDATA_TYPE_POS,
 	FILEDATA_TYPE_TEXT,
+	FILEDATA_TYPE_ATO,
 	FILEDATA_TYPE_ENUM_END, // Not a data type, just end of enum
 };
 
+enum
+{
+	ENDIAN_MODE_AUTO,
+	ENDIAN_MODE_LITTLE,
+	ENDIAN_MODE_BIG,
+	ENDIAN_MODE_ENUM_END,
+};
+
+const char *ENDIAN_MODE_STR[] = { NTRANS("Auto"),
+					NTRANS("Little"),
+					NTRANS("Big")
+				};
+
 const char *AVAILABLE_FILEDATA_TYPES[] = { 	NTRANS("POS Data"),
 					NTRANS("Text Data"),
+					NTRANS("ATO Data"),
 					};
 const char *DEFAULT_LABEL="Mass-to-Charge (amu/e)";
 
+
+
 // == Pos load filter ==
 DataLoadFilter::DataLoadFilter() : fileType(FILEDATA_TYPE_POS), doSample(true), maxIons(MAX_IONS_LOAD_DEFAULT),
 	r(1.0f),g(0.0f),b(0.0f),a(1.0f),ionSize(2.0f), numColumns(4), enabled(true),
 	volumeRestrict(false), monitorTimestamp(-1),monitorSize((size_t)-1),wantMonitor(false),
-	valueLabel(TRANS(DEFAULT_LABEL))
+	valueLabel(TRANS(DEFAULT_LABEL)), endianMode(0)
 {
 	COMPILE_ASSERT(THREEDEP_ARRAYSIZE(AVAILABLE_FILEDATA_TYPES) == FILEDATA_TYPE_ENUM_END);
 	cache=true;
@@ -114,6 +131,9 @@ void DataLoadFilter::setFileMode(unsigned int fileMode)
 		case DATALOAD_FLOAT_FILE:
 			fileType=FILEDATA_TYPE_POS;
 			break;
+		case DATALOAD_LAWATAP_ATO_FILE:
+			fileType=FILEDATA_TYPE_ATO;
+			break;
 		default:
 			ASSERT(false);
 	}
@@ -304,25 +324,24 @@ unsigned int DataLoadFilter::refresh(const std::vector<const FilterStreamData *>
 		case FILEDATA_TYPE_TEXT:
 		{
 
+			vector<vector<float> > outDat;
+			vector<std::string> headerData;
 		
 			if(doSample)
 			{
-				//TODO: Migrate to using a generic text data loading routine
-				//	rather than an IonHit specific one, to avoid need for separate error strings
-				//Load the data from a text file
-				if((uiErr = limitLoadTextFile(INDEX_LENGTH,index,ionData->data, ionFilename.c_str(),TEXT_DELIMINATORS,
-									maxIons,progress.filterProgress,callback,strongRandom)))
+				//Load the output data using a random sampling technique. Load up to 4 data columns
+				if((uiErr=limitLoadTextFile(4,outDat,ionFilename.c_str(),
+						TEXT_DELIMINATORS,maxIons,progress.filterProgress,callback,strongRandom)))
 				{
 					consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename);
 					delete ionData;
-					errStr=ION_TEXT_ERR_STRINGS[uiErr];
+					errStr=TEXT_LOAD_ERR_STRINGS[uiErr];
 					return uiErr;
 				}
 			}
 			else
 			{
-				vector<vector<float> > outDat;
-				vector<std::string> headerData;
+				//Load the entire text data using 
 				if((uiErr=loadTextData(ionFilename.c_str(),outDat,headerData,TEXT_DELIMINATORS)))
 				{
 					consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename);
@@ -331,26 +350,31 @@ unsigned int DataLoadFilter::refresh(const std::vector<const FilterStreamData *>
 					return uiErr;
 				}
 		
-					
+			}	
 
-				if(outDat.size() !=4)
-				{
-					std::string sizeStr;
-					stream_cast(sizeStr,outDat.size());
+			//Data output must be 3 or 4 entries
+			if(outDat.size() !=4 && outDat.size() != 3)
+			{
+				std::string sizeStr;
+				stream_cast(sizeStr,outDat.size());
 
-					consoleOutput.push_back(
-						string(TRANS("Data file contained incorrect number of columns -- should be 4, was ")) + sizeStr );
+				consoleOutput.push_back(
+					string(TRANS("Data file contained incorrect number of columns -- should be 3 or 4, was ")) + sizeStr );
+				delete ionData;
 
-					errStr=TEXT_LOAD_ERR_STRINGS[ERR_FILE_FORMAT];
-					return ERR_FILE_FORMAT;
-				}
-			
-			
-				ASSERT(outDat[0].size() == outDat[1].size() && 
-					outDat[1].size() == outDat[2].size()
-					&& outDat[2].size() == outDat[3].size());
+				errStr=TEXT_LOAD_ERR_STRINGS[ERR_FILE_FORMAT];
+				return ERR_FILE_FORMAT;
+			}
+		
+	
+			//All columns must have the same number of entries
+			ASSERT(outDat[0].size() == outDat[1].size() && 
+				outDat[1].size() == outDat[2].size());
 
-				ionData->data.resize(outDat[0].size());
+			ionData->data.resize(outDat[0].size());
+			if(outDat.size() == 4)
+			{
+				ASSERT(outDat[2].size() == outDat[3].size());
 				#pragma omp parallel for
 				for(unsigned int ui=0;ui<outDat[0].size(); ui++)
 				{
@@ -358,12 +382,43 @@ unsigned int DataLoadFilter::refresh(const std::vector<const FilterStreamData *>
 					ionData->data[ui].setPos(outDat[0][ui],outDat[1][ui],outDat[2][ui]);
 					ionData->data[ui].setMassToCharge(outDat[3][ui]);
 				}
-			}	
+			}
+			else
+			{
+				#pragma omp parallel for
+				for(unsigned int ui=0;ui<outDat[0].size(); ui++)
+				{
+					//Convert vector to ionhits.	
+					ionData->data[ui].setPos(outDat[0][ui],outDat[1][ui],outDat[2][ui]);
+					ionData->data[ui].setMassToCharge(ui);
+				}
+			}
 
 			
 			break;
 		}
+		case FILEDATA_TYPE_ATO:
+		{
+			//TODO: Load Ato file with sampling?
+
+			//Load the pos file, limiting how much you pull from it
+			if((uiErr = LoadATOFile(ionFilename.c_str(), ionData->data,
+						progress.filterProgress,callback)))
+			{
+				consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename);
+				delete ionData;
+				errStr=TRANS(LAWATAP_ATO_ERR_STRINGS[uiErr]);
+				return uiErr;
+			}
+				
 		
+			std::string tmpSize;
+			stream_cast(tmpSize,ionData->data.size());
+			consoleOutput.push_back(string(TRANS("Loaded dataset, " )) + tmpSize
+								 + string(TRANS(" points.")));
+
+			break;
+		}
 		default:
 			ASSERT(false);
 	}
@@ -463,6 +518,23 @@ void DataLoadFilter::getProperties(FilterPropGroup &propertyList) const
 		{
 			break;
 		}
+		case FILEDATA_TYPE_ATO:
+		{
+			vector<pair<unsigned int,string> > endianChoices;
+			endianChoices.resize(ENDIAN_MODE_ENUM_END);
+
+			for(unsigned int ui=0;ui<ENDIAN_MODE_ENUM_END;ui++)
+				endianChoices[ui]=make_pair(ui,ENDIAN_MODE_STR[ui]);
+
+			p.name=TRANS("File \"Endianness\"");
+			p.helpText=TRANS("On-disk data storage format. If file won\'t load, just try each");
+			p.data=choiceString(endianChoices,endianMode);
+			p.key=DATALOAD_KEY_ENDIANNESS;
+			p.type=PROPERTY_TYPE_CHOICE;
+			propertyList.addProperty(p,curGroup);
+			break;
+
+		}
 		default:
 			ASSERT(false);
 			
@@ -530,26 +602,30 @@ void DataLoadFilter::getProperties(FilterPropGroup &propertyList) const
 	if(enabled)
 	{
 		std::string tmpStr;
-		
-		stream_cast(tmpStr,doSample);
-		p.name=TRANS("Sample data");
-		p.data=tmpStr;
-		p.type=PROPERTY_TYPE_BOOL;
-		p.helpText=TRANS("Perform random selection on file contents, instead of loading entire file");
-		p.key=DATALOAD_KEY_SAMPLE;
-		propertyList.addProperty(p,curGroup);
 
-		if(doSample)
+		//FIXME: ATO Files need an imeplmentation of sampling read
+		if(fileType!=FILEDATA_TYPE_ATO)
 		{
-			stream_cast(tmpStr,maxIons*sizeof(float)*4/(1024*1024));
-			p.name=TRANS("Load Limit (MB)");
+			stream_cast(tmpStr,doSample);
+			p.name=TRANS("Sample data");
 			p.data=tmpStr;
-			p.type=PROPERTY_TYPE_INTEGER;
-			p.helpText=TRANS("Limit for size of data to load");
-			p.key=DATALOAD_KEY_SIZE;
+			p.type=PROPERTY_TYPE_BOOL;
+			p.helpText=TRANS("Perform random selection on file contents, instead of loading entire file");
+			p.key=DATALOAD_KEY_SAMPLE;
 			propertyList.addProperty(p,curGroup);
+
+			if(doSample)
+			{
+				stream_cast(tmpStr,maxIons*sizeof(float)*4/(1024*1024));
+				p.name=TRANS("Load Limit (MB)");
+				p.data=tmpStr;
+				p.type=PROPERTY_TYPE_INTEGER;
+				p.helpText=TRANS("Limit for size of data to load");
+				p.key=DATALOAD_KEY_SIZE;
+				propertyList.addProperty(p,curGroup);
+			}
 		}
-	
+
 		stream_cast(tmpStr,wantMonitor);
 		p.name=TRANS("Monitor");
 		p.data=tmpStr;
@@ -880,6 +956,28 @@ bool DataLoadFilter::setProperty(  unsigned int key,
 			
 			break;
 		}
+		
+		case DATALOAD_KEY_ENDIANNESS:
+		{
+			unsigned int ltmp;
+			ltmp=(unsigned int)-1;
+			
+			for(unsigned int ui=0;ui<ENDIAN_MODE_ENUM_END; ui++)
+			{
+				if(ENDIAN_MODE_STR[ui] == value)
+				{
+					ltmp=ui;
+					break;
+				}
+			}
+			if(ltmp == (unsigned int) -1 || ltmp == endianMode)
+				return false;
+
+			endianMode=ltmp;
+			clearCache();
+			needUpdate=true;
+			break;
+		}
 		default:
 			ASSERT(false);
 			break;
diff --git a/src/backend/filters/dataLoad.h b/src/backend/filters/dataLoad.h
index b8810b7..09499f9 100644
--- a/src/backend/filters/dataLoad.h
+++ b/src/backend/filters/dataLoad.h
@@ -25,7 +25,8 @@
 enum
 {
 	DATALOAD_FLOAT_FILE,
-	DATALOAD_TEXT_FILE
+	DATALOAD_TEXT_FILE,
+	DATALOAD_LAWATAP_ATO_FILE
 };
 
 enum
@@ -43,6 +44,7 @@ enum
 	DATALOAD_KEY_SELECTED_COLUMN2,
 	DATALOAD_KEY_SELECTED_COLUMN3,
 	DATALOAD_KEY_NUMBER_OF_COLUMNS,
+	DATALOAD_KEY_ENDIANNESS,
 	DATALOAD_KEY_MONITOR
 };
 
@@ -102,6 +104,9 @@ class DataLoadFilter:public Filter
 
 		//!String to use to set the value type
 		std::string valueLabel;
+
+		//!Endian read mode
+		unsigned int endianMode;
 	public:
 		DataLoadFilter();
 		//!Duplicate filter contents, excluding cache.
diff --git a/src/backend/filters/externalProgram.cpp b/src/backend/filters/externalProgram.cpp
index 8bc8db1..b82cc5b 100644
--- a/src/backend/filters/externalProgram.cpp
+++ b/src/backend/filters/externalProgram.cpp
@@ -398,7 +398,11 @@ unsigned int ExternalProgramFilter::refresh(const std::vector<const FilterStream
 					0, 1, 2, 3
 					};
 			if(GenericLoadFloatFile(4, 4, index2, d->data,sTmp.c_str(),dummy,dummyCallback))
+			{
+				delete d;
+				delete dir;
 				return READPOS_FAIL;
+			}
 
 
 			if(alwaysCache)
@@ -440,14 +444,20 @@ unsigned int ExternalProgramFilter::refresh(const std::vector<const FilterStream
 			//try each in turn
 			const char *delimString ="\t, ";
 			if(loadTextData(sTmp.c_str(),dataVec,header,delimString))
+			{
+				delete dir;
 				return READPLOT_FAIL;
+			}
 
 			//Check that the input has the correct size
 			for(unsigned int uj=0;uj<dataVec.size()-1;uj+=2)
 			{
 				//well the columns don't match
 				if(dataVec[uj].size() != dataVec[uj+1].size())
+				{
+					delete dir;
 					return PLOTCOLUMNS_FAIL;
+				}
 			}
 
 			//Check to see if the header might be able
@@ -782,9 +792,6 @@ unsigned int ExternalProgramFilter::getRefreshUseMask() const
 
 bool echoTest()
 {
-	ExternalProgramFilter* f = new ExternalProgramFilter;
-	f->setCaching(false);
-
 	int errCode;
 #if !defined(__WIN32__) && !defined(__WIN64__)
 	errCode=system("echo testing... > /dev/null");
@@ -797,6 +804,9 @@ bool echoTest()
 		return true;
 	}
 	
+	ExternalProgramFilter* f = new ExternalProgramFilter;
+	f->setCaching(false);
+
 	bool needUp;
 	string s;
 				
diff --git a/src/backend/filters/filterCommon.cpp b/src/backend/filters/filterCommon.cpp
index 47ec65e..5b8afdf 100644
--- a/src/backend/filters/filterCommon.cpp
+++ b/src/backend/filters/filterCommon.cpp
@@ -31,9 +31,11 @@ using std::vector;
 using std::endl;
 using std::string;
 
+bool qhullInited=false;
+
 //Wrapper for qhull single-pass run
 unsigned int doHull(unsigned int bufferSize, double *buffer, 
-			vector<Point3D> &resHull, Point3D &midPoint);
+			vector<Point3D> &resHull, Point3D &midPoint,bool freeHullOnExit);
 
 void writeVectorsXML(ostream &f,const char *containerName,
 		const vector<Point3D> &vectorParams, unsigned int depth)
@@ -321,7 +323,6 @@ unsigned int computeConvexHull(const vector<const FilterStreamData*> &data, unsi
 	//   work in batches.
 	Point3D midPoint;
 	float maxSqrDist=-1;
-	bool doneHull=false;
 	size_t progressReduce=PROGRESS_REDUCE;
 	size_t n=0;
 	for(size_t ui=0; ui<data.size(); ui++)
@@ -351,8 +352,6 @@ unsigned int computeConvexHull(const vector<const FilterStreamData*> &data, unsi
 					if(!tmp)
 					{
 						free(buffer);
-						if(doneHull)
-							FREE_QHULL();
 
 						return HULL_ERR_NO_MEM;
 					}
@@ -367,14 +366,14 @@ unsigned int computeConvexHull(const vector<const FilterStreamData*> &data, unsi
 					}
 
 					unsigned int errCode=0;
-					if(doneHull)
-						FREE_QHULL();
 					
-					errCode=doHull(bufferOffset,buffer,curHull,midPoint);
+					errCode=doHull(bufferOffset,buffer,curHull,midPoint,freeHull);
 					if(errCode)
+					{
+						free(buffer);
 						return errCode;
+					}
 
-					doneHull=true;
 
 					//Now compute the min sqr distance
 					//to the vertex, so we can fast-reject
@@ -394,8 +393,6 @@ unsigned int computeConvexHull(const vector<const FilterStreamData*> &data, unsi
 				if(!(*callback)(false))
 				{
 					free(buffer);
-					if(doneHull)
-						FREE_QHULL();
 					return HULL_ERR_USER_ABORT;
 				}
 	
@@ -406,11 +403,6 @@ unsigned int computeConvexHull(const vector<const FilterStreamData*> &data, unsi
 		}
 	}
 
-	//If we have actually done a convex hull in our loop,
-	// we may still have to clear it
-	if(doneHull && freeHull)
-		FREE_QHULL();
-
 	//Need at least 4 objects to construct a sufficiently large buffer
 	if(bufferOffset + curHull.size() > 4)
 	{
@@ -432,9 +424,7 @@ unsigned int computeConvexHull(const vector<const FilterStreamData*> &data, unsi
 			buffer[3*(bufferOffset+ui)+2]=curHull[ui][2];
 		}
 
-		unsigned int errCode=doHull(bufferOffset+curHull.size(),buffer,curHull,midPoint);
-		if(freeHull)
-			FREE_QHULL();
+		unsigned int errCode=doHull(bufferOffset+curHull.size(),buffer,curHull,midPoint,freeHull);
 
 		if(errCode)
 		{
@@ -473,7 +463,6 @@ unsigned int computeConvexHull(const vector<Point3D> &data, unsigned int *progre
 	//   work in batches.
 	Point3D midPoint;
 	float maxSqrDist=-1;
-	bool doneHull=false;
 
 
 	size_t progressReduce=PROGRESS_REDUCE;
@@ -500,8 +489,6 @@ unsigned int computeConvexHull(const vector<Point3D> &data, unsigned int *progre
 				if(!tmp)
 				{
 					free(buffer);
-					if(doneHull)
-						FREE_QHULL();
 
 					return HULL_ERR_NO_MEM;
 				}
@@ -516,14 +503,11 @@ unsigned int computeConvexHull(const vector<Point3D> &data, unsigned int *progre
 				}
 
 				unsigned int errCode=0;
-				if(doneHull)
-					FREE_QHULL();
 				
-				errCode=doHull(bufferOffset,buffer,curHull,midPoint);
+				errCode=doHull(bufferOffset,buffer,curHull,midPoint,freeHull);
 				if(errCode)
 					return errCode;
 
-				doneHull=true;
 
 				//Now compute the min sqr distance
 				//to the vertex, so we can fast-reject
@@ -540,8 +524,6 @@ unsigned int computeConvexHull(const vector<Point3D> &data, unsigned int *progre
 			if(!(*callback)(false))
 			{
 				free(buffer);
-				if(doneHull)
-					FREE_QHULL();
 				return HULL_ERR_USER_ABORT;
 			}
 	
@@ -551,11 +533,6 @@ unsigned int computeConvexHull(const vector<Point3D> &data, unsigned int *progre
 		}
 	}
 
-	//If we have actually done a convex hull in our loop,
-	// we may still have to clear it
-	if(doneHull && freeHull)
-		FREE_QHULL();
-
 
 	//Build the final hull, using the remaining points, and the
 	// filtered hull points
@@ -580,9 +557,7 @@ unsigned int computeConvexHull(const vector<Point3D> &data, unsigned int *progre
 			buffer[3*(bufferOffset+ui)+2]=curHull[ui][2];
 		}
 
-		unsigned int errCode=doHull(bufferOffset+curHull.size(),buffer,curHull,midPoint);
-		if(freeHull)
-			FREE_QHULL();
+		unsigned int errCode=doHull(bufferOffset+curHull.size(),buffer,curHull,midPoint,freeHull);
 
 		if(errCode)
 		{
@@ -598,8 +573,14 @@ unsigned int computeConvexHull(const vector<Point3D> &data, unsigned int *progre
 }
 
 unsigned int doHull(unsigned int bufferSize, double *buffer, 
-			vector<Point3D> &resHull, Point3D &midPoint)
+			vector<Point3D> &resHull, Point3D &midPoint, bool freeHullOnExit)
 {
+	if(qhullInited)
+	{
+		qh_freeqhull(true);
+		qhullInited=false;
+	}
+
 	const int dim=3;
 	//Now compute the new hull
 	//Generate the convex hull
@@ -607,13 +588,34 @@ unsigned int doHull(unsigned int bufferSize, double *buffer,
 	//note that the input is "joggled" to 
 	//ensure simplicial facet generation
 
+	//Qhull >=2012 has a "feature" where it won't accept null arguments for the output
+	// there is no clear way to shut it up.
+	FILE *outSquelch=0;
+#if defined(__linux__) || defined(__APPLE__) || defined(__BSD__)
+	outSquelch=fopen("/dev/null","w");
+#elif defined(__win32__) || defined(__win64__)
+	outSquelch=fopen("NUL","w");
+#endif
+
+	if(!outSquelch)
+	{
+		//Give up, just let qhull output random statistics to stderr
+		outSquelch=stderr;
+	}
+
 	qh_new_qhull(	dim,
 			bufferSize,
 			buffer,
 			false,
 			(char *)"qhull QJ", //Joggle the output, such that only simplical facets are generated
-			NULL,
-			NULL);
+			outSquelch, //QHULL's interface is bizarre, no way to set null pointer in qhull 2012 - result is inf. loop in qhull_fprintf and error reporting func. 
+			outSquelch);
+	qhullInited=true;
+
+	if(outSquelch !=stderr)
+	{
+		fclose(outSquelch);
+	}
 
 	unsigned int numPoints=0;
 	//count points
@@ -621,32 +623,30 @@ unsigned int doHull(unsigned int bufferSize, double *buffer,
 	//OKay, whilst this may look like invalid syntax,
 	//qh is actually a macro from qhull
 	//that creates qh. or qh-> as needed
-	vertexT *vertex = qh vertex_list;
-	while(vertex != qh vertex_tail)
-	{
-		vertex = vertex->next;
-		numPoints++;
-	}
+	numPoints = qh num_vertices;	
 	//--	
+	midPoint=Point3D(0,0,0);	
+
+	if(!numPoints)
+		return 0;
 
 	//store points in vector
 	//--
-	vertex= qh vertex_list;
 	try
 	{
 		resHull.resize(numPoints);	
 	}
 	catch(std::bad_alloc)
 	{
-		free(buffer);
 		return HULL_ERR_NO_MEM;
 	}
 	//--
 
 	//Compute mean point
 	//--
+	vertexT *vertex;
+	vertex= qh vertex_list;
 	int curPt=0;
-	midPoint=Point3D(0,0,0);	
 	while(vertex != qh vertex_tail)
 	{
 		resHull[curPt]=Point3D(vertex->point[0],
@@ -658,11 +658,23 @@ unsigned int doHull(unsigned int bufferSize, double *buffer,
 	}
 	midPoint*=1.0f/(float)numPoints;
 	//--
+	if(freeHullOnExit)
+	{
+		qh_freeqhull(true);
+		qhullInited=false;
+	
+	}
 
 	return 0;
 }
 
 
+void freeConvexHull()
+{
+	qh_freeqhull(true);
+	qhullInited=false;
+}
+
 DrawColourBarOverlay *makeColourBar(float minV, float maxV,size_t nColours,size_t colourMap, bool reverseMap) 
 {
 	//Set up the colour bar. Place it in a draw stream type
diff --git a/src/backend/filters/filterCommon.h b/src/backend/filters/filterCommon.h
index 26785aa..eec1f41 100644
--- a/src/backend/filters/filterCommon.h
+++ b/src/backend/filters/filterCommon.h
@@ -38,8 +38,6 @@ extern "C"
 #ifdef __POWERPC__
 	#pragma pop_macro("__POWERPC__")
 #endif
-#define FREE_QHULL() { qh_freeqhull(!qh_ALL); int curlong, totlong; \
-			qh_memfreeshort(&curlong, &totlong);}
 
 
 enum
@@ -129,6 +127,8 @@ unsigned int computeConvexHull(const std::vector<Point3D> &data,
 			unsigned int *progress, bool (*callback)(bool), 
 			std::vector<Point3D> &hullPts, bool freeHull=true);
 
+//Release the memory held by qhull, and notify the computeConvexHull routines that this has been done
+void freeConvexHull();
 //Draw a colour bar
 DrawColourBarOverlay *makeColourBar(float minV, float maxV,size_t nColours,size_t colourMap, bool reverseMap=false) ;
 
diff --git a/src/backend/filters/ionClip.cpp b/src/backend/filters/ionClip.cpp
index 9e864e2..9e8ac91 100644
--- a/src/backend/filters/ionClip.cpp
+++ b/src/backend/filters/ionClip.cpp
@@ -419,7 +419,10 @@ unsigned int IonClipFilter::refresh(const std::vector<const FilterStreamData *>
 
 					//Filter input data to output data.
 					if(cropper.runFilter(((const IonStreamData *)dataIn[ui])->data,d->data))
+					{
+						delete d;
 						return CALLBACK_FAIL; 
+					}
 
 					if(d->data.size())
 					{
diff --git a/src/backend/filters/ionColour.cpp b/src/backend/filters/ionColour.cpp
index 0de26d5..7bf43e0 100644
--- a/src/backend/filters/ionColour.cpp
+++ b/src/backend/filters/ionColour.cpp
@@ -82,7 +82,7 @@ unsigned int IonColourFilter::refresh(const std::vector<const FilterStreamData *
 	if(cacheOK)
 	{
 		ASSERT(filterOutputs.size());
-		propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,false);
+		propagateStreams(dataIn,getOut,getRefreshBlockMask(),true);
 
 		propagateCache(getOut);
 
@@ -363,7 +363,9 @@ bool IonColourFilter::setProperty(  unsigned int key,
 		case KEY_IONCOLOURFILTER_MAPEND:
 		{
 			float tmpBound;
-			stream_cast(tmpBound,value);
+			if(stream_cast(tmpBound,value))
+				return false;
+
 			if(tmpBound <=mapBounds[0])
 				return false;
 
diff --git a/src/backend/filters/ionInfo.cpp b/src/backend/filters/ionInfo.cpp
index 3e68a73..5b9984b 100644
--- a/src/backend/filters/ionInfo.cpp
+++ b/src/backend/filters/ionInfo.cpp
@@ -284,7 +284,7 @@ unsigned int IonInfoFilter::refresh(const std::vector<const FilterStreamData *>
 		}
 	}
 
-	float computedVol;
+	float computedVol=0;
 	//Compute volume as needed
 	if(wantVolume)
 	{
@@ -613,8 +613,8 @@ unsigned int IonInfoFilter::convexHullEstimateVol(const vector<const FilterStrea
 
 
 	//Free the convex hull mem
-	FREE_QHULL();
-	
+	freeConvexHull();
+
 	return 0;
 }
 
diff --git a/src/backend/filters/rangeFile.cpp b/src/backend/filters/rangeFile.cpp
index b084017..1bada94 100644
--- a/src/backend/filters/rangeFile.cpp
+++ b/src/backend/filters/rangeFile.cpp
@@ -107,7 +107,7 @@ unsigned int RangeFileFilter::refresh(const std::vector<const FilterStreamData *
 		//We don't cache anything but our modification
 		//to the ion stream data types. so we propagate
 		//these.
-		propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,false);
+		propagateStreams(dataIn,getOut,getRefreshBlockMask(),true);
 			
 		return 0;
 	}
diff --git a/src/backend/filters/spatialAnalysis.cpp b/src/backend/filters/spatialAnalysis.cpp
index 00cfe4d..dc98e01 100644
--- a/src/backend/filters/spatialAnalysis.cpp
+++ b/src/backend/filters/spatialAnalysis.cpp
@@ -1815,8 +1815,6 @@ size_t SpatialAnalysisFilter::algorithmRDF(ProgressData &progress, bool (*callba
 			{
 				if(errCode ==1)
 					return INSUFFICIENT_SIZE_ERR;
-				else if(errCode ==2)
-					return ABORT_ERR;
 				else
 				{
 					ASSERT(false);
@@ -2325,6 +2323,8 @@ size_t SpatialAnalysisFilter::algorithmDensity(ProgressData &progress,
 						newD->cached=0;
 					getOut.push_back(newD);
 				}
+				else
+					delete newD;
 			}
 			break;	
 			case STREAM_TYPE_RANGE: 
@@ -2631,6 +2631,8 @@ size_t SpatialAnalysisFilter::algorithmDensityFilter(ProgressData &progress,
 						newD->cached=0;
 					getOut.push_back(newD);
 				}
+				else
+					delete newD;
 			}
 			break;	
 			default:
@@ -2745,6 +2747,9 @@ size_t SpatialAnalysisFilter::algorithmAxialDf(ProgressData &progress,
 		const vector<const FilterStreamData *>  &dataIn, 
 		vector<const FilterStreamData * > &getOut,const RangeFile *rngF)
 {
+	//Need bins to perform histogram
+	ASSERT(numBins);
+
 	progress.step=1;
 	progress.stepName=TRANS("Extract");
 	progress.filterProgress=0;
diff --git a/src/backend/filters/spectrumPlot.cpp b/src/backend/filters/spectrumPlot.cpp
index 34363fc..39e6250 100644
--- a/src/backend/filters/spectrumPlot.cpp
+++ b/src/backend/filters/spectrumPlot.cpp
@@ -40,17 +40,17 @@ enum
 	KEY_SPECTRUM_COLOUR
 };
 
-//Limit user to one :million: bins
-const unsigned int SPECTRUM_MAX_BINS=1000000;
+//Limit user to two :million: bins
+const unsigned int SPECTRUM_MAX_BINS=2000000;
 
-const unsigned int SPECTRUM_AUTO_MAX_BINS=25000;
+const unsigned int SPECTRUM_AUTO_MAX_BINS=45000;
 
 SpectrumPlotFilter::SpectrumPlotFilter()
 {
 	minPlot=0;
 	maxPlot=150;
 	autoExtrema=true;	
-	binWidth=0.5;
+	binWidth=0.05;
 	plotStyle=0;
 	logarithmic=1;
 
@@ -288,6 +288,7 @@ unsigned int SpectrumPlotFilter::refresh(const std::vector<const FilterStreamDat
 					{
 						//save the range as a "region"
 						d->regions.push_back(rangeD->rangeFile->getRange(uj));
+						d->regionTitle.push_back(rangeD->rangeFile->getName(ionId));
 						d->regionID.push_back(uj);
 						d->parent=this;
 						//FIXME: Const correctness
diff --git a/src/backend/filters/transform.cpp b/src/backend/filters/transform.cpp
index e494559..6b04ed6 100644
--- a/src/backend/filters/transform.cpp
+++ b/src/backend/filters/transform.cpp
@@ -189,7 +189,8 @@ unsigned int TransformFilter::refresh(const std::vector<const FilterStreamData *
 	//use the cached copy if we have it.
 	if(cacheOK)
 	{
-		propagateStreams(dataIn,getOut, STREAM_TYPE_IONS,false);
+		//Propagate non-ion-types into output
+		propagateStreams(dataIn,getOut, getRefreshBlockMask(),true);
 		propagateCache(getOut);
 		return 0;
 	}
@@ -1109,7 +1110,15 @@ unsigned int TransformFilter::refresh(const std::vector<const FilterStreamData *
 			return ERR_CALLBACK_FAIL;
 		}
 		//Shuffle the value data.TODO: callback functor	
+
+#ifndef HAVE_CPP1X
+		std::srand(time(0));
 		std::random_shuffle(massData.begin(),massData.end());
+#else
+		std::mt19937_64 r;
+		r.seed(time(0));
+		std::shuffle(massData.begin(),massData.end(),r);
+#endif
 		if(!(*callback)(true))
 		{
 			delete d;
diff --git a/src/backend/filters/voxelise.cpp b/src/backend/filters/voxelise.cpp
index 88e55f6..3001475 100644
--- a/src/backend/filters/voxelise.cpp
+++ b/src/backend/filters/voxelise.cpp
@@ -906,8 +906,8 @@ void VoxeliseFilter::getProperties(FilterPropGroup &propertyList) const
 	//----
 	//TODO: Other filtering? threshold/median? laplacian? etc
 	
-	choices.clear();
 /*
+	choices.clear();
 	//Post-filtering method
 	for(unsigned int ui=0;ui<VOXELISE_FILTERTYPE_MAX; ui++)
 	{
@@ -952,9 +952,9 @@ void VoxeliseFilter::getProperties(FilterPropGroup &propertyList) const
 		propertyList.addProperty(p,curGroup);
 	}
 	propertyList.setGroupTitle(curGroup,TRANS("Filtering"));
-	curGroup++;*/
+	curGroup++;
 	//----
-
+*/
 	//start a new group for the visual representation
 	//----------------------------
 	choices.clear();
@@ -1460,10 +1460,14 @@ bool VoxeliseFilter::setProperty(unsigned int key,
 		}
 		case KEY_FILTER_MODE:
 		{
+			//Locate the current string
 			unsigned int i;
-			for (i = 0; i < VOXEL_REPRESENT_END; i++)
-				if (value == getFilterTypeString(i)) break;
-			if (i == VOXEL_REPRESENT_END)
+			for (i = 0; i < VOXELISE_FILTERTYPE_MAX; i++)
+			{
+				if (value == getFilterTypeString(i)) 
+					break;
+			}
+			if (i == VOXELISE_FILTERTYPE_MAX)
 				return false;
 			if(i!=filterMode)
 			{
diff --git a/src/backend/filtertree.cpp b/src/backend/filtertree.cpp
index 1993418..d9ad635 100644
--- a/src/backend/filtertree.cpp
+++ b/src/backend/filtertree.cpp
@@ -668,9 +668,16 @@ unsigned int FilterTree::refreshFilterTree(list<FILTER_OUTPUT_DATA > &outData,
 						currentFilter->setCaching(false);
 						break;
 					case CACHE_DEPTH_FIRST:
-						currentFilter->setCaching(cacheBytes/(1024*1024) < maxCachePercent*getAvailRAM());
-						break;
+					{
+						float ramFreeForUse;
+						ramFreeForUse= maxCachePercent/(float)100.0f*getAvailRAM();
+
+						bool cache;
+						cache=(cacheBytes/(1024*1024) ) < ramFreeForUse;
 
+						currentFilter->setCaching( cache);
+						break;
+					}
 				}
 			}
 			else
@@ -888,6 +895,77 @@ bool FilterTree::setFilterProperty(Filter *targetFilter, unsigned int key,
 
 }
 
+void FilterTree::serialiseToStringPaths(std::map<const Filter *, string > &serialisedPaths) const
+{
+
+	stack<string> pathStack;
+	pathStack.push("");
+
+	set<string> enumeratedPaths;
+
+	//Unlikely text string that can be appended to tree path
+	const char *PATH_NONCE="$>";
+
+	unsigned int lastDepth=0;
+	for(tree<Filter *>::iterator filterIt=filters.begin();
+			filterIt!=filters.end();++filterIt)
+	{
+		//if this is a new depth, pop the stack until
+		// we hit the correct level
+		unsigned int curDepth;
+		curDepth=depth(filterIt);
+		//Add one for base element
+		while(pathStack.size() > curDepth +1)
+		{
+			pathStack.pop();
+			lastDepth--;
+		}
+
+		std::string testPath;
+		testPath = pathStack.top() + string("/")  + (*filterIt)->typeString();
+
+		unsigned int nonceIncrement;
+		nonceIncrement=0;
+		while(enumeratedPaths.find(testPath) != enumeratedPaths.end())
+		{
+			std::string tailStr;
+			nonceIncrement++;
+			stream_cast(tailStr,nonceIncrement);
+
+			//Keep trying new path with nonce
+			testPath=pathStack.top()+(*filterIt)->typeString() + string(PATH_NONCE) + tailStr;
+		}
+
+		enumeratedPaths.insert(testPath);
+		const Filter *f;
+		f=(const Filter*)(*filterIt);
+		serialisedPaths.insert(make_pair(f,testPath));
+
+		pathStack.push(testPath);
+
+	}
+
+	ASSERT(serialisedPaths.size() == filters.size());
+}
+
+
+void FilterTree::serialiseToStringPaths(map<string, const Filter * > &serialisedPaths) const
+{
+	//Build one-way mapping
+	map<const Filter *, string> singleMap;
+	serialiseToStringPaths(singleMap);
+
+
+	serialisedPaths.clear();
+	for(map<const Filter*,string>::iterator it=singleMap.begin();
+		it!=singleMap.end();++it)
+	{
+		ASSERT(serialisedPaths.find(it->second) == serialisedPaths.end());
+		serialisedPaths[it->second]=it->first;	
+	}
+
+}
+
 unsigned int FilterTree::loadXML(const xmlNodePtr &treeParent, std::ostream &errStream,const std::string &stateFileDir)
 
 {
@@ -1107,7 +1185,8 @@ bool FilterTree::saveXML(std::ofstream &f,std::map<string,string> &fileMapping,
 
 	return true;
 }
-		
+	
+
 
 bool FilterTree::hasHazardousContents() const
 {
@@ -1347,6 +1426,8 @@ void FilterTree::safeDeleteFilterList( std::list<FILTER_OUTPUT_DATA> &outData,
 	for(list<FILTER_OUTPUT_DATA> ::iterator it=outData.begin(); 
 							it!=outData.end(); ) 
 	{
+		vector<bool> killV;
+		killV.resize(it->second.size(),false);
 		//Note the No-op at the loop iterator. this is needed so we can safely .erase()
 		for(size_t ui=0;ui<it->second.size();ui++)
 		{
@@ -1363,10 +1444,12 @@ void FilterTree::safeDeleteFilterList( std::list<FILTER_OUTPUT_DATA> &outData,
 			if(!f->cached)
 				delete f;
 	
-			std::swap(f,it->second.back());
-			it->second.pop_back();
+			killV[ui]=true;
 		}
 
+
+		vectorMultiErase(it->second,killV);
+
 		//Check to see if this element still has any items in its vector. if not,
 		//then discard the element
 		if(!(it->second.size()))
@@ -1776,7 +1859,18 @@ void FilterTree::clearCacheByType(unsigned int type)
 
 }
 
+size_t FilterTree::cacheCount(unsigned int typeMask) const
+{
+	size_t count=0;
+	for(tree<Filter * >::iterator it=filters.begin(); 
+					it!=filters.end(); ++it)
+	{
+		if(((*it)->getType() & typeMask) && (*it)->haveCache())
+			count++;
+	}
 
+	return count;
+}
 		
 void FilterTree::modifyRangeFiles(const map<const RangeFile *, const RangeFile *> &toModify)
 {
diff --git a/src/backend/filtertree.h b/src/backend/filtertree.h
index 41159e3..2baaa29 100644
--- a/src/backend/filtertree.h
+++ b/src/backend/filtertree.h
@@ -61,8 +61,6 @@ class FilterTree
 		void getFilterRefreshStarts(vector<tree<Filter *>::iterator > &propStarts) const;
 		
 			
-		//Retrieve the filter's pointer from its ID value	
-		Filter* getFilterByIdNonConst(unsigned long long filterId) const;
 		
 #ifdef DEBUG
 		//!Check that the output of filter refresh functions
@@ -154,6 +152,12 @@ class FilterTree
 					bool writePackage, bool useRelativePaths, unsigned int minTabDepth=0) const;
 
 
+		//!Convert tree to a series of flat strings representing the topology
+		//TODO: COnvert to bimap
+		void serialiseToStringPaths(std::map<const Filter *,string > &serialisedPaths) const;
+		void serialiseToStringPaths(std::map<string,const Filter *> &serialisedPaths) const;
+
+
 		//Topological alteration  & examination functions
 		//----------	
 		//!Remove an element and all sub elements from the tree, 
@@ -222,6 +226,9 @@ class FilterTree
 		//Overwrite the contents of the pointed-to range files with
 		// the map contents
 		void modifyRangeFiles(const map<const RangeFile *, const RangeFile *> &toModify);
+
+
+		size_t cacheCount(unsigned int typeMask = STREAMTYPE_MASK_ALL) const;
 };
 
 #endif
diff --git a/src/backend/filtertreeAnalyse.cpp b/src/backend/filtertreeAnalyse.cpp
index 4bd630b..e346c5e 100644
--- a/src/backend/filtertreeAnalyse.cpp
+++ b/src/backend/filtertreeAnalyse.cpp
@@ -48,6 +48,7 @@ bool filterIsSampling(const Filter *f)
 				affectsSampling = (props.getPropValue(DATALOAD_KEY_SAMPLE).data!= "0");
 			else
 				affectsSampling=false;
+			break;
 		}
 		case FILTER_TYPE_IONDOWNSAMPLE:
 		{
@@ -345,7 +346,7 @@ void FilterTreeAnalyse::checkRequiredParent(const FilterTree &f)
 
 		//walk back up the tree, to locate the parent (technically ancestor)
 		// we are looking for
-		while(it != treeFilt.begin())
+		while(treeFilt.depth(it))
 		{
 			it= treeFilt.parent(it);
 			if((*it)->getType() == type)
diff --git a/src/backend/plot.cpp b/src/backend/plot.cpp
index bd49a67..ea958a0 100644
--- a/src/backend/plot.cpp
+++ b/src/backend/plot.cpp
@@ -43,18 +43,6 @@ using std::string;
 using std::pair;
 using std::vector;
 
-float makePositiveLog(float v)
-
-{
-	if(v <=1.0f)
-		v=0.0f;
-	else
-		v=log10(v);
-
-	return v;
-}
-
-
 //Axis min/max bounding box is disallowed to be exactly zero on any given axis
 // perform a little "push off" by this fudge factor
 const float AXIS_MIN_TOLERANCE=10*sqrtf(std::numeric_limits<float>::epsilon());
@@ -332,6 +320,7 @@ const PlotRegion &PlotRegion::operator=(const PlotRegion &oth)
 	accessMode=oth.accessMode;
 	parentObject=oth.parentObject;
 	id=oth.id;
+	label=oth.label;
 
 	r=oth.r; g=oth.g; b=oth.b;
 	bounds=oth.bounds;
@@ -445,6 +434,11 @@ void PlotRegion::updateParent(size_t regionChangeType,
 	}
 }
 
+std::string PlotRegion::getName() const
+{
+	return label; 
+}
+
 PlotWrapper::PlotWrapper()
 {
 	COMPILE_ASSERT(THREEDEP_ARRAYSIZE(plotModeStrings) == PLOT_TRACE_ENDOFENUM);
@@ -777,6 +771,19 @@ unsigned int PlotWrapper::getVisibleType() const
 	return visibleType;
 }
 
+void PlotWrapper::getVisibleIDs(vector<unsigned int> &visiblePlotIDs ) const
+{
+
+	for(size_t ui=0;ui<plottingData.size() ; ui++)
+	{
+		if(isPlotVisible(ui))
+			visiblePlotIDs.push_back(ui);
+	}
+
+}
+
+
+
 void PlotWrapper::findRegionLimit(unsigned int plotId, unsigned int regionId,
 				unsigned int movementType, float &maxX, float &maxY) const
 {
@@ -785,7 +792,7 @@ void PlotWrapper::findRegionLimit(unsigned int plotId, unsigned int regionId,
 
 }
 
-void PlotWrapper::drawPlot(mglGraph *gr) const
+void PlotWrapper::drawPlot(mglGraph *gr, bool &haveUsedLog) const
 {
 	unsigned int visType = getVisibleType();
 	if(visType == PLOT_TYPE_ENUM_END || 
@@ -868,7 +875,7 @@ void PlotWrapper::drawPlot(mglGraph *gr) const
 	gr->Title(sT.c_str());
 	
 
-	bool haveUsedLog=false;
+	haveUsedLog=false;
 	mglPoint min,max;
 	switch(visType)
 	{
@@ -923,6 +930,14 @@ void PlotWrapper::drawPlot(mglGraph *gr) const
 				axisCross.y=min.y;
 			}
 			
+			//Allow logarithmic mode, as needed.
+			// mathgl does not like a zero coordinate for plotting
+			if(min.y == 0 && useLogPlot)
+			{
+				min.y=0.1;
+				if(axisCross.y < min.y)
+					axisCross.y=min.y;
+			}
 			//"Push" bounds around to prevent min == max
 			// This is a hack to prevent mathgl from inf. looping
 			//---
@@ -935,13 +950,13 @@ void PlotWrapper::drawPlot(mglGraph *gr) const
 			if(mglFloatTooClose(min.y , max.y))
 				max.y+=1;
 			//------
+			
 
 			//tell mathgl about the bounding box	
 #ifdef USE_MGL2
 			gr->SetRanges(min,max);
+			
 			gr->SetOrigin(axisCross);
-#else
-			gr->Axis(min,max,axisCross);
 #endif
 
 			WARN((fabs(min.x-max.x) > sqrt(std::numeric_limits<float>::epsilon())), 
@@ -949,12 +964,19 @@ void PlotWrapper::drawPlot(mglGraph *gr) const
 			WARN((fabs(min.y-max.y) > sqrt(std::numeric_limits<float>::epsilon())), 
 					"WARNING: Mgl limits (Y) too Close! Due to limitiations in MGL, This may inf. loop!");
 
+			if(useLogPlot)
+				gr->SetFunc("","lg(y)");
+			else
+				gr->SetFunc("","");
 #ifdef USE_MGL2
+			gr->Axis();
+
 			mglCanvas *canvas = dynamic_cast<mglCanvas *>(gr->Self());
 			canvas->AdjustTicks("x");
 			canvas->SetTickTempl('x',"%g"); //Set the tick type
 			canvas->Axis("xy"); //Build an X-Y crossing axis
 #else
+			gr->Axis(min,max,axisCross);
 			gr->AdjustTicks("x");
 			gr->SetXTT("%g"); //Set the tick type
 			gr->Axis("xy"); //Build an X-Y crossing axis
@@ -989,13 +1011,6 @@ void PlotWrapper::drawPlot(mglGraph *gr) const
 			//Prevent mathgl from dropping lines that straddle the plot bound.
 			gr->SetCut(false);
 			
-			if(useLogPlot && !notLog)
-				sY = string("\\log_{10}(") + sY + ")";
-			else if (useLogPlot && notLog)
-			{
-				sY = string(TRANS("Mixed log/non-log:")) + sY ;
-			}
-
 			//if we have to draw overlapping regions, do so
 			if(highlightRegionOverlaps)
 			{
@@ -1048,16 +1063,12 @@ void PlotWrapper::drawPlot(mglGraph *gr) const
 
 	gr->Label('x',sX.c_str());
 	gr->Label('y',sY.c_str(),0);
-	
+
 	if(haveMultiTitles)
 	{
 #ifdef USE_MGL2
-		const float LEGEND_SIZE=5.0f;
-		mreal oldFontSize=gr->Self()->GetFontSize();
-		gr->SetFontSize(LEGEND_SIZE);
 		if(drawLegend)
 			gr->Legend();
-		gr->SetFontSize(oldFontSize);
 #else
 		gr->SetLegendBox(false);
 		//I have NO idea what this size value is about,
@@ -1070,7 +1081,7 @@ void PlotWrapper::drawPlot(mglGraph *gr) const
 			gr->Legend(0x3,"rL",LEGEND_SIZE);
 #endif
 	}
-
+	
 	overlays.draw(gr,colourFixer,min,max,haveUsedLog);
 }
 
@@ -1204,6 +1215,12 @@ void PlotWrapper::switchOutRegionParent(std::map<const RangeFileFilter *, RangeF
 	}
 }
 
+void PlotWrapper::overrideLastVisible(vector< pair<const void *,unsigned int>  > &overridden)
+{
+
+	lastVisiblePlots=overridden;	
+
+}
 
 //-----------
 
@@ -1380,14 +1397,6 @@ void Plot1D::getBounds(float &xMin,float &xMax,float &yMin,float &yMax) const
 	yMax=maxY;
 
 	ASSERT(yMin <=yMax);
-	//If we are in log mode, then we need to set the
-	//log of that bound before emitting it.
-	if(logarithmic)
-	{
-		//Disallow negative logarithmic bounds
-		yMax=makePositiveLog(yMax);
-	}
-	ASSERT(yMin <=yMax);
 }
 
 bool Plot1D::empty() const
@@ -1416,28 +1425,16 @@ void Plot1D::drawPlot(mglGraph *gr,MGLColourFixer &fixer) const
 
 	//Pre-process the data, before handing to mathgl
 	//--
-	if(logarithmic)
+	for(unsigned int uj=0;uj<xValues.size(); uj++)
 	{
-		for(unsigned int uj=0;uj<xValues.size(); uj++)
-		{
-			bufferX[uj] = xValues[uj];
-			bufferY[uj] = makePositiveLog(yValues[uj]);
+		bufferX[uj] = xValues[uj];
+		bufferY[uj] = yValues[uj];
 
-		}
 	}
-	else
+	if(showErrs)
 	{
-		for(unsigned int uj=0;uj<xValues.size(); uj++)
-		{
-			bufferX[uj] = xValues[uj];
-			bufferY[uj] = yValues[uj];
-
-		}
-		if(showErrs)
-		{
-			for(unsigned int uj=0;uj<errBars.size(); uj++)
-				bufferErr[uj] = errBars[uj];
-		}
+		for(unsigned int uj=0;uj<errBars.size(); uj++)
+			bufferErr[uj] = errBars[uj];
 	}
 	//--
 	
@@ -1461,6 +1458,7 @@ void Plot1D::drawPlot(mglGraph *gr,MGLColourFixer &fixer) const
 	colourCode[1]='\0';
 	//---
 
+
 	//Plot the appropriate form	
 	switch(traceType)
 	{
@@ -1619,7 +1617,7 @@ void RegionGroup::getRegion(unsigned int offset, PlotRegion &r) const
 }
 
 
-void RegionGroup::addRegion(unsigned int regionID,float start, float end, 
+void RegionGroup::addRegion(unsigned int regionID,const std::string &name, float start, float end, 
 			float rNew, float gNew, float bNew, Filter *parentFilter)
 {
 	ASSERT(start <end);
@@ -1632,6 +1630,7 @@ void RegionGroup::addRegion(unsigned int regionID,float start, float end,
 	region.bounds.push_back(std::make_pair(start,end));
 	//Set the ID for the  region
 	region.id = regionID;
+	region.label=name;
 #ifdef DEBUG
 	//Ensure ID value is unique per parent
 	for(size_t ui=0;ui<regions.size();ui++)
@@ -1852,10 +1851,17 @@ void PlotOverlays::draw(mglGraph *gr,MGLColourFixer &fixer,
 				gr->Line (mglPoint(bufX[uj],std::max(0.0f,(float)boundMin.y)),
 					mglPoint(bufX[uj],bufY[uj]),colourCode,100);
 
-				const float STANDOFF_FACTOR=1.05f;
+				//Print labels near to the text
+				const float STANDOFF_FACTOR=1.05;
+#ifdef USE_MGL2
 				gr->Puts(mglPoint(bufX[uj],bufY[uj]*STANDOFF_FACTOR),
 					overlayData[ui].title.c_str());
+#else
+				//Font size in mathgl uses negative values to set a relative font size
+				gr->Text(mglPoint(bufX[uj],bufY[uj]*STANDOFF_FACTOR),
+					overlayData[ui].title.c_str(),"",-0.6);
 
+#endif
 			}
 		}
 	}
diff --git a/src/backend/plot.h b/src/backend/plot.h
index 047e270..6270ee8 100644
--- a/src/backend/plot.h
+++ b/src/backend/plot.h
@@ -112,6 +112,8 @@ class PlotRegion
 
 		//The ID value for this region, used when interacting with parent object
 		unsigned int id;
+
+		std::string label;
 		
 		PlotRegion();
 
@@ -130,6 +132,8 @@ class PlotRegion
 
 		RangeFile *getParentAsRangeFile() const { ASSERT(accessMode==ACCESS_MODE_RANGEFILE); return (RangeFile*)parentObject;};
 
+		std::string getName() const;
+
 };
 
 //Handles an array of regions, for drawing and editing of the array
@@ -151,7 +155,7 @@ class RegionGroup
 		void clear() {regions.clear(); };
 		
 		//!Append a region to the plot
-		void addRegion(unsigned int regionId, float start, float end,	
+		void addRegion(unsigned int regionId, const std::string &name, float start, float end,	
 				float r,float g, float b, Filter *parentFilter);
 		//!Retrieve the ID of the non-overlapping region in X-Y space
 		bool getRegionIdAtPosition(float x, float y, unsigned int &id) const;
@@ -348,6 +352,7 @@ class PlotWrapper
 
 		//! Data regarding plots were visible previously
 		// first pair entry is the parent object pointer. second is the parent plot index
+		//TODO: Convert to serialised parent path 
 		std::vector<std::pair< const void *, unsigned int> > lastVisiblePlots;
 	
 		//Position independant ID handling for the 
@@ -423,7 +428,7 @@ class PlotWrapper
 		//!Get the bounds for the plot
 		void scanBounds(float &xMin,float &xMax,float &yMin,float &yMax) const;
 		//Draw the plot onto a given MGL graph. Only one type (1D,2D etc) of plot may be visible
-		void drawPlot(mglGraph *graph) const;
+		void drawPlot(mglGraph *graph, bool &usingLogMode) const;
 
 		//!Set the X Y and title strings
 		void setStrings(unsigned int plotID,
@@ -433,10 +438,12 @@ class PlotWrapper
 		//!Set the parent information for a given plot
 		void setParentData(unsigned int plotID,
 				const void *parentObj, unsigned int plotIndex);
-	
+
+		//TODO: Type hack - should return const Filter *
 		//!Get the parent object fo rthis plot
 		const void *getParent(unsigned int plotID) { ASSERT(plotID < plottingData.size()); return plottingData[plotID]->parentObject;}
 
+		unsigned int getParentIndex(unsigned int plotId) const { ASSERT(plotId < plottingData.size()); return plottingData[plotId]->parentPlotIndex;}
 		//!Set the plotting mode.
 		void setTraceStyle(unsigned int plotID,unsigned int mode);
 
@@ -460,6 +467,9 @@ class PlotWrapper
 
 		//!Returns true if plot is visible, based upon its uniqueID.
 		bool isPlotVisible(unsigned int plotID) const;
+		
+		
+		void getVisibleIDs(vector<unsigned int> &plotID) const;
 
 		//!Disable user bounds
 		void disableUserBounds(){plotChanged=true;applyUserBounds=false;};
@@ -475,6 +485,9 @@ class PlotWrapper
 
 		//!Set whether to enable the legend or not
 		void setLegendVisible(bool vis) { drawLegend=vis;plotChanged=true;};
+		
+		bool getLegendVisible() const { return drawLegend; }
+		
 
 		//!Add a plot to the list of available plots. Control of the pointer becomes
 		//transferred to this class, so do *NOT* delete it after calling this function
@@ -520,6 +533,11 @@ class PlotWrapper
 		void switchOutRegionParent(std::map<const RangeFileFilter *, RangeFile> &switchMap);
 
 		void setRegionGroup(size_t plotId, RegionGroup &r);
+
+
+		//TODO: convert to serialised parent path
+		//Override the last-visible selection. This allows for overriding which plots were selected, which is normally handled internally
+		void overrideLastVisible(vector< pair<const void *,unsigned int>  > &overridden); 
 };
 
 #endif
diff --git a/src/backend/state.cpp b/src/backend/state.cpp
index 7ec92c9..8c3ab8f 100644
--- a/src/backend/state.cpp
+++ b/src/backend/state.cpp
@@ -33,6 +33,8 @@ AnalysisState::AnalysisState()
 	useRelativePathsForSave=false;
 	activeCamera=0;
 
+	plotLegendEnable=true;
+
 	rBack=gBack=bBack=0;
 }
 
@@ -53,7 +55,9 @@ void AnalysisState::operator=(const AnalysisState &oth)
 	for(size_t ui=0;ui<savedCameras.size();ui++)
 		savedCameras[ui]= oth.savedCameras[ui]->clone();
 
-
+	enabledStartupPlots=oth.enabledStartupPlots;
+	plotLegendEnable=oth.plotLegendEnable;
+	
 	undoTrees=oth.undoTrees; 
 	redoTrees=oth.redoTrees;
 
@@ -74,6 +78,9 @@ void AnalysisState::operator=(const AnalysisState &oth)
 	redoFilterStack=oth.redoFilterStack;
 	undoFilterStack=oth.undoFilterStack;
 
+	animationState=oth.animationState;
+	animationPaths=oth.animationPaths;
+	
 }
 
 AnalysisState::~AnalysisState()
@@ -95,6 +102,9 @@ void AnalysisState::clear()
 	undoTrees.clear(); 
 	redoTrees.clear();
 
+
+	enabledStartupPlots.clear();
+	
 	fileName.clear();
 	workingDir.clear();
 }
@@ -143,7 +153,16 @@ bool AnalysisState::save(const char *cpFilename, std::map<string,string> &fileMa
 		 gBack  << "\" b=\"" << bBack << "\"/>" <<  endl;
 	
 	f << tabs(1) << "<showaxis value=\"" << worldAxisMode << "\"/>"  << endl;
-
+	
+	//write plot status
+	f << tabs(1) << "<plotstatus legend=\"" << boolStrEnc(plotLegendEnable) << "\">"  << endl;
+	
+	for(size_t ui=0;ui<enabledStartupPlots.size(); ui++)
+	{
+		
+		f<< tabs(2) << "<enableplot filter=\"" << escapeXML(enabledStartupPlots[ui].first) << "\" id=\"" << enabledStartupPlots[ui].second << "\"/>" << endl;
+	}
+	f<<tabs(1) << "</plotstatus>" << endl;
 
 	if(useRelativePathsForSave)
 	{
@@ -221,6 +240,23 @@ bool AnalysisState::save(const char *cpFilename, std::map<string,string> &fileMa
 
 	}
 
+	//Save any animation data
+	if(animationState.getMaxFrame())
+	{
+		//Write the flattened tree - "path" -  data
+		f << tabs(1) << "<animationstate>" << endl;
+		f << tabs(2) << "<animationtree>" << endl;
+		for(unsigned int ui=0;ui<animationPaths.size();ui++)
+		{
+			f << tabs(3) << "<entry key=\"" << animationPaths[ui].second << "\" path=\"" 
+					<< animationPaths[ui].first << "\"/>" << endl;
+		}
+		f << tabs(2) << "</animationtree>" << endl;
+
+		animationState.writeState(f,STATE_FORMAT_XML,2);	
+
+		f << tabs(1) << "</animationstate>" << endl;
+	}
 
 
 	//Close XMl tag.	
@@ -275,6 +311,7 @@ bool AnalysisState::load(const char *cpFilename, std::ostream &errStream, bool m
 	vector<Camera *> newCameraVec;
 	vector<Effect *> newEffectVec;
 	vector<pair<string,FilterTree > > newStashes;
+	
 
 	std::string stateDir=onlyDir(cpFilename);
 	try
@@ -424,6 +461,43 @@ bool AnalysisState::load(const char *cpFilename, std::ostream &errStream, bool m
 			throw 1;
 		}
 
+		//Get plot legend status.
+		// TODO: Deprecate failure check: this is new as of 0.0.16 release (internal ) 
+		{
+		xmlNodePtr tmpStatPtr=nodePtr;
+		//Find list of which plots are enabled
+		if(!XMLHelpFwdToElem(tmpStatPtr,"plotstatus"))
+		{
+
+			//Is the legend enabled?
+			bool enableLegend;
+			if(!XMLHelpGetProp(enableLegend,tmpStatPtr,"legend"))
+				plotLegendEnable=enableLegend;
+
+			//find plot listing
+			xmlNodePtr enablePlotPtr=tmpStatPtr->xmlChildrenNode;
+
+			while(enablePlotPtr)
+			{
+				if(XMLHelpFwdToElem(enablePlotPtr,"enableplot"))
+					break;
+				
+				string filterPath;
+				unsigned int plotID;
+
+				//just abort loading this section if we can't find the filter
+				if(XMLHelpGetProp(plotID,enablePlotPtr,"id"))
+					break;
+			
+				if(XMLHelpGetProp(filterPath,enablePlotPtr,"filter"))
+					break;
+
+				enabledStartupPlots.push_back(make_pair(unescapeXML(filterPath),plotID));
+			}
+
+		}
+		}
+
 		//find filtertree data
 		if(XMLHelpFwdToElem(nodePtr,"filtertree"))
 		{
@@ -565,6 +639,7 @@ bool AnalysisState::load(const char *cpFilename, std::ostream &errStream, bool m
 		{
 			std::string tmpStr;
 			nodePtr=nodePtr->xmlChildrenNode;
+
 			while(!XMLHelpNextType(nodePtr,XML_ELEMENT_NODE))
 			{
 				tmpStr =(const char *)nodePtr->name;
@@ -604,10 +679,68 @@ bool AnalysisState::load(const char *cpFilename, std::ostream &errStream, bool m
 				newEffectVec.push_back(e);				
 			}
 		}
-		nodePtr=nodeStack.top();
 		nodeStack.pop();
+		nodePtr=nodeStack.top();
 
 
+		if(!XMLHelpFwdToElem(nodePtr,"animationstate"))
+		{
+			nodePtr=nodePtr->xmlChildrenNode;
+			if(!nodePtr)
+				throw 1;
+
+			if(XMLHelpFwdToElem(nodePtr,"animationtree"))
+				throw 1;
+			
+			//Save this location
+			nodeStack.push(nodePtr);
+
+			nodePtr=nodePtr->xmlChildrenNode;
+			if(!nodePtr)
+				throw 1;
+
+			vector<pair<string, size_t> > animationPathTmp;
+			//Read the "flattened animation tree
+			while(!XMLHelpFwdToElem(nodePtr,"entry"))
+			{
+				std::string path; 
+				size_t val;
+				if(XMLHelpGetProp(val,nodePtr,"key"))
+					throw 1;
+		
+				//read the flattened tree "path" data
+				//--
+				xmlChar *xmlString;
+				//grab the xml property
+				xmlString = xmlGetProp(nodePtr,(const xmlChar *)"path");
+				if(!xmlString)
+					throw 1;
+				path=(char *)xmlString;
+				xmlFree(xmlString);
+				//--
+
+
+				animationPathTmp.push_back(make_pair(path,val));
+			}
+
+			nodePtr=nodeStack.top();
+			nodeStack.pop();
+
+			if(XMLHelpFwdToElem(nodePtr,"propertyanimator"))
+				throw 1;
+			
+			nodePtr=nodePtr->xmlChildrenNode;
+			if(!nodePtr)
+				throw 1;
+			
+			//Try to load animation state
+			animationState.loadState(nodePtr);
+			animationPaths.swap(animationPathTmp);
+
+		}
+		
+		nodePtr=nodeStack.top();
+		nodeStack.pop();
 
 		nodeStack.push(nodePtr);
 	}
@@ -619,6 +752,7 @@ bool AnalysisState::load(const char *cpFilename, std::ostream &errStream, bool m
 	}
 	xmlFreeDoc(doc);	
 
+
 	//Check that stashes are uniquely named
 	// do brute force search, as there are unlikely to be many stashes	
 	for(unsigned int ui=0;ui<newStashes.size();ui++)
@@ -638,8 +772,6 @@ bool AnalysisState::load(const char *cpFilename, std::ostream &errStream, bool m
 
 	if(!merge)
 	{
-		//Erase any viscontrol data, seeing as we got this far	
-		clear(); 
 		//Now replace it with the new data
 		activeTree.swap(newFilterTree);
 		std::swap(stashedTrees,newStashes);
@@ -842,6 +974,13 @@ void AnalysisState::getBackgroundColour(float &r, float &g, float &b) const
 	b=bBack;
 }
 
+void AnalysisState::getAnimationState( PropertyAnimator &p, vector<pair<string,size_t> > &animPth) const
+{
+	p=animationState;
+	animPth=animationPaths;
+}
+
+
 void AnalysisState::copyEffects(vector<Effect *> &e) const
 {
 	e.clear();
@@ -998,8 +1137,6 @@ void AnalysisState::eraseStash(size_t offset)
 	stashedTrees.erase(stashedTrees.begin() + offset);
 }
 
-
-
 #ifdef DEBUG
 
 #include "./filters/ionDownsample.h"
@@ -1028,12 +1165,15 @@ bool testStateReload()
 	genRandomFilename(saveString);
 
 	map<string,string> dummyMapping;
-	someState.save(saveString.c_str(),dummyMapping,false);
+	if(!someState.save(saveString.c_str(),dummyMapping,false))
+	{
+		WARN(false, "Unable to save file.. write permissions? Skipping test");
+		return true;
+	}
 	someState.clear();
 
 	std::ofstream strm;
-	someState.load(saveString.c_str(),strm,false);
-
+	TEST(someState.load(saveString.c_str(),strm,false),"State load");
 
 	TEST(someState.getStashCount() == 1,"Stash save+load");
 	std::pair<string,FilterTree> stashOut;
diff --git a/src/backend/state.h b/src/backend/state.h
index c89333d..3ea33e1 100644
--- a/src/backend/state.h
+++ b/src/backend/state.h
@@ -27,6 +27,8 @@
 #include "tree.hh"
 #include "filtertree.h"
 
+#include "animator.h"
+
 //Unit tests
 #ifdef DEBUG
 bool runStateTests();
@@ -84,8 +86,13 @@ class AnalysisState
 		//Camera user has currently activated
 		size_t activeCamera;
 
+		//Should the plot legend be enabled
+		bool plotLegendEnable;
+
+		//Filter path and ID of plots that need to be enabled at startup 
+		vector<pair<string,unsigned int> > enabledStartupPlots;
 
-		//true if systme should be using relative paths when
+		//true if system should be using relative paths when
 		// saving state
 		bool useRelativePathsForSave;
 		
@@ -102,7 +109,14 @@ class AnalysisState
 		//!Undo filter tree stack 
 		std::deque<FilterTree> undoFilterStack,redoFilterStack;
 		
-		
+	
+		//!User-set animation properties
+		PropertyAnimator animationState;
+
+		//TODO: Migrte into some state wrapper class with animationState
+		//Additional state information for animation
+		vector<pair<string,size_t>  > animationPaths;
+
 		bool camNameExists(const std::string &s)  const ;
 
 		//Clear the effect vector
@@ -204,6 +218,14 @@ class AnalysisState
 		//Set the effect vector
 		void setEffectsByCopy(const vector<const Effect *> &e);
 
+		//Plotting functions
+		//=======
+
+		void setPlotLegend(bool enabled) {plotLegendEnable=enabled;}
+		void setEnabledPlots(const vector<pair<string,unsigned int> > &enabledPlots) {enabledStartupPlots = enabledPlots;}
+
+		void getEnabledPlots(vector<pair<string,unsigned int> > &enabledPlots) const { enabledPlots=enabledStartupPlots;}
+
 		//Set whether to use relative paths in saved file
 		void setUseRelPaths(bool useRel);
 		//get whether to use relative paths in saved file
@@ -219,6 +241,7 @@ class AnalysisState
 		void setFilterTreeByClone(const FilterTree &f);
 		
 		//Obtain a copy of the internal filter tree
+		// - underlying pointers will be different!
 		void copyFilterTree(FilterTree &f) const;
 
 		///Set the stashed filters to use internally
@@ -265,6 +288,11 @@ class AnalysisState
 		//Returns true if there is any data in the stash or the active tree
 		bool hasStateData() const { return (stashedTrees.size() || activeTree.size());}
 
+
+		void setAnimationState(const PropertyAnimator &p,const vector<pair<string,size_t> > &animPth) {animationState=p;animationPaths=animPth;}
+		
+		void getAnimationState( PropertyAnimator &p, vector<pair<string,size_t> > &animPth) const; 
+
 		//TODO: REMOVE ME - needed for viscontrol linkage
 		void setStateModified(int state) const { modifyLevel=state;}
 
diff --git a/src/backend/viscontrol.cpp b/src/backend/viscontrol.cpp
index f26dc9f..1f00d31 100644
--- a/src/backend/viscontrol.cpp
+++ b/src/backend/viscontrol.cpp
@@ -75,11 +75,14 @@ VisController::VisController()
 
 	limitIonOutput=DEFAULT_POINT_OUTPUT_LIMIT;
 
+
 	amRefreshing=false;
 	pendingUpdates=false;
+	deferClearPlotVisibility=false;
+	
 	curProg.reset();
 	//Assign global variable its init value
-	ASSERT(!delayTime); //Should not have been united yet.
+	ASSERT(!delayTime); //Should not have been inited yet.
 
 	delayTime = new wxStopWatch();
 
@@ -101,6 +104,7 @@ void VisController::abort()
 					
 void VisController::addFilter(Filter *f, bool isBase,size_t parentId)
 { 
+	pushUndoStack();
 	if(!isBase)
 		filterTree.addFilter(f,filterMap[parentId]);
 	else
@@ -142,6 +146,7 @@ void VisController::switchoutFilterTree(FilterTree &f)
 	std::map<Filter*,Filter*> filterRemap;
 	for(tree<Filter*>::pre_order_iterator itA=f.depthBegin(); itA!=f.depthEnd(); ++itA)
 	{
+		ASSERT(itB != filterTree.depthEnd());
 		filterRemap[*itA]=*itB;	
 		++itB;
 	}
@@ -542,7 +547,10 @@ unsigned int VisController::updateScene(list<vector<const FilterStreamData *> >
 	vector<DrawableObj *> sceneDrawables;
 	
 	//erase the contents of each plot 
-	targetPlots->clear(true); //Clear, but preserve selection information.
+	if(deferClearPlotVisibility)
+		deferClearPlotVisibility=false;
+	else
+		targetPlots->clear(true); //Clear, but preserve selection information.
 
 
 	//Names for plots
@@ -640,6 +648,7 @@ unsigned int VisController::updateScene(list<vector<const FilterStreamData *> >
 								//using the region data stored
 								//in the plot stream
 								plotNew->regionGroup.addRegion(plotData->regionID[ui],
+									plotData->regionTitle[ui],	
 									plotData->regions[ui].first,
 									plotData->regions[ui].second,
 									plotData->regionR[ui],
@@ -764,6 +773,7 @@ unsigned int VisController::updateScene(list<vector<const FilterStreamData *> >
 						}
 						default:
 							ASSERT(false);
+							delete v;
 							;
 					}
 
@@ -898,6 +908,8 @@ unsigned int VisController::updateScene(list<vector<const FilterStreamData *> >
 			displayList->endList();
 			targetScene->addDrawable(displayList);
 		}
+
+		delete displayList;
 	}
 	else
 	{
@@ -1062,6 +1074,7 @@ bool VisController::saveState(const char *cpFilename, std::map<string,string> &f
 	//Make a copy of the state, as some variables are still stored in viscontrol's scope
 	state=currentState; 
 	
+	
 	//-- scene variables --
 	float rBack,gBack,bBack;
 	targetScene->getBackgroundColour(rBack,gBack,bBack);
@@ -1075,12 +1088,48 @@ bool VisController::saveState(const char *cpFilename, std::map<string,string> &f
 	state.setEffectsByCopy(effectVec);
 	//------
 
+	//Plotting variables
+	//------------------
+	//TODO: Migrate plot status out of viscontrol
+	// and into state
+	state.setPlotLegend(targetPlots->getLegendVisible());
+
+	{
+	vector<unsigned int> visiblePlotIDs;
+	targetPlots->getVisibleIDs(visiblePlotIDs);
+	
+	//Obtain filter pointer -> serialised name data
+	map<const Filter *,string> serialisedFilterNames;
+	filterTree.serialiseToStringPaths(serialisedFilterNames);
+
+	vector<pair<string, unsigned int> > visiblePlotNames;
+	visiblePlotNames.resize(visiblePlotIDs.size());
+
+	for(size_t ui=0;ui<visiblePlotIDs.size (); ui++)
+	{
+		unsigned int thisID;
+		thisID= visiblePlotIDs[ui];
+
+		const Filter *f;
+		f=(const Filter *)targetPlots->getParent(thisID);
+	
+		ASSERT(serialisedFilterNames.find(f) != serialisedFilterNames.end());
+		visiblePlotNames[ui] = make_pair(
+			serialisedFilterNames[f], targetPlots->getParentIndex(thisID));
+	}
+
+	state.setEnabledPlots(visiblePlotNames);
+	}
+	//------------------
+
 	//-- viscontrol variables
 	state.setFilterTreeByClone(filterTree);
 	//--
 
 	if(resetModifyLevel)
 		currentState.setStateModified(false);
+
+
 	return state.save(cpFilename,fileMapping,writePackage);
 }
 
@@ -1125,6 +1174,37 @@ bool VisController::loadState(const char *cpFilename, std::ostream &errStream, b
 		currentState.copyEffects(e);
 		targetScene->setEffectVec(e);
 		//----
+
+		//Conver the enabled plots to underlying
+		// pointer representation, then pass to 
+		// plot functions, so it can enable plots
+		// after refresh
+		vector<pair<string, unsigned int> > enabledPlotsPath;
+		currentState.getEnabledPlots(enabledPlotsPath);
+
+		map<string,const Filter *> pathMap;
+		filterTree.serialiseToStringPaths(pathMap);	
+		
+		vector<pair<const void *, unsigned int> > enabledPlotsPtr;
+		for(unsigned int ui=0;ui<enabledPlotsPath.size();ui++)
+		{
+			std::string curPath;
+			curPath=enabledPlotsPath[ui].first;
+			//Check to see if the filter tree we loaded
+			// has the same info as the selected item
+			if(pathMap.find(curPath)!=pathMap.end())
+			{
+		
+				enabledPlotsPtr.push_back(
+					make_pair((void *)pathMap[curPath],enabledPlotsPath[ui].second));
+			}
+		}
+
+		//override the target plots internal rep. of what is visible,
+		// so that at next refresh it will pick this up and auto-select the plots,
+		// if it caun
+		targetPlots->overrideLastVisible(enabledPlotsPtr); 
+		deferClearPlotVisibility=true;
 	}
 
 
@@ -1381,6 +1461,17 @@ void VisController::setEffects(bool enable)
 	targetScene->setEffects(enable);
 }
 
+void VisController::setAnimationState(const PropertyAnimator &p,
+		const std::vector<pair<string,size_t> > &pathMapping) 
+{
+	//Add animation state saving
+	currentState.setAnimationState(p,pathMapping);
+}
+
+void VisController::getAnimationState(PropertyAnimator &p, std::vector<pair<string,size_t> > &pathMapping) const
+{
+	currentState.getAnimationState(p,pathMapping);
+}
 
 bool VisController::hasHazardousContents() const
 {
diff --git a/src/backend/viscontrol.h b/src/backend/viscontrol.h
index d329fd9..6b348e0 100644
--- a/src/backend/viscontrol.h
+++ b/src/backend/viscontrol.h
@@ -31,6 +31,7 @@ class Scene;
 
 #include "filtertreeAnalyse.h"
 #include "backend/plot.h"
+#include "backend/animator.h"
 #include "state.h"
 
 #include "backend/APT/APTFileIO.h"
@@ -73,6 +74,7 @@ class VisController
 	
 		//!Analysis results for last filter tree refresh
 		FilterTreeAnalyse fta;
+
 		//--------------------
 
 		
@@ -91,6 +93,12 @@ class VisController
 		//!Maximum number of ions to pass to scene
 		size_t limitIonOutput;
 
+		//TODO: Move plot visbility data into state file, 
+		// thus obviating the need to do this
+		//!Should we defer altering plot visibility during refresh
+		// this is used when loading a state file to prevent from bringing older selection state into current plots
+		bool deferClearPlotVisibility;
+
 		void clear();
 	
 
@@ -438,6 +446,16 @@ class VisController
 		string getFilename() const { return currentState.getFilename(); }
 		//Return the current state's filename
 		void setFilename(std::string &s) {currentState.setFilename(s); }
+
+		//!Set the animation state, by copy, overwriting the current one
+		// pathmapping provides an animation ID <-> serialised filter path mapping
+		void setAnimationState(const PropertyAnimator &pA, 
+				const std::vector<pair<string,size_t> > &pathMapping) ;
+		
+		//!Retrieve the animation state, by copy, overwriting the current one
+		void getAnimationState(PropertyAnimator &pA, 
+				std::vector<pair<string,size_t> > &pathMapping) const;
+
 #ifdef DEBUG
 		//Check that the tree conrol is synced up to the filter map correctly
 		void checkTree(wxTreeCtrl *t);
diff --git a/src/common/assertion.cpp b/src/common/assertion.cpp
new file mode 100644
index 0000000..93fc00b
--- /dev/null
+++ b/src/common/assertion.cpp
@@ -0,0 +1,46 @@
+/*
+ * common/assertion.h  - Program assertion header
+ * Copyright (C) 2013  D Haley
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "assertion.h"
+#include <iostream>
+
+void userAskAssert(const char * const filename, const unsigned int lineNumber) 
+{
+
+	static bool skipAll=false;
+
+	std::cerr << "ASSERTION ERROR!" << std::endl;
+	std::cerr << "Filename: " << filename << std::endl;
+	std::cerr << "Line number: " << lineNumber << std::endl;
+
+	if(skipAll)
+	{
+		std::cerr << "\tContinuing, as previously requested" << std::endl;
+		return;
+	}
+	
+	std::cerr << "Do you wish to continue? - (y)es/(n)o/(a)lways -";
+	char y = '_';
+	while (y != 'n' && y != 'y' && y!= 'a')
+		std::cin >> y;
+
+	if (y == 'n')
+		exit(1);
+
+	if(y == 'a')
+		skipAll=true;
+}
diff --git a/src/common/assertion.h b/src/common/assertion.h
index 8716388..e3c7675 100644
--- a/src/common/assertion.h
+++ b/src/common/assertion.h
@@ -37,20 +37,6 @@
 	#define WARN(f,g) { if(!(f)) { warnProgrammer(__FILE__,__LINE__,g);}}
 	#endif
 	
-	inline void userAskAssert(const char * const filename, const unsigned int lineNumber) 
-	{
-		std::cerr << "ASSERTION ERROR!" << std::endl;
-		std::cerr << "Filename: " << filename << std::endl;
-		std::cerr << "Line number: " << lineNumber << std::endl;
-
-		std::cerr << "Do you wish to continue?(y/n)";
-		char y = 'a';
-		while (y != 'n' && y != 'y')
-			std::cin >> y;
-
-		if (y != 'y')
-			exit(1);
-	}
 
 	inline void warnProgrammer(const char * const filename, const unsigned int lineNumber,const char *message) 
 	{
diff --git a/src/common/basics.cpp b/src/common/basics.cpp
index afbe3ee..33e9c06 100644
--- a/src/common/basics.cpp
+++ b/src/common/basics.cpp
@@ -41,6 +41,9 @@
 #include <sys/stat.h>
 #endif
 
+#include <cstring>
+#include <clocale>
+
 using std::string;
 using std::vector;
 using std::list;
@@ -51,7 +54,7 @@ const char *DTD_NAME="threeDepict-state.dtd";
 //Program name
 const char *PROGRAM_NAME = "3Depict";
 //Program version
-const char *PROGRAM_VERSION = "0.0.15";
+const char *PROGRAM_VERSION = "0.0.16";
 //Path to font for Default FTGL  font
 const char *FONT_FILE= "FreeSans.ttf";
 
@@ -65,6 +68,9 @@ const char *TEXT_LOAD_ERR_STRINGS[] = { "",
 //default font to use.
 std::string defaultFontFile;
 
+static char *oldLocaleStatic;
+static int localeStaticType;
+
 unsigned int getBitNum(unsigned int u)
 {
 	ASSERT(u);
@@ -86,6 +92,45 @@ std::string boolStrEnc(bool b)
 		return "0";
 }
 
+void pushLocale(const char *newLocale, int type)
+{
+	ASSERT(!oldLocaleStatic);
+	ASSERT(!localeStaticType);
+
+	ASSERT(type == LC_NUMERIC || type == LC_MONETARY || type == LC_CTYPE 
+		|| type == LC_COLLATE || type == LC_ALL || type == LC_TIME
+		|| type== LC_MESSAGES);
+
+	oldLocaleStatic=setlocale(type,NULL);   
+
+	//setlocale reserves the right to trash the returned pointer      
+	// on subsequent calls (i.e. use the returned pointer for later)
+	// thus we must duplicate the pointer to own it
+	oldLocaleStatic=strdup(oldLocaleStatic);      
+	if(strcmp(oldLocaleStatic,newLocale)) 
+	{
+		setlocale(type,newLocale);        
+		localeStaticType=type;
+	}
+	else
+	{
+		//record that we did not set this
+		localeStaticType=-1;
+	}
+
+}
+
+void popLocale()
+{
+	if(localeStaticType != -1)
+		setlocale(localeStaticType,oldLocaleStatic);
+
+	localeStaticType=0;
+
+	free(oldLocaleStatic);
+	oldLocaleStatic=0;
+}
+
 
 bool dummyCallback(bool)
 {
@@ -322,6 +367,25 @@ void BoundCube::setBounds(const std::vector<Point3D> &points)
 #endif
 }
 
+void BoundCube::getVertices(std::vector<Point3D> &points, bool centre) const
+{
+	points.resize(8);
+
+	for(size_t ui=0;ui<8;ui++)
+	{
+		points[ui][0]=bounds[0][ ui & 1]; 
+		points[ui][1]=bounds[1][ (ui & 2) >> 1]; 
+		points[ui][2]=bounds[2][ (ui & 4) >> 2]; 
+	}
+
+	if(centre)
+	{
+		Point3D centroid=getCentroid();
+		for(size_t ui=0;ui<8;ui++)
+			points[ui]-=centroid;
+	}
+}
+
 void BoundCube::setInverseLimits(bool setValid)
 {
 	bounds[0][0] = std::numeric_limits<float>::max();
@@ -1041,12 +1105,38 @@ unsigned int loadTextStringData(const char *cpFilename, vector<vector<string> >
 		CFile.getline(inBuffer,BUFFER_SIZE);
 		
 		if(!CFile.good() && !CFile.eof())
+		{
+			delete[] inBuffer;
 			return ERR_FILE_FORMAT;
+		}
 	}
 
+	delete[] inBuffer;
 	return 0;
 }
 
+//FIXME: Why negative?
+bool isNotDirectory(const char *filename)
+{
+#if !defined(__WIN32__) && !defined(__WIN64__)
+	struct stat statbuf;
+
+	if(stat(filename,&statbuf) == -1)
+		return false;
+
+	return (statbuf.st_mode !=S_IFDIR);
+#else
+
+	WARN(false, "Untested function. calling win api");
+	DWORD fileAttribs;
+	fileAttribs=GetFileAttributes((LPCWSTR)filename);
+	if(fileAttribs == INVALID_FILE_ATTRIBUTES)
+		return false;
+
+	return !(fileAttribs & FILE_ATTRIBUTE_DIRECTORY);
+#endif
+}
+
 #ifdef DEBUG
 bool isValidXML(const char *filename)
 {
@@ -1078,23 +1168,14 @@ bool isValidXML(const char *filename)
 	WARN(!result,"xmllint not installed in system PATH, cannot perform debug check")
 	return true;
 }
-#endif
-
-#if !defined(__WIN32__) && !defined(__WIN64)
-	
-bool isNotDirectory(const char *filename)
-{
-	struct stat statbuf;
-
-	if(stat(filename,&statbuf) == -1)
-		return false;
-
-	return (statbuf.st_mode !=S_IFDIR);
-}
 
 bool rmFile(const std::string &filename)
 {
+#if !defined(__WIN32__) && !defined(__WIN64__)
 	return remove(filename.c_str()) == 0;
+#else
+	WARN(false, "Untested function. calling win api");
+	return DeleteFile((LPCWSTR)filename.c_str());
+#endif
 }
-
 #endif
diff --git a/src/common/basics.h b/src/common/basics.h
index 53006ab..d0f5d5f 100644
--- a/src/common/basics.h
+++ b/src/common/basics.h
@@ -42,6 +42,13 @@ extern const char *PROGRAM_VERSION;
 extern const char *FONT_FILE;
 
 
+//Set new locale code. Must be followed by a popLocale call before completion
+// Only one locale type can be pushed at a time this way
+void pushLocale(const char *newLocale, int type);
+
+//Restore old locale code
+void popLocale();
+
 
 
 //C file peek function
@@ -381,8 +388,8 @@ public:
     void expand(const Point3D &p);
     //!Expand by a specified thickness 
     void expand(float v);
-
-
+    //!Obtain the corner points of the cube
+    void getVertices(std::vector<Point3D> &p,bool centre=false) const;
     friend  std::ostream &operator<<(std::ostream &stream, const BoundCube& b);
 
     //FIXME: Hack!
@@ -436,8 +443,6 @@ class EqualWithCallback
 		unsigned int redMax;
 		//!Current reduction counter
 		unsigned int reduction;
-		//!pointer to progress value
-		unsigned int *prgPtr;
 	public:
 		//!Second argument is a "reduction" value to set the number of calls
 		//to the random functor before initiating a callback
diff --git a/src/common/mathfuncs.cpp b/src/common/mathfuncs.cpp
index 9a332d1..e10c2f2 100644
--- a/src/common/mathfuncs.cpp
+++ b/src/common/mathfuncs.cpp
@@ -71,6 +71,14 @@ const Point3D &Point3D::operator+=(const Point3D &pt)
 	return *this;
 }
 
+const Point3D &Point3D::operator-=(const Point3D &pt)
+{
+	for(unsigned int ui=0;ui<3; ui++)
+		value[ui]-= pt.value[ui];
+	
+	return *this;
+}
+
 const Point3D Point3D::operator+(const Point3D &pt) const
 {
 	Point3D ptTmp;
@@ -545,7 +553,21 @@ void quat_pointmult(Point3f *result, const Quaternion *q1, const Quaternion *q2)
 	result->fz = (-q1->a*q2->d -q1->b*q2->c +q1->c*q2->b +q1->d*q2->a);
 
 }
- 
+
+//Inefficient Point3D version
+void quat_rot(Point3D &p, const Point3D &r, float angle)
+{
+	Point3f pP,rR;
+
+	pP.fx =p[0]; pP.fy =p[1]; pP.fz =p[2]; 	
+	rR.fx =r[0]; rR.fy =r[1]; rR.fz =r[2];
+
+	quat_rot(&pP,&rR,angle);
+
+	p[0] = pP.fx; p[1] =pP.fy; p[2] = pP.fz;
+}
+
+
 //Uses quaternion mathematics to perform a rotation around your favourite axis
 //IMPORTANT: Rotvec must be normalised before passing to this function 
 //failure to do so will have weird results. 
@@ -589,6 +611,75 @@ void quat_rot(Point3f *point, const Point3f *rotVec, float angle)
 
 }
 
+//TODO: Make as efficient as possible
+
+void quat_rot_array(Point3D  *pointArr, unsigned int n, 
+			const Point3f *rotVec, float angle)
+{
+	Point3f *fArr;
+	fArr = new Point3f[n];
+
+	for(size_t ui=0;ui<n;ui++)
+	{
+		fArr[ui].fx = pointArr[ui][0];
+		fArr[ui].fy = pointArr[ui][1];
+		fArr[ui].fz = pointArr[ui][2];
+	}
+
+	quat_rot_array(fArr,n,rotVec,angle);
+
+	for(size_t ui=0;ui<n;ui++)
+	{
+		 pointArr[ui][0]=fArr[ui].fx; 
+		 pointArr[ui][1]=fArr[ui].fy;
+		 pointArr[ui][2]=fArr[ui].fz;
+	}
+
+	delete[] fArr;
+}
+void quat_rot_array(Point3f *pointArr, unsigned int n,
+			const Point3f *rotVec, float angle)
+{
+	Quaternion rotQuat;
+	Quaternion pointQuat;
+	Quaternion temp;
+	{
+		ASSERT(rotVec->fx*rotVec->fx + rotVec->fy*rotVec->fy + rotVec->fz*rotVec->fz - 1.0f < 
+				5.0f*sqrt(std::numeric_limits<float>::epsilon()));
+
+		double sinCoeff;
+		
+		//remember this value so we don't recompute it
+	#ifdef _GNU_SOURCE
+		double cosCoeff;
+		//GNU provides sincos which is about twice the speed of sin/cos separately
+		sincos(angle*0.5f,&sinCoeff,&cosCoeff);
+		rotQuat.a=cosCoeff;
+	#else
+		angle*=0.5f;
+		sinCoeff=sin(angle);
+		
+		rotQuat.a = cos(angle);
+	#endif	
+		rotQuat.b=sinCoeff*rotVec->fx;
+		rotQuat.c=sinCoeff*rotVec->fy;
+		rotQuat.d=sinCoeff*rotVec->fz;
+
+		for(unsigned int ui=0;ui<n; ui++)
+		{
+		//	pointQuat.a =0.0f; This is implied in the pointQuat multiplcation function
+			pointQuat.b = pointArr[ui].fx;
+			pointQuat.c = pointArr[ui].fy;
+			pointQuat.d = pointArr[ui].fz;
+
+
+			//perform  rotation
+			quat_mult_no_second_a(&temp,&rotQuat,&pointQuat);
+			quat_pointmult(pointArr+ui, &temp,&rotQuat);
+
+		}
+	}
+}
 
 //Retrieve the quaternion for repeated rotation. Pass to the quat_rot_apply_quats
 void quat_get_rot_quat(const Point3f *rotVec, float angle,Quaternion *rotQuat) 
diff --git a/src/common/mathfuncs.h b/src/common/mathfuncs.h
index d71b394..61c38c3 100644
--- a/src/common/mathfuncs.h
+++ b/src/common/mathfuncs.h
@@ -77,6 +77,9 @@ class Point3D
                 const Point3D &operator=(const Point3D &pt);
 		//!+= operator
                 const Point3D &operator+=(const Point3D &pt);
+		
+		//!+= operator
+                const Point3D &operator-=(const Point3D &pt);
 
 		const Point3D operator+(float f) const;
 		//!multiplication operator
@@ -211,8 +214,17 @@ typedef struct
 //failure to do so will have weird results
 //Note result is stored in  point passed as argument
 //angle is in radians.
+
+//Inefficient Point3D version
+void quat_rot(Point3D &p, const Point3D &r, float angle);
+
 void quat_rot(Point3f *point, const Point3f *rotVec, float angle);
 
+void quat_rot_array(Point3f *point, unsigned int n, const Point3f *rotVec, float angle);
+
+void quat_rot_array(Point3D *point, unsigned int n, const Point3f *rotVec, float angle);
+
+
 //Retrieve the quaternion for repeated rotations. Pass to the quat_rot_apply_quats.
 //angle is in radians
 void quat_get_rot_quat(const Point3f *rotVec, float angle,  Quaternion *rotQuat);
diff --git a/src/common/stringFuncs.h b/src/common/stringFuncs.h
index f36df88..9d48c35 100644
--- a/src/common/stringFuncs.h
+++ b/src/common/stringFuncs.h
@@ -24,6 +24,7 @@
 
 //generate a semi-random string (not strong random), returns true
 // if a file that could be opened was found
+// this is useful for creating temp files
 bool genRandomFilename(std::string &s,bool timerInitRand=true);
 
 //Convert a boolean to "1" or "0"
@@ -54,10 +55,6 @@ std::string digitString(unsigned int thisDigit, unsigned int maxDigit);
 //!Returns Choice from string (see choiceString(...) for string format)
 std::string getActiveChoice(const std::string &choiceString);
 
-//!Convert a choiceString() into something that a wxGridCellChoiceEditor will accept
-std::string wxChoiceParamString(std::string choiceString);
-
-
 //Strip given whitespace (\f,\n,\r,\t,\ )from a string
 std::string stripWhite(const std::string &str);
 //Strip specified chars from a string
diff --git a/src/common/xmlHelper.cpp b/src/common/xmlHelper.cpp
index 65ea290..2518266 100644
--- a/src/common/xmlHelper.cpp
+++ b/src/common/xmlHelper.cpp
@@ -18,7 +18,7 @@
 #include "xmlHelper.h"
 
 #include <cstring>
-
+using std::string;
 //Convert a normal string sequence into an XML escaped sequence
 std::string escapeXML(const std::string &input)
 {
@@ -82,6 +82,23 @@ std::string unescapeXML(const std::string &input)
 	return data ;
 }
 
+template<> unsigned int XMLHelpGetProp(std::string  &prop,xmlNodePtr node, string propName)
+{
+	xmlChar *xmlString;
+
+	//grab the xml property
+	xmlString = xmlGetProp(node,(const xmlChar *)propName.c_str());
+
+	//Check string contents	
+	if(!xmlString)
+		return PROP_PARSE_ERR;
+
+	prop=(char *)xmlString;
+			
+	xmlFree(xmlString);
+
+	return 0;
+}
 
 
 unsigned int XMLHelpNextType(xmlNodePtr &node, int nodeType)
diff --git a/src/common/xmlHelper.h b/src/common/xmlHelper.h
index 9412512..8568ad3 100644
--- a/src/common/xmlHelper.h
+++ b/src/common/xmlHelper.h
@@ -29,7 +29,6 @@
 	#undef ATTRIBUTE_PRINTF
 #endif
 #include <string>
-using std::string;
 
 #include "common/basics.h"
 
@@ -84,7 +83,7 @@ bool XMLGetNextElemAttrib(xmlNodePtr &nodePtr, T &v, const char *nodeName, const
 
 
 //Returns 0 if successful, non zero if there is a property failure, or if the property is empty
-template<class T> unsigned int XMLHelpGetProp(T &prop,xmlNodePtr node, string propName)
+template<class T> unsigned int XMLHelpGetProp(T &prop,xmlNodePtr node, std::string propName)
 {
 	xmlChar *xmlString;
 
@@ -106,6 +105,10 @@ template<class T> unsigned int XMLHelpGetProp(T &prop,xmlNodePtr node, string pr
 	return 0;
 }
 
+//Specialisation for std::string, 
+// By default, whitespace  is dropped by << operator. Use assignment instead
+template<> unsigned int XMLHelpGetProp(std::string &prop,xmlNodePtr node, std::string propName);
+
 //Returns false on failure 
 //Do not use on validly whitespace containing XML
 template<class T>
diff --git a/src/gl/cameras.cpp b/src/gl/cameras.cpp
index ba68a87..aac6789 100644
--- a/src/gl/cameras.cpp
+++ b/src/gl/cameras.cpp
@@ -39,6 +39,7 @@
 
 using std::cerr;
 using std::endl;
+using std::string;
 
 //TODO: FIXME: Orthogonal camera zooming is very slow, compared to 
 // perspective camera dolly. Check equations of motion for equivalence
diff --git a/src/gl/drawables.cpp b/src/gl/drawables.cpp
index 66059b1..b5bc147 100644
--- a/src/gl/drawables.cpp
+++ b/src/gl/drawables.cpp
@@ -46,6 +46,132 @@ unsigned int DrawableObj::winY;
 //==
 
 
+//Draw a cone pointing in the axisVec direction, positioned at 
+//	- (if translateAxis is true, origin+axisVec, otherwise origin)
+//	- 
+void drawCone(const Point3D &axisVec, const Point3D &origin, 
+		float radius, float numConeRadiiLen, size_t numSegments,bool translateAxis=false)
+{
+	Point3D axis;
+	axis =axisVec;
+	if(axis.sqrMag() < sqrt(std::numeric_limits<float>::epsilon()))
+		axis=Point3D(0,0,1);
+	else
+		axis.normalise();
+
+
+	//Tilt space to align to cone axis
+	Point3D zAxis(0,0,1);
+	float tiltAngle;
+	tiltAngle = zAxis.angle(axis);
+	
+	Point3D rotAxis;
+	rotAxis=zAxis.crossProd(axis);
+	
+	Point3D *ptArray = new Point3D[numSegments];
+
+	const float ROT_TOL=sqrt(std::numeric_limits<float>::epsilon()) ;
+
+	//Only rotate if the angle is nonzero (note 2PI wraparound is possible from acos)
+	if((tiltAngle > ROT_TOL	|| fabs(tiltAngle - 2*M_PI) > ROT_TOL) && 
+			rotAxis.sqrMag() > ROT_TOL)
+	{
+
+		//Draw an angled cone
+		Point3f vertex,r;	
+		rotAxis.normalise();
+
+
+		r.fx=rotAxis[0];
+		r.fy=rotAxis[1];
+		r.fz=rotAxis[2];
+
+	
+		//we have to rotate the cone points around the apex point
+		for(unsigned int ui=0; ui<numSegments; ui++)
+		{
+			//Note that the ordering for theta defines the orientation
+			// for the generated triangles. CCW triangles in opengl 
+			// are required
+			float theta;
+			theta = -2.0f*M_PI*(float)ui/(float)(numSegments-1);
+
+			//initial point is at r*(cos(theta),r*sin(theta),-numConeRadiiLen),
+			vertex.fx=sin(theta);
+			vertex.fy=cos(theta);
+			vertex.fz=-numConeRadiiLen;
+		
+			//rotate to new position
+			quat_rot(&vertex,&r,tiltAngle);
+
+			//store the coord
+			ptArray[ui]=Point3D(radius*vertex.fx,radius*vertex.fy,radius*vertex.fz);
+		}
+	}
+	else
+	{
+		if(tiltAngle > ROT_TOL)
+		{
+			//Downwards pointing cone - note "-radius"
+			for(unsigned int ui=0; ui<numSegments; ui++)
+			{
+				float theta;
+				theta = 2.0f*M_PI*(float)ui/(float)(numSegments-1);
+				ptArray[ui] =Point3D(-radius*cos(theta),
+					radius*sin(theta),numConeRadiiLen*radius);
+			}
+		}
+		else
+		{
+			//upwards pointing cone
+			for(unsigned int ui=0; ui<numSegments; ui++)
+			{
+				float theta;
+				theta = 2.0f*M_PI*(float)ui/(float)(numSegments-1);
+				ptArray[ui] =Point3D(radius*cos(theta),
+					radius*sin(theta),-numConeRadiiLen*radius);
+			}
+		}
+	}
+
+
+	//Translation vector
+	Point3D trans;
+	if(translateAxis)
+		trans=(origin+axisVec);
+	else
+		trans=origin;
+	glPushMatrix();
+	glTranslatef(trans[0],trans[1],trans[2]);
+	
+	//Now, having the needed coords, we can draw the cone
+	glBegin(GL_TRIANGLE_FAN);
+	glNormal3fv(axis.getValueArr());
+	glVertex3f(0,0,0);
+	for(unsigned int ui=0; ui<numSegments; ui++)
+	{
+		Point3D n;
+		n=ptArray[ui];
+		n.normalise();
+		glNormal3fv(n.getValueArr());
+		glVertex3fv(ptArray[ui].getValueArr());
+	}
+
+	glEnd();
+
+	//Now draw the base of the cone, to make it solid
+	// Note that traversal order of pt array is also important
+	glBegin(GL_TRIANGLE_FAN);
+	glNormal3f(-axis[0],-axis[1],-axis[2]);
+	for(unsigned int ui=numSegments; ui--;) 
+		glVertex3fv(ptArray[ui].getValueArr());
+	glEnd();
+
+	glPopMatrix();
+	delete[] ptArray;
+}
+
+
 //Common functions
 //
 void drawBox(Point3D pMin, Point3D pMax, float r,float g, float b, float a)
@@ -96,8 +222,6 @@ void drawBox(Point3D pMin, Point3D pMax, float r,float g, float b, float a)
 }
 
 
-using std::vector;
-
 DrawableObj::DrawableObj() : active(true), haveChanged(true), canSelect(false), wantsLight(false)
 {
 }
@@ -240,144 +364,53 @@ void DrawVector::draw() const
 
 	glLineWidth(lineSize);
 	glBegin(GL_LINES);
-	glVertex3fv(origin.getValueArr());
-	
-	if(arrowSize < sqrt(std::numeric_limits<float>::epsilon()) || !drawArrow)
-	{
-		glVertex3f(vector[0]+origin[0],vector[1]+origin[1],vector[2]+origin[2]);
-		glEnd();
-		//restore the old line size
-		glLineWidth(oldLineWidth);
-		glPopAttrib();
-		return ;
-	}
-	glVertex3f(vector[0]+origin[0],vector[1]+origin[1],vector[2]+origin[2]);
-	glEnd();
-	//restore the old line size
-	glLineWidth(oldLineWidth);
-	
-	glPopAttrib();
-
-
-
 
-
-	//Now compute & draw the cone tip
-	//----
-
-	Point3D axis;
-	axis = vector;
-
-	if(axis.sqrMag() < sqrt(std::numeric_limits<float>::epsilon()))
-		axis=Point3D(0,0,1);
-	else
-		axis.normalise();
-
-
-	//Tilt space to align to cone axis
-	Point3D zAxis(0,0,1);
-	float tiltAngle;
-	tiltAngle = zAxis.angle(axis);
-	
-	Point3D rotAxis;
-	rotAxis=zAxis.crossProd(axis);
-	
-	Point3D *ptArray = new Point3D[NUM_CONE_SEGMENTS];
-	if(tiltAngle > sqrt(std::numeric_limits<float>::epsilon()) && 
-			rotAxis.sqrMag() > sqrt(std::numeric_limits<float>::epsilon()))
+	if(drawArrow)
 	{
-
-		//Draw an angled cone
-		Point3f vertex,r;	
-		rotAxis.normalise();
-
-
-		r.fx=rotAxis[0];
-		r.fy=rotAxis[1];
-		r.fz=rotAxis[2];
-
-	
-		//we have to rotate the cone points around the apex point
-		for(unsigned int ui=0; ui<NUM_CONE_SEGMENTS; ui++)
-		{
-			//Note that the ordering for theta defines the orientation
-			// for the generated triangles. CCW triangles in opengl 
-			// are required
-			float theta;
-			theta = -2.0f*M_PI*(float)ui/(float)(NUM_CONE_SEGMENTS-1);
-
-			//initial point is at r*(cos(theta),r*sin(theta),-numConeRadiiLen),
-			vertex.fx=sin(theta);
-			vertex.fy=cos(theta);
-			vertex.fz=-numConeRadiiLen;
+		//Back off the distance a little, because otherwise the line can poke out
+		// the sides of the cone.
+		float backoffFactor = std::max(radius/sqrt(vector.sqrMag()),0.0f);
+		Point3D tmpVec=vector*(1.0f-backoffFactor) + origin;
 		
-			//rotate to new position
-			quat_rot(&vertex,&r,tiltAngle);
-
-			//store the coord
-			ptArray[ui]=Point3D(radius*vertex.fx,radius*vertex.fy,radius*vertex.fz);
-		}
-	}
-	else
-	{
-		if(tiltAngle > sqrt(std::numeric_limits<float>::epsilon()))
+		if(doubleEnded)
 		{
-			//Downwards pointing cone
-			for(unsigned int ui=0; ui<NUM_CONE_SEGMENTS; ui++)
-			{
-				float theta;
-				theta = -2.0f*M_PI*(float)ui/(float)(NUM_CONE_SEGMENTS-1);
-				ptArray[ui] =Point3D(-radius*cos(theta),
-					radius*sin(theta),numConeRadiiLen*radius);
-			}
+			Point3D tmpOrigin;
+			tmpOrigin = origin+vector*(backoffFactor);
+			glVertex3fv(tmpOrigin.getValueArr());
+			glVertex3fv(tmpVec.getValueArr());
 		}
 		else
 		{
-			//upwards pointing cone
-			for(unsigned int ui=0; ui<NUM_CONE_SEGMENTS; ui++)
-			{
-				float theta;
-				theta = -2.0f*M_PI*(float)ui/(float)(NUM_CONE_SEGMENTS-1);
-				ptArray[ui] =Point3D(radius*cos(theta),
-					radius*sin(theta),-numConeRadiiLen*radius);
-			}
+			glVertex3fv(origin.getValueArr());
+			glVertex3fv(tmpVec.getValueArr());
 		}
 	}
-
-
-	Point3D trans;
-	trans=(origin+vector);
-	glPushMatrix();
-	glTranslatef(trans[0],trans[1],trans[2]);
-	
-	//Now, having the needed coords, we can draw the cone
-	glBegin(GL_TRIANGLE_FAN);
-	glNormal3fv(axis.getValueArr());
-	glVertex3f(0,0,0);
-	for(unsigned int ui=0; ui<NUM_CONE_SEGMENTS; ui++)
+	else
 	{
-		Point3D n;
-		n=ptArray[ui];
-		n.normalise();
-		glNormal3fv(n.getValueArr());
-		glVertex3fv(ptArray[ui].getValueArr());
+		glVertex3fv(origin.getValueArr());
+		glVertex3f(vector[0]+origin[0],vector[1]+origin[1],vector[2]+origin[2]);
 	}
-
 	glEnd();
 
-	//Now draw the base of the cone, to make it solid
-	// Note that traversal order of pt array is also important
-	glBegin(GL_TRIANGLE_FAN);
-	glNormal3f(-axis[0],-axis[1],-axis[2]);
-	for(unsigned int ui=NUM_CONE_SEGMENTS; ui--;) 
-		glVertex3fv(ptArray[ui].getValueArr());
-	glEnd();
+	//restore the old line size
+	glLineWidth(oldLineWidth);
+	glPopAttrib();
+
+	//If we only wanted the line, then we are done here.
+	if(arrowSize < sqrt(std::numeric_limits<float>::epsilon()) || !drawArrow)
+		return ;
+
+	//Now compute & draw the cone tip
+	//----
+	drawCone(vector, origin, arrowSize,
+		numConeRadiiLen,NUM_CONE_SEGMENTS,true);
+
+	if(doubleEnded)
+		drawCone(-vector,origin,arrowSize,numConeRadiiLen,NUM_CONE_SEGMENTS);
 
-	glPopMatrix();
 	//----
 
 
-	delete[] ptArray;
 }
 
 void DrawVector::recomputeParams(const std::vector<Point3D> &vecs, 
@@ -900,7 +933,7 @@ void DrawManyPoints::clear()
 
 void DrawManyPoints::addPoints(const vector<Point3D> &vp)
 {
-	pts.reserve(pts.size()+vp.size());
+	pts.resize(pts.size()+vp.size());
 	std::copy(vp.begin(),vp.end(),pts.begin());
 	haveCachedBounds=false;
 }
@@ -1135,15 +1168,16 @@ void DrawGLText::draw() const
 
 	//Translate the drawing position to the origin
 	Point3D offsetVec=textDir;
-	float advance;
-	float halfHeight;
-	
+	float advance, halfHeight;
+
+	{
 	FTBBox box;
 	box=font->BBox(strText.c_str());
 	advance=box.Upper().X()-box.Lower().X();
 	
 	halfHeight=box.Upper().Y()-box.Lower().Y();
 	halfHeight/=2.0f;
+	}
 
 	switch(alignMode)
 	{
@@ -1180,11 +1214,11 @@ void DrawGLText::draw() const
 		ASSERT(textDir.dotProd(up) < sqrtf(std::numeric_limits<float>::epsilon()));
 
 		//rotate around textdir cross X, if the two are not the same
-		Point3D rotateAxis;
 		Point3D newUp=up;
 		float angle=textDir.angle(Point3D(1,0,0) );
 		if(angle > sqrtf(std::numeric_limits<float>::epsilon()))
 		{
+			Point3D rotateAxis;
 			rotateAxis = textDir.crossProd(Point3D(-1,0,0));
 			rotateAxis.normalise();
 			
@@ -1198,6 +1232,7 @@ void DrawGLText::draw() const
 			axis.fz=rotateAxis[2];
 
 
+//			cerr << "Gl rotate (1):" << rotateAxis << " , " << angle << endl;
 			glRotatef(angle*180.0f/M_PI,rotateAxis[0],rotateAxis[1],rotateAxis[2]);
 			quat_rot(&tmp,&axis,angle); //angle is in radiians
 
@@ -1211,9 +1246,11 @@ void DrawGLText::draw() const
 		if(angle > sqrtf(std::numeric_limits<float>::epsilon()) &&
 			fabs(angle - M_PI) > sqrtf(std::numeric_limits<float>::epsilon())) 
 		{
+			Point3D rotateAxis;
 			rotateAxis = newUp.crossProd(Point3D(0,-1,0));
 			rotateAxis.normalise();
 			glRotatef(angle*180.0f/M_PI,rotateAxis[0],rotateAxis[1],rotateAxis[2]);
+			//cerr << "Gl rotate (2):" << rotateAxis << " , " << angle << endl;
 		}
 
 		//Ensure that the text is not back-culled (i.e. if the
@@ -1313,6 +1350,7 @@ void DrawGLText::draw() const
 	glPopAttrib();
 	
 	glPopMatrix();
+
 }
 
 DrawGLText::~DrawGLText()
@@ -1331,14 +1369,93 @@ void DrawGLText::setColour(float rnew, float gnew, float bnew, float anew)
 
 void DrawGLText::getBoundingBox(BoundCube &b) const
 {
-
+	//Box forwards transformations
+	// * Translation by [origin-textDir*  (maxx - minx)]
+	// * Rotate by textDir.angle([1 0 0 ]), around [ textdir x [ -1 0 0 ] ]  
+	// * Rotate by newUp.angle([0,1,0]), around [ newUp x [ 0 -1 0 ] ]
 	if(isOK)
 	{
+		//Obtain the vertices around the untransformed text
 		float minX,minY,minZ;
 		float maxX,maxY,maxZ;
 		font->BBox(strText.c_str(),minX,minY,minZ,maxX,maxY,maxZ);
-		b.setBounds(minX+origin[0],minY+origin[1],minZ+origin[2],
-				maxX+origin[0],maxY+origin[1],maxZ+origin[2]);
+
+		float dy=maxY-minY;
+
+
+		b.setBounds(minX,minY,minZ,
+				maxX,maxY,maxZ);
+		vector<Point3D> p;
+		b.getVertices(p,true);
+
+		for(size_t ui=0;ui<p.size();ui++)
+			p[ui]-=Point3D(0,-dy*0.5,0);
+
+		const float TOL_EPS=sqrtf(std::numeric_limits<float>::epsilon());
+		
+		Point3D r1Axis,r2Axis;
+		bool degenR1,degenR2;
+		r1Axis=Point3D(1,0,0);
+	
+		//Compute R1 axis, but do not apply
+		//--
+		float r1Angle=r1Axis.angle(textDir);
+		degenR1=( r1Angle < TOL_EPS || fabs(r1Angle-M_PI) < TOL_EPS ) ;
+
+		Point3D newUp=up;
+		if(!degenR1)
+		{
+			r1Axis=textDir.crossProd(r1Axis);
+			r1Axis.normalise();
+
+			quat_rot(newUp,r1Axis,r1Angle);
+
+		}
+		//--
+
+		//Compute R2 axis
+		//--
+		r2Axis=Point3D(0,-1,0);
+		//In degenerate case, we don't do anything
+		// otherwise we compute R2
+		//rotate new up direction into y around x axis
+		float angle = newUp.angle(Point3D(0,1,0));
+		if(!degenR1 && (angle > sqrtf(std::numeric_limits<float>::epsilon()) &&
+			fabs(angle - M_PI) > sqrtf(std::numeric_limits<float>::epsilon())) )
+		{
+			r2Axis= newUp.crossProd(Point3D(0,-1,0));
+			r2Axis.normalise();
+		}
+		else
+			r2Axis=up;
+
+		//--
+
+		//Compute R2'(P)
+		//--
+		float r2Angle=angle;
+		degenR2 = r2Angle < TOL_EPS;
+		if(!degenR2)
+		{
+			Point3f rotAx;
+			rotAx.fx = r2Axis[0]; rotAx.fy = r2Axis[1]; rotAx.fz=r2Axis[2];
+			quat_rot_array(&p[0], p.size(), &rotAx,r2Angle);
+		}
+		//--
+
+		//Compute R1'(p)
+		if(!degenR1)
+		{
+			Point3f rotAx;
+			rotAx.fx = r1Axis[0]; rotAx.fy = r1Axis[1]; rotAx.fz=r1Axis[2];
+			quat_rot_array(&p[0], p.size(), &rotAx,-r1Angle);
+
+		}
+
+		for(size_t ui=0;ui<p.size();ui++)
+			p[ui]+=origin ; 
+
+		b.setBounds(p);
 	}
 	else
 		b.setInverseLimits();	
diff --git a/src/gl/drawables.h b/src/gl/drawables.h
index 9592dd8..aad4671 100644
--- a/src/gl/drawables.h
+++ b/src/gl/drawables.h
@@ -354,7 +354,7 @@ class DrawVector: public DrawableObj
 		void setEnds(const Point3D &start, const Point3D &end);
 
 		//Set to draw both ends
-		void setDoubleEnded(bool wantDoubleEnd=true);
+		void setDoubleEnded(bool wantDoubleEnd=true){doubleEnded=wantDoubleEnd;};
 
 		//!Gets the arrow axis direction
 		Point3D getVector() const { return vector;};
@@ -557,7 +557,7 @@ class DrawAnimatedOverlay : public DrawQuad
 
 		void getBoundingBox(BoundCube &b) const ;
 
-		bool isOK() const { return textureId != (unsigned int)-1; }
+		bool isOK() const { return textureOK; }
 };
 
 //!A sphere drawing 
diff --git a/src/gl/effect.cpp b/src/gl/effect.cpp
index 0123625..89c3eb3 100644
--- a/src/gl/effect.cpp
+++ b/src/gl/effect.cpp
@@ -465,6 +465,9 @@ bool BoxCropEffect::readState(xmlNodePtr nodePtr)
 {
 	using std::string;
 
+	if(!nodePtr->xmlChildrenNode)
+		return false;
+
 	nodePtr=nodePtr->xmlChildrenNode;
 	xmlNodePtr scalars;
 	if(XMLHelpFwdToElem(nodePtr,"cropvalues"))
@@ -615,6 +618,10 @@ bool AnaglyphEffect::readState(xmlNodePtr nodePtr)
 {
 	using std::string;
 
+	if(!nodePtr->xmlChildrenNode)
+		return false;
+	nodePtr=nodePtr->xmlChildrenNode;
+	
 	if(!XMLGetNextElemAttrib(nodePtr,colourMode,"colourmode","value"))
 		return false;
 	if(colourMode >= ANAGLYPH_HALF_COLOUR)
diff --git a/src/gl/effect.h b/src/gl/effect.h
index 0b1b22d..117f574 100644
--- a/src/gl/effect.h
+++ b/src/gl/effect.h
@@ -74,6 +74,7 @@ class Effect
 		virtual bool writeState(std::ofstream &f, 
 				unsigned int format, unsigned int depth) const=0;
 		//read the effects state information from an XML file
+		// Should be pointing to the top-level of effect element (eg <anaglyph>)
 		virtual bool readState(xmlNodePtr n)=0;
 
 		virtual bool needCamUpdate() const { return false;}
diff --git a/src/gl/scene.cpp b/src/gl/scene.cpp
index 79ed633..361394e 100644
--- a/src/gl/scene.cpp
+++ b/src/gl/scene.cpp
@@ -48,6 +48,7 @@ Scene::Scene() : tempCam(0), cameraSet(true), outWinAspect(1.0f)
 	showAxis=true;
 	attemptedLoadProgressAnim=false;
 	showProgressAnimation=false;
+	witholdCamUpdate=false;
 
 	//default to black
 	rBack=gBack=bBack=0.0f;
@@ -68,6 +69,7 @@ Scene::~Scene()
 {
 	clearAll();
 	DrawableObj::clearTexPool();
+	delete activeCam;
 }
 
 unsigned int Scene::initDraw()
@@ -641,12 +643,26 @@ void Scene::setAspect(float newAspect)
 {
 	outWinAspect=newAspect;
 }
+void Scene::setActiveCam(Camera *c)
+{
+	if(tempCam)
+		discardTempCam();
+
+	if(activeCam)
+		delete activeCam;
+
+	activeCam = c;
+	cameraSet=true;
+}
 
 void Scene::setActiveCamByClone(const Camera *c)
 {
 	if(tempCam)
 		discardTempCam();
 
+	if(activeCam)
+		delete activeCam;
+	
 	activeCam = c->clone();
 	cameraSet=true;
 }
diff --git a/src/gl/scene.h b/src/gl/scene.h
index 847695e..2b1783e 100644
--- a/src/gl/scene.h
+++ b/src/gl/scene.h
@@ -201,7 +201,10 @@ class Scene
 		//!remove a drawable object
 		void removeDrawable(unsigned int);
 
-		void setActiveCam();
+		//!Set the active camera directly
+		// note that the pointer becomes "owned" by the scene.
+		// any previous active camera will be deleted
+		void setActiveCam(Camera *c);
 		//! set the active camera
 		void setActiveCamByClone(const Camera *c);
 
@@ -333,6 +336,8 @@ class Scene
 
 		//!Clear effects vector
 		void clearEffects();
+
+		static string getGlVersion() { return  string((char *)glGetString(GL_VERSION)); }
 };
 
 #endif
diff --git a/src/gl/textures.cpp b/src/gl/textures.cpp
index 400cfab..2ce8500 100644
--- a/src/gl/textures.cpp
+++ b/src/gl/textures.cpp
@@ -88,6 +88,7 @@ bool TexturePool::openTexture(const char *texName, unsigned int &texID)
 
 bool TexturePool::openTexture3D(const std::vector<std::string> &fileNames, unsigned int &texId) 
 {
+	ASSERT(fileNames.size());
 
 	vector<string> fullNames;
 	fullNames.resize(fileNames.size());
@@ -237,6 +238,9 @@ int pngTexture(texture* dest, const char* filename, GLenum type)
 
 int pngTexture3D(texture *dest, const vector<string> &fileNames)
 {
+	if(fileNames.empty())
+		return 0;
+
 	dest->depth=fileNames.size();
 
 	//Copy data from disk into temporary storage
diff --git a/src/gui/cropPanel.cpp b/src/gui/cropPanel.cpp
index ee0897e..f322775 100644
--- a/src/gui/cropPanel.cpp
+++ b/src/gui/cropPanel.cpp
@@ -217,7 +217,7 @@ unsigned int CropPanel::getBestCropWidget(float xMouse, float yMouse,unsigned in
 	float meanPx = 1.0/(1.0/(w-2) + 1.0/(h-2));
 	unsigned int minIndex;
 	float minDist=std::numeric_limits<float>::max();
-	float tmpDist,x,y;
+	float x,y;
 	//work our way clockwise around the corners
 	//finding the minimum distance
 	for(unsigned int ui=0;ui<4;ui++)
@@ -250,6 +250,7 @@ unsigned int CropPanel::getBestCropWidget(float xMouse, float yMouse,unsigned in
 				ASSERT(false);
 		}
 
+		float tmpDist;
 		tmpDist=(xMouse-x)*(xMouse-x) + (yMouse-y)*(yMouse-y);
 		if(tmpDist < minDist) 
 		{
diff --git a/src/gui/dialogs/ExportPos.cpp b/src/gui/dialogs/ExportPos.cpp
index b8d765e..6592f26 100644
--- a/src/gui/dialogs/ExportPos.cpp
+++ b/src/gui/dialogs/ExportPos.cpp
@@ -414,6 +414,9 @@ void ExportPosDialog::getExportVec(std::vector<const FilterStreamData * > &v) co
 {
 	typedef std::pair<Filter *,vector<const FilterStreamData * > > filterOutputData;
 
+	//Incoming vector should be empty
+	ASSERT(v.empty());
+
 	//If the user has selected "visible", then all outputs are to be exported
 	if(exportVisible)
 	{
@@ -423,7 +426,11 @@ void ExportPosDialog::getExportVec(std::vector<const FilterStreamData * > &v) co
 							it!=outputData.end();++it)
 		{
 			for(unsigned int ui=0;ui<it->second.size();ui++)
+			{
 				v.push_back(it->second[ui]);
+				//Ensure pointer is valid by forcing a dereference
+				ASSERT(v.back()->getStreamType() == STREAM_TYPE_IONS);
+			}
 
 		}
 	}
diff --git a/src/gui/dialogs/animateFilterDialog.cpp b/src/gui/dialogs/animateFilterDialog.cpp
index d4333df..3b95109 100644
--- a/src/gui/dialogs/animateFilterDialog.cpp
+++ b/src/gui/dialogs/animateFilterDialog.cpp
@@ -166,7 +166,7 @@ ExportAnimationDialog::ExportAnimationDialog(wxWindow* parent, int id, const wxS
     lblImageName = new wxStaticText(frameViewPane, wxID_ANY, wxTRANS("File Suffix: "));
     textImageName = new wxTextCtrl(frameViewPane, ID_TEXTBOX_IMAGEPREFIX, wxEmptyString);
     labelImageSize = new wxStaticText(frameViewPane, wxID_ANY, wxTRANS("Size : "));
-    textImageSize = new wxTextCtrl(frameViewPane, ID_TEXTBOX_IMAGESIZE, wxEmptyString);
+    textImageSize = new wxTextCtrl(frameViewPane, ID_TEXTBOX_IMAGESIZE, wxEmptyString, wxDefaultPosition,wxDefaultSize, wxTE_READONLY );
     buttonImageSize = new wxButton(frameViewPane, ID_BUTTON_IMAGE_RES, wxTRANS("..."));
     checkPoints = new wxCheckBox(frameViewPane, ID_CHECK_POINT_OUT, wxTRANS("Point data"));
     checkPlotData = new wxCheckBox(frameViewPane, ID_CHECK_PLOT_OUT, wxTRANS("Plots"));
@@ -215,9 +215,6 @@ ExportAnimationDialog::ExportAnimationDialog(wxWindow* parent, int id, const wxS
     programmaticEvent=true;
 
     //-- set up the default properties for dialog back-end data
-    imageWidth=640;
-    imageHeight=480;
-    imageSizeOK=true;
 
     //Plot check status
     wantPlotOutput=checkPlotData->IsChecked();
@@ -228,11 +225,6 @@ ExportAnimationDialog::ExportAnimationDialog(wxWindow* parent, int id, const wxS
     wantRangeOutput=checkRangeData->IsChecked();
     wantOnlyChanges=checkOutOnlyChanged->IsChecked();
 
-    string sFirst,sSecond;
-    stream_cast(sFirst,imageWidth);
-    stream_cast(sSecond,imageHeight);
-    textImageSize->SetValue(wxStr(string(sFirst+string("x")+sSecond)));
-    textImageSize->SetBackgroundColour(wxNullColour);
 
     comboRangeFormat->Enable(checkRangeData->IsChecked());
 
@@ -261,7 +253,6 @@ BEGIN_EVENT_TABLE(ExportAnimationDialog, wxDialog)
     EVT_CHECKBOX(ID_CHECK_ONLYDATACHANGE, ExportAnimationDialog::OnCheckOutDataChange)
     EVT_CHECKBOX(ID_CHECK_IMAGE_OUT, ExportAnimationDialog::OnCheckImageOutput)
     EVT_TEXT(ID_TEXTBOX_IMAGEPREFIX, ExportAnimationDialog::OnImageFilePrefix)
-    EVT_TEXT(ID_TEXTBOX_IMAGESIZE, ExportAnimationDialog::OnTextImageSize)
     EVT_BUTTON(ID_BUTTON_IMAGE_RES, ExportAnimationDialog::OnBtnResolution)
     EVT_CHECKBOX(ID_CHECK_POINT_OUT, ExportAnimationDialog::OnCheckPointOutput)
     EVT_CHECKBOX(ID_CHECK_PLOT_OUT, ExportAnimationDialog::OnCheckPlotOutput)
@@ -275,6 +266,17 @@ BEGIN_EVENT_TABLE(ExportAnimationDialog, wxDialog)
     // end wxGlade
 END_EVENT_TABLE();
 
+void ExportAnimationDialog::setDefImSize(unsigned int w, unsigned int h)
+{
+    imageWidth=w; imageHeight=h;
+    
+    string sFirst,sSecond;
+    stream_cast(sFirst,imageWidth);
+    stream_cast(sSecond,imageHeight);
+    textImageSize->SetValue(wxStr(string(sFirst+string("x")+sSecond)));
+    
+    imageSizeOK=true;
+}
     
 bool ExportAnimationDialog::getModifiedTree(size_t frame, FilterTree &t,bool &needsUp) const
 {
@@ -355,6 +357,40 @@ std::string ExportAnimationDialog::getFilename(unsigned int frame,
 	return s;
 }
 
+void ExportAnimationDialog::setAnimationState(const PropertyAnimator &prop,
+				    const vector<pair<string,size_t> > &pathMapping)
+{
+	//Copy the animation state
+	propertyAnimator=prop;
+
+	vector<pair<string,size_t> > newMapping;
+
+	//Obtain our updated mapping
+	getPathMapping(newMapping,true);
+
+	map<size_t,size_t> idRemap;
+
+	//TODO: Smarter algorithm (sort & compare heads)
+	//	- also better handling of renaming for nonces.
+	for(size_t ui=0;ui<newMapping.size();ui++)
+	{
+		for(size_t uj=0;uj<pathMapping.size();uj++)
+		{
+			if(newMapping[ui]==pathMapping[uj])
+			{
+				idRemap[pathMapping[ui].second] = newMapping[ui].second;
+			}
+
+		}
+	}
+
+	//Sync this into the dialog 
+	// -> we need to examine the animation state, and only
+	// keeo paths we recognise, rewriting the id values
+	propertyAnimator.updateMappings(idRemap);
+
+}
+
 void ExportAnimationDialog::prepare() 
 {
 	vector<const Filter*> dummyVec;
@@ -986,46 +1022,6 @@ void ExportAnimationDialog::OnImageFilePrefix(wxCommandEvent &event)
 }
 
 
-void ExportAnimationDialog::OnTextImageSize(wxCommandEvent &event)
-{
-
-	if(programmaticEvent)
-		return;
-
-	string s;
-	s=stlStr(textImageSize->GetValue());
-	
-	bool parseOK=true;
-	size_t pos;
-	pos = s.find('x'); 
-	if(pos==string::npos)
-		parseOK=false;
-	else
-	{
-		string first,last;
-		first = s.substr(0,pos);
-		last=s.substr(pos+1);
-
-
-		size_t w,h;
-		if(stream_cast(w,first))
-			parseOK&=false;
-
-		
-		if(stream_cast(h,last))
-			parseOK&=false;
-	}
-
-	if(!parseOK)
-		textImageSize->SetBackgroundColour(*wxCYAN);
-	else
-		textImageSize->SetBackgroundColour(wxNullColour);
-	
-	//update UI (eg OK button)
-	update();
-
-}
-
 void ExportAnimationDialog::OnBtnResolution(wxCommandEvent &event)
 {
 	ResolutionDialog *r = new ResolutionDialog(this,wxID_ANY,wxT("Choose Resolution"));
@@ -1095,6 +1091,50 @@ size_t ExportAnimationDialog::getRangeFormat() const
 
 }
 
+void ExportAnimationDialog::getAnimationState(PropertyAnimator &prop, 
+				vector<pair<string,size_t> > &mapping) const
+{
+	prop=propertyAnimator;
+	getPathMapping(mapping);
+}
+
+
+void ExportAnimationDialog::getPathMapping(vector<pair<string,size_t> > &mapping,bool allowMissing) const
+{
+	ASSERT(filterTree->size());
+
+	std::map<const Filter *, string> pathMapping;
+	filterTree->serialiseToStringPaths(pathMapping);
+
+	vector<unsigned int> idsInUse;
+	propertyAnimator.getIdList(idsInUse);
+
+	for(size_t ui=0;ui<idsInUse.size();ui++)
+	{
+		//Use the filter map to obtain the full path to the filter
+		std::map<size_t, Filter *>::const_iterator it;
+
+		it=filterMap.find(idsInUse[ui]);
+
+		//if we allow missing elements, then skip processing this ID
+		if(allowMissing && it == filterMap.end())
+			continue;
+
+		ASSERT(it!=filterMap.end());
+
+		const Filter *f;
+		f=it->second;
+
+		//record the string name for the map
+		std::string path;
+		path=(pathMapping[f]);
+
+		mapping.push_back(make_pair(path,idsInUse[ui]));
+
+	}
+
+}
+
 // wxGlade: add ExportAnimationDialog event handlers
 
 
diff --git a/src/gui/dialogs/animateFilterDialog.h b/src/gui/dialogs/animateFilterDialog.h
index 4508ca4..49fa856 100644
--- a/src/gui/dialogs/animateFilterDialog.h
+++ b/src/gui/dialogs/animateFilterDialog.h
@@ -98,6 +98,19 @@ public:
 
     //!Obtain the format the user wants to save ranges in
     size_t getRangeFormat()  const;
+
+    //! Obtain the current state from the animation (keyframes)
+    // the second element provides the mappings for the property animator to 
+    // filter tree path locations
+    void getAnimationState(PropertyAnimator &prop,  vector<pair<string,size_t> > &pathMapping) const ;
+    //!Obtain the current state from the animation
+    void setAnimationState(const PropertyAnimator &prop,
+		    const vector<pair<string,size_t> > &pathMapping);
+
+    //!Obtain the filter tree path string->animation ID mapping
+    void getPathMapping(vector<pair<string,size_t> > &mapping, bool allowMissing=false) const;
+
+    void setDefImSize(unsigned int w, unsigned int h) ; 
 private:
     //!Tree of filters that can be manipulated
     const FilterTree *filterTree;
@@ -139,6 +152,9 @@ private:
     size_t rangeExportMode;
 
 
+    //viewport aspect ratio for image output
+    float imageAspectRatio;
+
     //Used to jump out of wx events that are generated by 
     // the code, rather than the user, eg text events
     bool programmaticEvent;
@@ -214,7 +230,6 @@ public:
     virtual void OnCheckOutDataChange(wxCommandEvent &event); // wxGlade: <event_handler>
     virtual void OnCheckImageOutput(wxCommandEvent &event); // wxGlade: <event_handler>
     virtual void OnImageFilePrefix(wxCommandEvent &event); // wxGlade: <event_handler>
-    virtual void OnTextImageSize(wxCommandEvent &event); // wxGlade: <event_handler>
     virtual void OnBtnResolution(wxCommandEvent &event); // wxGlade: <event_handler>
     virtual void OnCheckPointOutput(wxCommandEvent &event); // wxGlade: <event_handler>
     virtual void OnCheckPlotOutput(wxCommandEvent &event); // wxGlade: <event_handler>
diff --git a/src/gui/dialogs/prefDialog.cpp b/src/gui/dialogs/prefDialog.cpp
index ba93f62..066381c 100644
--- a/src/gui/dialogs/prefDialog.cpp
+++ b/src/gui/dialogs/prefDialog.cpp
@@ -64,7 +64,6 @@ enum
 PrefDialog::PrefDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
     wxDialog(parent, id, title, pos, size, style)
 {
-	SetTitle(wxTRANS("Preferences"));
     // begin wxGlade: prefDialog::prefDialog
 	notePrefPanels = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
     notePrefPanels_pane_3 = new wxPanel(notePrefPanels, wxID_ANY);
diff --git a/src/gui/dialogs/prefDialog.h b/src/gui/dialogs/prefDialog.h
index a473db2..a219f12 100644
--- a/src/gui/dialogs/prefDialog.h
+++ b/src/gui/dialogs/prefDialog.h
@@ -105,7 +105,7 @@ protected:
 public:
 	// begin wxGlade: PrefDialog::ids
 	// end wxGlade
-	PrefDialog(wxWindow* parent, int id=wxID_ANY, const wxString& title=wxT(""), const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER);
+	PrefDialog(wxWindow* parent, int id=wxID_ANY, const wxString& title=wxT("Preferences"), const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER);
 	virtual ~PrefDialog();
 	virtual void OnFilterCellChange(wxGridEvent &event); // wxGlade: <event_handler>
 	virtual void OnFilterListClick(wxCommandEvent &event); // wxGlade: <event_handler>
diff --git a/src/gui/dialogs/rangeEditDialog.cpp b/src/gui/dialogs/rangeEditDialog.cpp
index 275d713..87426f9 100644
--- a/src/gui/dialogs/rangeEditDialog.cpp
+++ b/src/gui/dialogs/rangeEditDialog.cpp
@@ -210,7 +210,7 @@ RangeEditorDialog::RangeEditorDialog(wxWindow* parent, int id, const wxString& t
     noteLeftOverlay = new wxPanel(notebookLeft, wxID_ANY);
     noteLeftRanges = new wxPanel(notebookLeft, wxID_ANY);
     noteLeftPlots = new wxPanel(notebookLeft, wxID_ANY);
-    listPlots = new wxListBox(noteLeftPlots, ID_LIST_PLOTS, wxDefaultPosition, wxDefaultSize, 0, NULL);
+    listPlots = new wxListBox(noteLeftPlots, ID_LIST_PLOTS, wxDefaultPosition, wxDefaultSize, 0,(const wxString*) NULL);
     gridIons= new wxGrid(noteLeftRanges, ID_GRID_IONS);
     gridRanges = new wxGrid(noteLeftRanges, ID_GRID_RANGES);
     btnRangeIonAdd = new wxButton(noteLeftRanges,wxID_ADD, wxEmptyString);
diff --git a/src/gui/glPane.cpp b/src/gui/glPane.cpp
index 5df04c5..030241d 100644
--- a/src/gui/glPane.cpp
+++ b/src/gui/glPane.cpp
@@ -702,6 +702,7 @@ void BasicGLPane::keyReleased(wxKeyEvent& event)
 	switch(event.GetKeyCode())
 	{
 		case '-':
+		case '_':
 		case WXK_NUMPAD_SUBTRACT:
 		case WXK_SUBTRACT:
 		{
@@ -715,6 +716,7 @@ void BasicGLPane::keyReleased(wxKeyEvent& event)
 		case '=':
 		case WXK_NUMPAD_ADD:
 		case WXK_ADD:
+		case WXK_NUMPAD_EQUAL:
 		{
 			//Reverse direction of motion
 			cameraMoveRate= -cameraMoveRate;
@@ -922,7 +924,7 @@ bool BasicGLPane::saveImage(unsigned int width, unsigned int height,
 	wxProgressDialog *wxD=0;	
 
 
-	//Only show progress for mutliple tiles
+	//Only show progress for multiple tiles
 	std::string tmpStr,tmpStrTwo;
 	stream_cast(tmpStrTwo,nRow*nCol);
 	
@@ -1042,10 +1044,12 @@ bool BasicGLPane::saveImageSequence(unsigned int resX, unsigned int resY, unsign
 	wxD->Show();
 	std::string tmpStr,tmpStrTwo;
 	stream_cast(tmpStrTwo,nFrames);
+
+	Camera *origCam=currentScene.getActiveCam()->clone();
+	
+	
 	for(unsigned int ui=0;ui<nFrames;ui++)
 	{
-		Camera *c;
-		float angle;
 		std::string digitStr;
 
 		//Create a string like 00001, such that there are always leading zeros
@@ -1053,19 +1057,22 @@ bool BasicGLPane::saveImageSequence(unsigned int resX, unsigned int resY, unsign
 
 		//Manipulate the camera such that it orbits around its current axis
 		//FIXME: Why is this M_PI, not 2*M_PI???
+		float angle;
 		angle= (float)ui/(float)nFrames*M_PI;
 
-		//create a new temp camera
-		currentScene.setTempCam();
-		c=currentScene.getTempCam();
-		//Rotate the temporary camera
-		c->move(angle,0);
+		Camera *modifiedCam;
+		modifiedCam=origCam->clone();
+		modifiedCam->move(angle,0);
+		currentScene.setActiveCam(modifiedCam);
 
 		//Save the result
 		outFile = string(stlStr(path))+ string("/") + 
 				string(stlStr(prefix))+digitStr+ string(".") + string(stlStr(ext));
 		if(!saveImage(resX,resY,outFile.c_str(),false, false))
+		{
+			currentScene.setActiveCam(origCam);
 			return false;
+		}
 
 		//Update the progress bar
 		stream_cast(tmpStr,ui+1);
@@ -1077,6 +1084,8 @@ bool BasicGLPane::saveImageSequence(unsigned int resX, unsigned int resY, unsign
 		Refresh();
 	}
 
+	currentScene.setActiveCam(origCam);
+
 	//Discard the current temp. cam to return the scene back to normal
 	currentScene.discardTempCam();
 	wxD->Destroy();
diff --git a/src/gui/glade-skeleton/prefDialog.cpp b/src/gui/glade-skeleton/prefDialog.cpp
deleted file mode 100644
index 3f19afa..0000000
--- a/src/gui/glade-skeleton/prefDialog.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-// -*- C++ -*-
-//
-// generated by wxGlade 0.6.8 on Sun Nov 10 18:05:15 2013
-//
-// Example for compiling a single file project under Linux using g++:
-//  g++ MyApp.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp
-//
-// Example for compiling a multi file project under Linux using g++:
-//  g++ main.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp Dialog1.cpp Frame1.cpp
-//
-
-#include "prefDialog.h"
-
-// begin wxGlade: ::extracode
-// end wxGlade
-
-
-
-PrefDialog::PrefDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
-    wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxTHICK_FRAME)
-{
-    // begin wxGlade: PrefDialog::PrefDialog
-    notePrefPanels = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
-    notePrefPanels_pane_3 = new wxPanel(notePrefPanels, wxID_ANY);
-    panelStartup = new wxPanel(notePrefPanels, wxID_ANY);
-    panelFilters = new wxPanel(notePrefPanels, wxID_ANY);
-    sizer_2_staticbox = new wxStaticBox(panelStartup, wxID_ANY, _("Panel Display"));
-    updateSizer_staticbox = new wxStaticBox(panelStartup, wxID_ANY, _("Online Updates"));
-    sizer_7_staticbox = new wxStaticBox(notePrefPanels_pane_3, wxID_ANY, _("Startup"));
-    sizerCamSpeed_staticbox = new wxStaticBox(notePrefPanels_pane_3, wxID_ANY, _("Speed"));
-    filterPropSizer_staticbox = new wxStaticBox(panelFilters, wxID_ANY, _("Filter Defaults"));
-    lblFilters = new wxStaticText(panelFilters, wxID_ANY, _("Available Filters"));
-    const wxString *listFilters_choices = NULL;
-    listFilters = new wxListBox(panelFilters, ID_LIST_FILTERS, wxDefaultPosition, wxDefaultSize, 0, listFilters_choices, wxLB_SINGLE|wxLB_SORT);
-    filterGridProperties = new wxGrid(panelFilters, ID_GRID_PROPERTIES);
-    filterBtnResetAllFilters = new wxButton(panelFilters, wxID_ANY, _("Reset All"));
-    filterResetDefaultFilter = new wxButton(panelFilters, wxID_ANY, _("Reset"));
-    const wxString comboPanelStartMode_choices[] = {
-        _("Always show"),
-        _("Remember"),
-        _("Specify")
-    };
-    comboPanelStartMode = new wxComboBox(panelStartup, ID_START_COMBO_PANEL, wxT(""), wxDefaultPosition, wxDefaultSize, 3, comboPanelStartMode_choices, wxCB_DROPDOWN|wxCB_SIMPLE|wxCB_DROPDOWN|wxCB_READONLY);
-    chkControl = new wxCheckBox(panelStartup, ID_START_CHECK_CONTROL, _("Control Pane"));
-    chkRawData = new wxCheckBox(panelStartup, ID_START_CHECK_RAWDATA, _("Raw Data Panel"));
-    chkPlotlist = new wxCheckBox(panelStartup, ID_START_CHECK_PLOTLIST, _("Plot List"));
-    checkAllowOnlineUpdate = new wxCheckBox(panelStartup, wxID_ANY, _("Notify periodically about available updates"));
-    chkPreferOrtho = new wxCheckBox(notePrefPanels_pane_3, wxID_ANY, _("Prefer orthographic at startup"));
-    lblMoveSpeed = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, _("Move Rate"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
-    labelSlowCamMoveRate = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, _("(slow)"));
-    sliderCamMoveRate = new wxSlider(notePrefPanels_pane_3, ID_MOUSE_MOVE_SLIDER, 1, 1, 100);
-    labelFastCamMoveRate = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, _("(fast)"));
-    lblZoomSpeed = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, _("Zoom Rate"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
-    labelSlowCamZoomRate = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, _("(slow)"));
-    sliderCamZoomRate = new wxSlider(notePrefPanels_pane_3, ID_MOUSE_ZOOM_SLIDER, 1, 1, 100);
-    labelSlowFastZoomRate = new wxStaticText(notePrefPanels_pane_3, ID_MOUSE_ZOOM_SLIDER, _("(fast)"));
-    btnOK = new wxButton(this, wxID_OK, wxEmptyString);
-    btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString);
-
-    set_properties();
-    do_layout();
-    // end wxGlade
-}
-
-
-void PrefDialog::set_properties()
-{
-    // begin wxGlade: PrefDialog::set_properties
-    SetTitle(_("Preferences"));
-    SetSize(wxSize(640, 487));
-    filterBtnResetAllFilters->SetToolTip(_("Reset all filter initial values back to program defaults"));
-    filterResetDefaultFilter->SetToolTip(_("Reset the filter initial values back to program defaults"));
-    comboPanelStartMode->SetToolTip(_("Set the method of panel layout when starting the program"));
-    comboPanelStartMode->SetSelection(0);
-    checkAllowOnlineUpdate->SetToolTip(_("Lets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again."));
-    chkPreferOrtho->SetToolTip(_("By default, use an orthographic camera at startup. State files will override this preference."));
-    sliderCamMoveRate->SetToolTip(_("Camera translation, orbit and swivel rates. "));
-    sliderCamZoomRate->SetToolTip(_("Camera zooming rate."));
-    // end wxGlade
-}
-
-
-void PrefDialog::do_layout()
-{
-    // begin wxGlade: PrefDialog::do_layout
-    wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL);
-    wxBoxSizer* exitButtonSizer = new wxBoxSizer(wxHORIZONTAL);
-    wxBoxSizer* sizer_5 = new wxBoxSizer(wxVERTICAL);
-    sizerCamSpeed_staticbox->Lower();
-    wxStaticBoxSizer* sizerCamSpeed = new wxStaticBoxSizer(sizerCamSpeed_staticbox, wxVERTICAL);
-    wxBoxSizer* sizer_6_copy = new wxBoxSizer(wxHORIZONTAL);
-    wxBoxSizer* sizer_6 = new wxBoxSizer(wxHORIZONTAL);
-    sizer_7_staticbox->Lower();
-    wxStaticBoxSizer* sizer_7 = new wxStaticBoxSizer(sizer_7_staticbox, wxHORIZONTAL);
-    wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL);
-    updateSizer_staticbox->Lower();
-    wxStaticBoxSizer* updateSizer = new wxStaticBoxSizer(updateSizer_staticbox, wxVERTICAL);
-    sizer_2_staticbox->Lower();
-    wxStaticBoxSizer* sizer_2 = new wxStaticBoxSizer(sizer_2_staticbox, wxVERTICAL);
-    wxBoxSizer* sizer_3 = new wxBoxSizer(wxHORIZONTAL);
-    wxBoxSizer* sizer_4 = new wxBoxSizer(wxVERTICAL);
-    filterPropSizer_staticbox->Lower();
-    wxStaticBoxSizer* filterPropSizer = new wxStaticBoxSizer(filterPropSizer_staticbox, wxHORIZONTAL);
-    wxBoxSizer* filterRightSideSizer = new wxBoxSizer(wxVERTICAL);
-    wxBoxSizer* resetButtonSizer = new wxBoxSizer(wxHORIZONTAL);
-    wxBoxSizer* filterLeftSizer = new wxBoxSizer(wxVERTICAL);
-    filterLeftSizer->Add(lblFilters, 0, 0, 0);
-    filterLeftSizer->Add(listFilters, 1, wxEXPAND, 0);
-    filterPropSizer->Add(filterLeftSizer, 1, wxEXPAND, 0);
-    filterPropSizer->Add(20, 20, 0, 0, 0);
-    filterRightSideSizer->Add(filterGridProperties, 1, wxEXPAND, 0);
-    resetButtonSizer->Add(filterBtnResetAllFilters, 0, 0, 0);
-    resetButtonSizer->Add(filterResetDefaultFilter, 0, 0, 0);
-    resetButtonSizer->Add(20, 20, 1, 0, 0);
-    filterRightSideSizer->Add(resetButtonSizer, 0, wxEXPAND, 0);
-    filterPropSizer->Add(filterRightSideSizer, 2, wxEXPAND, 0);
-    panelFilters->SetSizer(filterPropSizer);
-    sizer_2->Add(comboPanelStartMode, 0, 0, 0);
-    sizer_3->Add(20, 20, 0, 0, 0);
-    sizer_4->Add(chkControl, 0, 0, 0);
-    sizer_4->Add(chkRawData, 0, 0, 0);
-    sizer_4->Add(chkPlotlist, 0, 0, 0);
-    sizer_3->Add(sizer_4, 1, wxEXPAND, 0);
-    sizer_2->Add(sizer_3, 1, wxEXPAND, 0);
-    sizer_1->Add(sizer_2, 0, wxALL|wxEXPAND, 5);
-    updateSizer->Add(checkAllowOnlineUpdate, 0, 0, 0);
-    sizer_1->Add(updateSizer, 0, wxALL|wxEXPAND, 5);
-    panelStartup->SetSizer(sizer_1);
-    sizer_7->Add(chkPreferOrtho, 0, wxALL, 5);
-    sizer_5->Add(sizer_7, 0, wxEXPAND, 0);
-    sizer_6->Add(lblMoveSpeed, 0, wxALIGN_CENTER_VERTICAL, 0);
-    sizer_6->Add(20, 20, 0, 0, 0);
-    sizer_6->Add(labelSlowCamMoveRate, 0, wxALIGN_CENTER_VERTICAL, 0);
-    sizer_6->Add(sliderCamMoveRate, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 0);
-    sizer_6->Add(labelFastCamMoveRate, 0, wxALIGN_CENTER_VERTICAL, 0);
-    sizerCamSpeed->Add(sizer_6, 1, wxEXPAND, 0);
-    sizer_6_copy->Add(lblZoomSpeed, 0, wxALIGN_CENTER_VERTICAL, 0);
-    sizer_6_copy->Add(20, 20, 0, 0, 0);
-    sizer_6_copy->Add(labelSlowCamZoomRate, 0, wxALIGN_CENTER_VERTICAL, 0);
-    sizer_6_copy->Add(sliderCamZoomRate, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 0);
-    sizer_6_copy->Add(labelSlowFastZoomRate, 0, wxALIGN_CENTER_VERTICAL, 0);
-    sizerCamSpeed->Add(sizer_6_copy, 1, wxEXPAND, 0);
-    sizer_5->Add(sizerCamSpeed, 1, wxEXPAND, 0);
-    notePrefPanels_pane_3->SetSizer(sizer_5);
-    notePrefPanels->AddPage(panelFilters, _("Pref"));
-    notePrefPanels->AddPage(panelStartup, _("Startup"));
-    notePrefPanels->AddPage(notePrefPanels_pane_3, _("Camera"));
-    panelSizer->Add(notePrefPanels, 2, wxEXPAND, 0);
-    exitButtonSizer->Add(20, 20, 1, wxEXPAND, 0);
-    exitButtonSizer->Add(btnOK, 0, wxTOP, 8);
-    exitButtonSizer->Add(btnCancel, 0, wxLEFT|wxTOP|wxBOTTOM, 8);
-    exitButtonSizer->Add(10, 20, 0, 0, 0);
-    panelSizer->Add(exitButtonSizer, 0, wxEXPAND, 0);
-    SetSizer(panelSizer);
-    Layout();
-    // end wxGlade
-}
-
-
-BEGIN_EVENT_TABLE(PrefDialog, wxDialog)
-    // begin wxGlade: PrefDialog::event_table
-    EVT_LISTBOX(ID_LIST_FILTERS, PrefDialog::OnListClick)
-    EVT_GRID_CMD_CELL_CHANGE(ID_GRID_PROPERTIES, PrefDialog::OnFilterCellChange)
-    EVT_GRID_CMD_CELL_LEFT_CLICK(ID_GRID_PROPERTIES, PrefDialog::OnFilterCellClick)
-    EVT_COMBOBOX(ID_START_COMBO_PANEL, PrefDialog::OnStartupPanelCombo)
-    EVT_CHECKBOX(ID_START_CHECK_CONTROL, PrefDialog::OnStartupCheckControl)
-    EVT_CHECKBOX(ID_START_CHECK_RAWDATA, PrefDialog::OnStartupCheckRawData)
-    EVT_CHECKBOX(ID_START_CHECK_PLOTLIST, PrefDialog::OnStartupCheckPlotList)
-    EVT_CHECKBOX(wxID_ANY, PrefDialog::OnCheckPreferOrtho)
-    EVT_COMMAND_SCROLL(ID_MOUSE_MOVE_SLIDER, PrefDialog::OnMouseMoveSlider)
-    EVT_COMMAND_SCROLL(ID_MOUSE_ZOOM_SLIDER, PrefDialog::OnMouseZoomSlider)
-    // end wxGlade
-END_EVENT_TABLE();
-
-
-void PrefDialog::OnListClick(wxCommandEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnListClick) not implemented yet"));
-}
-
-void PrefDialog::OnFilterCellChange(wxGridEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnFilterCellChange) not implemented yet"));
-}
-
-void PrefDialog::OnFilterCellClick(wxGridEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnFilterCellClick) not implemented yet"));
-}
-
-void PrefDialog::OnStartupPanelCombo(wxCommandEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnStartupPanelCombo) not implemented yet"));
-}
-
-void PrefDialog::OnStartupCheckControl(wxCommandEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnStartupCheckControl) not implemented yet"));
-}
-
-void PrefDialog::OnStartupCheckRawData(wxCommandEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnStartupCheckRawData) not implemented yet"));
-}
-
-void PrefDialog::OnStartupCheckPlotList(wxCommandEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnStartupCheckPlotList) not implemented yet"));
-}
-
-void PrefDialog::OnCheckPreferOrtho(wxCommandEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnCheckPreferOrtho) not implemented yet"));
-}
-
-void PrefDialog::OnMouseMoveSlider(wxScrollEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnMouseMoveSlider) not implemented yet"));
-}
-
-void PrefDialog::OnMouseZoomSlider(wxScrollEvent &event)
-{
-    event.Skip();
-    // notify the user that he hasn't implemented the event handler yet
-    wxLogDebug(wxT("Event handler (PrefDialog::OnMouseZoomSlider) not implemented yet"));
-}
-
-
-// wxGlade: add PrefDialog event handlers
-
-
-class MyApp: public wxApp {
-public:
-    bool OnInit();
-protected:
-    wxLocale m_locale;  // locale we'll be using
-};
-
-IMPLEMENT_APP(MyApp)
-
-bool MyApp::OnInit()
-{
-    m_locale.Init();
-#ifdef APP_LOCALE_DIR
-    m_locale.AddCatalogLookupPathPrefix(wxT(APP_LOCALE_DIR));
-#endif
-    m_locale.AddCatalog(wxT(APP_CATALOG));
-
-    wxInitAllImageHandlers();
-    PrefDialog* dlgPreference = new PrefDialog(NULL, wxID_ANY, wxEmptyString);
-    SetTopWindow(dlgPreference);
-    dlgPreference->Show();
-    return true;
-}
\ No newline at end of file
diff --git a/src/gui/glade-skeleton/prefDialog.h b/src/gui/glade-skeleton/prefDialog.h
deleted file mode 100644
index 8845c97..0000000
--- a/src/gui/glade-skeleton/prefDialog.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// -*- C++ -*-
-//
-// generated by wxGlade 0.6.8 on Sun Nov 10 18:05:15 2013
-//
-// Example for compiling a single file project under Linux using g++:
-//  g++ MyApp.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp
-//
-// Example for compiling a multi file project under Linux using g++:
-//  g++ main.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp Dialog1.cpp Frame1.cpp
-//
-
-#ifndef PREFDIALOG_H
-#define PREFDIALOG_H
-
-#include <wx/wx.h>
-#include <wx/image.h>
-#include "wx/intl.h"
-
-#ifndef APP_CATALOG
-#define APP_CATALOG "app"  // replace with the appropriate catalog name
-#endif
-
-
-// begin wxGlade: ::dependencies
-#include <wx/notebook.h>
-#include <wx/grid.h>
-// end wxGlade
-
-// begin wxGlade: ::extracode
-// end wxGlade
-
-
-class PrefDialog: public wxDialog {
-public:
-    // begin wxGlade: PrefDialog::ids
-    // end wxGlade
-
-    PrefDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE);
-
-private:
-    // begin wxGlade: PrefDialog::methods
-    void set_properties();
-    void do_layout();
-    // end wxGlade
-
-protected:
-    // begin wxGlade: PrefDialog::attributes
-    wxStaticBox* sizerCamSpeed_staticbox;
-    wxStaticBox* sizer_7_staticbox;
-    wxStaticBox* updateSizer_staticbox;
-    wxStaticBox* sizer_2_staticbox;
-    wxStaticBox* filterPropSizer_staticbox;
-    wxStaticText* lblFilters;
-    wxListBox* listFilters;
-    wxGrid* filterGridProperties;
-    wxButton* filterBtnResetAllFilters;
-    wxButton* filterResetDefaultFilter;
-    wxPanel* panelFilters;
-    wxComboBox* comboPanelStartMode;
-    wxCheckBox* chkControl;
-    wxCheckBox* chkRawData;
-    wxCheckBox* chkPlotlist;
-    wxCheckBox* checkAllowOnlineUpdate;
-    wxPanel* panelStartup;
-    wxCheckBox* chkPreferOrtho;
-    wxStaticText* lblMoveSpeed;
-    wxStaticText* labelSlowCamMoveRate;
-    wxSlider* sliderCamMoveRate;
-    wxStaticText* labelFastCamMoveRate;
-    wxStaticText* lblZoomSpeed;
-    wxStaticText* labelSlowCamZoomRate;
-    wxSlider* sliderCamZoomRate;
-    wxStaticText* labelSlowFastZoomRate;
-    wxPanel* notePrefPanels_pane_3;
-    wxNotebook* notePrefPanels;
-    wxButton* btnOK;
-    wxButton* btnCancel;
-    // end wxGlade
-
-    DECLARE_EVENT_TABLE();
-
-public:
-    virtual void OnListClick(wxCommandEvent &event); // wxGlade: <event_handler>
-    virtual void OnFilterCellChange(wxGridEvent &event); // wxGlade: <event_handler>
-    virtual void OnFilterCellClick(wxGridEvent &event); // wxGlade: <event_handler>
-    virtual void OnStartupPanelCombo(wxCommandEvent &event); // wxGlade: <event_handler>
-    virtual void OnStartupCheckControl(wxCommandEvent &event); // wxGlade: <event_handler>
-    virtual void OnStartupCheckRawData(wxCommandEvent &event); // wxGlade: <event_handler>
-    virtual void OnStartupCheckPlotList(wxCommandEvent &event); // wxGlade: <event_handler>
-    virtual void OnCheckPreferOrtho(wxCommandEvent &event); // wxGlade: <event_handler>
-    virtual void OnMouseMoveSlider(wxScrollEvent &event); // wxGlade: <event_handler>
-    virtual void OnMouseZoomSlider(wxScrollEvent &event); // wxGlade: <event_handler>
-}; // wxGlade: end class
-
-
-#endif // PREFDIALOG_H
diff --git a/src/gui/mainFrame.cpp b/src/gui/mainFrame.cpp
index 82c5c03..fbe36f9 100644
--- a/src/gui/mainFrame.cpp
+++ b/src/gui/mainFrame.cpp
@@ -1,4 +1,4 @@
-#include "mainFrame.h"
+
 
 #ifdef __APPLE__
 //FIXME: workaround for UI layout under apple platform 
@@ -260,7 +260,8 @@ enum
 	FILE_OPEN_TYPE_UNKNOWN=1,
 	FILE_OPEN_TYPE_XML=2,
 	FILE_OPEN_TYPE_POS=4,
-	FILE_OPEN_TYPE_TEXT=8
+	FILE_OPEN_TYPE_TEXT=8,
+	FILE_OPEN_TYPE_LAWATAP_ATO=16,
 };
 
 
@@ -539,7 +540,7 @@ TRANS("Unable to initialise the openGL (3D) panel. Program cannot start. Please
 
     comboStash = new wxComboBox(noteData, ID_COMBO_STASH, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN|wxTE_PROCESS_ENTER|SAFE_CB_SORT);
     btnStashManage = new wxButton(noteData, ID_BTN_STASH_MANAGE, wxT("..."),wxDefaultPosition,wxSize(28,28));
-    filteringLabel = new wxStaticText(noteData, wxID_ANY, wxTRANS("Data Filtering"));
+    filteringLabel = new wxStaticText(noteData, wxID_ANY, wxTRANS("New Filters"));
 
 
     //Workaround for wx bug http://trac.wxwidgets.org/ticket/4398
@@ -562,7 +563,11 @@ TRANS("Unable to initialise the openGL (3D) panel. Program cannot start. Please
     comboFilters = new wxComboBox(filterTreePane, ID_COMBO_FILTER, wxT(""), wxDefaultPosition, wxDefaultSize, filterNames, wxCB_DROPDOWN|wxCB_READONLY|SAFE_CB_SORT);
 
 
-    treeFilters = new wxTreeCtrl(filterTreePane, ID_TREE_FILTERS, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS|wxTR_NO_LINES|wxTR_HIDE_ROOT|wxTR_DEFAULT_STYLE|wxSUNKEN_BORDER|wxTR_EDIT_LABELS);
+    treeFilters = new TextTreeCtrl(filterTreePane, ID_TREE_FILTERS, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS|wxTR_NO_LINES|wxTR_HIDE_ROOT|wxTR_DEFAULT_STYLE|wxSUNKEN_BORDER|wxTR_EDIT_LABELS);
+    vector<string> msgs;
+    msgs.push_back("No data loaded:");
+    msgs.push_back("open file, then add filters");
+    treeFilters->setMessages(msgs); 
     lastRefreshLabel = new wxStaticText(filterTreePane, wxID_ANY, wxTRANS("Last Outputs"));
     listLastRefresh = new wxListCtrl(filterTreePane, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER);
     checkAutoUpdate = new wxCheckBox(filterTreePane, ID_CHECK_AUTOUPDATE, wxTRANS("Auto Refresh"));
@@ -690,7 +695,7 @@ TRANS("Unable to initialise the openGL (3D) panel. Program cannot start. Please
 
 
     //Manually tuned splitter parameters.
-    filterSplitter->SetMinimumPaneSize(80);
+    filterSplitter->SetMinimumPaneSize(180);
     filterSplitter->SetSashGravity(0.8);
     splitLeftRight->SetSashGravity(0.15);
     splitTopBottom->SetSashGravity(0.85);
@@ -819,6 +824,7 @@ BEGIN_EVENT_TABLE(MainWindowFrame, wxFrame)
     EVT_SPLITTER_DCLICK(ID_SPLIT_LEFTRIGHT, MainWindowFrame::OnControlUnsplit) 
     EVT_SPLITTER_SASH_POS_CHANGED(ID_SPLIT_LEFTRIGHT, MainWindowFrame::OnControlSplitMove) 
     EVT_SPLITTER_SASH_POS_CHANGED(ID_SPLIT_TOP_BOTTOM, MainWindowFrame::OnTopBottomSplitMove) 
+    EVT_SPLITTER_SASH_POS_CHANGED(ID_SPLIT_FILTERPROP, MainWindowFrame::OnFilterSplitMove) 
     // begin wxGlade: MainWindowFrame::event_table
     EVT_MENU(ID_FILE_OPEN, MainWindowFrame::OnFileOpen)
     EVT_MENU(ID_FILE_MERGE, MainWindowFrame::OnFileMerge)
@@ -936,6 +942,9 @@ unsigned int MainWindowFrame::guessFileType(const std::string &dataFile)
 
 	if( extStr == std::string("pos"))
 		return FILE_OPEN_TYPE_POS;
+	
+	if( extStr == std::string("ato"))
+		return FILE_OPEN_TYPE_LAWATAP_ATO;
 
 	return FILE_OPEN_TYPE_UNKNOWN;
 }
@@ -982,11 +991,28 @@ void MainWindowFrame::OnFileOpen(wxCommandEvent &event)
 		return;
 
 
+	vector<pair<std::string,std::string> > validTypes;
+	validTypes.push_back(	make_pair(TRANS("Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)"),
+					"*.xml;*.pos;*.txt;*.csv;*.ato") );
+	validTypes.push_back( make_pair(TRANS("XML State File (*.xml)"),"*.xml"));
+	validTypes.push_back( make_pair(TRANS("POS File (*.pos)"),"*.pos"));
+	validTypes.push_back( make_pair(TRANS("LAWATAP ATO File (*.ato)"),"*.ato"));
+	validTypes.push_back( make_pair(TRANS("Text File (*.txt, *.csv)"),"*.csv;*.txt"));
+	validTypes.push_back( make_pair(TRANS("All Files (*)"),"*"));
 
+	std::string totalStr;
+	totalStr=validTypes[0].first + std::string("|") + validTypes[0].second;
+	for(unsigned int ui=1;ui<validTypes.size();ui++)
+	{
+		totalStr+="|",
+		totalStr+=validTypes[ui].first ;
+		totalStr+="|",
+		totalStr+=validTypes[ui].second;
+	}
 
 	//Load a file, either a state file, or a new pos file
 	wxFileDialog wxF(this,wxTRANS("Select Data or State File..."), wxT(""),
-		wxT(""),wxTRANS("Readable files (*.xml, *.pos, *.txt,*.csv)|*.xml;*.pos;*.txt;*.csv|POS File (*.pos)|*.pos|XML State File (*.xml)|*.xml|Text Data Files (*.txt/csv)|*.txt;*.csv|All Files (*)|*"),wxFD_OPEN|wxFD_FILE_MUST_EXIST);
+		wxT(""),wxStr(totalStr),wxFD_OPEN|wxFD_FILE_MUST_EXIST);
 
 	//Show the file dialog	
 	if( (wxF.ShowModal() == wxID_CANCEL))
@@ -1298,6 +1324,8 @@ bool MainWindowFrame::loadFile(const wxString &fileStr, bool merge,bool noUpdate
 		unsigned int fileMode;
 		if(fileType == FILE_OPEN_TYPE_TEXT)
 			fileMode=DATALOAD_TEXT_FILE;
+		else if(fileType == FILE_OPEN_TYPE_LAWATAP_ATO)
+			fileMode=DATALOAD_LAWATAP_ATO_FILE;
 		else
 			fileMode=DATALOAD_FLOAT_FILE;
 		
@@ -1320,7 +1348,7 @@ bool MainWindowFrame::loadFile(const wxString &fileStr, bool merge,bool noUpdate
 	visControl.updateWxTreeCtrl(treeFilters);
 
 	if(!noUpdate)
-		doSceneUpdate();
+		return doSceneUpdate();
 
 	return true;
 }	
@@ -1451,7 +1479,6 @@ void MainWindowFrame::OnFileExportPlot(wxCommandEvent &event)
 		EXT_NONE
 	};
 	const char *extensions[] = {"png","svg",""};
-	const char *descriptions[] = {"PNG File", "Scalable Vector Graphic",""};
 
 	size_t extId = EXT_NONE;
 	for(size_t ui=0;ui<EXT_NONE;ui++)
@@ -1468,6 +1495,7 @@ void MainWindowFrame::OnFileExportPlot(wxCommandEvent &event)
 	// give them a multi-choice dialog they can pick from
 	if(extId == EXT_NONE)
 	{
+		const char *descriptions[] = {"PNG File", "Scalable Vector Graphic",""};
 		wxArrayString wxStrs;
 		for(size_t ui=0;ui<EXT_NONE;ui++)
 			wxStrs.Add(wxCStr(descriptions[ui]));
@@ -1765,11 +1793,19 @@ void MainWindowFrame::OnFileExportFilterVideo(wxCommandEvent &event)
 	}
 
 
-	ExportAnimationDialog *exportDialog = 
-		new ExportAnimationDialog(this, wxID_ANY, wxEmptyString);
 
 	int w, h;
 	panelTop->GetClientSize(&w,&h);
+	
+	ExportAnimationDialog *exportDialog = 
+		new ExportAnimationDialog(this, wxID_ANY, wxEmptyString);
+	exportDialog->setDefImSize(w,h);
+
+
+	//FIXME: Tree ownership is very complex, making code here brittle
+	// - order of operations for initing the export dialog is important
+	// Getting/Setting animation state requires the filtertree to
+	// be under exportDialog's control
 	FilterTree treeWithCache;
 
 	//Steal the filter tree, and give the pointer to the export dialog
@@ -1777,17 +1813,48 @@ void MainWindowFrame::OnFileExportFilterVideo(wxCommandEvent &event)
 	visControl.swapFilterTree(treeWithCache);
 
 	exportDialog->setTree(treeWithCache);
+
+	//FIXME: HACK - this needs to be called twice
+	// due to synchronisation problems with 
+	// ExportAnimationDialog::setAnimationState.
+	exportDialog->prepare();
+
+	//Set the saved animation properties, as needed
+	{
+	PropertyAnimator p;
+	vector<pair<string,size_t> > pathMap;
+	visControl.getAnimationState(p,pathMap);
+	if(p.getMaxFrame())
+	{
+		exportDialog->setAnimationState(p,pathMap);
+	}
+	}
+	
 	exportDialog->prepare();
+
+	//Display Animate dialog
+	bool dialogErr;
+	dialogErr=(exportDialog->ShowModal() == wxID_CANCEL);
+
+	//even if user aborts, record the state of the animation
+	{
+	PropertyAnimator propAnim;
+	vector<pair<string,size_t> > pathMap;
+	exportDialog->getAnimationState(propAnim,pathMap);
+	
+	//restore the cache to viscontrol
 	visControl.swapFilterTree(treeWithCache);
 
-	//Animate dialog
-	if( (exportDialog->ShowModal() == wxID_CANCEL))
+	visControl.setAnimationState(propAnim,pathMap);
+	}
+
+	//Stop processing here if user aborted
+	if(dialogErr)
 	{
 		exportDialog->Destroy();
 		return;
 	}
 
-
 	//Stop timer based events, and lock UI
 	//--
 	updateTimer->Stop();
@@ -2030,7 +2097,7 @@ void MainWindowFrame::OnFileExportFilterVideo(wxCommandEvent &event)
 					}
 				}
 			}
-			catch(std::pair<string,string> errMsg)
+			catch(std::pair<string,string> &errMsg)
 			{
 				errMessage=errMsg.first + "\n" + errMsg.second;
 				//clean up data
@@ -2080,6 +2147,14 @@ void MainWindowFrame::OnFileExportPackage(wxCommandEvent &event)
 
 	}
 
+	//Determine if we want to export a debug package (hold CTRL+SHIFT during export menu select)
+	bool wantDebugPack;
+	{
+	bool shiftState=wxGetKeyState(WXK_SHIFT);
+	bool ctrlState= wxGetKeyState(WXK_CONTROL);
+	wantDebugPack=(shiftState && ctrlState);
+	}
+		
 	//This could be nicer, or reordered
 	wxTextEntryDialog wxTD(this,wxTRANS("Package name"),
 					wxTRANS("Package directory name"),wxT(""),wxOK|wxCANCEL);
@@ -2103,7 +2178,8 @@ void MainWindowFrame::OnFileExportPackage(wxCommandEvent &event)
 	while(res != wxID_CANCEL)
 	{
 		//Dir cannot exist yet, as we want to make it.
-		if(wxDirExists(wxD.GetPath() + wxTD.GetValue()))
+		if(wxDirExists(wxD.GetPath() +wxFileName::GetPathSeparator()
+			+ wxTD.GetValue()))
 		{
 			wxMesD.ShowModal();
 			res=wxD.ShowModal();
@@ -2149,7 +2225,58 @@ void MainWindowFrame::OnFileExportPackage(wxCommandEvent &event)
 		for(map<string,string>::iterator it=fileMapping.begin();
 				it!=fileMapping.end();++it)
 		{
-			if(!wxCopyFile(wxStr(it->second),folder+wxStr(it->first)))
+			//Hack, if we are exporting a debugging package,
+			// pos files should be 
+			// only copied for the first CHUNKSIZE bytes 
+			bool copyError; bool isPosFile;
+			copyError=false;isPosFile=false;
+			
+			string strName=it->first;
+
+			if(strName.size() > 4)
+			{
+				strName=strName.substr(strName.size()-4);
+				if(strName == ".pos")
+					isPosFile=true;	
+			}
+
+			size_t filesize;
+			const size_t CHUNKSIZE=1024*1024*2;
+			filesize=0;
+			if(wantDebugPack && isPosFile)
+				getFilesize(it->second.c_str(),filesize);
+			
+			if(wantDebugPack && isPosFile && filesize > CHUNKSIZE)
+			{
+				ifstream inputF(it->second.c_str(),std::ios::binary);
+				if(!inputF)
+				{
+					copyError=true;
+					break;
+				}
+			
+				//copy one chunk
+				char *c = new char[CHUNKSIZE];
+				std::string outfname;
+				outfname=stlStr(folder) + it->first;
+				ofstream of(outfname.c_str(),std::ios::binary);
+				if(!of)
+				{
+					delete[] c;
+					copyError=true;
+					break;
+				}
+				inputF.read(c,CHUNKSIZE);
+				of.write(c,CHUNKSIZE);
+
+				delete[] c;
+			}
+			else
+			{
+				copyError=!wxCopyFile(wxStr(it->second),folder+wxStr(it->first));
+			}
+
+			if(copyError)
 			{
 				wxErrMsg(this,TRANS("Save error"),TRANS("Error copying file"));
 				return;
@@ -2161,6 +2288,10 @@ void MainWindowFrame::OnFileExportPackage(wxCommandEvent &event)
 
 		wxString s;
 		s=wxString(wxTRANS("Saved package: ")) + folder;
+		if(wantDebugPack)
+		{
+			s+=wxCStr(" (debug mode)");
+		}
 		statusMessage(stlStr(s).c_str(),MESSAGE_INFO);
 	}
 }
@@ -2469,7 +2600,7 @@ void MainWindowFrame::OnEditRange(wxCommandEvent &event)
 void MainWindowFrame::OnEditPreferences(wxCommandEvent &event)
 {
 	//Create  a new preference dialog
-	PrefDialog *p = new PrefDialog(this);
+	PrefDialog *p = new PrefDialog(this,wxID_ANY,wxT("Preferences"));
 
 	//TODO: Refactor preference dialog to accept a config file object
 
@@ -4119,7 +4250,8 @@ void MainWindowFrame::updateProgressStatus()
 		ProgressData p;
 		p=visControl.getProgress();
 
-		if(p == lastProgressData)
+		if(p == lastProgressData
+			|| !p.maxStep)
 			return;
 		lastProgressData=p;
 
@@ -4525,8 +4657,13 @@ void MainWindowFrame::OnFilterPropDoubleClick(wxSplitterEvent &event)
 
 void MainWindowFrame::OnControlSplitMove(wxSplitterEvent &event)
 {
+	//Set the grid an event so that it can adapt the grid margins to fit
 	wxGridEvent gridEvent(ID_GRID_RAW_DATA,wxEVT_GRID_LABEL_LEFT_DCLICK,NULL);
 	wxPostEvent(gridFilterPropGroup,gridEvent);
+
+	//For some reason, the damage rectangle is not updated
+	// for the tree ctrl
+	treeFilters->Refresh();
 }
 
 void MainWindowFrame::OnTopBottomSplitMove(wxSplitterEvent &event)
@@ -4535,6 +4672,13 @@ void MainWindowFrame::OnTopBottomSplitMove(wxSplitterEvent &event)
 	panelTop->forceRedraw();
 }
 
+void MainWindowFrame::OnFilterSplitMove(wxSplitterEvent &event)
+{
+	//For some reason, the damage rectangle is not updated
+	// for the tree ctrl
+	treeFilters->Refresh();
+}
+
 void MainWindowFrame::OnControlUnsplit(wxSplitterEvent &event)
 {
 	//Make sure that the LHS panel is removed, rather than the default (right)
@@ -5234,13 +5378,17 @@ void MainWindowFrame::restoreConfigDefaults()
 		{
 			const unsigned int ROUGH_NUMBER_TIPS=22;
 			bool wantTipsAgain;
-			wxTipProvider *tipProvider = wxCreateFileTipProvider(wxStr(tipFile), (float)rand()/(float)RAND_MAX*(float)ROUGH_NUMBER_TIPS);
-			wantTipsAgain=wxShowTip(this, tipProvider);
+			wxTipProvider *tipProvider = wxCreateFileTipProvider(wxStr(tipFile), 
+					(size_t) ((float)rand()/(float)RAND_MAX*(float)ROUGH_NUMBER_TIPS));
+
+			if(tipProvider)
+			{
+				wantTipsAgain=wxShowTip(this, tipProvider);
+				delete tipProvider;
+				configFile.setWantStartupTips(wantTipsAgain);
+			}
 
-			if(!wantTipsAgain)
-				configFile.setWantStartupTips(false);
 
-			delete tipProvider;
 		}
 		else
 		{
@@ -5321,7 +5469,7 @@ void MainWindowFrame::restoreConfigPanelDefaults()
 	if(configFile.configLoadedOK())
 	{
 		val=configFile.getFilterSashPos();
-		winSize=filterPropertyPane->GetSize();
+		winSize=noteData->GetSize();
 		if(val > std::numeric_limits<float>::epsilon())
 		{
 			oldGravity=filterSplitter->GetSashGravity();
@@ -5759,7 +5907,7 @@ void MainWindowFrame::set_properties()
     comboCamera->Bind(wxEVT_SET_FOCUS, &MainWindowFrame::OnComboCameraSetFocus, this);
     comboStash->Bind(wxEVT_SET_FOCUS, &MainWindowFrame::OnComboStashSetFocus, this);
     noteDataView->Bind(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, &MainWindowFrame::OnNoteDataView, this);
-    treeFilters->Bind(wxEVT_KEY_DOWN,&MainWindowFrame::OnTreeKeyDown, this);
+    treeFilters->Bind(wxEVT_KEY_DOWN,&MainWindowFrame::OnTreeKeyDown, this); //Only required for 2.9
 #else
     comboCamera->Connect(wxID_ANY,
                  wxEVT_SET_FOCUS,
@@ -5769,6 +5917,7 @@ void MainWindowFrame::set_properties()
 		   wxFocusEventHandler(MainWindowFrame::OnComboStashSetFocus), NULL, this);
     noteDataView->Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
 		    wxNotebookEventHandler(MainWindowFrame::OnNoteDataView),NULL,this);
+    
 #endif
     gridCameraProperties->clear();
     int widths[] = {-4,-2,-1};
diff --git a/src/gui/mainFrame.h b/src/gui/mainFrame.h
index c85eeb8..1e9fa28 100644
--- a/src/gui/mainFrame.h
+++ b/src/gui/mainFrame.h
@@ -28,6 +28,9 @@
 #include <wx/dnd.h>
 #include <wx/grid.h>
 #include <wx/treectrl.h>
+#if wxCHECK_VERSION(2,9,0)
+#include <wx/filehistory.h>
+#endif
 // end wxGlade
 
 //Local stuff
@@ -43,8 +46,8 @@
 #ifndef THREEDEPICT_H 
 #define THREEDEPICT_H
 
-//Workaround for keypress not detected under MSW wx3.0
-#if wxCHECK_VERSION(2,9,0) && ( defined(__WIN32) || defined(__WIN64))
+//Workaround for keypress not detected under MSW wx3.0 and apple
+#if wxCHECK_VERSION(2,9,0) && ( defined(__WIN32) || defined(__WIN64) || defined(__APPLE__)) || wxCHECK_VERSION(3,0,0)
 #define WX_TREE_WORKAROUND
 #endif
 
@@ -181,7 +184,7 @@ protected:
     wxStaticLine* stashFilterStaticSep;
     wxStaticText* filteringLabel;
     wxComboBox* comboFilters;
-    wxTreeCtrl* treeFilters;
+    TextTreeCtrl* treeFilters;
     wxStaticText* lastRefreshLabel;
     wxListCtrl* listLastRefresh;
     wxCheckBox* checkAutoUpdate;
@@ -347,6 +350,7 @@ public:
     virtual void OnFilterPropDoubleClick(wxSplitterEvent &event);
     virtual void OnControlUnsplit(wxSplitterEvent &event);
     virtual void OnControlSplitMove(wxSplitterEvent &event);
+    virtual void OnFilterSplitMove(wxSplitterEvent &event);
     virtual void OnTopBottomSplitMove(wxSplitterEvent &event);
     virtual void OnSpectraUnsplit(wxSplitterEvent &event);
     virtual void OnViewSpectraList(wxCommandEvent &event); 
@@ -366,6 +370,7 @@ public:
 
     virtual void OnTreeBeginLabelEdit(wxTreeEvent &evt);
     virtual void OnTreeEndLabelEdit(wxTreeEvent &evt);
+    
     virtual void OnUpdateTimer(wxTimerEvent &evt);
     virtual void OnAutosaveTimer(wxTimerEvent &evt);
 
diff --git a/src/gui/mathglPane.cpp b/src/gui/mathglPane.cpp
index e2fbd32..f6259e4 100644
--- a/src/gui/mathglPane.cpp
+++ b/src/gui/mathglPane.cpp
@@ -25,15 +25,18 @@
 #include "wx/wxcommon.h"
 #include "common/translation.h"
 
+#ifndef pow10
+#define pow10(x) pow(10,x)
+#endif
+
 #ifdef USE_MGL2
 	#include <mgl2/canvas_wnd.h>
-	#include <mgl2/canvas_wnd.h>
 #else
 	#include <mgl/mgl_eps.h>
 #endif
 
 //Panning speed modifier
-const float MGL_PAN_SPEED=0.8f;
+const float MGL_PAN_SPEED=2.0f;
 //Mathgl uses floating point loop computation, and can get stuck. Limit zoom precision
 const float MGL_ZOOM_LIMIT=10.0f*sqrt(std::numeric_limits<float>::epsilon());
 
@@ -50,7 +53,20 @@ enum
 //Do the particular enums require a redraw?
 const bool MOUSE_ACTION_NEEDS_REDRAW[] = { false,true,true};
 
+enum
+{
+	PLOT_TEXTURE_ZOOM_X,
+	PLOT_TEXTURE_ZOOM_Y,
+	PLOT_TEXTURE_ZOOM_RESET,
+	PLOT_TEXTURE_SLIDE_X,
+	PLOT_TEXTURE_ENUM_END
+};
 
+const char *mglTextureFile[] = { "textures/plot_zoom_x.png",
+				"textures/plot_zoom_y.png",
+				"textures/plot_zoom_reset.png",
+				"textures/plot_slide_x.png"
+				};
 
 using std::ifstream;
 using std::ios;
@@ -85,6 +101,7 @@ MathGLPane::MathGLPane(wxWindow* parent, int id) :
 wxPanel(parent, id,  wxDefaultPosition, wxDefaultSize)
 {
 	COMPILE_ASSERT(THREEDEP_ARRAYSIZE(MOUSE_ACTION_NEEDS_REDRAW) == MOUSE_MODE_ENUM_END);
+	COMPILE_ASSERT(THREEDEP_ARRAYSIZE(mglTextureFile) == PLOT_TEXTURE_ENUM_END);
 
 	hasResized=true;
 	limitInteract=false;
@@ -95,6 +112,7 @@ wxPanel(parent, id,  wxDefaultPosition, wxDefaultSize)
 	ownPlotPtr=false;
 	lastEditedPlot=lastEditedRegion=-1;
 	regionSelfUpdate=false;
+	plotIsLogarithmic=false;
 
 	SetBackgroundStyle(wxBG_STYLE_CUSTOM);
 
@@ -117,31 +135,26 @@ bool MathGLPane::readyForInput() const
 
 unsigned int MathGLPane::getAxisMask(int x, int y) const
 {
-	
-	ASSERT(thePlot && gr);
-	int w,h;
-	w=0;h=0;
-
-	//Retrieve wx coordinates for window rectangle size
-	GetClientSize(&w,&h);
 
 	//Retrieve XY position in graph coordinate space
 	// from XY coordinate in window space.
-	mglPoint mglCurMouse= gr->CalcXYZ(x,y);
+	float mglCurX, mglCurY;
+	if(!toPlotCoords(x,y,mglCurX,mglCurY))
+		return 0;
 
 	unsigned int retVal=0;
 
 #ifdef USE_MGL2
-	if(mglCurMouse.x < gr->Self()->GetOrgX('x'))
+	if(mglCurX < gr->Self()->GetOrgX('x'))
 		retVal |=AXIS_POSITION_LOW_X;
 
-	if(mglCurMouse.y < gr->Self()->GetOrgY('y'))
+	if(mglCurY < gr->Self()->GetOrgY('y'))
 		retVal |=AXIS_POSITION_LOW_Y;
 #else
-	if(mglCurMouse.x < gr->Org.x)
+	if(mglCurX < gr->Org.x)
 		retVal |=AXIS_POSITION_LOW_X;
 
-	if(mglCurMouse.y < gr->Org.y)
+	if(mglCurY < gr->Org.y)
 		retVal |=AXIS_POSITION_LOW_Y;
 #endif
 
@@ -167,7 +180,7 @@ void MathGLPane::setPlotWrapper(PlotWrapper *newPlot,bool takeOwnPtr)
 void MathGLPane::render(wxPaintEvent &event)
 {
 	
-    wxAutoBufferedPaintDC   *dc=new wxAutoBufferedPaintDC(this);
+	wxAutoBufferedPaintDC   *dc=new wxAutoBufferedPaintDC(this);
 
 	if(!thePlot || thePlot->isInteractionLocked() )
 	{
@@ -192,6 +205,12 @@ void MathGLPane::render(wxPaintEvent &event)
 	//Set the enabled and disabled plots
 	unsigned int nItems=thePlot->getNumVisible();
 	
+
+	wxFont font;
+	font.SetFamily(wxFONTFAMILY_SWISS);
+	if(font.IsOk())
+		dc->SetFont(font);
+	
 	if(!nItems)
 	{
 #ifdef __WXGTK__
@@ -208,7 +227,6 @@ void MathGLPane::render(wxPaintEvent &event)
 		int clientW,clientH;
 		GetClientSize(&clientW,&clientH);
 		
-		
 		wxString str=wxTRANS("No plots selected.");
 		dc->GetMultiLineTextExtent(str,&w,&h);
 		dc->DrawText(str,(clientW-w)/2, (clientH-h)/2);
@@ -223,21 +241,32 @@ void MathGLPane::render(wxPaintEvent &event)
 	}
 
 	//If the plot has changed, been resized or is performing
-	// a mouse action that reuqires updating, we need to update it
+	// a mouse action that requires updating, we need to update it
 	//likewise if we don't have a plot, we need one.
 	if(!gr || hasChanged || hasResized || 
 		MOUSE_ACTION_NEEDS_REDRAW[mouseDragMode])
 	{
-
+		//TODO: There appears to be a bug in mathgl
+		// where attempting to clear the plot with ->SetSize()
+		// causes objects to become zero sized (eg ticks).
+		// using a brand "new" plot entity bypasses this
+		// at some computational cost.
+		// Need to make a minimal example.
+	
 		//clear the plot drawing entity
-		if(gr)
-			delete gr;
-
+		if(!gr)
+		{
 #ifdef USE_MGL2
 		gr = new mglGraph(0,w,h);
 #else
 		gr = new mglGraphZB(w,h);
 #endif
+		}
+		else 
+		{
+			gr->SetSize(w,h);
+		}
+		
 		//change the plot by panningOneD it before we draw.
 		//if we need to 
 		if(mouseDragMode==MOUSE_MODE_DRAG_PAN)
@@ -245,16 +274,15 @@ void MathGLPane::render(wxPaintEvent &event)
 			float xMin,xMax,yMin,yMax;
 			thePlot->getBounds(xMin,xMax,yMin,yMax);
 		
-			mglPoint pEnd,pStart;
-			pEnd = gr->CalcXYZ(draggingCurrent.x,draggingCurrent.y);
-			pStart = gr->CalcXYZ(draggingStart.x,draggingStart.y);
+			float pEndX, pStartX,dummy;
+			toPlotCoords(draggingCurrent.x,draggingCurrent.y,pEndX,dummy);
+			toPlotCoords(draggingStart.x,draggingStart.y,pStartX,dummy);
 			
-			float offX = pEnd.x-pStart.x;
+			float offX = pEndX-pStartX;
 
-			//I cannot for the life of me work out why
-			//this extra transformation is needed.
-			//but without this the code produces a scale-dependant pan speed.
-			offX*=xMax-xMin;
+			//This is not needed if re-using mgl object!
+			// - not sure why!
+			//offX*=xMax-xMin;
 
 			//Modify for speed
 			offX*=MGL_PAN_SPEED;
@@ -264,21 +292,27 @@ void MathGLPane::render(wxPaintEvent &event)
 		}
 
 		//Draw the plot
-		thePlot->drawPlot(gr);	
+		thePlot->drawPlot(gr,plotIsLogarithmic);	
+		thePlot->resetChange();
 		hasResized=false;
+
+		//Copy the plot's memory buffer into a wxImage object, then draw it	
+	#ifdef USE_MGL2
+		char *rgbdata = (char*)malloc(w*h*3);
+		gr->GetRGB((char*)rgbdata,w*h*3);
+		
+		imageCacheBmp=wxImage(w,h,(unsigned char*)rgbdata,true);
+		free(rgbdata);
+	#else
+		unsigned char *tmp;
+		tmp=const_cast<unsigned char*>(gr->GetBits());
+		wxImage imTmp;
+		imTmp=wxImage(w,h,tmp,true);
+		imageCacheBmp=wxBitmap(imTmp);
+	#endif
 	}
 
-	//Copy the plot's memory buffer into a wxImage object, then draw it	
-#ifdef USE_MGL2
-	char *rgbdata = (char*)malloc(w*h*3);
-	gr->GetRGB((char*)rgbdata,w*h*3);
-	
-	wxImage img(w,h,(unsigned char*)rgbdata,true);
-	free(rgbdata);
-#else
-	wxImage img(w,h,const_cast<unsigned char*>(gr->GetBits()),true);
-#endif
-	dc->DrawBitmap(wxBitmap(img),0,0);
+	dc->DrawBitmap(wxBitmap(imageCacheBmp),0,0);
 	//If we are engaged in a dragging operation
 	//draw the nice little bits we need
 	switch(mouseDragMode)
@@ -349,8 +383,8 @@ void MathGLPane::render(wxPaintEvent &event)
 						tlX,draggingStart.y+END_MARKER_SIZE);
 
 			}
-				else
-					dc->DrawRectangle(tlX,tlY,wRect,hRect);
+			else
+				dc->DrawRectangle(tlX,tlY,wRect,hRect);
 		
 			break;
 		}    
@@ -364,12 +398,7 @@ void MathGLPane::render(wxPaintEvent &event)
 			break;
 		case MOUSE_MODE_ENUM_END:
 		{
-			unsigned int axisMask;
-			axisMask=getAxisMask(curMouse.x,curMouse.y);
-
-			//Draw any overlays
-			if(axisMask == AXIS_POSITION_INTERIOR)
-				drawInteractOverlay(dc);
+			drawInteractOverlay(dc);
 			break;
 		}
 		default:
@@ -446,7 +475,12 @@ bool MathGLPane::getRegionUnderCursor(const wxPoint  &mousePos, unsigned int &pl
 	ASSERT(gr);
 
 	//Convert the mouse coordinates to data coordinates.
-	mglPoint pMouse= gr->CalcXYZ(mousePos.x,mousePos.y);
+	float xM,yM;
+	toPlotCoords(mousePos.x,mousePos.y,xM,yM);
+	mglPoint pMouse(xM,yM); 
+
+
+
 	if(!readyForInput())
 		return false;
 
@@ -560,11 +594,6 @@ void MathGLPane::oneDMouseDownAction(bool leftDown,bool middleDown,
 {
 	ASSERT(thePlot->getNumVisible());
 	
-	int w,h;
-	w=0;h=0;
-
-	GetClientSize(&w,&h);
-
 	float xMin,xMax,yMin,yMax;
 	thePlot->getBounds(xMin,xMax,yMin,yMax);
 
@@ -586,11 +615,13 @@ void MathGLPane::oneDMouseDownAction(bool leftDown,bool middleDown,
 			//TODO: Implement a more generic region handler?
 			ASSERT(thePlot->plotType(plotId) == PLOT_TYPE_ONED);
 
-			mglPoint mglDragStart = gr->CalcXYZ(draggingStart.x,draggingStart.y);
+			float mglStartX,mglStartY;
+			toPlotCoords(draggingStart.x, draggingStart.y,mglStartX,mglStartY);
+
 			//Get the type of move, and the region
 			//that is being moved, as well as the plot that this
 			//region belongs to.
-			regionMoveType=computeRegionMoveType(mglDragStart.x,mglDragStart.y, r);
+			regionMoveType=computeRegionMoveType(mglStartX,mglStartY, r);
 			startMouseRegion=regionId;
 			startMousePlot=plotId;
 			mouseDragMode=MOUSE_MODE_DRAG_REGION;
@@ -623,6 +654,11 @@ void MathGLPane::leftMouseDown(wxMouseEvent& event)
 	if(!w || !h)
 		return;
 
+	//mathgl can't handle coordinate transformations with negative values
+	if(event.GetPosition().x > w || event.GetPosition().y > h ||
+		event.GetPosition().x < 0 || event.GetPosition().y < 0)
+		return;
+
 	switch(thePlot->getVisibleType())
 	{
 		case PLOT_TYPE_ONED:
@@ -703,7 +739,9 @@ void MathGLPane::mouseWheelMoved(wxMouseEvent& event)
 
 
 	mglPoint mousePos;
-	mousePos=gr->CalcXYZ(curMouse.x,curMouse.y);
+	float mglX,mglY;
+	toPlotCoords(curMouse.x,curMouse.y,mglX,mglY);
+	mousePos=mglPoint(mglX,mglY);
 
 	float xPlotMin,xPlotMax,yPlotMin,yPlotMax;
 	float xMin,xMax,yMin,yMax;
@@ -800,14 +838,16 @@ void MathGLPane::leftMouseReleased(wxMouseEvent& event)
 			{
 				//we need to tell viscontrol that we have done a region
 				//update
-				mglPoint mglCurMouse= gr->CalcXYZ(curMouse.x,curMouse.y);
+				float mglX,mglY;
+
+				toPlotCoords(curMouse.x,curMouse.y,mglX,mglY);
 				lastEditedRegion=startMouseRegion;
 				lastEditedPlot=startMousePlot;
 			
 				//Send the movement to the parent filter
 				thePlot->moveRegion(startMousePlot,startMouseRegion,
 							regionSelfUpdate,regionMoveType,
-								mglCurMouse.x,mglCurMouse.y);	
+								mglX,mglY);	
 				haveUpdates=true;	
 
 			}
@@ -891,8 +931,14 @@ void MathGLPane::updateDragPos(const wxPoint &draggingEnd) const
 
 	//Compute the MGL coords
 	mglPoint pStart,pEnd;
-	pStart = gr->CalcXYZ(startX,startY);
-	pEnd = gr->CalcXYZ(endX,endY);
+	float mglX,mglY;
+	if(!toPlotCoords(startX,startY,mglX,mglY))
+		return;
+	pStart= mglPoint(mglX,mglY);
+
+	if(!toPlotCoords(endX,endY,mglX,mglY))
+		return;
+	pEnd = mglPoint(mglX,mglY);
 
 
 	mglPoint cA;
@@ -1018,34 +1064,42 @@ unsigned int MathGLPane::savePNG(const std::string &filename,
 		gr=0;
 		return MGLPANE_ERR_BADALLOC;
 	}
-	char *mglWarnMsgBuf=new char[1024];
-	*mglWarnMsgBuf=0;
+
 #ifdef USE_MGL2
-	gr->Self()->SetWarn(0,mglWarnMsgBuf);
+	gr->SetWarn(0,"");
 #else
+	char *mglWarnMsgBuf=new char[1024];
+	*mglWarnMsgBuf=0;
 	gr->SetWarn(0);
 	gr->Message=mglWarnMsgBuf;
 #endif
-	thePlot->drawPlot(gr);	
+	bool dummy;
+	thePlot->drawPlot(gr,dummy);	
 
 	gr->WritePNG(filename.c_str());
 
 	bool doWarn;
 #ifdef USE_MGL2
-	doWarn=gr->Self()->GetWarn();
+	doWarn=gr->GetWarn();
 #else
 	doWarn=gr->WarnCode;
 #endif
 	if(doWarn)
 	{
+#ifdef USE_MGL2
+		lastMglErr= gr->Self()->Mess;
+#else
 		lastMglErr=mglWarnMsgBuf;
 		delete[] mglWarnMsgBuf;
+#endif
 		delete gr;
 		gr=0;
 		return MGLPANE_ERR_MGLWARN;
 	}
 
+#ifndef USE_MGL2
 	delete[] mglWarnMsgBuf;
+#endif
 	delete gr;
 	gr=0;
 	//Hack. mathgl does not return an error value from its writer
@@ -1081,29 +1135,40 @@ unsigned int MathGLPane::saveSVG(const std::string &filename)
 	grS = new mglGraphPS(1024,768);
 #endif
 
-	thePlot->drawPlot(grS);
+	bool dummy;
+	thePlot->drawPlot(grS,dummy);
 
-	char *mglWarnMsgBuf=new char[1024];
-	*mglWarnMsgBuf=0;
 #ifdef USE_MGL2
-	grS->Self()->SetWarn(0,mglWarnMsgBuf);
+	grS->SetWarn(0,"");
 #else
+	char *mglWarnMsgBuf=new char[1024];
+	*mglWarnMsgBuf=0;
 	grS->SetWarn(0);
 	grS->Message=mglWarnMsgBuf;
 #endif	
+
+	//Mathgl does not set locale prior to writing SVG
+	// do this by hand
+	pushLocale("C",LC_NUMERIC);
 	grS->WriteSVG(filename.c_str());
+	popLocale();
+
 
 	bool doWarn;
 #ifdef USE_MGL2
-	doWarn=grS->Self()->GetWarn();
+	doWarn=grS->GetWarn();
 #else
 	doWarn=grS->WarnCode;
 #endif
 
 	if(doWarn)
 	{
+#ifdef USE_MGL2
+		lastMglErr=grS->Self()->Mess;
+#else
 		lastMglErr=mglWarnMsgBuf;
 		delete[] mglWarnMsgBuf;
+#endif
 		delete grS;
 		grS=0;
 		return MGLPANE_ERR_MGLWARN;
@@ -1177,70 +1242,216 @@ void MathGLPane::drawInteractOverlay(wxDC *dc) const
 
 	ASSERT(w && h);
 
+
+	if(curMouse.x < 0 || curMouse.y < 0 || curMouse.x > w || curMouse.y > h)
+		return;
+
+	//Draw the overlay if outside the 
+	// axes
+	unsigned int axisMask=getAxisMask(curMouse.x,curMouse.y);
 	unsigned int regionId,plotId;
 	if(getRegionUnderCursor(curMouse,plotId,regionId))
 	{
-		PlotRegion r;
-		thePlot->getRegion(plotId,regionId,r);
-		
-		wxPen *arrowPen;
-		if(limitInteract)
-			arrowPen= new wxPen(*wxLIGHT_GREY,2,wxSOLID);
-		else
-			arrowPen= new wxPen(*wxBLACK,2,wxSOLID);
-		dc->SetPen(*arrowPen);
-		//Use inverse drawing function so that we don't get 
-		//black-on-black type drawing.
-		//Other option is to use inverse outlines.
-		dc->SetLogicalFunction(wxINVERT);
-
-		const int ARROW_SIZE=8;
+
+		if(axisMask == AXIS_POSITION_INTERIOR)
+		{
+
+			PlotRegion r;
+			thePlot->getRegion(plotId,regionId,r);
+			wxPen *drawPen;
 		
+			//Select pen colour depending upon whether interaction
+			// is allowed
+			if(limitInteract)
+				drawPen= new wxPen(*wxLIGHT_GREY,2,wxSOLID);
+			else
+				drawPen= new wxPen(*wxBLACK,2,wxSOLID);
+			
+			dc->SetPen(*drawPen);
+			//Draw two arrows < > over the centre of the plot
+			//---------
+			//Use inverse drawing function so that we don't get 
+			//black-on-black type drawing.
+			//Other option is to use inverse outlines.
+			dc->SetLogicalFunction(wxINVERT);
+
+			const int ARROW_SIZE=8;
+			
 
-		//Convert the mouse coordinates to data coordinates.
-		mglPoint pMouse= gr->CalcXYZ(curMouse.x,curMouse.y);
-		unsigned int regionMoveType=computeRegionMoveType(pMouse.x,pMouse.y,r);
+			float pMouseX,pMouseY;
+			//Convert the mouse coordinates to data coordinates.
+			if(!toPlotCoords(curMouse.x,curMouse.y,pMouseX,pMouseY))
+			{
+				delete drawPen;
+				return;
+			}
 
-		switch(regionMoveType)
+
+			unsigned int regionMoveType=computeRegionMoveType(pMouseX,pMouseY,r);
+
+			switch(regionMoveType)
+			{
+				//Left hand side of region
+				case REGION_MOVE_EXTEND_XMINUS:
+					dc->DrawLine(curMouse.x-ARROW_SIZE,h/2-ARROW_SIZE,
+						     curMouse.x-2*ARROW_SIZE, h/2);
+					dc->DrawLine(curMouse.x-2*ARROW_SIZE, h/2,
+						     curMouse.x-ARROW_SIZE,h/2+ARROW_SIZE);
+					break;
+				//right hand side of region
+				case REGION_MOVE_EXTEND_XPLUS:
+					dc->DrawLine(curMouse.x+ARROW_SIZE,h/2-ARROW_SIZE,
+						     curMouse.x+2*ARROW_SIZE, h/2);
+					dc->DrawLine(curMouse.x+2*ARROW_SIZE, h/2,
+						     curMouse.x+ARROW_SIZE,h/2+ARROW_SIZE);
+					break;
+
+				//centre of region
+				case REGION_MOVE_TRANSLATE_X:
+					dc->DrawLine(curMouse.x-ARROW_SIZE,h/2-ARROW_SIZE,
+						     curMouse.x-2*ARROW_SIZE, h/2);
+					dc->DrawLine(curMouse.x-2*ARROW_SIZE, h/2,
+						     curMouse.x-ARROW_SIZE,h/2+ARROW_SIZE);
+					dc->DrawLine(curMouse.x+ARROW_SIZE,h/2-ARROW_SIZE,
+						     curMouse.x+2*ARROW_SIZE, h/2);
+					dc->DrawLine(curMouse.x+2*ARROW_SIZE, h/2,
+						     curMouse.x+ARROW_SIZE,h/2+ARROW_SIZE);
+					break;
+				default:
+					ASSERT(false);
+
+			}
+
+			dc->SetLogicalFunction(wxCOPY);
+			delete drawPen;
+			//---------
+
+			//Draw the label for the species being hovered.
+			//---------
+			string labelText;
+			labelText = r.getName();
+			wxSize textSize=dc->GetTextExtent(wxStr(labelText));
+			dc->DrawText(wxStr(labelText),curMouse.x-textSize.GetWidth()/2, 
+					h/2-(textSize.GetHeight() + 1.5*ARROW_SIZE));
+			//---------
+		}	
+	}
+	else
+	{
+		//Draw small helper icons in top right of window
+		// TODO: Multiple images, and image cache
+		vector<unsigned int> textureIDs;
+
+		if(axisMask & AXIS_POSITION_LOW_X && 
+			(axisMask & AXIS_POSITION_LOW_Y))
+			textureIDs.push_back(PLOT_TEXTURE_ZOOM_RESET);
+		else if (axisMask & AXIS_POSITION_LOW_X)
+			textureIDs.push_back((PLOT_TEXTURE_ZOOM_Y));
+		else if (axisMask & AXIS_POSITION_LOW_Y)
 		{
-			//Left hand side of region
-			case REGION_MOVE_EXTEND_XMINUS:
-				dc->DrawLine(curMouse.x-ARROW_SIZE,h/2-ARROW_SIZE,
-					     curMouse.x-2*ARROW_SIZE, h/2);
-				dc->DrawLine(curMouse.x-2*ARROW_SIZE, h/2,
-					     curMouse.x-ARROW_SIZE,h/2+ARROW_SIZE);
-				break;
-			//right hand side of region
-			case REGION_MOVE_EXTEND_XPLUS:
-				dc->DrawLine(curMouse.x+ARROW_SIZE,h/2-ARROW_SIZE,
-					     curMouse.x+2*ARROW_SIZE, h/2);
-				dc->DrawLine(curMouse.x+2*ARROW_SIZE, h/2,
-					     curMouse.x+ARROW_SIZE,h/2+ARROW_SIZE);
-				break;
+			textureIDs.push_back(PLOT_TEXTURE_ZOOM_X);
+			textureIDs.push_back(PLOT_TEXTURE_SLIDE_X);
+		}
 
-			//centre of region
-			case REGION_MOVE_TRANSLATE_X:
-				dc->DrawLine(curMouse.x-ARROW_SIZE,h/2-ARROW_SIZE,
-					     curMouse.x-2*ARROW_SIZE, h/2);
-				dc->DrawLine(curMouse.x-2*ARROW_SIZE, h/2,
-					     curMouse.x-ARROW_SIZE,h/2+ARROW_SIZE);
-				dc->DrawLine(curMouse.x+ARROW_SIZE,h/2-ARROW_SIZE,
-					     curMouse.x+2*ARROW_SIZE, h/2);
-				dc->DrawLine(curMouse.x+2*ARROW_SIZE, h/2,
-					     curMouse.x+ARROW_SIZE,h/2+ARROW_SIZE);
-				break;
-			default:
-				ASSERT(false);
+		const float THUMB_FRACTION=0.1;
+		unsigned int thumbSize=THUMB_FRACTION*std::min(h,w);
+
+		for(size_t ui=0;ui<textureIDs.size();ui++)
+		{
+			size_t textureID;
+			textureID = textureIDs[ui];
+
+			ASSERT(textureID < PLOT_TEXTURE_ENUM_END);
+			std::string filename;
+			filename=locateDataFile(mglTextureFile[textureID]);
+		
+			//Need to draw a picture
+			wxImage img;
+			if(wxFileExists(wxStr(filename)) && img.LoadFile(wxStr(filename) ))
+			{
+				int position[2];
+				float tmp;
+				
+				img.Rescale(thumbSize,thumbSize,wxIMAGE_QUALITY_HIGH);
 
+				wxBitmap bmp(img);
+				//Draw in upper right, by one fraction
+				tmp= (1.0-1.5*THUMB_FRACTION);
+				position[0] = tmp*w;
+				
+				//Compute the vertical spacing for each icon 
+				position[1] = (1.0-(tmp - 2.0*(float)ui*THUMB_FRACTION))*h;
+
+				dc->DrawBitmap(img,position[0],position[1]);
+			}
 		}
+	}
 
-		dc->SetLogicalFunction(wxCOPY);
-		delete arrowPen;
+}
+
+
+
+bool MathGLPane::toPlotCoords(int winX, int winY,float &resX, float &resY) const
+{
+	int width, height;
+	GetClientSize(&width,&height);
+	if(winX < 0 || winY<0 || winX > width || winY > height)
+	{
+		WARN(false,"DEBUG ONLY - was outside window coord");
+		return false;
 	}
+		
+	ASSERT(gr);
+	mglPoint pt = gr->CalcXYZ(winX,winY);
+	
+	resX=pt.x;
+	if(plotIsLogarithmic)
+	{
+		float plotMinY,plotMaxY;
+#if USE_MGL2
+		plotMinY=gr->Self()->Min.y;
+		plotMaxY=gr->Self()->Max.y;
+#else
+		plotMinY=gr->Min.y;
+		plotMaxY=gr->Max.y;
+#endif
+		float proportion =(pt.y-plotMinY)/(plotMaxY-plotMinY);
+		float tmp = proportion*(log10(plotMaxY)-log10(plotMinY)) + log10(plotMinY); 
+		
+		resY=pow10(tmp);
+	}
+	else
+		resY=pt.y;
 
+	return true;
+}
+bool MathGLPane::toWinCoords(float plotX, float plotY, float &winX, float &winY) const
+{
+#ifdef USE_MGL2
+	mglPoint tmp;
+	tmp=gr->CalcScr(mglPoint(plotX,plotY));
+	winX=tmp.x; winY=tmp.y;
+#else
+	
+	int iWinX,iWinY;
+	iWinX=winX;
+	iWinY=winY;
+	gr->CalcScr(mglPoint(plotX,plotY),&iWinX,&iWinY);
+#endif
 
+	if(plotIsLogarithmic)
+	{
+		//FIXME: IMPLEMENT ME
+		WARN(false,"NOT IMPLEMENTED FOR LOG MODE");
+		return true;
+	}
+	else
+		return true;
 }
 
+
+
+
 void MathGLPane::drawRegionDraggingOverlay(wxDC *dc) const
 {
 	int w,h;
@@ -1250,31 +1461,23 @@ void MathGLPane::drawRegionDraggingOverlay(wxDC *dc) const
 	//Well, we are dragging the region out some.
 	//let us draw a line from the original X position to
 	//the current mouse position/nearest region position
-	mglPoint mglCurMouse= gr->CalcXYZ(curMouse.x,curMouse.y);
 
-	ASSERT(thePlot->plotType(startMousePlot) == PLOT_TYPE_ONED);
 	float regionLimitX,regionLimitY;
-	regionLimitX=mglCurMouse.x;
-	regionLimitY=mglCurMouse.y;
+	if(!toPlotCoords(curMouse.x,curMouse.y,regionLimitX,regionLimitY))
+		return;
+
+
+	ASSERT(thePlot->plotType(startMousePlot) == PLOT_TYPE_ONED);
 
 	//See where extending the region is allowed up to.
 	thePlot->findRegionLimit(startMousePlot,startMouseRegion,
 					regionMoveType, regionLimitX,regionLimitY);
 	
-	int deltaDrag;
-	mglPoint testPoint;
-	testPoint.x=regionLimitX;
-	testPoint.y=0;
-	int testX,testY;
-#ifdef USE_MGL2
-	mglPoint testOut;
-	testOut=gr->CalcScr(testPoint);
-	testX=testOut.x; testY=testOut.y;
-#else
-
-	gr->CalcScr(testPoint,&testX,&testY);
-#endif
-	deltaDrag = testX-draggingStart.x;
+	
+	float testX,testY;
+	toWinCoords(regionLimitX,regionLimitY,testX,testY);
+	
+	int deltaDrag = testX-draggingStart.x;
 
 	//Draw some text above the cursor to indicate the current position
 	std::string str;
@@ -1284,7 +1487,11 @@ void MathGLPane::drawRegionDraggingOverlay(wxDC *dc) const
 	wxCoord textW,textH;
 	dc->GetTextExtent(wxs,&textW,&textH);
 
-
+	wxFont font;
+	font.SetFamily(wxFONTFAMILY_SWISS);
+	if(font.IsOk())
+		dc->SetFont(font);
+	
 	wxPen *arrowPen;
 	arrowPen=  new wxPen(*wxBLACK,2,wxSOLID);
 
@@ -1317,6 +1524,14 @@ void MathGLPane::drawRegionDraggingOverlay(wxDC *dc) const
 	}
 
 
+	float mglCurMouseX,mglCurMouseY;
+	if(!toPlotCoords(curMouse.x,curMouse.y,mglCurMouseX,mglCurMouseY))
+	{
+		dc->SetLogicalFunction(wxCOPY);
+		delete arrowPen;
+		return;
+	}
+	
 	switch(regionMoveType)
 	{
 		case REGION_MOVE_EXTEND_XMINUS:
@@ -1335,23 +1550,20 @@ void MathGLPane::drawRegionDraggingOverlay(wxDC *dc) const
 			//upper and lower
 			PlotRegion reg;
 			thePlot->getRegion(startMousePlot,startMouseRegion,reg);
-			mglPoint mglDragStart = gr->CalcXYZ(draggingStart.x,draggingStart.y);
+
+			//Convert form window to mathgl coordinates
+			float mglDragStartX,mglDragStartY;
+			if(!toPlotCoords(draggingStart.x,draggingStart.y,
+				mglDragStartX,mglDragStartY))
+				break;
 
 			float newLower,newUpper;
-			newLower = reg.bounds[0].first + (mglCurMouse.x-mglDragStart.x);
-			newUpper = reg.bounds[0].second + (mglCurMouse.x-mglDragStart.x);
+			newLower = reg.bounds[0].first + (mglCurMouseX-mglDragStartX);
+			newUpper = reg.bounds[0].second + (mglCurMouseX-mglDragStartX);
 
-			int newLowerX,newUpperX,dummy;
-#ifdef USE_MGL2
-			mglPoint tmp;
-			tmp=gr->CalcScr(mglPoint(newLower,0.0f));
-			newLowerX=tmp.x;
-			tmp=gr->CalcScr(mglPoint(newUpper,0.0f));
-			newUpperX=tmp.x;
-#else
-			gr->CalcScr(mglPoint(newLower,0.0f),&newLowerX,&dummy);
-			gr->CalcScr(mglPoint(newUpper,0.0f),&newUpperX,&dummy);
-#endif
+			float newLowerX,newUpperX,dummy;
+			toWinCoords(newLower,0.0f,newLowerX,dummy);
+			toWinCoords(newUpper,0.0f,newUpperX,dummy);
 
 			dc->DrawLine(newLowerX,h/2+2*ARROW_SIZE,newLowerX,h/2-2*ARROW_SIZE);
 			dc->DrawLine(newUpperX,h/2+2*ARROW_SIZE,newUpperX,h/2-2*ARROW_SIZE);
diff --git a/src/gui/mathglPane.h b/src/gui/mathglPane.h
index 16e8f9f..834541a 100644
--- a/src/gui/mathglPane.h
+++ b/src/gui/mathglPane.h
@@ -45,6 +45,8 @@ typedef int (wxWindow::*UpdateHandler)();
 
 class MathGLPane: public wxPanel {
 private:
+	wxBitmap imageCacheBmp;	
+	
 	
 	vector<pair<wxWindow*,UpdateHandler> > updateHandlers;
 
@@ -84,6 +86,9 @@ private:
 	//!True if regions should update themselves
 	bool regionSelfUpdate;
 
+	//!True if last plot was in log mode. plot pointer (gr) must exist or this is not valid
+	bool  plotIsLogarithmic;
+
 	//!Pointer to the mathgl renderer
 #ifdef USE_MGL2
 	mglGraph *gr;	
@@ -119,6 +124,13 @@ private:
 		bool alternateDown, int dragX,int dragY);
 
 	bool readyForInput() const;
+
+	//Convert window coordinates to plot coordintes.
+	// - must be within window frame
+	// returns false if not able to convert (eg outside window)
+	bool toPlotCoords(int winX, int winY,float &resX, float &resY) const;
+
+	bool toWinCoords(float plotX, float plotY, float &winX, float &winY) const;
 public:
 
 	MathGLPane(wxWindow* parent, int id);
diff --git a/src/testing/filtertesting.cpp b/src/testing/filtertesting.cpp
index eaae3d8..ab2cc0c 100644
--- a/src/testing/filtertesting.cpp
+++ b/src/testing/filtertesting.cpp
@@ -432,9 +432,9 @@ bool filterTreeTests()
 		}
 		catch(bool)
 		{
-			WARN(false,"Couldn't run XML reparse of output file");
+			WARN(false,"Couldn't run XML reparse of output file - write permission?" );
 			wxRemoveFile(wxStr(tmpName));
-			return false;
+			return true;
 		}
 		wxRemoveFile(wxStr(tmpName));
 	}
diff --git a/src/testing/mglTesting.cpp b/src/testing/mglTesting.cpp
new file mode 100644
index 0000000..006eded
--- /dev/null
+++ b/src/testing/mglTesting.cpp
@@ -0,0 +1,159 @@
+#ifdef DEBUG
+#include <iostream>
+#include <cstdlib>
+#include <fstream>
+#include <limits>
+
+#include "config.h"
+
+#include "common/assertion.h"
+
+#ifdef USE_MGL2
+#include <mgl2/canvas_wnd.h>
+
+#include "common/basics.h"
+#include "common/stringFuncs.h"
+
+
+//Create a fixed type of mathgl graph, then compare it to
+// a reference image (if possible)
+bool mglTest()
+{
+	unsigned int w=1024,h=768;
+	mglGraph *grS;
+	grS = new mglGraph(0,w,h);
+
+	//Create some fake data
+	mglData someDataX,someDataY;
+	float *bufferX,*bufferY;
+	bufferX=new float[100];
+	bufferY=new float[100];
+	for(unsigned int ui=0; ui<100; ui++)
+	{
+		bufferX[ui]=ui;
+		bufferY[ui]=ui;
+	}
+	someDataX.Set(bufferX, 100);
+	someDataY.Set(bufferY, 100);
+
+	//Set up the plot area
+	grS->SetRanges(0,100);
+	grS->SetOrigin(mglPoint(0,0));
+	grS->Label('x',"axis one");
+	grS->Label('y',"axis two",0);
+	grS->SetCut(true);
+	//set up the axes a little
+	mglCanvas *canvas = dynamic_cast<mglCanvas*>(grS->Self());
+	canvas->AdjustTicks("x");
+	canvas->SetTickTempl('x',"%g");
+	canvas->Axis("xy");
+
+	grS->Plot(someDataX,someDataY,"r");
+
+	std::string s,t;
+	genRandomFilename(t);
+	s=t+".svg";
+	
+	pushLocale("C",LC_NUMERIC);
+	grS->WriteSVG(s.c_str());
+	popLocale();
+
+	//Check that the SVG was written
+	{
+	std::ifstream f(s.c_str());
+	if(!f)
+	{
+		WARN(false,"MGL Did not generate SVG");
+		delete[] bufferX;
+		delete[] bufferY;
+		delete grS;
+		return false;
+	}
+	}
+
+	//Check that mathgl was OK with this
+	if(grS->GetWarn())
+	{
+		WARN(false,"MGL functions returned an error");
+		std::cerr << "warncode :" << grS->Self()->GetWarn() << " message:" << grS->Message()<< std::endl;
+		delete[] bufferX;
+		delete[] bufferY;
+		delete grS;
+
+		return false;
+	}
+
+
+	//Try writing a PNG
+	s=t+".png";
+	grS->WritePNG(s.c_str());
+	{
+	std::ifstream f(s.c_str());
+	if(!f)
+	{
+		WARN(false,"MGL Did not generate PNG");
+		delete[] bufferX;
+		delete[] bufferY;
+		delete grS;
+		return false;
+	}
+	}
+
+	delete[] bufferX;
+	delete[] bufferY;
+
+	//Check that the PNG write was OK
+	if(grS->GetWarn())
+	{
+		WARN(false,"MGL functions returned an error");
+		std::cerr << "warncode :" << grS->Self()->GetWarn() << " message:" << grS->Message()<< std::endl;
+		delete grS;
+		
+		return false;
+	}
+
+	delete grS;
+
+
+	//TODO: write non-hack image comparison function
+	{
+	std::string call="/usr/bin/python ../extras/image-compare-hist.py ";
+	call+=s;
+	call += " ../test/ref-images/plot-ref.png";
+	if(!system(call.c_str()))
+	{
+		const char *FILE_COMPARE_OUT="img-compare-result-arkd.txt";
+		std::ifstream f(FILE_COMPARE_OUT);
+		if(f)
+		{
+			float answer=std::numeric_limits<float>::max();
+			stream_cast(answer,f);
+
+			//As an example, an "OK" image gave 177, a broken image 13000
+			const float THRESHOLD=2000;
+			TEST(answer < THRESHOLD,"Image comparison failed")
+				
+		}
+		rmFile(FILE_COMPARE_OUT);
+	}
+	else
+	{
+		WARN(false,"Unable to execute rather hacky image comparison code");
+	}
+	}
+
+
+	rmFile(s);
+	rmFile(t+".svg");
+
+	return true;
+}
+
+#else
+bool mglTest()
+{
+	WARN(false,"MGL tests not implemented for mgl 1.x");
+	return true;
+}
+#endif
+#endif
diff --git a/src/testing/mglTesting.h b/src/testing/mglTesting.h
new file mode 100644
index 0000000..3fb7f6d
--- /dev/null
+++ b/src/testing/mglTesting.h
@@ -0,0 +1,7 @@
+#ifndef MGLTESTING_H
+#define MGLTESTING_H
+
+//!Run a quick test that mathgl is working
+bool mglTest();
+
+#endif
diff --git a/src/testing/testing.cpp b/src/testing/testing.cpp
index 169ffb4..9f91575 100644
--- a/src/testing/testing.cpp
+++ b/src/testing/testing.cpp
@@ -22,6 +22,8 @@
 #include <wx/filename.h>
 #include <wx/dir.h>
 
+#include <fstream>
+
 #include "wx/wxcommon.h"
 
 
@@ -30,6 +32,7 @@
 #include "backend/configFile.h"
 #include "backend/filters/algorithms/binomial.h"
 #include "backend/APT/ionhit.h"
+#include "backend/APT/APTFileIO.h"
 
 #include "common/stringFuncs.h"
 #include "common/xmlHelper.h"
@@ -52,6 +55,8 @@ bool basicFunctionTests() ;
 //!Run a few checks on our XML helper functions
 bool XMLTests();
 
+//!Check to see if manifest contents can be found
+bool locateDataTests();
 
 bool basicFunctionTests()
 {
@@ -137,6 +142,15 @@ bool runUnitTests()
 	if(!runStateTests())
 		return false;
 
+	if(!locateDataTests())
+		return false;
+
+	if(!testFileIO())
+		return false;
+
+	if(!mglTest())
+		return false;
+
 	cerr << " OK" << endl << endl;
 
 	return true;
@@ -353,6 +367,133 @@ bool XMLTests()
 	return true;
 }
 
+bool locateDataTests()
+{
+	ifstream manifest;
+
+	vector<string> paths;
+	paths.push_back("./test/manifest.txt");
+	paths.push_back("../test/manifest.txt");
+	paths.push_back("manifest.txt");
+
+	//Try some standard paths
+	bool manifestOK=false;
+	for(unsigned int ui=0;ui<paths.size();ui++)
+	{
+		manifest.open(paths[ui].c_str());
+		if(manifest)
+		{
+			manifestOK=true;
+			break;
+		}
+	}
+
+	//Fall-back to using locate function
+	if(!manifestOK)
+	{
+		std::string str;
+		str=locateDataFile("manifest.txt");
+
+		if(str.size())
+		{
+			manifest.open(str.c_str());
+			manifestOK=manifest;
+		}
+	}
+
+	//Check for manifest existance
+	TEST(manifestOK,"manifest.txt not found. Unable to check package contents.");
+
+
+	//Process manifest
+	//Should look like:
+	//--
+	// [win|mac|lin|all] /path/to/file
+
+	vector<string> failures;
+
+	unsigned int lineNum=0;
+	unsigned int checkedCount=0;
+	while(manifest)
+	{
+		lineNum++;
+		std::string line;
+		getline(manifest,line);
+		line=stripWhite(line);
+
+		if(line.empty() || line[0] == '#')
+			continue;
+
+		std::string arch,path;
+		arch=line.substr(0,3);
+		path=stripWhite(line.substr(4));
+
+		//Find out if we need to check this path
+		// under our current arch
+		bool check;
+		check=false;
+		if(arch == "all")
+			check=true;
+		else
+		{
+			//Check only if compiled for thiarch arch
+			if(arch == "win")
+			{
+#if defined(__WIN32__) || defined(__WIN64)
+				check=true;
+#endif
+			}
+			else if(arch == "lin")
+			{
+#ifdef __linux__
+				check=true;
+#endif
+			}
+			else if(arch == "mac")
+			{
+#ifdef __APPLE__
+				check=true;
+#endif
+			}
+			else
+			{
+				std::string errStr,tmp;
+				errStr="Syntax error in manifest, line " ;
+				stream_cast(tmp,lineNum);
+				errStr+=lineNum;
+				errStr+=". Should start with win/lin/mac/all";
+				TEST(false,errStr);
+			}
+		}
+
 
+		if(check)
+		{
+			std::string newPath;
+			newPath=locateDataFile(path.c_str());
+			ifstream f(newPath.c_str());
+			if(!f)
+			{
+				std::string errStr;
+				errStr="Unable to locate: ";
+				errStr+=path;
+				failures.push_back(errStr);
+			}
+			else
+				checkedCount++;
+		}
+	}
+
+	if(failures.size())
+	{
+		WARN(false,"Failed to locate files in manifest.");
+		for(size_t ui=0;ui<failures.size();ui++)
+		{
+			cerr << failures[ui].c_str() << endl;;
+		}
+	}
+
+	return true;
+}
 
 #endif
diff --git a/src/testing/testing.h b/src/testing/testing.h
index 47b92d1..d3f7951 100644
--- a/src/testing/testing.h
+++ b/src/testing/testing.h
@@ -21,7 +21,7 @@
 
 #ifdef DEBUG
 #include "backend/filtertree.h"
-
+#include "testing/mglTesting.h"
 
 //Run all the built-in unit tests.
 bool runUnitTests();
diff --git a/src/wx/wxcommon.cpp b/src/wx/wxcommon.cpp
index ef65b1d..9750c69 100644
--- a/src/wx/wxcommon.cpp
+++ b/src/wx/wxcommon.cpp
@@ -18,6 +18,8 @@
 #include "wxcommon.h"
 
 #include "common/stringFuncs.h"
+#include "common/constants.h"
+#include <stack>
 
 #include <wx/wx.h>
 #include <wx/xml/xml.h>
@@ -31,6 +33,12 @@
 #include "CoreFoundation/CoreFoundation.h"
 #endif
 
+using std::stack;
+using std::pair;
+using std::map;
+using std::make_pair;
+using std::string;
+
 //Auto update checking RSS URL
 const char *RSS_FEED_LOCATION="http://threedepict.sourceforge.net/rss.xml";
 
@@ -41,6 +49,9 @@ wxEventType RemoteUpdateAvailEvent = wxNewEventType(); // You get to choose the
 //Maximum amount of content in RSS header is 1MB.
 const unsigned int MAX_RSS_CONTENT_SIZE=1024*1024;
 
+//Unlikely text string that can be appended to treepersist 
+const char *PATH_NONCE="%$-";
+
 std::string inputString;
 
 std::string locateDataFile(const char *name)
@@ -80,21 +91,25 @@ std::string locateDataFile(const char *name)
 				return s;
 		}
 	}
-
-	return std::string("");
+	else if(wxFileExists(wxStr(s)))
+		return s;
+	else
+		return std::string("");
 #elif defined( __linux__)
 
 	//Possible search paths. Must have trailing slash. will
 	//be searched in sequence.
-	const unsigned int NUM_SEARCH_DIRS=5;
+	const unsigned int NUM_SEARCH_DIRS=6;
 	const char *possibleDirs[] = { "./",
 					"/usr/local/share/3Depict/",
 					"/usr/share/3Depict/",
 					"/usr/share/3depict/", //Under debian, we have to use lowercase according to the debian guidelines, so handle this case.
 					"../data/",
-					"",
+					"./data/",
 					};
 
+	COMPILE_ASSERT(THREEDEP_ARRAYSIZE(possibleDirs) == NUM_SEARCH_DIRS);
+	
 	std::string s;
 	for(unsigned int ui=0; ui<NUM_SEARCH_DIRS; ui++)
 	{
@@ -121,7 +136,6 @@ std::string locateDataFile(const char *name)
 			return s;
 #else
 
-	//E.g. Mac
 	//	- Look in cwd
 	if(wxFileExists(wxCStr(name)))
 		return  std::string(name);
@@ -450,7 +464,143 @@ bool processMatchesName(size_t processID, const std::string &procName)
 		free(pspidBase);
 
 	}
+#endif
 	
+TreePersistNode::TreePersistNode(const wxTreeCtrl *treeCtrl,wxTreeItemId t)
+{
+	ASSERT(t.IsOk());
+
+	expanded = treeCtrl->IsExpanded(t);
+	selected = treeCtrl->IsSelected(t);
+}
+
+TreePersistNode::TreePersistNode()
+{
+}
+
+void TreePersist::saveTreeExpandState(wxTreeCtrl *treeCtrl)
+{
+	treeState.clear();
+	buildPathMapping(treeCtrl, treeState);
+}
+
+//TODO: Limit copy/paste code shared between overloads
+void TreePersist::buildPathMapping(wxTreeCtrl *treeCtrl,std::map<std::string, TreePersistNode> &retMap)
+{
+	//DFS walker stack for wxwidgets' tree item IDs
+	stack<pair<string,wxTreeItemId> > treeIDs;
 	
-#endif
+	{
+	wxTreeItemId baseItem;
+	baseItem=treeCtrl->GetRootItem();
+
+	//If tree is empty, then baseItem may not be OK	
+	if(!baseItem.IsOk())
+		return;
+	//Start with wx root node
+	treeIDs.push(make_pair("",baseItem));
+	}
 
+	//Build the map<> containing the flattened path in the tree
+	// and 
+	while(!treeIDs.empty())
+	{
+		std::string pathStr;
+		wxTreeItemId curItem;
+		pathStr= treeIDs.top().first;
+		curItem = treeIDs.top().second;
+		ASSERT(curItem.IsOk());
+		treeIDs.pop();
+		if(treeCtrl->ItemHasChildren(curItem))
+		{
+			wxTreeItemId tmp;
+			wxTreeItemIdValue token;
+			std::string baseStr;
+		
+			tmp = treeCtrl->GetFirstChild(curItem,token);
+			baseStr = pathStr;
+
+			//Push all children onto processing stack
+			//similarly, push down the tree<> content
+			while(tmp.IsOk())
+			{
+				pathStr=baseStr+ 
+					string("/") + stlStr(treeCtrl->GetItemText(tmp));
+
+				while(retMap.find(pathStr) != retMap.end())
+					pathStr+=PATH_NONCE;
+				
+				retMap[pathStr]=TreePersistNode(treeCtrl,tmp);
+				treeIDs.push(make_pair(pathStr,tmp));
+				
+				tmp=treeCtrl->GetNextChild(curItem,token);
+			}
+		} 
+	}
+}
+
+void TreePersist::buildPathMapping(wxTreeCtrl *treeCtrl,std::map<std::string, wxTreeItemId> &retMap)
+{
+	//DFS walker stack for wxwidgets' tree item IDs
+	stack<pair<string,wxTreeItemId> > treeIDs;
+		
+	//Start with wx root node
+	treeIDs.push(make_pair("",treeCtrl->GetRootItem()));
+
+	//Build the map<> containing the flattened path in the tree
+	// and 
+	while(!treeIDs.empty())
+	{
+		std::string pathStr;
+		wxTreeItemId curItem;
+		pathStr= treeIDs.top().first;
+		curItem = treeIDs.top().second;
+		treeIDs.pop();
+	
+		if(treeCtrl->ItemHasChildren(curItem))
+		{
+			wxTreeItemId tmp;
+			wxTreeItemIdValue token;
+			std::string baseStr;
+		
+			tmp = treeCtrl->GetFirstChild(curItem,token);
+			baseStr = pathStr;
+
+			//Push all children onto processing stack
+			while(tmp.IsOk())
+			{
+				wxString s;
+				s=treeCtrl->GetItemText(tmp);
+				pathStr=baseStr+ string("/");
+				pathStr+=stlStr(s);
+				while(retMap.find(pathStr) != retMap.end())
+					pathStr+=PATH_NONCE;
+				
+				treeIDs.push(make_pair(pathStr,tmp));
+				retMap[pathStr] = tmp;
+				tmp=treeCtrl->GetNextChild(curItem,token);
+			}
+		}
+	}
+}
+
+
+void TreePersist::restoreTreeExpandState(wxTreeCtrl *treeCtrl) const
+{
+	map<string,wxTreeItemId> treeMap;
+	buildPathMapping(treeCtrl,treeMap);
+
+	for(map<string,wxTreeItemId>::const_iterator it=treeMap.begin(); it!=treeMap.end(); ++it)
+	{
+		map<string,TreePersistNode>::const_iterator stateIt;
+		stateIt= treeState.find(it->first);
+
+		//If the path is found, then restore the item state
+		if(stateIt!=treeState.end())
+		{
+			if(stateIt->second.expanded)
+				treeCtrl->Expand(it->second); 
+		}
+
+	}
+}
diff --git a/src/wx/wxcommon.h b/src/wx/wxcommon.h
index 642d2d4..a4ee534 100644
--- a/src/wx/wxcommon.h
+++ b/src/wx/wxcommon.h
@@ -19,8 +19,12 @@
 #define WXCOMMON_H
 #include <wx/wx.h>
 #include <wx/url.h>
+#include <wx/treectrl.h>
+
+#include <map>
 
 #include "common/basics.h"
+#include "backend/tree.hh"
 
 #define wxCStr(a) wxString(a,*wxConvCurrent)
 #define wxStr(a) wxString(a.c_str(),*wxConvCurrent)
@@ -158,4 +162,36 @@ class VersionCheckThread : public wxThread
 		//Return the maximal version string obtained from the remote RSS feed
 		std::string getVerStr() {  return versionStr; }
 };
+
+
+//!storage node of tree persistence 
+// - tree persistence means the state for 
+//   a tree in terms of expanded and not-expanded items
+class TreePersistNode
+{
+	public:
+		bool expanded,selected;
+
+		//Contructor for node persistence
+		TreePersistNode();
+		TreePersistNode(const wxTreeCtrl *ctrl,wxTreeItemId t);
+};
+
+//!storage helper class for tree persistence 
+//   persistence - expanded and not-expanded items
+class TreePersist
+{
+	private:
+		std::map<std::string,TreePersistNode> treeState;
+
+		//Build path mapping for persistance node
+		static void buildPathMapping(wxTreeCtrl *t, std::map<std::string,TreePersistNode>  &retMap);
+		//Build path mapping for wx tree items
+		static void buildPathMapping(wxTreeCtrl *t, std::map<std::string,wxTreeItemId>  &retMap);
+	public:
+		//TODO: Const correctness
+		void saveTreeExpandState(wxTreeCtrl *treeCtrl);
+		void restoreTreeExpandState(wxTreeCtrl *treeCtrl) const;
+};
+
 #endif
diff --git a/src/wx/wxcomponents.cpp b/src/wx/wxcomponents.cpp
index 1e267b0..ca72ced 100644
--- a/src/wx/wxcomponents.cpp
+++ b/src/wx/wxcomponents.cpp
@@ -35,6 +35,8 @@ void upWxTreeCtrl(const FilterTree &filterTree, wxTreeCtrl *t,
 		std::map<size_t,Filter *> &filterMap,vector<const Filter *> &persistentFilters,
 		const Filter *visibleFilt)
 {
+	TreePersist tPersist;
+	tPersist.saveTreeExpandState(t);
 	//Remove any filters that don't exist any more
 	for(unsigned int ui=persistentFilters.size();ui--;)
 	{
@@ -121,13 +123,16 @@ void upWxTreeCtrl(const FilterTree &filterTree, wxTreeCtrl *t,
 		ASSERT(reverseFilterMap.find(visibleFilt)!=reverseFilterMap.end())
 		t->SelectItem(reverseFilterMap[visibleFilt]);
 	}
+	
 	t->GetParent()->Layout();
 
+	tPersist.restoreTreeExpandState(t);
+
 	t->Thaw();
 }
 
-//Convert my internal choice string format to wx's
-std::string wxChoiceParamString(std::string choiceString)
+//Convert my internal choice string format to comma delimited 
+std::string choiceStringToCommaDelim(std::string choiceString)
 {
 	std::string retStr;
 
@@ -209,7 +214,13 @@ void wxCustomPropGrid::OnLabelDClick(wxGridEvent &event)
 void wxCustomPropGrid::fitCols(wxSize &size)
 {
 	int wc = size.GetWidth()-this->GetScrollThumb(wxVERTICAL)-15;
-	this->SetColSize(1, wc-this->GetColSize(0)); 
+	int colSize = this->GetColSize(0) ;
+
+	//SetColSize complains with negative argument
+	if(wc - colSize < 0)
+		return;
+
+	this->SetColSize(1, wc-colSize);
 
 	Refresh();
 }
@@ -513,7 +524,7 @@ void wxCustomPropGrid::propertyLayout()
 				                   1,wxStr(s));
 
 				//construct a wxStringArray of possible choices.
-				s=wxChoiceParamString(propertyKeys[ui][uj].data);
+				s=choiceStringToCommaDelim(propertyKeys[ui][uj].data);
 				vector<std::string> splitStrs;
 				wxArrayString a;
 				splitStrsRef(s.c_str(),',',splitStrs);
@@ -724,8 +735,6 @@ void CopyGrid::OnKey(wxKeyEvent &event)
 
 void CopyGrid::copyData() 
 {
-        // Number of rows and cols
-        int rows,cols;
        
 	
 	//This is an undocumented class AFAIK. :(
@@ -742,6 +751,8 @@ void CopyGrid::copyData()
 	endline="\n";
 #endif
 
+        // Number of rows and cols
+        int rows,cols;
 	if(arrayTL.Count() && arrayBR.Count())
 	{
 
@@ -881,6 +892,81 @@ void CopyGrid::copyData()
 }
 
 
+BEGIN_EVENT_TABLE(TextTreeCtrl, wxTreeCtrl)
+	EVT_PAINT(TextTreeCtrl::OnTreePaint)
+END_EVENT_TABLE()
+
+void TextTreeCtrl::OnTreePaint(wxPaintEvent &event)
+{
+	//Draws a message in the text control, if the
+	// control is otherwise empty
+
+	//Call standard handler on exit
+	event.Skip(true);
+	//If there are items in the control, just abort
+	if(GetCount() || messageStrs.empty())
+		return;
+
+	//scan for the largest string
+	size_t largestTextSize=0,idx=(size_t)-1;
+	for(size_t ui=0;ui<messageStrs.size();ui++)
+	{
+		if(messageStrs[ui].size() > largestTextSize)
+		{
+			largestTextSize=messageStrs[ui].size();
+			idx=ui;
+		}
+	}
+
+	if(idx ==(size_t) -1)
+		return;
+
+	//Check that the string we want fits in the control 
+	int w,h;
+	GetClientSize(&w,&h);
+
+	//Create drawing context
+	wxPaintDC *dc = new wxPaintDC(this);
+	//Set text font
+	wxFont font;
+	font.SetFamily(wxFONTFAMILY_SWISS);
+	
+	if(font.IsOk())
+		dc->SetFont(font);
+	
+	wxSize textSize=dc->GetTextExtent(wxStr(messageStrs[idx]));
+
+	//Don't go ahead with the drawing if the text
+	// won't fit in the control
+	const float HEIGHT_SPACING=1.1;
+	float blockHeight=textSize.GetHeight()*messageStrs.size()*HEIGHT_SPACING;
+
+	if(textSize.GetWidth() >=w || blockHeight> h) 
+	{
+		delete dc;
+		return;
+	}
+
+	//Draw each text in turn, advancing by spacing
+	
+	// start far enough back so that 
+	float startY= 0.5*(h - blockHeight);
+
+	for(size_t ui=0;ui<messageStrs.size();ui++)
+	{
+		textSize=dc->GetTextExtent(wxStr(messageStrs[ui]));
+		int startX;
+		startX=w/2 - textSize.GetWidth()/2; 
+
+		dc->DrawText(wxStr(messageStrs[ui]),
+					startX,startY);	
+		
+		startY+=HEIGHT_SPACING*textSize.GetHeight();
+	}
+
+	delete dc;
+}
+
 std::string TTFFinder::findFont(const char *fontFile)
 {
 	//Action is OS dependant
diff --git a/src/wx/wxcomponents.h b/src/wx/wxcomponents.h
index 39752a1..b10d790 100644
--- a/src/wx/wxcomponents.h
+++ b/src/wx/wxcomponents.h
@@ -89,6 +89,23 @@ void upWxTreeCtrl(const FilterTree &filterTree, wxTreeCtrl *t,
 		std::map<size_t,Filter *> &filterMap,vector<const Filter *> &persistentFilters,
 		const Filter *visibleFilt);
 
+//Subclassed wx tree ctrl to draw text in tree when empty
+class TextTreeCtrl : public wxTreeCtrl
+{
+	private:
+		std::vector<std::string> messageStrs;
+	public:
+		 TextTreeCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTR_HAS_BUTTONS, const wxValidator& validator = wxDefaultValidator, const wxString& name = _("treeCtrl")) : wxTreeCtrl(parent,id,pos,size,style,validator,name) {};
+
+
+		virtual void OnTreePaint(wxPaintEvent &evt);
+
+		void setMessages(const std::vector<std::string> &msgs) { messageStrs=msgs;}
+
+		DECLARE_EVENT_TABLE()
+};
+
+
 //!Data container for tree object data
 class wxTreeUint : public wxTreeItemData
 {
diff --git a/test/dogtail/test.py b/test/dogtail/test.py
new file mode 100755
index 0000000..039fc9d
--- /dev/null
+++ b/test/dogtail/test.py
@@ -0,0 +1,494 @@
+#!/usr/bin/python
+#
+#	test.py - Automated UI testing for 3depict
+#	Copyright (C) 2014, D Haley 
+
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+
+#	This program is distributed in the hope that it will be useful,
+#	but WITHOUT ANY WARRANTY; without even the implied warranty of
+#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#	GNU General Public License for more details.
+
+#	You should have received a copy of the GNU General Public License
+#	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+
+import os
+from os import environ
+
+import traceback
+import subprocess
+import time
+import tempfile
+import struct
+import array
+import random
+
+#Dogtail imports
+import dogtail
+from dogtail.config import config
+from dogtail import dump
+from dogtail import rawinput
+from dogtail import sessions 
+from dogtail.procedural import *
+from dogtail.utils import screenshot
+from dogtail.predicate import GenericPredicate
+
+#Python magick - wrapper for imagemagick (no docs, afaik)
+import PythonMagick as Magick
+
+#HELPER FUNCTIONS
+#---
+#Create a predicate from name/role
+def element(name,role,description=""):
+	return predicate.GenericPredicate(name,role,description)
+
+#launch the colour dialog from the main window
+def loadColDlg(app3depict):
+	viewMenu=app3depict.menu('View');
+	viewMenu.click();
+	backItem = viewMenu.menuItem("Background Colour...")
+	backItem.click()
+
+	colDlg = app3depict.findChild(element("Choose colour","color chooser"))
+	return colDlg
+
+def sameImage(fileA,fileB):
+	imA=Magick.Image(fileA);
+	imB=Magick.Image(fileB);
+
+	return  imA == imB
+
+def appShot(application,ycrop=0):
+	time.sleep(0.3) # Wait a fraction of second, in case image is not very static
+	shot=screenshot()
+	mainFrame=application.findChild(element("","frame"))
+	xyStart=mainFrame.position;
+	xySize=mainFrame.size
+	
+	im=Magick.Image(shot);
+	im.crop(Magick.Geometry(xySize[0],xySize[1]-ycrop,xyStart[0],xyStart[1]))
+	im.write(shot)
+
+	return shot
+def find(target, someList):
+	for item in someList:
+		if target == item: 
+			return True
+	return False
+
+
+#---
+
+#Close the program
+def closeProgram(app3depict):
+	fileMenu=app3depict.menu('File')
+	fileMenu.click();
+	exitMenu=app3depict.menuItem('Exit');
+
+	exitMenu.click()	
+
+	try:
+		reqDialog=app3depict.findChild(element("","alert"),retry=False)
+		#For some reason, pressing the dialog contents using .button(...) does nothing
+		# manually use keycombo to quit
+		if reqDialog.name == "Error" : 
+			dogtail.rawinput.keyCombo("<alt>o")
+
+	except:
+		reqDialog=None	
+
+#Try executing/aborting the file->open menu
+def openTest(app3depict):
+	global overrideImage	
+	
+	shotBefore=appShot(app3depict)
+
+	fileMenu=app3depict.menu('File')
+	fileMenu.click();
+	openMenu=fileMenu.menuItem('Open...')
+	openMenu.click();
+
+	saveas = app3depict.dialog('Select Data or State File...')
+
+	
+	tmp=tempfile.NamedTemporaryFile(delete=False)
+	tmp.close()
+	filename=tmp.name+'.pos'
+	writeRandomPos(filename,100)
+
+	#Force gnome's annoying dialog to actually display a
+	# place to type
+	hddButton=saveas.findChild(element("File System","table cell"));
+	hddButton.click()
+
+	fileText=saveas.findChild(element("","text"));
+	fileText.typeText(filename)
+
+	saveas.button('Open').click()
+	
+	shotAfter=appShot(app3depict)
+
+	#Point data should have loaded
+	if(sameImage(shotBefore,shotAfter) and ( not overrideImage)):
+		return False
+	
+	
+
+	#FIXME: 3Depict bug! shouldn't need to tap space
+	# after loading file - should auto-snap to bounds
+	#Press space to tap 
+	dogtail.rawinput.pressKey("space")
+	return True
+
+def filterTests(app3depict):
+	global overrideImage
+	
+	#Fudge the bounding box of the
+	# cropping region to exclude stuff like statusbar
+	# - autosave, progress etc can affect this
+	CROP_FUDGE=60
+	
+	#Locate the data tab
+	dataTab=app3depict.findChild(element("Data","page tab"))
+
+	#locate listbox with filters inside
+	filterText=dataTab.findChild(element("","text","List of available filters"))
+	filterBox=filterText.findAncestor(element("","combo box"))
+
+	xy=filterBox.position
+
+	#move 5px beyond the box so we can click the down arrow	
+	xPlus=xy[0]+filterBox.size[0] -3 
+	yPlus=xy[1] + filterBox.size[1]/2
+
+	#locate filter tree
+	filterTree=dataTab.findChild(element("","panel","Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items."));
+	
+	#We can't interact with the tree using dogtail's
+	# accessibility stuff - the tree doens't appear.
+	# So just use the dropdown with undo
+	
+
+	dropdownBox=filterBox.menu("")
+	dropItems=dropdownBox.findChildren(element("","menu item"))
+
+	editMenu=app3depict.menu("Edit");
+	undoMenuItem=editMenu.menuItem("Undo");
+
+	#Single item on each 
+	for i in dropItems:
+		#Range filter pops up a dialog, 
+		# needs special processing
+		if i.name == "Range File":
+			continue
+
+		#Node is named "pos data", press "p" to activate it
+		filterTree.click()
+		dogtail.rawinput.pressKey("p")
+		dogtail.rawinput.pressKey("space")
+
+		dogtail.rawinput.click(xPlus,yPlus)
+		shotBefore=appShot(app3depict,CROP_FUDGE)
+		i.click()
+
+		filterTree.click()
+		dogtail.rawinput.pressKey("space")
+		shotAfter=appShot(app3depict,CROP_FUDGE)
+		
+		if(sameImage(shotBefore,shotAfter) and not (overrideImage) ):
+			print("Image didn't change before/after filter")
+			return False
+
+		#Tap the refresh shortcut, then refocus dialog to
+		# kill tooltip
+		dogtail.rawinput.pressKey("F5")
+		
+		time.sleep(2) #Wait for refresh to complete 
+		dogtail.rawinput.pressKey("space") #Tap "neutral key" to kill tooltip
+		shotAfterRefresh=appShot(app3depict,CROP_FUDGE);
+
+		if not sameImage(shotAfterRefresh,shotAfter) and not (overrideImage):
+			print("Image Changed when refresh from cache")
+			return False
+	
+		editMenu.click()
+		undoMenuItem.click()
+
+
+	SHOT_BLACKLIST=["Annotation" ]
+	#Select the pos data item again
+	filterTree.click()
+	dogtail.rawinput.pressKey("p")
+	for i in dropItems:
+		
+		shotBefore=appShot(app3depict,CROP_FUDGE)
+		#Range filter pops up a dialog, 
+		# needs special processing
+		if i.name == "Range File":
+			continue
+
+		dogtail.rawinput.click(xPlus,yPlus)
+		i.click()
+
+		shotAfter=appShot(app3depict,CROP_FUDGE)
+		
+		#For most filters, there should be a visible change
+		if not find(i.name,SHOT_BLACKLIST) :
+			if(sameImage(shotBefore, shotAfter) and not overrideImage):
+				return False
+
+		#Tap the refresh shortcut
+		dogtail.rawinput.pressKey("F5")
+		time.sleep(5) #Wait for refresh to complete 
+		dogtail.rawinput.pressKey("space") #Tap "neutral key" to kill tooltip
+		shotAfterRefresh=appShot(app3depict,CROP_FUDGE);
+
+		#Pressing refresh should do nothing
+		if not sameImage(shotAfter,shotAfter) and not overrideImage:
+			return False
+
+	
+	filterTree.click()
+	dogtail.rawinput.pressKey("p")
+	
+	dogtail.rawinput.pressKey("del")
+	
+	return True
+
+
+#Try opening and closing panels with the menu,
+# check for change in GUI
+def panelTests(app3depict):
+	global overrideImage
+	viewMenu=app3depict.menu('View');
+
+	PANEL_TOGGLES=["Control Pane", "Raw Data Pane"]
+	for i in PANEL_TOGGLES:
+		shotBefore=appShot(app3depict);
+		viewMenu.click();
+		viewMenu.menuItem(i).click();
+		shotAfter=appShot(app3depict);
+		
+		viewMenu.click();
+		viewMenu.menuItem(i).click();
+
+		if sameImage(shotBefore,shotAfter) and not overrideImage:
+			print ('UI did not change, but should have:')
+			return False
+	return True
+
+#Try opening preferences menu, and activating a few items
+def prefTests(app3depict):
+	prefMenu=app3depict.menu("Edit");
+	prefMenu.click();
+	editMenu=prefMenu.menuItem("Preferences");
+	editMenu.click();
+
+	prefDialog=app3depict.findChild(element("Preferences","frame"));
+
+	#Get defaults tab
+	tabFilterDefaults=prefDialog.findChild(element("Pref","page tab",));
+	#Walk through all the filter entries in the list, clicking each one
+	listFilters=tabFilterDefaults.findChild(element("","table"))
+	listFilterEntries=tabFilterDefaults.findChildren(element("","table cell"))	
+
+	tmpDelay=dogtail.config.actionDelay;
+	dogtail.config.actionDelay=0.05;
+	for i in listFilterEntries:
+		i.click()
+	tmpDelay=tmpDelay;
+
+
+	prefDialog.button("Cancel").click()
+
+	return True
+
+
+#Try changing some of the view options
+def viewTests(app3depict):
+	global overrideImage
+	#Show colour dialog
+	colDlg = loadColDlg(app3depict) 
+
+	#Set the colour to black, remembering orig
+	#--------
+	#The first text field is the colour hex code field
+	hexText=colDlg.findChild(element("","text"))
+	origHex=hexText.text
+	hexText.typeText("#000000")
+	colDlg.button("OK").click()
+	#--------
+	
+	#Take screenshot
+	shotBefore= appShot(app3depict)
+
+	#Show dialog
+	colDlg = loadColDlg(app3depict) 
+
+	#Set colour to green
+	#------
+	hexText=colDlg.findChild(element("","text"))
+	hexText.typeText("#22aa22")
+	colDlg.button("OK").click()
+
+	shotAfter = appShot(app3depict)
+
+	#Colour should have changed
+	if sameImage(shotAfter, shotBefore ) and not overrideImage:
+		return False
+	
+	#Set the colour back to orig
+	colDlg=loadColDlg(app3depict)
+	hexText=colDlg.findChild(element("","text"))
+	hexText.typeText(origHex)
+	colDlg.button("OK").click()
+
+
+	#Toggle axis
+	shotBefore=appShot(app3depict)
+	
+	viewMenu=app3depict.menu('View');
+	viewMenu.click()
+	axisItem=viewMenu.menuItem("Axis")
+	axisItem.click()
+	
+	shotAfter=appShot(app3depict)
+
+	#Screenshot should have changed
+	if sameImage(shotBefore, shotAfter) and not overrideImage:
+		return False
+
+	#Restore axis
+	viewMenu.click()
+	axisItem.click()
+
+
+	#Play with fullscreen
+	shotBefore=appShot(app3depict)
+	viewMenu.click()
+	fullscrItem=viewMenu.menuItem("Fullscreen mode")
+	fullscrItem.click()
+
+	shotAfter=appShot(app3depict)
+
+	if(sameImage(shotBefore,shotAfter)) and not overrideImage:
+		return False
+	
+
+	#Leave fullscreen
+	dogtail.rawinput.pressKey("F11")
+	shotAfter=appShot(app3depict)
+	if(sameImage(shotAfter,shotBefore)) and not overrideImage:
+		return False
+
+	return True
+
+#Try saving an image, and see if the file turns up
+def imageTest(app3depict):
+	dogtail.rawinput.keyCombo('<Control>i')
+	
+	saveas = app3depict.dialog('Save Image...')
+	saveLocText=saveas.findChild(element("","text"))
+
+	tmp=tempfile.NamedTemporaryFile(delete=False)
+	tmp.close()
+	strDogSave=tmp.name + "-shot.png"
+	saveLocText.typeText(strDogSave)
+	
+	saveas.button("Save").click()
+	
+	
+	ressel= app3depict.findChild(element('Resolution Selection','frame'))
+	ressel.button("OK").click()
+
+	if not os.path.isfile(strDogSave) :
+		return False
+
+	return True
+
+def writeRandomPos(filename,numpoints):
+	f=open(filename,'wb')
+
+	#Inefficiently generate a whole bunch of random
+	# floats in -100:100 
+	randomData=[]
+	for i in range(numpoints*4):
+		randomData.append(random.uniform(-100,100))
+
+	s=struct.pack('>'+'f'*len(randomData),*randomData)
+	f.write(s)
+
+	
+
+def runDogtailTests():
+	environ['LANG']='en'
+	# Start  program
+	run('3Depict')
+	app3depict = tree.root.application('3Depict')
+
+	#Tap escape twice, once for startuptips,
+	# once to remove any autosave dialog questions
+	dogtail.rawinput.pressKey("esc")	
+	dogtail.rawinput.pressKey("esc")	
+	#Run various tests
+	#--------
+	if not panelTests(app3depict):
+		return False;
+	prefTests(app3depict)
+	if not viewTests(app3depict):
+		return False
+	if not imageTest(app3depict):
+		return False
+
+	#This test does not return 3depict to
+	# normal state, leaves file open
+	if not openTest(app3depict):
+		return False
+	
+	if not filterTests(app3depict):
+		return False
+	##--------
+
+	closeProgram(app3depict)
+
+	return True
+
+if __name__=='__main__':
+	import sys
+
+	global overrideImage
+	overrideImage=True
+
+	#Check for existing 3depict instances
+	data=subprocess.Popen(['pidof', '3Depict'],stdout=subprocess.PIPE).communicate()[0]
+	pids=data.split(' ');
+	if not (len(pids) == 1 and len(pids[0]) == 0)  :
+		print("Cannot start - multiple program instances cannot be run with dogtail")
+		exit(1)
+
+	#Setup some rate parameters
+	dogtail.config.defaultDelay=0.15;
+	dogtail.config.actionDelay=0.15;
+	dogtail.config.typingDelay=0.15;
+	dogtail.config.searchCutoffCount=5
+
+
+	#Just complain if anything goes wrong
+	try:
+		testsOK =runDogtailTests()
+	except :
+		traceback.print_exc(limit=2)
+		print('Test failed with exception.')
+		exit(1);
+
+	if not testsOK:
+		print('Test failed.')
+		exit(1)
+
+	exit(0)
diff --git a/test/manifest.txt b/test/manifest.txt
new file mode 100644
index 0000000..6a4cf62
--- /dev/null
+++ b/test/manifest.txt
@@ -0,0 +1,31 @@
+#"Manifest" file. Contains the list of files that should be find-able with 
+# 3depict. Used in unit tests.
+#Syntax is 
+# [all|lin|win|mac] <path-to-file>
+# path-to-file should be such that locateDataFile(...) [src/wx/wxcommon.cpp] can find it
+
+#Textures
+all 3Depict.xpm
+all atomic-mass-table.dtd
+all textures/animProgress0.png
+all textures/animProgress1.png
+all textures/animProgress2.png
+all textures/enlarge.png
+all textures/keyboard-alt.png
+all textures/keyboard-command.png
+all textures/keyboard-ctrl.png
+all textures/keyboard-shift.png
+all textures/keyboard-tab.png
+all textures/Left_clicked_mouse.png
+all textures/Left-Right-arrow.png
+all textures/middle_clicked_mouse.png
+all textures/plot_zoom_reset.png
+all textures/plot_zoom_x.png
+all textures/plot_zoom_y.png
+all textures/Right-arrow.png
+all textures/Right_clicked_mouse.png
+all textures/rotateArrow.png
+all textures/scroll_wheel_mouse.png
+#Startup tips
+all naturalAbundance.xml
+all startup-tips.txt
diff --git a/test/ref-images/plot-ref.png b/test/ref-images/plot-ref.png
new file mode 100644
index 0000000..7298b0e
Binary files /dev/null and b/test/ref-images/plot-ref.png differ
diff --git a/translations/3Depict_base.pot b/translations/3Depict_base.pot
index 5c909c0..6ae63d3 100644
--- a/translations/3Depict_base.pot
+++ b/translations/3Depict_base.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-05 22:42+0200\n"
+"POT-Creation-Date: 2014-04-12 18:12+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -17,270 +17,272 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../src/gl/cameras.cpp:688 ../src/gl/cameras.cpp:690
+#: ../src/gl/cameras.cpp:598 ../src/gl/cameras.cpp:600
 msgid "Lock"
 msgstr ""
 
-#: ../src/gl/cameras.cpp:697 ../src/backend/filters/ionClip.cpp:523
-#: ../src/backend/filters/ionClip.cpp:545
-#: ../src/backend/filters/ionClip.cpp:567
-#: ../src/backend/filters/ionClip.cpp:607
-#: ../src/backend/filters/compositionProfile.cpp:940
-#: ../src/backend/filters/compositionProfile.cpp:981
-#: ../src/backend/filters/spatialAnalysis.cpp:593
-#: ../src/backend/filters/transform.cpp:1258
-#: ../src/backend/filters/transform.cpp:1285
-#: ../src/backend/filters/transform.cpp:1311
+#: ../src/gl/cameras.cpp:607 ../src/backend/filters/ionClip.cpp:526
+#: ../src/backend/filters/ionClip.cpp:548
+#: ../src/backend/filters/ionClip.cpp:570
+#: ../src/backend/filters/ionClip.cpp:610
+#: ../src/backend/filters/compositionProfile.cpp:1015
+#: ../src/backend/filters/compositionProfile.cpp:1056
+#: ../src/backend/filters/spatialAnalysis.cpp:599
+#: ../src/backend/filters/transform.cpp:1264
+#: ../src/backend/filters/transform.cpp:1291
+#: ../src/backend/filters/transform.cpp:1317
 #: ../src/backend/filters/annotation.cpp:569
 msgid "Origin"
 msgstr ""
 
-#: ../src/gl/cameras.cpp:702 ../src/backend/filters/spatialAnalysis.cpp:511
+#: ../src/gl/cameras.cpp:612 ../src/backend/filters/spatialAnalysis.cpp:518
 msgid "Target"
 msgstr ""
 
-#: ../src/gl/cameras.cpp:707
+#: ../src/gl/cameras.cpp:617
 msgid "Up Dir."
 msgstr ""
 
-#: ../src/gl/cameras.cpp:715 ../src/gl/cameras.cpp:819
+#: ../src/gl/cameras.cpp:625 ../src/gl/cameras.cpp:729
 msgid "Perspective"
 msgstr ""
 
-#: ../src/gl/cameras.cpp:717 ../src/gl/cameras.cpp:821
+#: ../src/gl/cameras.cpp:627 ../src/gl/cameras.cpp:731
+#: ../src/gui/mainFrame.cpp:5396
 msgid "Orthogonal"
 msgstr ""
 
-#: ../src/gl/cameras.cpp:721
+#: ../src/gl/cameras.cpp:631
 msgid "Projection"
 msgstr ""
 
-#: ../src/gl/cameras.cpp:729
+#: ../src/gl/cameras.cpp:639
 msgid "Field of View (deg)"
 msgstr ""
 
-#: ../src/gl/cameras.cpp:735
+#: ../src/gl/cameras.cpp:645
 msgid "View size"
 msgstr ""
 
-#: ../src/wxcomponents.cpp:428 ../src/gui/dialogs/ExportRngDialog.cpp:88
-#: ../src/gui/dialogs/prefDialog.cpp:108
+#: ../src/wx/wxcomponents.cpp:441 ../src/gui/dialogs/ExportRngDialog.cpp:88
+#: ../src/gui/dialogs/prefDialog.cpp:110
 msgid "Param"
 msgstr ""
 
-#: ../src/wxcomponents.cpp:429 ../src/gui/dialogs/ExportRngDialog.cpp:89
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1109
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1134
-#: ../src/gui/dialogs/prefDialog.cpp:109 ../src/gui/mainFrame.cpp:5489
-#: ../src/gui/mainFrame.cpp:5494 ../src/backend/filters/dataLoad.cpp:486
+#: ../src/wx/wxcomponents.cpp:442 ../src/gui/dialogs/ExportRngDialog.cpp:89
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:109
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1186
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1211
+#: ../src/gui/dialogs/prefDialog.cpp:111 ../src/gui/mainFrame.cpp:5849
+#: ../src/gui/mainFrame.cpp:5854 ../src/backend/filters/dataLoad.cpp:575
 msgid "Value"
 msgstr ""
 
-#: ../src/wxcomponents.cpp:641
+#: ../src/wx/wxcomponents.cpp:655
 msgid "Save Data..."
 msgstr ""
 
-#: ../src/wxcomponents.cpp:642
+#: ../src/wx/wxcomponents.cpp:656
 msgid "Text File (*.txt)|*.txt|All Files (*)|*"
 msgstr ""
 
-#: ../src/wxcomponents.cpp:654
+#: ../src/wx/wxcomponents.cpp:668
 msgid "Error saving file. Check output dir is writable."
 msgstr ""
 
-#: ../src/wxcomponents.cpp:654 ../src/gui/dialogs/ExportRngDialog.cpp:170
-#: ../src/gui/mainFrame.cpp:1371 ../src/gui/mainFrame.cpp:1500
-#: ../src/gui/mainFrame.cpp:1545 ../src/gui/mainFrame.cpp:1628
-#: ../src/gui/mainFrame.cpp:2122 ../src/gui/mainFrame.cpp:2137
-#: ../src/gui/mainFrame.cpp:2230 ../src/gui/mainFrame.cpp:2347
+#: ../src/wx/wxcomponents.cpp:668 ../src/gui/dialogs/ExportRngDialog.cpp:170
+#: ../src/gui/mainFrame.cpp:1422 ../src/gui/mainFrame.cpp:1548
+#: ../src/gui/mainFrame.cpp:1583 ../src/gui/mainFrame.cpp:1659
+#: ../src/gui/mainFrame.cpp:2213 ../src/gui/mainFrame.cpp:2279
+#: ../src/gui/mainFrame.cpp:2371 ../src/gui/mainFrame.cpp:2486
 msgid "Save error"
 msgstr ""
 
-#: ../src/common/basics.cpp:52 ../src/backend/APT/APTFileIO.cpp:61
+#: ../src/common/basics.cpp:62 ../src/backend/APT/APTFileIO.cpp:65
+#: ../src/backend/APT/APTFileIO.cpp:89
 msgid "Error opening file"
 msgstr ""
 
-#: ../src/common/basics.cpp:53
+#: ../src/common/basics.cpp:63
 msgid "Error whilst reading file contents"
 msgstr ""
 
-#: ../src/common/basics.cpp:54 ../src/backend/APT/APTFileIO.cpp:65
+#: ../src/common/basics.cpp:64 ../src/backend/APT/APTFileIO.cpp:69
 msgid "Error interpreting field in file"
 msgstr ""
 
-#: ../src/common/basics.cpp:55
+#: ../src/common/basics.cpp:65
 msgid "Inconsistent number of columns found"
 msgstr ""
 
-#: ../src/common/basics.cpp:167
+#: ../src/common/basics.cpp:197
 msgid "in the future?"
 msgstr ""
 
-#: ../src/common/basics.cpp:218
+#: ../src/common/basics.cpp:248
 msgid "a decade ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:219
+#: ../src/common/basics.cpp:249
 msgid "a year ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:220
+#: ../src/common/basics.cpp:250
 msgid "a month ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:221
+#: ../src/common/basics.cpp:251
 msgid "a week ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:222
+#: ../src/common/basics.cpp:252
 msgid "a day ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:223
+#: ../src/common/basics.cpp:253
 msgid "an hour ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:224
+#: ../src/common/basics.cpp:254
 msgid "45 minutes ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:225
+#: ../src/common/basics.cpp:255
 msgid "30 minutes ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:226
+#: ../src/common/basics.cpp:256
 msgid "20 minutes ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:227
+#: ../src/common/basics.cpp:257
 msgid "15 minutes ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:228
+#: ../src/common/basics.cpp:258
 msgid "10 minutes ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:229
+#: ../src/common/basics.cpp:259
 msgid "5 minutes ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:230
+#: ../src/common/basics.cpp:260
 msgid "a minute ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:231
+#: ../src/common/basics.cpp:261
 msgid "30 seconds ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:232
+#: ../src/common/basics.cpp:262
 msgid "10 seconds ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:233
+#: ../src/common/basics.cpp:263
 msgid "a second ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:238
+#: ../src/common/basics.cpp:268
 msgid "a few decades ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:239
+#: ../src/common/basics.cpp:269
 msgid "a few years ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:240
+#: ../src/common/basics.cpp:270
 msgid "a few months ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:241
+#: ../src/common/basics.cpp:271
 msgid "a few weeks ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:242
+#: ../src/common/basics.cpp:272
 msgid "a few days ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:243
+#: ../src/common/basics.cpp:273
 msgid "a few hours ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:250
+#: ../src/common/basics.cpp:280
 msgid "a few minutes ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:253
+#: ../src/common/basics.cpp:283
 msgid "a few seconds ago"
 msgstr ""
 
-#: ../src/common/basics.cpp:280
+#: ../src/common/basics.cpp:310
 msgid "moments ago"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:234
+#: ../src/common/colourmap.cpp:242
 msgid "Jet"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:235
+#: ../src/common/colourmap.cpp:243
 msgid "Hot"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:236
+#: ../src/common/colourmap.cpp:244
 msgid "Cold"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:237
+#: ../src/common/colourmap.cpp:245
 msgid "Grey"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:238
+#: ../src/common/colourmap.cpp:246
 msgid "Cyclic"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:239
+#: ../src/common/colourmap.cpp:247
 msgid "General"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:240
+#: ../src/common/colourmap.cpp:248
 msgid "Blue"
 msgstr ""
 
-#: ../src/common/colourmap.cpp:241
+#: ../src/common/colourmap.cpp:249
 msgid "Pseudo-Random"
 msgstr ""
 
-#: ../src/gui/glPane.cpp:636
+#: ../src/gui/glPane.cpp:670
 msgid "Use shift/ctrl-space or double tap to alter reset axis"
 msgstr ""
 
-#: ../src/gui/glPane.cpp:894
+#: ../src/gui/glPane.cpp:934
 msgid "Image progress"
 msgstr ""
 
-#: ../src/gui/glPane.cpp:895
+#: ../src/gui/glPane.cpp:935
 msgid "Rendering tiles..."
 msgstr ""
 
-#: ../src/gui/glPane.cpp:911
+#: ../src/gui/glPane.cpp:969
 msgid "Tile "
 msgstr ""
 
-#: ../src/gui/glPane.cpp:911 ../src/gui/glPane.cpp:1078
-#: ../src/gui/mainFrame.cpp:3975 ../src/gui/mainFrame.cpp:3979
-#: ../src/gui/mainFrame.cpp:3992
+#: ../src/gui/glPane.cpp:969 ../src/gui/glPane.cpp:1080
+#: ../src/gui/mainFrame.cpp:4279 ../src/gui/mainFrame.cpp:4283
+#: ../src/gui/mainFrame.cpp:4296 ../src/backend/filters/dataLoad.cpp:311
 msgid " of "
 msgstr ""
 
-#: ../src/gui/glPane.cpp:1044
+#: ../src/gui/glPane.cpp:1041
 msgid "Animation progress"
 msgstr ""
 
-#: ../src/gui/glPane.cpp:1045
+#: ../src/gui/glPane.cpp:1042
 msgid "Rendering sequence..."
 msgstr ""
 
-#: ../src/gui/glPane.cpp:1078
+#: ../src/gui/glPane.cpp:1080
 msgid "Saving Image "
 msgstr ""
 
@@ -301,7 +303,8 @@ msgid "Ions"
 msgstr ""
 
 #: ../src/gui/dialogs/ExportRngDialog.cpp:55
-#: ../src/backend/filters/rangeFile.cpp:721
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1606
+#: ../src/backend/filters/rangeFile.cpp:729
 msgid "Ranges"
 msgstr ""
 
@@ -317,7 +320,8 @@ msgstr ""
 msgid "Num Ranges"
 msgstr ""
 
-#: ../src/gui/dialogs/ExportRngDialog.cpp:116 ../src/backend/filter.cpp:43
+#: ../src/gui/dialogs/ExportRngDialog.cpp:116
+#: ../src/gui/dialogs/rangeEditDialog.cpp:710 ../src/backend/filter.cpp:43
 msgid "Ion"
 msgstr ""
 
@@ -329,7 +333,7 @@ msgstr ""
 msgid "Range end"
 msgstr ""
 
-#: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2173
+#: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2315
 msgid "Save pos..."
 msgstr ""
 
@@ -337,10 +341,10 @@ msgstr ""
 msgid "ORNL format RNG (*.rng)|*.rng|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/dialogs/ExportRngDialog.cpp:167 ../src/gui/mainFrame.cpp:1371
-#: ../src/gui/mainFrame.cpp:1546 ../src/gui/mainFrame.cpp:1628
-#: ../src/gui/mainFrame.cpp:2123 ../src/gui/mainFrame.cpp:2231
-#: ../src/gui/mainFrame.cpp:2348
+#: ../src/gui/dialogs/ExportRngDialog.cpp:167 ../src/gui/mainFrame.cpp:1422
+#: ../src/gui/mainFrame.cpp:1584 ../src/gui/mainFrame.cpp:1659
+#: ../src/gui/mainFrame.cpp:2214 ../src/gui/mainFrame.cpp:2372
+#: ../src/gui/mainFrame.cpp:2487
 msgid "Unable to save. Check output destination can be written to."
 msgstr ""
 
@@ -356,6 +360,97 @@ msgstr ""
 msgid "Detailed view of selected range"
 msgstr ""
 
+#: ../src/gui/dialogs/rangeEditDialog.cpp:218
+msgid "Show Overlays"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:243
+msgid "e.g. H2O"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:575
+#: ../src/gui/dialogs/rangeEditDialog.cpp:709 ../src/gui/mainFrame.cpp:6061
+#: ../src/backend/filter.cpp:44
+msgid "Plot"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:576
+msgid "Short Name"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:577
+msgid "Long Name"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:578
+#: ../src/backend/filters/voxelise.cpp:1022
+#: ../src/backend/filters/compositionProfile.cpp:1156
+#: ../src/backend/filters/annotation.cpp:903
+#: ../src/backend/filters/spectrumPlot.cpp:472
+msgid "Colour"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:711
+#: ../src/backend/filters/annotation.cpp:606
+#: ../src/backend/filters/annotation.cpp:645
+#: ../src/backend/filters/annotation.cpp:812
+msgid "Start"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:712
+#: ../src/backend/filters/annotation.cpp:614
+#: ../src/backend/filters/annotation.cpp:654
+#: ../src/backend/filters/annotation.cpp:820
+msgid "End"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1275
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1278
+msgid "Range or ion?"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1276
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1279
+msgid "Select type to add"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1561
+msgid "Range Editor"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1565
+msgid "Enable or disable all overlays"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1566
+msgid "Entered overlays, use delete to remove"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1567
+msgid "Available plots for ranging"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1568
+msgid "Enter species to display as overlay, e.g. SiO2"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1569
+msgid "Editable ranges"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1570
+msgid "Editable ions"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1605
+#: ../src/gui/dialogs/animateFilterDialog.cpp:172
+msgid "Plots"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1607
+msgid "Overlay"
+msgstr ""
+
 #: ../src/gui/dialogs/autosaveDialog.cpp:39
 msgid "Remove &All"
 msgstr ""
@@ -434,57 +529,57 @@ msgstr ""
 msgid "From Table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:108
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354
 #: ../src/gui/dialogs/animateFilterDialog.cpp:191
 msgid "Frame"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:244
 msgid "Select text file..."
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:245
 msgid "Text files (*.txt)|*.txt;|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346
 msgid "String Keyframes"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348
 msgid "Frame at which to start string sequence"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:349
 msgid "Frame offset for data start"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350
 msgid "File to use as string data source, one value per row"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:351
 msgid "Select file to use as data source"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352
 msgid "Use table below for data source"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:358
 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:359
 msgid "Remove selected strings from table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:360
 msgid "Abort value selection and return to previous window"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:361
 msgid "Accept data values"
 msgstr ""
 
@@ -505,12 +600,12 @@ msgid "Ramp"
 msgstr ""
 
 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1115
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1192
 msgid "Start Frame"
 msgstr ""
 
 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:66
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1116
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1193
 msgid "End Frame"
 msgstr ""
 
@@ -530,15 +625,15 @@ msgstr ""
 msgid "endColour"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:235
+#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:237
 msgid "Key Frame : Colour"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:237
+#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:239
 msgid "Colour at the start of the transtition"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:238
+#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:240
 msgid "Colour at end of transition"
 msgstr ""
 
@@ -583,7 +678,7 @@ msgid "3D Images"
 msgstr ""
 
 #: ../src/gui/dialogs/animateFilterDialog.cpp:166
-msgid "File Prefix: "
+msgid "File Suffix: "
 msgstr ""
 
 #: ../src/gui/dialogs/animateFilterDialog.cpp:168
@@ -598,10 +693,6 @@ msgstr ""
 msgid "Point data"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:172
-msgid "Plots"
-msgstr ""
-
 #: ../src/gui/dialogs/animateFilterDialog.cpp:173
 msgid "Voxel data"
 msgstr ""
@@ -614,159 +705,156 @@ msgstr ""
 msgid "Format"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:638
+#: ../src/gui/dialogs/animateFilterDialog.cpp:672
 msgid "transition frame"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:638
-#: ../src/gui/mainFrame.cpp:1601
+#: ../src/gui/dialogs/animateFilterDialog.cpp:672
+#: ../src/gui/mainFrame.cpp:1636
 msgid "Frame count"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:710
+#: ../src/gui/dialogs/animateFilterDialog.cpp:744
 msgid "Key frame : Colour"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:763
+#: ../src/gui/dialogs/animateFilterDialog.cpp:797
 msgid "File existed, but was unable to read or interpret file contents."
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:764
+#: ../src/gui/dialogs/animateFilterDialog.cpp:798
 msgid "String load failed"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:785
+#: ../src/gui/dialogs/animateFilterDialog.cpp:819
 msgid "Keyframe : decimal"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:794
+#: ../src/gui/dialogs/animateFilterDialog.cpp:828
 msgid "Keyframe : integer"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:803
+#: ../src/gui/dialogs/animateFilterDialog.cpp:837
 msgid "Keyframe : 3D Point"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:929
+#: ../src/gui/dialogs/animateFilterDialog.cpp:962
 msgid "Select or create new folder"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1105
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1182
 msgid "Export Animation"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1106
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1183
 msgid "Select filter"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1108
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1113
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1133
-#: ../src/gui/mainFrame.cpp:5488 ../src/gui/mainFrame.cpp:5493
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1185
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1190
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1210
+#: ../src/gui/mainFrame.cpp:5848 ../src/gui/mainFrame.cpp:5853
 msgid "Property"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1110
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1187
 msgid "Select property"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1112
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1132
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1189
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1209
 msgid "Filter"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1114
-#: ../src/backend/filters/transform.cpp:1176
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1191
+#: ../src/backend/filters/transform.cpp:1182
 #: ../src/backend/filters/annotation.cpp:547
 msgid "Mode"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1117
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1194
 msgid "Keyframe table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1118
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1195
 msgid "Remove the selected keyframe from the table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1119
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1196
 msgid "Enter where the animation frames will be exported to"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1120
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1197
 msgid "Browse to directory where the animation frames will be exported to"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1122
-msgid "Enter a descriptive name for output files"
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1199
+msgid ""
+"Title for files, result will be saved as #-name.png, where # is image number."
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1123
-msgid "Enter the target resoltuion (image size)"
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1200
+msgid "Target resolution (image size)"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1125
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1202
 msgid "Select frame for property display"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1126
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1203
 msgid "Enter frame number to change frame (eg 1/20)"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1127
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1204
 msgid "Save point data (POS files) in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1128
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1205
 msgid "Save plots (as text files) in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1129
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1206
 msgid "Save voxel data (raw files) in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1130
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1207
 msgid "Save range files  in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1135
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1212
 msgid "Animation parameters for current frame"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1136
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1213
 msgid "Abort animation"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1137
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1214
 msgid "Run Animation"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1208
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1285
 msgid "Filter view"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1209
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1286
 msgid "Frame view"
 msgstr ""
 
-#: ../src/gui/dialogs/resolutionDialog.cpp:46
+#: ../src/gui/dialogs/resolutionDialog.cpp:45
 msgid "Width :"
 msgstr ""
 
-#: ../src/gui/dialogs/resolutionDialog.cpp:48
+#: ../src/gui/dialogs/resolutionDialog.cpp:47
 msgid "Height :"
 msgstr ""
 
 #: ../src/gui/dialogs/resolutionDialog.cpp:50
-msgid "Lock Aspect"
-msgstr ""
-
-#: ../src/gui/dialogs/resolutionDialog.cpp:54
-#: ../src/gui/dialogs/prefDialog.cpp:82
+#: ../src/gui/dialogs/prefDialog.cpp:83
 msgid "Reset"
 msgstr ""
 
-#: ../src/gui/dialogs/resolutionDialog.cpp:462
+#: ../src/gui/dialogs/resolutionDialog.cpp:350
 msgid "Resolution Selection"
 msgstr ""
 
@@ -775,7 +863,7 @@ msgid "Export:"
 msgstr ""
 
 #: ../src/gui/dialogs/ExportPos.cpp:76
-#: ../src/backend/filters/boundingBox.cpp:528
+#: ../src/backend/filters/boundingBox.cpp:520
 msgid "Visible"
 msgstr ""
 
@@ -796,10 +884,12 @@ msgid "Index"
 msgstr ""
 
 #: ../src/gui/dialogs/ExportPos.cpp:111 ../src/gui/dialogs/ExportPos.cpp:114
-#: ../src/backend/filters/compositionProfile.cpp:466
-#: ../src/backend/filters/spatialAnalysis.cpp:1667
-#: ../src/backend/filters/spatialAnalysis.cpp:1736
-#: ../src/backend/filters/spatialAnalysis.cpp:2670
+#: ../src/backend/filters/compositionProfile.cpp:549
+#: ../src/backend/filters/spatialAnalysis.cpp:1953
+#: ../src/backend/filters/spatialAnalysis.cpp:2022
+#: ../src/backend/filters/spatialAnalysis.cpp:3002
+#: ../src/backend/filters/spatialAnalysis.cpp:3221
+#: ../src/backend/filters/spatialAnalysis.cpp:3290
 #: ../src/backend/filters/spectrumPlot.cpp:240
 msgid "Count"
 msgstr ""
@@ -824,722 +914,753 @@ msgstr ""
 msgid "Add selected data from currently selected filter"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:66 ../src/gui/dialogs/prefDialog.cpp:541
-msgid "Preferences"
+#: ../src/gui/dialogs/prefDialog.cpp:72
+msgid "Panel Display"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:73
+#: ../src/gui/dialogs/prefDialog.cpp:74
 msgid "Online Updates"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:75
-msgid "Panel Display"
+#: ../src/gui/dialogs/prefDialog.cpp:76 ../src/gui/dialogs/prefDialog.cpp:654
+msgid "Startup"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:76
+#: ../src/gui/dialogs/prefDialog.cpp:77
 msgid "Camera Speed"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:77
+#: ../src/gui/dialogs/prefDialog.cpp:78
 msgid "Filter Defaults"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:78
+#: ../src/gui/dialogs/prefDialog.cpp:79
 msgid "Available Filters"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:81
+#: ../src/gui/dialogs/prefDialog.cpp:82
 msgid "Reset All"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:84
+#: ../src/gui/dialogs/prefDialog.cpp:85
 msgid "Show all panels"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:85
+#: ../src/gui/dialogs/prefDialog.cpp:86
 msgid "Remember last"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:86
+#: ../src/gui/dialogs/prefDialog.cpp:87
 msgid "Show Selected"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:89
+#: ../src/gui/dialogs/prefDialog.cpp:90
 msgid "Control Pane"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:90
+#: ../src/gui/dialogs/prefDialog.cpp:91
 msgid "Raw Data Panel"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:91 ../src/gui/mainFrame.cpp:639
+#: ../src/gui/dialogs/prefDialog.cpp:92 ../src/gui/mainFrame.cpp:652
 msgid "Plot List"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:93
+#: ../src/gui/dialogs/prefDialog.cpp:94
 msgid "Periodically notify about available updates"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:95
+#: ../src/gui/dialogs/prefDialog.cpp:96
+msgid "Prefer orthographic at startup"
+msgstr ""
+
+#: ../src/gui/dialogs/prefDialog.cpp:97
 msgid "Move Rate"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:96 ../src/gui/dialogs/prefDialog.cpp:100
+#: ../src/gui/dialogs/prefDialog.cpp:98 ../src/gui/dialogs/prefDialog.cpp:102
 msgid "(slow)"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:98 ../src/gui/dialogs/prefDialog.cpp:102
+#: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104
 msgid "(fast)"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:99
+#: ../src/gui/dialogs/prefDialog.cpp:101
 msgid "Zoom Rate"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:449
+#: ../src/gui/dialogs/prefDialog.cpp:456
 msgid "Notice"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:452
+#: ../src/gui/dialogs/prefDialog.cpp:459
 msgid "For security reasons, defaults are not modifiable for this filter"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:482
+#: ../src/gui/dialogs/prefDialog.cpp:496
 msgid "Show all panels when starting program"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:485
+#: ../src/gui/dialogs/prefDialog.cpp:499
 msgid "Show panels visible at last shutdown when starting program"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:492
+#: ../src/gui/dialogs/prefDialog.cpp:506
 msgid "Show selected panels when starting program"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:543
+#: ../src/gui/dialogs/prefDialog.cpp:555
+msgid "Preferences"
+msgstr ""
+
+#: ../src/gui/dialogs/prefDialog.cpp:557
 msgid "Set the method of panel layout when starting the program"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:546
+#: ../src/gui/dialogs/prefDialog.cpp:560
 msgid ""
 "Lets the program check the internet to see if updates to the program version "
 "are available, then notifies you about updates now and again."
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:548
+#: ../src/gui/dialogs/prefDialog.cpp:562
+msgid ""
+"By default, use an orthographic camera at startup. State files will override "
+"this preference."
+msgstr ""
+
+#: ../src/gui/dialogs/prefDialog.cpp:563
 msgid "Camera translation, orbit and swivel rates. "
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:549
+#: ../src/gui/dialogs/prefDialog.cpp:564
 msgid "Camera zooming rate."
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:551
+#: ../src/gui/dialogs/prefDialog.cpp:566
 msgid "Reset the filter initial values back to program defaults"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:552
+#: ../src/gui/dialogs/prefDialog.cpp:567
 msgid "Reset all filter initial values back to program defaults"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:614
+#: ../src/gui/dialogs/prefDialog.cpp:653
 msgid "Pref"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:615
-msgid "Startup"
-msgstr ""
-
-#: ../src/gui/dialogs/prefDialog.cpp:616
+#: ../src/gui/dialogs/prefDialog.cpp:655
 msgid "Camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:89
+#: ../src/gui/mainFrame.cpp:91
 msgid "New camera name..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:90
+#: ../src/gui/mainFrame.cpp:92
 msgid "New stash name...."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:106 ../src/backend/filters/annotation.cpp:561
+#: ../src/gui/mainFrame.cpp:108 ../src/backend/filters/annotation.cpp:561
 #: ../src/backend/filters/annotation.cpp:663
 #: ../src/backend/filters/annotation.h:96
 msgid "Annotation"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:107
+#: ../src/gui/mainFrame.cpp:109
 msgid "Bounding Box"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:108 ../src/backend/filters/ionClip.h:66
+#: ../src/gui/mainFrame.cpp:110 ../src/backend/filters/ionClip.h:66
 msgid "Clipping"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:109 ../src/backend/filters/clusterAnalysis.h:132
+#: ../src/gui/mainFrame.cpp:111 ../src/backend/filters/clusterAnalysis.h:140
 msgid "Cluster Analysis"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:110
+#: ../src/gui/mainFrame.cpp:112
 msgid "Compos. Profiles"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:111
+#: ../src/gui/mainFrame.cpp:113
 msgid "Downsampling"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:112
+#: ../src/gui/mainFrame.cpp:114
 msgid "Extern. Prog."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:113
+#: ../src/gui/mainFrame.cpp:115
 msgid "Ion Colour"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:114
+#: ../src/gui/mainFrame.cpp:116
 msgid "Ion Info"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:115
+#: ../src/gui/mainFrame.cpp:117
 msgid "Ion Transform"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:116 ../src/backend/filters/spectrumPlot.h:53
+#: ../src/gui/mainFrame.cpp:118 ../src/backend/filters/spectrumPlot.h:53
 msgid "Spectrum"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:117
+#: ../src/gui/mainFrame.cpp:119
 msgid "Range File"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:118 ../src/backend/filters/spatialAnalysis.h:142
+#: ../src/gui/mainFrame.cpp:120 ../src/backend/filters/spatialAnalysis.h:172
 msgid "Spat. Analysis"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:119 ../src/backend/filters/voxelise.h:121
+#: ../src/gui/mainFrame.cpp:121 ../src/backend/filters/voxelise.h:121
 msgid "Voxelisation"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:415
+#: ../src/gui/mainFrame.cpp:421
 msgid "OpenGL Failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:416 ../src/gui/mainFrame.cpp:418
+#: ../src/gui/mainFrame.cpp:422 ../src/gui/mainFrame.cpp:424
 msgid ""
 "Unable to initialise the openGL (3D) panel. Program cannot start. Please "
 "check your video drivers."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:438
+#: ../src/gui/mainFrame.cpp:444
 msgid "&Open...\tCtrl+O"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:438
+#: ../src/gui/mainFrame.cpp:444
 msgid "Open state file"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:439
+#: ../src/gui/mainFrame.cpp:445
 msgid "&Merge...\tCtrl+Shift+O"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:439
+#: ../src/gui/mainFrame.cpp:445
 msgid "Merge other file"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:443
+#: ../src/gui/mainFrame.cpp:449
 msgid "&Recent"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:444
+#: ../src/gui/mainFrame.cpp:450
 msgid "&Save\tCtrl+S"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:444
+#: ../src/gui/mainFrame.cpp:450
 msgid "Save state to file"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:446
+#: ../src/gui/mainFrame.cpp:452
 msgid "Save &As...\tCtrl+Shift+S"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:446
+#: ../src/gui/mainFrame.cpp:452
 msgid "Save current state to new file"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:449
+#: ../src/gui/mainFrame.cpp:455
 msgid "&Plot...\tCtrl+P"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:449
+#: ../src/gui/mainFrame.cpp:455
 msgid "Export Current Plot"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:450
+#: ../src/gui/mainFrame.cpp:456
 msgid "&Image...\tCtrl+I"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:450
+#: ../src/gui/mainFrame.cpp:456
 msgid "Export Current 3D View"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:451
+#: ../src/gui/mainFrame.cpp:457
 msgid "Ion&s...\tCtrl+N"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:451
+#: ../src/gui/mainFrame.cpp:457
 msgid "Export Ion Data"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:452
+#: ../src/gui/mainFrame.cpp:458
 msgid "Ran&ges...\tCtrl+G"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:452
+#: ../src/gui/mainFrame.cpp:458
 msgid "Export Range Data"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:453
+#: ../src/gui/mainFrame.cpp:459
 msgid "&Animate Filters...\tCtrl+A"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:453
+#: ../src/gui/mainFrame.cpp:459
 msgid "Export Animated Filter"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:454
+#: ../src/gui/mainFrame.cpp:460
 msgid "Ani&mate Camera...\tCtrl+M"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:454
+#: ../src/gui/mainFrame.cpp:460
 msgid "Export Animated Camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:455
+#: ../src/gui/mainFrame.cpp:461
 msgid "Pac&kage...\tCtrl+K"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:455
+#: ../src/gui/mainFrame.cpp:461
 msgid "Export analysis package"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:457
+#: ../src/gui/mainFrame.cpp:463
 msgid "&Export"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:460
+#: ../src/gui/mainFrame.cpp:466
 msgid "&Quit\tCtrl+Q"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:460 ../src/gui/mainFrame.cpp:462
+#: ../src/gui/mainFrame.cpp:466 ../src/gui/mainFrame.cpp:468
 msgid "Exit Program"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:462
+#: ../src/gui/mainFrame.cpp:468
 msgid "E&xit"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:464
+#: ../src/gui/mainFrame.cpp:470
 msgid "&File"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:468
+#: ../src/gui/mainFrame.cpp:474
 msgid "&Background Colour...\tCtrl+B"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:468
+#: ../src/gui/mainFrame.cpp:474
 msgid "Change background colour"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:472
-msgid "&Control Pane\tF3"
+#: ../src/gui/mainFrame.cpp:478
+msgid "&Control Pane\tF2"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:472 ../src/gui/mainFrame.cpp:475
+#: ../src/gui/mainFrame.cpp:478 ../src/gui/mainFrame.cpp:481
 msgid "Toggle left control pane"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:475
+#: ../src/gui/mainFrame.cpp:481
 msgid "&Control Pane\tAlt+C"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:481
-msgid "&Raw Data Pane\tF4"
+#: ../src/gui/mainFrame.cpp:487
+msgid "&Raw Data Pane\tF3"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:481 ../src/gui/mainFrame.cpp:484
+#: ../src/gui/mainFrame.cpp:487 ../src/gui/mainFrame.cpp:490
 msgid "Toggle raw data  pane (bottom)"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:484
+#: ../src/gui/mainFrame.cpp:490
 msgid "&Raw Data Pane\tAlt+R"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:488
-msgid "&Plot List\tF5"
+#: ../src/gui/mainFrame.cpp:494
+msgid "&Plot List\tF4"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:488 ../src/gui/mainFrame.cpp:490
+#: ../src/gui/mainFrame.cpp:494 ../src/gui/mainFrame.cpp:496
 msgid "Toggle plot list"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:490
+#: ../src/gui/mainFrame.cpp:496
 msgid "&Plot List\tAlt+P"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:496
+#: ../src/gui/mainFrame.cpp:502
 msgid "&Legend\tCtrl+L"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:496
+#: ../src/gui/mainFrame.cpp:502
 msgid "Toggle Legend display"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:498
+#: ../src/gui/mainFrame.cpp:504
 msgid "P&lot..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:499
+#: ../src/gui/mainFrame.cpp:505
 msgid "&Axis\tCtrl+Shift+I"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:499
+#: ../src/gui/mainFrame.cpp:505
 msgid "Toggle World Axis display"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:504
+#: ../src/gui/mainFrame.cpp:510
 msgid "&Fullscreen mode\tF11"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:504 ../src/gui/mainFrame.cpp:506
+#: ../src/gui/mainFrame.cpp:510 ../src/gui/mainFrame.cpp:512
 msgid "Next fullscreen mode: with toolbars"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:506
+#: ../src/gui/mainFrame.cpp:512
 msgid "&Fullscreen mode\tCtrl+Shift+F"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:511
+#: ../src/gui/mainFrame.cpp:517
 msgid "&Undo\tCtrl+Z"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:513
+#: ../src/gui/mainFrame.cpp:519
 msgid "&Redo\tCtrl+Y"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:516
+#: ../src/gui/mainFrame.cpp:522
+msgid "&Range"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:525
 msgid "&Preferences"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:518
+#: ../src/gui/mainFrame.cpp:527
 msgid "&Edit"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:521
+#: ../src/gui/mainFrame.cpp:530
 msgid "&View"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:523
+#: ../src/gui/mainFrame.cpp:532
 msgid "&Help...\tCtrl+H"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:523
+#: ../src/gui/mainFrame.cpp:532
 msgid "Show help files and documentation"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:524
+#: ../src/gui/mainFrame.cpp:533
 msgid "&Contact..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:524
+#: ../src/gui/mainFrame.cpp:533
 msgid "Open contact page"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:526
+#: ../src/gui/mainFrame.cpp:535
 msgid "&About..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:526
+#: ../src/gui/mainFrame.cpp:535
 msgid "Information about this program"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:527
+#: ../src/gui/mainFrame.cpp:536
 msgid "&Help"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:529
+#: ../src/gui/mainFrame.cpp:538
 msgid "Stashed Filters"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:534
-msgid "Data Filtering"
+#: ../src/gui/mainFrame.cpp:543
+msgid "New Filters"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:558
+#: ../src/gui/mainFrame.cpp:571
 msgid "Last Outputs"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:560
+#: ../src/gui/mainFrame.cpp:573
 msgid "Auto Refresh"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:566
+#: ../src/gui/mainFrame.cpp:579
 msgid "Filter settings"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:568
+#: ../src/gui/mainFrame.cpp:581
 msgid "Camera Name"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:574
+#: ../src/gui/mainFrame.cpp:587
 msgid "3D Post-processing"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:576
+#: ../src/gui/mainFrame.cpp:589
 msgid "Enable Cropping"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:578 ../src/gui/mainFrame.cpp:589
+#: ../src/gui/mainFrame.cpp:591 ../src/gui/mainFrame.cpp:602
 msgid "x-y"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:579 ../src/gui/mainFrame.cpp:590
+#: ../src/gui/mainFrame.cpp:592 ../src/gui/mainFrame.cpp:603
 msgid "x-z"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:580 ../src/gui/mainFrame.cpp:591
+#: ../src/gui/mainFrame.cpp:593 ../src/gui/mainFrame.cpp:604
 msgid "y-x"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:581 ../src/gui/mainFrame.cpp:592
+#: ../src/gui/mainFrame.cpp:594 ../src/gui/mainFrame.cpp:605
 msgid "y-z"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:582 ../src/gui/mainFrame.cpp:593
+#: ../src/gui/mainFrame.cpp:595 ../src/gui/mainFrame.cpp:606
 msgid "z-x"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:583 ../src/gui/mainFrame.cpp:594
+#: ../src/gui/mainFrame.cpp:596 ../src/gui/mainFrame.cpp:607
 msgid "z-y"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:598
+#: ../src/gui/mainFrame.cpp:611
 msgid "Use camera coordinates"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:599
+#: ../src/gui/mainFrame.cpp:612
 msgid "dX"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:601
+#: ../src/gui/mainFrame.cpp:614
 msgid "dY"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:603
+#: ../src/gui/mainFrame.cpp:616
 msgid "dZ"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:605
+#: ../src/gui/mainFrame.cpp:618
 msgid "Enable Anaglyphic Stereo"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:606
+#: ../src/gui/mainFrame.cpp:619
 msgid "Flip Channels"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:607
+#: ../src/gui/mainFrame.cpp:620
 msgid "Anaglyph Mode"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:609
+#: ../src/gui/mainFrame.cpp:622
 msgid "Red-Blue"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:610
+#: ../src/gui/mainFrame.cpp:623
 msgid "Red-Green"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:611
+#: ../src/gui/mainFrame.cpp:624
 msgid "Red-Cyan"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:612
+#: ../src/gui/mainFrame.cpp:625
 msgid "Green-Magenta"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:616
+#: ../src/gui/mainFrame.cpp:629
 msgid "Baseline Separation"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:619
+#: ../src/gui/mainFrame.cpp:631 ../src/backend/filters/voxelise.cpp:981
+#: ../src/backend/filters/voxelise.cpp:1037
+#: ../src/backend/filters/compositionProfile.cpp:1165
+#: ../src/backend/filters/boundingBox.cpp:648
+#: ../src/backend/filters/dataLoad.cpp:660
+msgid "Appearance"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:632
 msgid "Smooth && translucent objects"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:621
+#: ../src/gui/mainFrame.cpp:634
 msgid "3D lighting"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:624
+#: ../src/gui/mainFrame.cpp:637
 msgid "Performance"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:625
+#: ../src/gui/mainFrame.cpp:638
 msgid "Fast and weak randomisation."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:627
+#: ../src/gui/mainFrame.cpp:640
 msgid "Limit Output Pts"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:633
+#: ../src/gui/mainFrame.cpp:646
 msgid "Filter caching"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:635
+#: ../src/gui/mainFrame.cpp:648
 msgid "Max. Ram usage (%)"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:692
+#: ../src/gui/mainFrame.cpp:705
 msgid "Type"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:693
+#: ../src/gui/mainFrame.cpp:706
 msgid "Num"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:704
+#: ../src/gui/mainFrame.cpp:721
 msgid "Warning: Your configuration file appears to be invalid:\n"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:705
+#: ../src/gui/mainFrame.cpp:722
 msgid "\tConfig Load: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:940
+#: ../src/gui/mainFrame.cpp:974
 msgid "Current state has not been saved, would you like to save it now?"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:941
+#: ../src/gui/mainFrame.cpp:975
 msgid "State changed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:963 ../src/gui/mainFrame.cpp:1019
-msgid "Select Data or State File..."
+#: ../src/gui/mainFrame.cpp:995
+msgid "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:964
-msgid ""
-"Readable files (*.xml, *.pos, *.txt,*.csv)|*.xml;*.pos;*.txt;*.csv|POS File "
-"(*.pos)|*.pos|XML State File (*.xml)|*.xml|Text Data Files (*.txt/csv)|*.txt;"
-"*.csv|All Files (*)|*"
+#: ../src/gui/mainFrame.cpp:997
+msgid "XML State File (*.xml)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:998
+msgid "POS File (*.pos)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:999
+msgid "LAWATAP ATO File (*.ato)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:1000
+msgid "Text File (*.txt, *.csv)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:1001
+msgid "All Files (*)"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1005 ../src/gui/mainFrame.cpp:1336
+#: ../src/gui/mainFrame.cpp:1014 ../src/gui/mainFrame.cpp:1068
+msgid "Select Data or State File..."
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:1056 ../src/gui/mainFrame.cpp:1387
 msgid "Loaded file."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1020
+#: ../src/gui/mainFrame.cpp:1069
 msgid ""
 "3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*.pos|"
 "XML State File (*.xml)|*.xml|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1031
+#: ../src/gui/mainFrame.cpp:1080
 msgid "Merged file."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1135
+#: ../src/gui/mainFrame.cpp:1182
 msgid "Tip: You can use ⌘ (command) to merge"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1137
+#: ../src/gui/mainFrame.cpp:1184
 msgid "Tip: You can use ctrl to merge"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1174
+#: ../src/gui/mainFrame.cpp:1221
 msgid "Load error"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1175
+#: ../src/gui/mainFrame.cpp:1222
 msgid ""
 "Error loading state file.\n"
 "See console for more info."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1183
+#: ../src/gui/mainFrame.cpp:1230
 msgid ""
 "This state file contains filters that can be unsafe to run\n"
 "Do you wish to remove these before continuing?."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1184
+#: ../src/gui/mainFrame.cpp:1231
 msgid "Security warning"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1393 ../src/gui/mainFrame.cpp:1492
-#: ../src/gui/mainFrame.cpp:1875
+#: ../src/gui/mainFrame.cpp:1444 ../src/gui/mainFrame.cpp:1540
+#: ../src/gui/mainFrame.cpp:1957
 msgid "Unable to save"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1394
+#: ../src/gui/mainFrame.cpp:1445
 msgid "No plot available. Please create a plot before exporting."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1398
+#: ../src/gui/mainFrame.cpp:1449
 msgid "Save plot..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1399
+#: ../src/gui/mainFrame.cpp:1450
 msgid ""
 "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*."
 "svg|PNG File (*.png)|*.png|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1455
+#: ../src/gui/mainFrame.cpp:1504
 msgid "Select type for save"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1455
+#: ../src/gui/mainFrame.cpp:1505
 msgid "Choose file type"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1477 ../src/gui/mainFrame.cpp:1520
-#: ../src/gui/mainFrame.cpp:1567
+#: ../src/gui/mainFrame.cpp:1525 ../src/gui/mainFrame.cpp:1568
+#: ../src/gui/mainFrame.cpp:1604
 msgid "Choose resolution"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1493
+#: ../src/gui/mainFrame.cpp:1541
 msgid "Unknown file extension. Please use \"svg\" or \"png\""
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1504
+#: ../src/gui/mainFrame.cpp:1552
 msgid "Saved plot: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1511 ../src/gui/mainFrame.cpp:1559
+#: ../src/gui/mainFrame.cpp:1559 ../src/gui/mainFrame.cpp:1597
 msgid "Save Image..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1512 ../src/gui/mainFrame.cpp:1560
+#: ../src/gui/mainFrame.cpp:1560 ../src/gui/mainFrame.cpp:1598
 msgid "PNG File (*.png)|*.png|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1535 ../src/gui/mainFrame.cpp:1584
-msgid "Program limitation"
-msgstr ""
-
-#: ../src/gui/mainFrame.cpp:1536
-msgid ""
-"Limitation on the screenshot dimension; please ensure that both width and "
-"height exceed the initial values,\n"
-" or that they are both smaller than the initial values.\n"
-" If this bothers you, please submit a bug."
+#: ../src/gui/mainFrame.cpp:1588 ../src/gui/mainFrame.cpp:1664
+msgid "Saved 3D View :"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1550 ../src/gui/mainFrame.cpp:1633
-msgid "Saved 3D View :"
+#: ../src/gui/mainFrame.cpp:1618
+msgid "Program limitation"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1585
+#: ../src/gui/mainFrame.cpp:1619
 msgid ""
 "Limitation on the screenshot dimension; please ensure that both width and "
 "height exceed the initial values,\n"
@@ -1547,389 +1668,402 @@ msgid ""
 " If this bothers, please submit a bug."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1601
+#: ../src/gui/mainFrame.cpp:1636
 msgid "Number of frames"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1760
+#: ../src/gui/mainFrame.cpp:1791
 msgid "Cannot animate with no filters."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1807
-msgid "Filter property change failed"
+#: ../src/gui/mainFrame.cpp:1868
+msgid "Animating"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1809
-msgid "Filter change error"
+#: ../src/gui/mainFrame.cpp:1869
+msgid "Performing refresh"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1832
-msgid "Refresh failed on frame :"
+#: ../src/gui/mainFrame.cpp:1898
+msgid "Filter property change failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1834
-msgid "Refresh failed"
+#: ../src/gui/mainFrame.cpp:1918
+msgid "Refresh failed on frame :"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1861
+#: ../src/gui/mainFrame.cpp:1943
 msgid "Scene generation failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1862
+#: ../src/gui/mainFrame.cpp:1944
 msgid "Unable to generate scene for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1876
+#: ../src/gui/mainFrame.cpp:1958
 msgid "Image save failed for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1901
+#: ../src/gui/mainFrame.cpp:1983
 msgid "Ion save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1902
+#: ../src/gui/mainFrame.cpp:1984
 msgid "Unable to save ions for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1933
+#: ../src/gui/mainFrame.cpp:2015
 msgid "Plot save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1934
+#: ../src/gui/mainFrame.cpp:2016
 msgid "Unable to save plot or frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1975
+#: ../src/gui/mainFrame.cpp:2057
 msgid "Range save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1976
+#: ../src/gui/mainFrame.cpp:2058
 msgid "Unable to save range for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2005
+#: ../src/gui/mainFrame.cpp:2087
 msgid "Voxel save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2006
+#: ../src/gui/mainFrame.cpp:2088
 msgid "Unable to save voxels for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2052 ../src/gui/mainFrame.cpp:2159
-#: ../src/gui/mainFrame.cpp:2256
+#: ../src/gui/mainFrame.cpp:2118
+msgid "Animate failed"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:2143 ../src/gui/mainFrame.cpp:2301
+#: ../src/gui/mainFrame.cpp:2397
 msgid "No filters means no data to export"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2058
+#: ../src/gui/mainFrame.cpp:2157
 msgid "Package name"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2059
+#: ../src/gui/mainFrame.cpp:2158
 msgid "Package directory name"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2061
+#: ../src/gui/mainFrame.cpp:2160
 msgid "AnalysisPackage"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2073
+#: ../src/gui/mainFrame.cpp:2173
 msgid "Package folder already exists, won't overwrite."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2074
+#: ../src/gui/mainFrame.cpp:2174
 msgid "Not available"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2105
+#: ../src/gui/mainFrame.cpp:2199
 msgid ""
 "Package folder creation failed\n"
 "check writing to this location is possible."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2106
+#: ../src/gui/mainFrame.cpp:2200
 msgid "Folder creation failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2128
+#: ../src/gui/mainFrame.cpp:2219
 msgid "Copying"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2129
+#: ../src/gui/mainFrame.cpp:2220
 msgid "Copying referenced files"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2137
+#: ../src/gui/mainFrame.cpp:2279
 msgid "Error copying file"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2148
+#: ../src/gui/mainFrame.cpp:2288
 msgid "Saved package: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2169
+#: ../src/gui/mainFrame.cpp:2311
 msgid "Export"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2174
+#: ../src/gui/mainFrame.cpp:2316
 msgid "POS Data (*.pos)|*.pos|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2202 ../src/gui/mainFrame.cpp:2301
+#: ../src/gui/mainFrame.cpp:2344 ../src/gui/mainFrame.cpp:2442
 msgid "File already exists, overwrite?"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2203 ../src/gui/mainFrame.cpp:2302
-#: ../src/gui/mainFrame.cpp:2328
+#: ../src/gui/mainFrame.cpp:2345 ../src/gui/mainFrame.cpp:2443
+#: ../src/gui/mainFrame.cpp:2467
 msgid "Overwrite?"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2235
+#: ../src/gui/mainFrame.cpp:2376
 msgid "Saved ions: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2260
+#: ../src/gui/mainFrame.cpp:2401
 msgid "Export Ranges"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2283
+#: ../src/gui/mainFrame.cpp:2424
 msgid "Save state..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2284
+#: ../src/gui/mainFrame.cpp:2425
 msgid "XML state file (*.xml)|*.xml|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2327
+#: ../src/gui/mainFrame.cpp:2466
 msgid "Files have been referred to using relative paths. Keep relative paths?"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2360
+#: ../src/gui/mainFrame.cpp:2499
 msgid "Saved state: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2698
+#: ../src/gui/mainFrame.cpp:2576
+msgid "Range editor"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:2872
 msgid "Manual not found locally. Launching web browser"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2707
+#: ../src/gui/mainFrame.cpp:2881
 msgid "Opening contact page in external web browser"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2719
+#: ../src/gui/mainFrame.cpp:2893
 msgid "No filter stashes to edit."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2723
+#: ../src/gui/mainFrame.cpp:2897
 msgid "Filter Stashes"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2752
+#: ../src/gui/mainFrame.cpp:2926
 msgid "Quick and dirty analysis for point data."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2762
+#: ../src/gui/mainFrame.cpp:2936
 msgid "Compiled with wx Version: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2783
+#: ../src/gui/mainFrame.cpp:2957
 msgid "Press enter to store new stash"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2789
+#: ../src/gui/mainFrame.cpp:2963
 msgid "Press enter to restore stash"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2824
+#: ../src/gui/mainFrame.cpp:2998
 msgid "Unable to create stash, selection invalid"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2832
+#: ../src/gui/mainFrame.cpp:3006
 msgid "Created new filter tree stash"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2954
+#: ../src/gui/mainFrame.cpp:3128
 msgid "Filter type not a data source - can't be at tree base"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3112
+#: ../src/gui/mainFrame.cpp:3302
 msgid "Moving - Hold ⌘ (command) to copy"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3114
+#: ../src/gui/mainFrame.cpp:3304
 msgid "Moving - Hold control to copy"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3370
+#: ../src/gui/mainFrame.cpp:3647
 msgid "Press enter to store new camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3372
+#: ../src/gui/mainFrame.cpp:3649
 msgid "Press enter to restore camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3397 ../src/gui/mainFrame.cpp:3438
+#: ../src/gui/mainFrame.cpp:3674 ../src/gui/mainFrame.cpp:3715
 msgid "Restored camera: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3417
+#: ../src/gui/mainFrame.cpp:3694
 msgid "Stored camera: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3498
+#: ../src/gui/mainFrame.cpp:3775
 msgid "Select an item from the filter tree before choosing a new filter"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3500
+#: ../src/gui/mainFrame.cpp:3777
 msgid "Load data source (file->open) before choosing a new filter"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3521
+#: ../src/gui/mainFrame.cpp:3798
 msgid "Select RNG File..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3522
+#: ../src/gui/mainFrame.cpp:3799
 msgid ""
 "Range Files (*rng; *env; *rrng)|*rng;*env;*rrng|RNG File (*.rng)|*.rng|"
 "Environment File (*.env)|*.env|RRNG Files (*.rrng)|*.rrng|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3542
+#: ../src/gui/mainFrame.cpp:3819
 msgid "Failed reading range file."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3546
+#: ../src/gui/mainFrame.cpp:3823
 msgid "Error loading file"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3604 ../src/gui/mainFrame.cpp:3658
-#: ../src/gui/mainFrame.cpp:5150 ../src/gui/mainFrame.cpp:5703
+#: ../src/gui/mainFrame.cpp:3881 ../src/gui/mainFrame.cpp:3947
+#: ../src/gui/mainFrame.cpp:5508 ../src/gui/mainFrame.cpp:6063
 msgid "Cons."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3634
+#: ../src/gui/mainFrame.cpp:3914
 msgid "Refresh Aborted."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3662
+#: ../src/gui/mainFrame.cpp:3951
 msgid "*Cons."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3664
+#: ../src/gui/mainFrame.cpp:3953
 msgid "§Cons."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3781
+#: ../src/gui/mainFrame.cpp:4076
 msgid "Autosave complete."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3940
+#: ../src/gui/mainFrame.cpp:4243
 msgid "Aborted."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3990
+#: ../src/gui/mainFrame.cpp:4294
 msgid "Updated."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3997
+#: ../src/gui/mainFrame.cpp:4301
 msgid "\\% Done (Esc aborts)"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3999
+#: ../src/gui/mainFrame.cpp:4303
 msgid "\\% Done"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4258 ../src/gui/mainFrame.cpp:4265
+#: ../src/gui/mainFrame.cpp:4562 ../src/gui/mainFrame.cpp:4569
 msgid "Next Fullscreen mode: none"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4261
+#: ../src/gui/mainFrame.cpp:4565
 msgid "Next Fullscreen mode: complete"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4269
+#: ../src/gui/mainFrame.cpp:4573
 msgid "Next Fullscreen mode: with toolbars"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4285
+#: ../src/gui/mainFrame.cpp:4589
 msgid "Next Mode: No fullscreen"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4289
+#: ../src/gui/mainFrame.cpp:4593
 msgid "Next Mode: fullscreen w/o toolbar"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4293
+#: ../src/gui/mainFrame.cpp:4597
 msgid "Next Mode: fullscreen with toolbar"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4334
+#: ../src/gui/mainFrame.cpp:4638
 msgid "Tip: You can shift-click to force full refresh, if required"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4590
+#: ../src/gui/mainFrame.cpp:4910
 msgid "No data to save"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4759
+#: ../src/gui/mainFrame.cpp:5082
 msgid "Aborting..."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4765
+#: ../src/gui/mainFrame.cpp:5088
 msgid ""
 "Waiting for refresh to abort. Exiting could lead to the program "
 "backgrounding. Exit anyway? "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4766 ../src/gui/mainFrame.cpp:4788
+#: ../src/gui/mainFrame.cpp:5089 ../src/gui/mainFrame.cpp:5109
 msgid "Confirmation request"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:4787
+#: ../src/gui/mainFrame.cpp:5108
 msgid "Are you sure you wish to exit 3Depict?"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5178
+#: ../src/gui/mainFrame.cpp:5536
 msgid "Update Notice: New version "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5178
+#: ../src/gui/mainFrame.cpp:5536
 msgid " found online."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5182
+#: ../src/gui/mainFrame.cpp:5540
 msgid "Online Check: "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5182
+#: ../src/gui/mainFrame.cpp:5540
 msgid " is up-to-date."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5272
+#: ../src/gui/mainFrame.cpp:5630
 msgid "An auto-save state was found, would you like to restore it?."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5273
+#: ../src/gui/mainFrame.cpp:5631
 msgid "Autosave"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5280
+#: ../src/gui/mainFrame.cpp:5638
 msgid "Unable to load autosave file.."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5474
+#: ../src/gui/mainFrame.cpp:5830
 msgid "List of available filters"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5475
-msgid "Tree of data filters"
+#: ../src/gui/mainFrame.cpp:5832
+msgid "Tree - drag to move items, hold ⌘ for copy. Tap delete to remove items"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5476
+#: ../src/gui/mainFrame.cpp:5834
+msgid ""
+"Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items."
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:5836
 msgid ""
 "Enable/Disable automatic updates of data when filter change takes effect"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5479
+#: ../src/gui/mainFrame.cpp:5839
 msgid ""
 "Enable/Disable \"Alpha blending\" (transparency) in rendering system. "
 "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") "
@@ -1937,14 +2071,14 @@ msgid ""
 "but look more blocky"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5480
+#: ../src/gui/mainFrame.cpp:5840
 msgid ""
 "Enable/Disable lighting calculations in rendering, for objects that request "
 "this. Lighting provides important depth cues for objects comprised of 3D "
 "surfaces. Disabling may allow faster rendering in complex scenes"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5481
+#: ../src/gui/mainFrame.cpp:5841
 msgid ""
 "Enable/Disable weak randomisation (Galois linear feedback shift register). "
 "Strong randomisation uses a much slower random selection method, but "
@@ -1952,14 +2086,14 @@ msgid ""
 "recommended for final analyses"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5483
+#: ../src/gui/mainFrame.cpp:5843
 msgid ""
 "Limit the number of points that can be displayed in the 3D  scene. Does not "
 "affect filter tree calculations. Disabling this can severely reduce "
 "performance, due to large numbers of points being visible at once."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5484
+#: ../src/gui/mainFrame.cpp:5844
 msgid ""
 "Enable/Disable caching of intermediate results during filter updates. "
 "Disabling caching will use less system RAM, though changes to any filter "
@@ -1967,138 +2101,134 @@ msgid ""
 "computations"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5495
+#: ../src/gui/mainFrame.cpp:5855
 msgid "Camera data information"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5499
+#: ../src/gui/mainFrame.cpp:5859
 msgid "Enable/disable visual effects on final 3D output"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5501
+#: ../src/gui/mainFrame.cpp:5861
 msgid "Enable cropping post-process effect"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5504
+#: ../src/gui/mainFrame.cpp:5864
 msgid ""
 "Colour based 3D effect enable/disable - requires appropriate colour filter "
 "3D glasses."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5505
+#: ../src/gui/mainFrame.cpp:5865
 msgid "Glasses colour mode"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5507
+#: ../src/gui/mainFrame.cpp:5867
 msgid ""
 "Level of separation between left and right images, which sets 3D depth to "
 "visual distortion tradeoff"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5511
+#: ../src/gui/mainFrame.cpp:5871
 msgid "X"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5512
+#: ../src/gui/mainFrame.cpp:5872
 msgid "Y"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5513
+#: ../src/gui/mainFrame.cpp:5873
 msgid "Save raw data to file"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5514
+#: ../src/gui/mainFrame.cpp:5874
 msgid "Copy raw data to clipboard"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5515
+#: ../src/gui/mainFrame.cpp:5875
 msgid "Manage \"stashed\" data."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5516
+#: ../src/gui/mainFrame.cpp:5876
 msgid "Program text output"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5517
+#: ../src/gui/mainFrame.cpp:5877
 msgid "Select active camera, or type to create new named camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5518
+#: ../src/gui/mainFrame.cpp:5878
 msgid "Remove the selected camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5519
+#: ../src/gui/mainFrame.cpp:5879
 msgid "Perform cropping from coordinate frame of camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5520
+#: ../src/gui/mainFrame.cpp:5880
 msgid ""
 "Set the maximum amount of RAM to use in order to speed repeat computations"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5521
+#: ../src/gui/mainFrame.cpp:5881
 msgid "Collapse the filter tree"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5522
+#: ../src/gui/mainFrame.cpp:5882
 msgid "Expand the filter tree"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5523
+#: ../src/gui/mainFrame.cpp:5883
 msgid "Process the filter tree, hold shift to purge cached filter data"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5663
+#: ../src/gui/mainFrame.cpp:6023
 msgid "Crop"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5664
+#: ../src/gui/mainFrame.cpp:6024
 msgid "Stereo"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5681
+#: ../src/gui/mainFrame.cpp:6041
 msgid "Data"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5682
+#: ../src/gui/mainFrame.cpp:6042
 msgid "Cam"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5683
+#: ../src/gui/mainFrame.cpp:6043
 msgid "Post"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5684
+#: ../src/gui/mainFrame.cpp:6044
 msgid "Tools"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5701 ../src/backend/filter.cpp:44
-msgid "Plot"
-msgstr ""
-
-#: ../src/gui/mainFrame.cpp:5702
+#: ../src/gui/mainFrame.cpp:6062
 msgid "Raw"
 msgstr ""
 
-#: ../src/gui/mathglPane.cpp:209
+#: ../src/gui/mathglPane.cpp:230
 msgid "No plots selected."
 msgstr ""
 
-#: ../src/gui/mathglPane.cpp:1134
+#: ../src/gui/mathglPane.cpp:1202
 msgid ""
 "Unable to allocate requested memory.\n"
 " Try a lower resolution, or save as vector (SVG)."
 msgstr ""
 
-#: ../src/gui/mathglPane.cpp:1136
+#: ../src/gui/mathglPane.cpp:1204
 msgid "Plotting functions returned an error:\n"
 msgstr ""
 
-#: ../src/gui/mathglPane.cpp:1138
+#: ../src/gui/mathglPane.cpp:1206
 msgid "File readback check failed"
 msgstr ""
 
-#: ../src/gui/mathglPane.cpp:1140
+#: ../src/gui/mathglPane.cpp:1208
 msgid "Filesize during readback appears to be zero."
 msgstr ""
 
@@ -2116,11 +2246,11 @@ msgid ""
 "\t\tXML files may be passed to run, instead of default tests"
 msgstr ""
 
-#: ../src/3Depict.cpp:375
+#: ../src/3Depict.cpp:383
 msgid "File : "
 msgstr ""
 
-#: ../src/3Depict.cpp:375
+#: ../src/3Depict.cpp:383
 msgid " does not exist. Skipping"
 msgstr ""
 
@@ -2136,11 +2266,11 @@ msgstr ""
 msgid "Unable to determine filter type in defaults listing."
 msgstr ""
 
-#: ../src/backend/configFile.cpp:577
+#: ../src/backend/configFile.cpp:610
 msgid "Online access for non win32/apple platforms is intentionally disabled, "
 msgstr ""
 
-#: ../src/backend/configFile.cpp:578
+#: ../src/backend/configFile.cpp:611
 msgid ""
 "regardless of the settings you use here. Use your package manager to keep up-"
 "to-date"
@@ -2175,103 +2305,99 @@ msgstr ""
 msgid "Points"
 msgstr ""
 
-#: ../src/backend/plot.cpp:648 ../src/backend/plot.cpp:656
+#: ../src/backend/plot.cpp:841 ../src/backend/plot.cpp:849
 msgid "Multiple data types"
 msgstr ""
 
-#: ../src/backend/plot.cpp:808
-msgid "Mixed log/non-log:"
-msgstr ""
-
-#: ../src/backend/plot.cpp:1261
+#: ../src/backend/plot.cpp:1550
 msgid "error"
 msgstr ""
 
-#: ../src/backend/filtertree.cpp:951
+#: ../src/backend/filtertree.cpp:1051
 msgid "WARNING: Skipping node "
 msgstr ""
 
-#: ../src/backend/filtertree.cpp:951
+#: ../src/backend/filtertree.cpp:1051
 msgid " as it was not recognised"
 msgstr ""
 
-#: ../src/backend/filtertree.cpp:989
+#: ../src/backend/filtertree.cpp:1089
 msgid "Error processing node: "
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:515
+#: ../src/backend/filters/externalProgram.cpp:543
 msgid "Command"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:518
+#: ../src/backend/filters/externalProgram.cpp:546
 msgid ""
 "Full command to send to operating system. See manual for escape sequence "
 "meanings"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:522
+#: ../src/backend/filters/externalProgram.cpp:550
 msgid "Work Dir"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:525
+#: ../src/backend/filters/externalProgram.cpp:553
 msgid "Directory to run the command in"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:535
+#: ../src/backend/filters/externalProgram.cpp:563
 msgid "Cleanup input"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:538
+#: ../src/backend/filters/externalProgram.cpp:566
 msgid "Erase input files when command completed"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:547
+#: ../src/backend/filters/externalProgram.cpp:575
 msgid "Cache"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:550
+#: ../src/backend/filters/externalProgram.cpp:578
 msgid ""
 "Assume program does not alter its output, unless inputs from 3Depict are "
 "altered"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:632
+#: ../src/backend/filters/externalProgram.cpp:660
 msgid "Error processing command line"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:634
+#: ../src/backend/filters/externalProgram.cpp:662
 msgid "Unable to set working directory"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:636
+#: ../src/backend/filters/externalProgram.cpp:664
 msgid "Error saving posfile result for external program"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:638
+#: ../src/backend/filters/externalProgram.cpp:666
 msgid "Error saving plot result for externalprogram"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:640
+#: ../src/backend/filters/externalProgram.cpp:668
 msgid "Error creating temporary directory"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:642
+#: ../src/backend/filters/externalProgram.cpp:670
 msgid "Detected unusable number of columns in plot"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:644
+#: ../src/backend/filters/externalProgram.cpp:672
 msgid "Unable to parse plot result from external program"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:646
+#: ../src/backend/filters/externalProgram.cpp:674
 msgid "Unable to load ions from external program"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:648
+#: ../src/backend/filters/externalProgram.cpp:676
 msgid "Unable to perform commandline substitution"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:650
+#: ../src/backend/filters/externalProgram.cpp:678
 msgid "Error executing external program"
 msgstr ""
 
@@ -2293,124 +2419,125 @@ msgstr ""
 msgid "Aligned box"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:492
+#: ../src/backend/filters/ionClip.cpp:495
 msgid "Primitive"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:495
+#: ../src/backend/filters/ionClip.cpp:498
 msgid "Shape of clipping object"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:501
-#: ../src/backend/filters/compositionProfile.cpp:925
+#: ../src/backend/filters/ionClip.cpp:504
+#: ../src/backend/filters/compositionProfile.cpp:1000
 msgid "Show Primitive"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:504
+#: ../src/backend/filters/ionClip.cpp:507
 msgid "Display the 3D interaction object"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:509
+#: ../src/backend/filters/ionClip.cpp:512
 msgid "Invert Clip"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:512
+#: ../src/backend/filters/ionClip.cpp:515
 msgid ""
 "Switch between retaining points inside (false) and outside (true) of "
 "primitive"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:526
-#: ../src/backend/filters/compositionProfile.cpp:984
+#: ../src/backend/filters/ionClip.cpp:529
+#: ../src/backend/filters/compositionProfile.cpp:1059
 msgid "Position for centre of sphere"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:531
-#: ../src/backend/filters/ionClip.cpp:594
-#: ../src/backend/filters/compositionProfile.cpp:967
-#: ../src/backend/filters/compositionProfile.cpp:989
-#: ../src/backend/filters/spatialAnalysis.cpp:610
+#: ../src/backend/filters/ionClip.cpp:534
+#: ../src/backend/filters/ionClip.cpp:597
+#: ../src/backend/filters/compositionProfile.cpp:1042
+#: ../src/backend/filters/compositionProfile.cpp:1064
+#: ../src/backend/filters/spatialAnalysis.cpp:93
+#: ../src/backend/filters/spatialAnalysis.cpp:616
 msgid "Radius"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:534
-#: ../src/backend/filters/compositionProfile.cpp:992
+#: ../src/backend/filters/ionClip.cpp:537
+#: ../src/backend/filters/compositionProfile.cpp:1067
 msgid "Radius of sphere"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:548
+#: ../src/backend/filters/ionClip.cpp:551
 msgid "Position that plane passes through"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:553
+#: ../src/backend/filters/ionClip.cpp:556
 msgid "Plane Normal"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:556
+#: ../src/backend/filters/ionClip.cpp:559
 msgid "Perpendicular direction for plane"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:570
+#: ../src/backend/filters/ionClip.cpp:573
 msgid "Centre of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:575
-#: ../src/backend/filters/compositionProfile.cpp:948
-#: ../src/backend/filters/spatialAnalysis.cpp:601
-#: ../src/backend/filters/transform.cpp:1319
+#: ../src/backend/filters/ionClip.cpp:578
+#: ../src/backend/filters/compositionProfile.cpp:1023
+#: ../src/backend/filters/spatialAnalysis.cpp:607
+#: ../src/backend/filters/transform.cpp:1325
 msgid "Axis"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:578
+#: ../src/backend/filters/ionClip.cpp:581
 msgid "Positive vector for cylinder"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:586
-#: ../src/backend/filters/compositionProfile.cpp:959
+#: ../src/backend/filters/ionClip.cpp:589
+#: ../src/backend/filters/compositionProfile.cpp:1034
 msgid "Lock Axis Mag."
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:589
+#: ../src/backend/filters/ionClip.cpp:592
 msgid "Prevent changing length of cylinder during 3D interaction"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:597
-#: ../src/backend/filters/compositionProfile.cpp:970
-#: ../src/backend/filters/spatialAnalysis.cpp:613
+#: ../src/backend/filters/ionClip.cpp:600
+#: ../src/backend/filters/compositionProfile.cpp:1045
+#: ../src/backend/filters/spatialAnalysis.cpp:619
 msgid "Radius of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:610
+#: ../src/backend/filters/ionClip.cpp:613
 msgid "Centre of axis aligned box"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:615
+#: ../src/backend/filters/ionClip.cpp:618
 msgid "Corner offset"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:618
+#: ../src/backend/filters/ionClip.cpp:621
 msgid "Vector to corner of box"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:74
-#: ../src/backend/filters/clusterAnalysis.cpp:998
+#: ../src/backend/filters/clusterAnalysis.cpp:77
+#: ../src/backend/filters/clusterAnalysis.cpp:1017
 msgid "Size Distribution"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:75
+#: ../src/backend/filters/clusterAnalysis.cpp:78
 msgid "Chemistry Distribution"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:487
+#: ../src/backend/filters/clusterAnalysis.cpp:491
 msgid "No range data. Can't cluster."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:498
+#: ../src/backend/filters/clusterAnalysis.cpp:502
 msgid ""
 "No ranges selected for cluster \"core\". Cannot continue with clustering."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:510
+#: ../src/backend/filters/clusterAnalysis.cpp:511
 msgid ""
 "No ranges selected for cluster \"bulk\". Cannot continue with clustering."
 msgstr ""
@@ -2456,8 +2583,8 @@ msgid "Core Link + Erode"
 msgstr ""
 
 #: ../src/backend/filters/clusterAnalysis.cpp:902
-#: ../src/backend/filters/spatialAnalysis.cpp:360
-#: ../src/backend/filters/ionInfo.cpp:447
+#: ../src/backend/filters/spatialAnalysis.cpp:373
+#: ../src/backend/filters/ionInfo.cpp:440
 msgid "Algorithm"
 msgstr ""
 
@@ -2466,243 +2593,259 @@ msgid "Cluster algorithm mode"
 msgstr ""
 
 #: ../src/backend/filters/clusterAnalysis.cpp:915
-msgid "Core Classify Dist"
+msgid "Core Classify"
 msgstr ""
 
 #: ../src/backend/filters/clusterAnalysis.cpp:918
-msgid "Restrict only atoms by distance to be cluster sources"
+msgid ""
+"Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:923
+#: ../src/backend/filters/clusterAnalysis.cpp:924
+msgid "Core Classify Dist"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:927
+msgid "Restrict only atoms by distance to be cluster sources"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:932
 msgid "Classify Knn Max"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:926
+#: ../src/backend/filters/clusterAnalysis.cpp:935
 msgid ""
 "Require that the kth NN (this number) is within the classify distance, to be "
 "a cluster source"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:931
+#: ../src/backend/filters/clusterAnalysis.cpp:941
 msgid "Core Link Dist"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:934
+#: ../src/backend/filters/clusterAnalysis.cpp:944
 msgid "Distance between clusters to allow linking"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:939
+#: ../src/backend/filters/clusterAnalysis.cpp:949
+msgid "Bulk Link"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:952
+#: ../src/backend/filters/clusterAnalysis.cpp:970
+msgid "Enable  linking of non-cluster species - eg for composition analysis "
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:959
 msgid "Bulk Link (Envelope) Dist"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:942
+#: ../src/backend/filters/clusterAnalysis.cpp:962
 msgid ""
 "Distance from core points that form cluster that is used to grab surrounding "
 "bulk points"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:947
+#: ../src/backend/filters/clusterAnalysis.cpp:967
+msgid "Erosion"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:976
 msgid "Erode Dist"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:950
+#: ../src/backend/filters/clusterAnalysis.cpp:979
 msgid ""
 "Distance from unclustered material in which bulk points are eroded from "
 "cluster"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:955
+#: ../src/backend/filters/clusterAnalysis.cpp:985
 msgid "Clustering Params"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:962
-msgid "Count bulk"
-msgstr ""
-
-#: ../src/backend/filters/clusterAnalysis.cpp:965
-msgid "Include bulk ions in size distribution."
-msgstr ""
-
-#: ../src/backend/filters/clusterAnalysis.cpp:971
+#: ../src/backend/filters/clusterAnalysis.cpp:990
 msgid "Size Cropping"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:974
-msgid "Perform removal of clusters based upon size distribution"
+#: ../src/backend/filters/clusterAnalysis.cpp:993
+msgid "Remove clusters based upon size distribution"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:981
+#: ../src/backend/filters/clusterAnalysis.cpp:1000
 msgid "Min Size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:984
+#: ../src/backend/filters/clusterAnalysis.cpp:1003
 msgid "Remove clusters below this size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:989
+#: ../src/backend/filters/clusterAnalysis.cpp:1008
 msgid "Max Size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:992
+#: ../src/backend/filters/clusterAnalysis.cpp:1011
 msgid "Remove clusters above this size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1001
+#: ../src/backend/filters/clusterAnalysis.cpp:1020
 msgid "Show number of clusters as a function of cluster size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1007
+#: ../src/backend/filters/clusterAnalysis.cpp:1026
 msgid "Log Scale"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1010
+#: ../src/backend/filters/clusterAnalysis.cpp:1029
 msgid "Use logarithmic scale for size distribution"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1026
+#: ../src/backend/filters/clusterAnalysis.cpp:1045
 msgid "Chemistry Dist."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1029
+#: ../src/backend/filters/clusterAnalysis.cpp:1048
 msgid "Create a plot showing chemistry for each cluster size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1036
-#: ../src/backend/filters/compositionProfile.cpp:1032
-#: ../src/backend/filters/ionInfo.cpp:419
+#: ../src/backend/filters/clusterAnalysis.cpp:1055
+#: ../src/backend/filters/compositionProfile.cpp:1107
+#: ../src/backend/filters/spatialAnalysis.cpp:674
+#: ../src/backend/filters/ionInfo.cpp:412
 msgid "Normalise"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1039
+#: ../src/backend/filters/clusterAnalysis.cpp:1058
 msgid "Convert cluster counts to composition"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1045
+#: ../src/backend/filters/clusterAnalysis.cpp:1064
 msgid "Postprocess"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1064
+#: ../src/backend/filters/clusterAnalysis.cpp:1083
 msgid "If selected, use as \"core\" ion type (can make clusters)"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1069
+#: ../src/backend/filters/clusterAnalysis.cpp:1088
 msgid "Core Ranges"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1081
+#: ../src/backend/filters/clusterAnalysis.cpp:1102
 msgid ""
 "If selected, use as \"bulk\" ion type (can be included in existing clusters)"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1086
+#: ../src/backend/filters/clusterAnalysis.cpp:1107
 msgid "Bulk Ranges"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1101
+#: ../src/backend/filters/clusterAnalysis.cpp:1123
 msgid "Max. Sep + Erode"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1730
+#: ../src/backend/filters/clusterAnalysis.cpp:1803
 msgid "Clustering aborted"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1732
+#: ../src/backend/filters/clusterAnalysis.cpp:1805
 msgid "No core ions for cluster"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1734
+#: ../src/backend/filters/clusterAnalysis.cpp:1807
 msgid "No bulk ions for cluster"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1812
+#: ../src/backend/filters/clusterAnalysis.cpp:1885
 msgid " --------------------------- Parameter selection notice ------------- "
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1813
+#: ../src/backend/filters/clusterAnalysis.cpp:1886
 msgid "You have specified a bulk distance larger than half your link distance."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1814
+#: ../src/backend/filters/clusterAnalysis.cpp:1887
 msgid ""
 "You can do this; thats OK, but the output is no longer independent of the "
 "computational process;"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1815
+#: ../src/backend/filters/clusterAnalysis.cpp:1888
 msgid ""
 "This will be a problem in the case where two or more clusters can equally "
 "lay claim to a \"bulk\" ion. "
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1816
+#: ../src/backend/filters/clusterAnalysis.cpp:1889
 msgid ""
 " If your inter-cluster distance is sufficiently large (larger than your bulk "
 "linking distance), then you can get away with this."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1817
+#: ../src/backend/filters/clusterAnalysis.cpp:1890
 msgid ""
 " In theory it is possible to \"join\" the clusters, but this has not been "
 "implemented for speed reasons."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1818
+#: ../src/backend/filters/clusterAnalysis.cpp:1891
 msgid ""
 "If you want this, please contact the author, or just use the source to add "
 "this in yourself."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1819
+#: ../src/backend/filters/clusterAnalysis.cpp:1892
 msgid "---------------------------------------------------------------------- "
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1829
-#: ../src/backend/filters/spatialAnalysis.cpp:1469
-#: ../src/backend/filters/spatialAnalysis.cpp:1798
-#: ../src/backend/filters/spatialAnalysis.cpp:2094
-#: ../src/backend/filters/transform.cpp:1035
+#: ../src/backend/filters/clusterAnalysis.cpp:1902
+#: ../src/backend/filters/spatialAnalysis.cpp:1757
+#: ../src/backend/filters/spatialAnalysis.cpp:2084
+#: ../src/backend/filters/spatialAnalysis.cpp:2382
+#: ../src/backend/filters/spatialAnalysis.cpp:3078
+#: ../src/backend/filters/transform.cpp:1033
 msgid "Collate"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1848
+#: ../src/backend/filters/clusterAnalysis.cpp:1921
 msgid "Build Core"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1866
+#: ../src/backend/filters/clusterAnalysis.cpp:1939
 msgid "Classify Core"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1959
+#: ../src/backend/filters/clusterAnalysis.cpp:2032
 msgid "Build Bulk"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1979
+#: ../src/backend/filters/clusterAnalysis.cpp:2052
 msgid "Core"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2124
+#: ../src/backend/filters/clusterAnalysis.cpp:2197
 msgid "Bulk"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2254
+#: ../src/backend/filters/clusterAnalysis.cpp:2327
 msgid "Erode"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2328
+#: ../src/backend/filters/clusterAnalysis.cpp:2401
 msgid "Re-Collate"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2596
-#: ../src/backend/filters/clusterAnalysis.cpp:2823
+#: ../src/backend/filters/clusterAnalysis.cpp:2669
+#: ../src/backend/filters/clusterAnalysis.cpp:2873
 msgid "Cluster Size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2597
-#: ../src/backend/filters/clusterAnalysis.cpp:2827
+#: ../src/backend/filters/clusterAnalysis.cpp:2670
+#: ../src/backend/filters/clusterAnalysis.cpp:2877
 msgid "Frequency"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2825
+#: ../src/backend/filters/clusterAnalysis.cpp:2875
 msgid "Composition"
 msgstr ""
 
@@ -2883,14 +3026,6 @@ msgstr ""
 msgid "3D display method"
 msgstr ""
 
-#: ../src/backend/filters/voxelise.cpp:981
-#: ../src/backend/filters/voxelise.cpp:1037
-#: ../src/backend/filters/compositionProfile.cpp:1079
-#: ../src/backend/filters/boundingBox.cpp:656
-#: ../src/backend/filters/dataLoad.cpp:567
-msgid "Appearance"
-msgstr ""
-
 #: ../src/backend/filters/voxelise.cpp:984
 msgid "Spot size"
 msgstr ""
@@ -2920,13 +3055,6 @@ msgstr ""
 msgid "Scalar value to show as isosurface"
 msgstr ""
 
-#: ../src/backend/filters/voxelise.cpp:1022
-#: ../src/backend/filters/compositionProfile.cpp:1070
-#: ../src/backend/filters/annotation.cpp:903
-#: ../src/backend/filters/spectrumPlot.cpp:471
-msgid "Colour"
-msgstr ""
-
 #: ../src/backend/filters/voxelise.cpp:1025
 msgid "Colour of isosurface"
 msgstr ""
@@ -2968,12 +3096,12 @@ msgid "Colour mode"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1097
-#: ../src/backend/filters/ionColour.cpp:263
+#: ../src/backend/filters/ionColour.cpp:262
 msgid "Colour scheme used to assign points colours by value"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1106
-#: ../src/backend/filters/ionColour.cpp:271
+#: ../src/backend/filters/ionColour.cpp:274
 msgid "Show Bar"
 msgstr ""
 
@@ -2986,22 +3114,22 @@ msgid "Auto-compute min/max values in map"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1127
-#: ../src/backend/filters/ionColour.cpp:286
+#: ../src/backend/filters/ionColour.cpp:289
 msgid "Map start"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1128
-#: ../src/backend/filters/ionColour.cpp:287
+#: ../src/backend/filters/ionColour.cpp:290
 msgid "Assign points with this value to the first colour in map"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1135
-#: ../src/backend/filters/ionColour.cpp:294
+#: ../src/backend/filters/ionColour.cpp:297
 msgid "Map end"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1136
-#: ../src/backend/filters/ionColour.cpp:295
+#: ../src/backend/filters/ionColour.cpp:298
 msgid "Assign points with this value to the last colour in map"
 msgstr ""
 
@@ -3021,366 +3149,458 @@ msgstr ""
 msgid "Voxelisation bounds are invalid"
 msgstr ""
 
-#: ../src/backend/filters/ionColour.cpp:259
+#: ../src/backend/filters/ionColour.cpp:258
 msgid "Colour Map"
 msgstr ""
 
-#: ../src/backend/filters/ionColour.cpp:278
+#: ../src/backend/filters/ionColour.cpp:266
+msgid "Reverse map"
+msgstr ""
+
+#: ../src/backend/filters/ionColour.cpp:267
+msgid "Reverse the colour scale"
+msgstr ""
+
+#: ../src/backend/filters/ionColour.cpp:281
 msgid "Num Colours"
 msgstr ""
 
-#: ../src/backend/filters/ionColour.cpp:280
+#: ../src/backend/filters/ionColour.cpp:283
 msgid "Number of unique colours to use in colour map"
 msgstr ""
 
-#: ../src/backend/filters/ionColour.cpp:395
-#: ../src/backend/filters/transform.cpp:1573
-#: ../src/backend/filters/ionInfo.cpp:548
+#: ../src/backend/filters/ionColour.cpp:416
+#: ../src/backend/filters/transform.cpp:1579
+#: ../src/backend/filters/ionInfo.cpp:541
 msgid "Aborted"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:453
+#: ../src/backend/filters/compositionProfile.cpp:536
 msgid "Distance"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:461
+#: ../src/backend/filters/compositionProfile.cpp:544
 msgid "Fraction"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:463
-msgid "Density (\\#.len^3)"
+#: ../src/backend/filters/compositionProfile.cpp:546
+msgid "Density (\\frac{\\#}{len^3})"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:490
+#: ../src/backend/filters/compositionProfile.cpp:573
 msgid "Freq. Profile"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:588
+#: ../src/backend/filters/compositionProfile.cpp:641
 msgid "Too many bins in comp. profile."
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:590
+#: ../src/backend/filters/compositionProfile.cpp:643
 msgid "Not enough memory for comp. profile."
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:592
+#: ../src/backend/filters/compositionProfile.cpp:645
 msgid "Aborted composition prof."
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:914
+#: ../src/backend/filters/compositionProfile.cpp:989
 msgid "Primitive type"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:918
+#: ../src/backend/filters/compositionProfile.cpp:993
 msgid "Basic shape to use for profile"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:929
+#: ../src/backend/filters/compositionProfile.cpp:1004
 msgid "Display the 3D composition profile interaction object"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:943
-#: ../src/backend/filters/spatialAnalysis.cpp:596
+#: ../src/backend/filters/compositionProfile.cpp:1018
+#: ../src/backend/filters/spatialAnalysis.cpp:602
 msgid "Position for centre of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:951
+#: ../src/backend/filters/compositionProfile.cpp:1026
 msgid "Vector between ends of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:962
+#: ../src/backend/filters/compositionProfile.cpp:1037
 msgid "Prevent length of cylinder changing during interaction"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1002
+#: ../src/backend/filters/compositionProfile.cpp:1077
 msgid "Fixed Bin Num"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1005
+#: ../src/backend/filters/compositionProfile.cpp:1080
 msgid ""
 "If true, use a fixed number of bins for profile, otherwise use fixed step "
 "size"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1011
-#: ../src/backend/filters/spatialAnalysis.cpp:420
-#: ../src/backend/filters/spatialAnalysis.cpp:569
+#: ../src/backend/filters/compositionProfile.cpp:1086
+#: ../src/backend/filters/spatialAnalysis.cpp:433
+#: ../src/backend/filters/spatialAnalysis.cpp:575
 msgid "Num Bins"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1016
+#: ../src/backend/filters/compositionProfile.cpp:1091
 msgid "Number of bins to use for profile"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1021
-#: ../src/backend/filters/spectrumPlot.cpp:395
+#: ../src/backend/filters/compositionProfile.cpp:1096
+#: ../src/backend/filters/spectrumPlot.cpp:396
 msgid "Bin width"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1027
+#: ../src/backend/filters/compositionProfile.cpp:1102
 msgid "Size of each bin in profile"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1036
+#: ../src/backend/filters/compositionProfile.cpp:1111
 msgid "Convert bin counts into relative frequencies in each bin"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1057
-#: ../src/backend/filters/spectrumPlot.cpp:458
+#: ../src/backend/filters/compositionProfile.cpp:1115
+msgid "Min. events"
+msgstr ""
+
+#: ../src/backend/filters/compositionProfile.cpp:1119
+msgid "Drop data that does not have this many events"
+msgstr ""
+
+#: ../src/backend/filters/compositionProfile.cpp:1143
+#: ../src/backend/filters/spectrumPlot.cpp:459
 msgid "Plot Type"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1060
+#: ../src/backend/filters/compositionProfile.cpp:1146
 msgid "Visual style for plot"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1073
+#: ../src/backend/filters/compositionProfile.cpp:1159
 msgid "Colour of plot"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1089
+#: ../src/backend/filters/compositionProfile.cpp:1175
 msgid "Err. Estimator"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1092
+#: ../src/backend/filters/compositionProfile.cpp:1178
 msgid "Method of estimating error associated with each bin"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1099
+#: ../src/backend/filters/compositionProfile.cpp:1185
 msgid "Avg. Window"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1102
+#: ../src/backend/filters/compositionProfile.cpp:1188
 msgid "Number of bins to include in moving average filter"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1106
+#: ../src/backend/filters/compositionProfile.cpp:1192
 msgid "Error analysis"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:72
+#: ../src/backend/filters/spatialAnalysis.cpp:84
 msgid "Local Density"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:73
+#: ../src/backend/filters/spatialAnalysis.cpp:85
 msgid "Density Filtering"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:74
+#: ../src/backend/filters/spatialAnalysis.cpp:86
 msgid "Radial Distribution"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:75
+#: ../src/backend/filters/spatialAnalysis.cpp:87
 msgid "Axial Distribution"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:79
-msgid "Fixed Neighbour Count"
+#: ../src/backend/filters/spatialAnalysis.cpp:88
+msgid "Binomial Distribution"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:80
-msgid "Fixed Radius"
+#: ../src/backend/filters/spatialAnalysis.cpp:92
+msgid "Neighbour Count"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:363
+#: ../src/backend/filters/spatialAnalysis.cpp:376
 msgid "Spatial analysis algorithm to use"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:385
+#: ../src/backend/filters/spatialAnalysis.cpp:398
 msgid "Stop Mode"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:388
+#: ../src/backend/filters/spatialAnalysis.cpp:401
 msgid "Method to use to terminate algorithm when examining each point"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:395
+#: ../src/backend/filters/spatialAnalysis.cpp:408
 msgid "NN Max"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:398
+#: ../src/backend/filters/spatialAnalysis.cpp:411
 msgid "Maximum number of neighbours to examine"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:404
+#: ../src/backend/filters/spatialAnalysis.cpp:417
 msgid "Dist Max"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:407
+#: ../src/backend/filters/spatialAnalysis.cpp:420
 msgid "Maximum distance from each point for search"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:423
-#: ../src/backend/filters/spatialAnalysis.cpp:572
+#: ../src/backend/filters/spatialAnalysis.cpp:436
+#: ../src/backend/filters/spatialAnalysis.cpp:578
 msgid "Number of bins for output 1D RDF plot"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:432
+#: ../src/backend/filters/spatialAnalysis.cpp:442
 msgid "Surface Remove"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:435
+#: ../src/backend/filters/spatialAnalysis.cpp:445
 msgid ""
 "Exclude surface as part of source to minimise bias in RDF (at cost of "
 "increased noise)"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:442
+#: ../src/backend/filters/spatialAnalysis.cpp:452
 msgid "Remove Dist"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:445
+#: ../src/backend/filters/spatialAnalysis.cpp:455
 msgid "Minimum distance to remove from surface"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:456
-#: ../src/backend/filters/spatialAnalysis.cpp:581
+#: ../src/backend/filters/spatialAnalysis.cpp:466
+#: ../src/backend/filters/spatialAnalysis.cpp:587
 msgid "Plot colour "
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:459
-#: ../src/backend/filters/spatialAnalysis.cpp:584
+#: ../src/backend/filters/spatialAnalysis.cpp:469
+#: ../src/backend/filters/spatialAnalysis.cpp:590
 msgid "Colour of output plot"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:478
+#: ../src/backend/filters/spatialAnalysis.cpp:488
 msgid "Source"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:481
+#: ../src/backend/filters/spatialAnalysis.cpp:491
 msgid "Ions to use for initiating RDF search"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:497
+#: ../src/backend/filters/spatialAnalysis.cpp:504
 msgid "Enable/disable ion as source"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:514
+#: ../src/backend/filters/spatialAnalysis.cpp:521
 msgid "Enable/disable all ions as target"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:529
+#: ../src/backend/filters/spatialAnalysis.cpp:533
 msgid "Enable/disable this ion as target"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:542
+#: ../src/backend/filters/spatialAnalysis.cpp:541
+#: ../src/backend/filters/spatialAnalysis.cpp:564
+#: ../src/backend/filters/spatialAnalysis.cpp:569
+#: ../src/backend/filters/spatialAnalysis.cpp:622
+#: ../src/backend/filters/spatialAnalysis.cpp:661
+msgid "Alg. Params."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:548
 msgid "Cutoff"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:545
+#: ../src/backend/filters/spatialAnalysis.cpp:551
 msgid "Remove points with local density above/below this value"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:555
+#: ../src/backend/filters/spatialAnalysis.cpp:557
 msgid "Retain Upper"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:558
+#: ../src/backend/filters/spatialAnalysis.cpp:560
 msgid "Retain either points with density above (enabled) or below cutoff"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:604
+#: ../src/backend/filters/spatialAnalysis.cpp:610
 msgid "Vector between centre and end of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:622
-msgid "Alg. Params."
+#: ../src/backend/filters/spatialAnalysis.cpp:629
+#: ../src/backend/filters/spatialAnalysis.cpp:3217
+#: ../src/backend/filters/spatialAnalysis.cpp:3286
+msgid "Block size"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:632
+msgid "Number of ions to use per block"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:639
+msgid "Max Block Aspect"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:642
+msgid ""
+"Maximum allowable block aspect ratio. Blocks above this aspect are "
+"discarded. Setting too high decreases correlation strength. Too low causes "
+"loss of statistical power."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:653
+msgid "Extrusion Direction"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:656
+msgid "Direction in which blocks are extended during construction."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:665
+msgid "Plot Counts"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:668
+msgid "Show the counts in the binomial histogram"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1022
+#: ../src/backend/filters/spatialAnalysis.cpp:677
+msgid ""
+"Normalise the counts in the binomial histogram to a probability density "
+"function"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:691
+msgid "Display Grid"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:700
+msgid "View Options"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1227
 msgid "Spatial analysis aborted by user"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1024
+#: ../src/backend/filters/spatialAnalysis.cpp:1229
 msgid "Insufficient data to complete analysis."
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1503
-#: ../src/backend/filters/spatialAnalysis.cpp:1557
-#: ../src/backend/filters/spatialAnalysis.cpp:1804
-#: ../src/backend/filters/spatialAnalysis.cpp:2100
-#: ../src/backend/filters/spatialAnalysis.cpp:2589
+#: ../src/backend/filters/spatialAnalysis.cpp:1231
+msgid "Insufficient bins in histogram for analysis."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1233
+msgid "Insufficient memory for binomial. Reduce input size?"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1235
+msgid "Binomial requires a parent range file"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1791
+#: ../src/backend/filters/spatialAnalysis.cpp:1843
+#: ../src/backend/filters/spatialAnalysis.cpp:2090
+#: ../src/backend/filters/spatialAnalysis.cpp:2388
+#: ../src/backend/filters/spatialAnalysis.cpp:2920
 msgid "Build"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1515
-#: ../src/backend/filters/spatialAnalysis.cpp:1569
+#: ../src/backend/filters/spatialAnalysis.cpp:1803
+#: ../src/backend/filters/spatialAnalysis.cpp:1855
 msgid "Surface"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1609
-#: ../src/backend/filters/spatialAnalysis.cpp:1831
-#: ../src/backend/filters/spatialAnalysis.cpp:2127
+#: ../src/backend/filters/spatialAnalysis.cpp:1895
+#: ../src/backend/filters/spatialAnalysis.cpp:2117
+#: ../src/backend/filters/spatialAnalysis.cpp:2415
 msgid "Analyse"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1666
-#: ../src/backend/filters/spatialAnalysis.cpp:1735
+#: ../src/backend/filters/spatialAnalysis.cpp:1952
+#: ../src/backend/filters/spatialAnalysis.cpp:2021
 msgid "Radial Distance"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1670
+#: ../src/backend/filters/spatialAnalysis.cpp:1956
 msgid "NN Freq."
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1726
+#: ../src/backend/filters/spatialAnalysis.cpp:2012
 msgid "Warning, "
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1727
+#: ../src/backend/filters/spatialAnalysis.cpp:2013
 msgid ""
 " points were unable to find neighbour points that exceeded the search "
 "radius, and thus terminated prematurely"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1737
+#: ../src/backend/filters/spatialAnalysis.cpp:2023
 msgid " RDF"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2027
-#: ../src/backend/filters/spatialAnalysis.cpp:2333
+#: ../src/backend/filters/spatialAnalysis.cpp:2313
+#: ../src/backend/filters/spatialAnalysis.cpp:2621
 msgid "Number Density (\\#/Vol^3)"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2054
-#: ../src/backend/filters/spatialAnalysis.cpp:2358
+#: ../src/backend/filters/spatialAnalysis.cpp:2342
+#: ../src/backend/filters/spatialAnalysis.cpp:2648
 msgid "Warning,"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2055
-#: ../src/backend/filters/spatialAnalysis.cpp:2359
+#: ../src/backend/filters/spatialAnalysis.cpp:2343
+#: ../src/backend/filters/spatialAnalysis.cpp:2649
 msgid " points were un-analysable. These have been dropped"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2077
-#: ../src/backend/filters/spatialAnalysis.cpp:2381
+#: ../src/backend/filters/spatialAnalysis.cpp:2365
+#: ../src/backend/filters/spatialAnalysis.cpp:2671
 msgid "And so on..."
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2461
+#: ../src/backend/filters/spatialAnalysis.cpp:2754
 msgid "Extract"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2512
+#: ../src/backend/filters/spatialAnalysis.cpp:2829
 msgid "Reduce"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2606
+#: ../src/backend/filters/spatialAnalysis.cpp:2937
 msgid "Compute"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2631
+#: ../src/backend/filters/spatialAnalysis.cpp:2965
 msgid "Insufficient points to complete analysis"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2669
+#: ../src/backend/filters/spatialAnalysis.cpp:3001
 msgid "Axial Distance"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2671
+#: ../src/backend/filters/spatialAnalysis.cpp:3003
 msgid " 1D Dist. Func."
 msgstr ""
 
+#: ../src/backend/filters/spatialAnalysis.cpp:3087
+msgid "Binomial"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:3219
+#: ../src/backend/filters/spatialAnalysis.cpp:3288
+msgid "Rel. Frequency"
+msgstr ""
+
 #: ../src/backend/filters/transform.cpp:77
 msgid "Translate"
 msgstr ""
@@ -3421,122 +3641,122 @@ msgstr ""
 msgid "Mass Centre"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1054
+#: ../src/backend/filters/transform.cpp:1052
 msgid "Mass-to-Charge (amu/e)"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1108
+#: ../src/backend/filters/transform.cpp:1106
 msgid "Shuffle"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1124
+#: ../src/backend/filters/transform.cpp:1130
 msgid "Splice"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1179
+#: ../src/backend/filters/transform.cpp:1185
 msgid "Algorithm to use to transform point data"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1195
+#: ../src/backend/filters/transform.cpp:1201
 msgid "Origin mode"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1198
+#: ../src/backend/filters/transform.cpp:1204
 msgid "Select how transform origin is computed"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1203
+#: ../src/backend/filters/transform.cpp:1209
 msgid "Show marker"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1207
+#: ../src/backend/filters/transform.cpp:1213
 msgid "Display an interactive object to set transform origin"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1209
+#: ../src/backend/filters/transform.cpp:1215
 msgid "Display a small marker to denote transform origin"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1225
+#: ../src/backend/filters/transform.cpp:1231
 msgid "Translation"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1228
+#: ../src/backend/filters/transform.cpp:1234
 msgid "Translation vector for transform"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1240
+#: ../src/backend/filters/transform.cpp:1246
 msgid "Offset"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1244
+#: ../src/backend/filters/transform.cpp:1250
 msgid "Scalar to use to offset each point's associated value"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1261
-#: ../src/backend/filters/transform.cpp:1288
+#: ../src/backend/filters/transform.cpp:1267
+#: ../src/backend/filters/transform.cpp:1294
 msgid "Origin of scale trasnform"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1268
-#: ../src/backend/filters/transform.cpp:1295
+#: ../src/backend/filters/transform.cpp:1274
+#: ../src/backend/filters/transform.cpp:1301
 msgid "Scale Fact."
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1271
-#: ../src/backend/filters/transform.cpp:1298
+#: ../src/backend/filters/transform.cpp:1277
+#: ../src/backend/filters/transform.cpp:1304
 msgid "Enlargement factor for scaling around origin"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1314
+#: ../src/backend/filters/transform.cpp:1320
 msgid "Origin of rotation"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1322
+#: ../src/backend/filters/transform.cpp:1328
 msgid "Axis around which to revolve"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1327
+#: ../src/backend/filters/transform.cpp:1333
 msgid "Angle (deg)"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1330
+#: ../src/backend/filters/transform.cpp:1336
 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1347
+#: ../src/backend/filters/transform.cpp:1353
 msgid "Noise Type"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1350
+#: ../src/backend/filters/transform.cpp:1356
 msgid "Method to use to degrade point data"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1357
+#: ../src/backend/filters/transform.cpp:1363
 msgid "Noise level"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1359
+#: ../src/backend/filters/transform.cpp:1365
 msgid "Standard dev."
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1367
+#: ../src/backend/filters/transform.cpp:1373
 msgid "Amplitude of noise"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1379
+#: ../src/backend/filters/transform.cpp:1385
 msgid "Transform Params"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1576
+#: ../src/backend/filters/transform.cpp:1582
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1755
+#: ../src/backend/filters/transform.cpp:1761
 msgid "White"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1757
+#: ../src/backend/filters/transform.cpp:1763
 msgid "Gaussian"
 msgstr ""
 
@@ -3552,102 +3772,102 @@ msgstr ""
 msgid "Dimension"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:532
+#: ../src/backend/filters/boundingBox.cpp:524
 msgid "If true, show box, otherwise hide box"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:545
+#: ../src/backend/filters/boundingBox.cpp:537
 msgid "Style"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:548
+#: ../src/backend/filters/boundingBox.cpp:540
 msgid "Box display mode"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:559
+#: ../src/backend/filters/boundingBox.cpp:551
 msgid "Fixed Tick Num"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:563
+#: ../src/backend/filters/boundingBox.cpp:555
 msgid ""
 "If true, evenly use specified number of ticks. Otherwise, use distance to "
 "determine tick count"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:571
+#: ../src/backend/filters/boundingBox.cpp:563
 msgid "Num X"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:574
+#: ../src/backend/filters/boundingBox.cpp:566
 msgid "Tick count in X direction"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:579
+#: ../src/backend/filters/boundingBox.cpp:571
 msgid "Num Y"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:582
+#: ../src/backend/filters/boundingBox.cpp:574
 msgid "Tick count in Y direction"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:587
+#: ../src/backend/filters/boundingBox.cpp:579
 msgid "Num Z"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:590
+#: ../src/backend/filters/boundingBox.cpp:582
 msgid "Tick count in Z direction"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:596
+#: ../src/backend/filters/boundingBox.cpp:588
 msgid "Spacing X"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:600
+#: ../src/backend/filters/boundingBox.cpp:592
 msgid "Distance between ticks on X axis"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:604
+#: ../src/backend/filters/boundingBox.cpp:596
 msgid "Spacing Y"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:608
+#: ../src/backend/filters/boundingBox.cpp:600
 msgid "Distance between ticks on Y axis"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:612
+#: ../src/backend/filters/boundingBox.cpp:604
 msgid "Spacing Z"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:616
+#: ../src/backend/filters/boundingBox.cpp:608
 msgid "Distance between ticks on Z axis"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:619
+#: ../src/backend/filters/boundingBox.cpp:611
 msgid "Tick marks"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:629
+#: ../src/backend/filters/boundingBox.cpp:621
 msgid "Box Colour"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:633
+#: ../src/backend/filters/boundingBox.cpp:625
 msgid "Colour of the bounding box"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:638
+#: ../src/backend/filters/boundingBox.cpp:630
 msgid "Line thickness"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:642
+#: ../src/backend/filters/boundingBox.cpp:634
 msgid "Thickness of the lines used to draw the box"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:650
+#: ../src/backend/filters/boundingBox.cpp:642
 #: ../src/backend/filters/annotation.cpp:845
 msgid "Font Size"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:653
+#: ../src/backend/filters/boundingBox.cpp:645
 msgid "Relative size for text"
 msgstr ""
 
@@ -3728,23 +3948,11 @@ msgstr ""
 msgid "Relative size of annotation text"
 msgstr ""
 
-#: ../src/backend/filters/annotation.cpp:606
-#: ../src/backend/filters/annotation.cpp:645
-#: ../src/backend/filters/annotation.cpp:812
-msgid "Start"
-msgstr ""
-
 #: ../src/backend/filters/annotation.cpp:610
 #: ../src/backend/filters/annotation.cpp:649
 msgid "3D position for tail of arrow"
 msgstr ""
 
-#: ../src/backend/filters/annotation.cpp:614
-#: ../src/backend/filters/annotation.cpp:654
-#: ../src/backend/filters/annotation.cpp:820
-msgid "End"
-msgstr ""
-
 #: ../src/backend/filters/annotation.cpp:618
 #: ../src/backend/filters/annotation.cpp:658
 msgid "3D Position to which arrow points"
@@ -3877,51 +4085,51 @@ msgstr ""
 msgid "Colour for ruler and ticks"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:464
+#: ../src/backend/filters/ionDownsample.cpp:460
 msgid "By Count"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:467
+#: ../src/backend/filters/ionDownsample.cpp:463
 msgid "Sample up to a fixed number of ions"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:473
+#: ../src/backend/filters/ionDownsample.cpp:469
 msgid "Per Species"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:477
+#: ../src/backend/filters/ionDownsample.cpp:473
 msgid "Use species specific (from ranging) sampling values"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:482
+#: ../src/backend/filters/ionDownsample.cpp:478
 msgid "Sampling rates"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:505
+#: ../src/backend/filters/ionDownsample.cpp:501
 msgid "Sampling value for species"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:517
+#: ../src/backend/filters/ionDownsample.cpp:513
 msgid "Output Count"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:520
+#: ../src/backend/filters/ionDownsample.cpp:516
 msgid "Sample up to this value of points"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:525
+#: ../src/backend/filters/ionDownsample.cpp:521
 msgid "Out Fraction"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:529
+#: ../src/backend/filters/ionDownsample.cpp:525
 msgid "Sample this fraction of points"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:677
+#: ../src/backend/filters/ionDownsample.cpp:669
 msgid "Downsample Aborted"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:679
+#: ../src/backend/filters/ionDownsample.cpp:671
 msgid "Insuffient memory for downsample"
 msgstr ""
 
@@ -3933,241 +4141,280 @@ msgstr ""
 msgid "Convex hull"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:195
+#: ../src/backend/filters/ionInfo.cpp:193
 msgid "No ions"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:233
+#: ../src/backend/filters/ionInfo.cpp:231
 msgid "--Counts--"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:245
+#: ../src/backend/filters/ionInfo.cpp:241
 msgid "Total Ranged\t"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:250
+#: ../src/backend/filters/ionInfo.cpp:246
 msgid "Total (incl. unranged)\t"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:263
+#: ../src/backend/filters/ionInfo.cpp:259
 msgid "n/a"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:273
+#: ../src/backend/filters/ionInfo.cpp:269
 msgid "Unranged"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:289
+#: ../src/backend/filters/ionInfo.cpp:282
 msgid "Number of points : "
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:318
+#: ../src/backend/filters/ionInfo.cpp:311
 msgid "Rectilinear Bounds : "
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:323
+#: ../src/backend/filters/ionInfo.cpp:316
 msgid "Volume (len^3): "
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:339
+#: ../src/backend/filters/ionInfo.cpp:332
 msgid "Convex Volume (len^3): "
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:341
+#: ../src/backend/filters/ionInfo.cpp:334
 msgid "Unable to compute volume"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:370
+#: ../src/backend/filters/ionInfo.cpp:363
 msgid "Ranged Density (pts/vol):"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:375
+#: ../src/backend/filters/ionInfo.cpp:368
 msgid "Total Density (pts/vol):"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:403
+#: ../src/backend/filters/ionInfo.cpp:396
 msgid "Compositions"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:404
+#: ../src/backend/filters/ionInfo.cpp:397
 msgid "Display compositional data for points in console"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:408
+#: ../src/backend/filters/ionInfo.cpp:401
 msgid "Counts"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:409
+#: ../src/backend/filters/ionInfo.cpp:402
 msgid "Display count data for points in console"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:423
+#: ../src/backend/filters/ionInfo.cpp:416
 msgid "Normalise count data"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:432
+#: ../src/backend/filters/ionInfo.cpp:425
 msgid "Volume"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:435
+#: ../src/backend/filters/ionInfo.cpp:428
 msgid "Compute volume for point data"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:450
+#: ../src/backend/filters/ionInfo.cpp:443
 msgid "Select volume counting technique"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:546
+#: ../src/backend/filters/ionInfo.cpp:539
 msgid "Insufficient memory for operation"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:550
+#: ../src/backend/filters/ionInfo.cpp:543
 msgid "Bug? Problem with qhull library, cannot run convex hull."
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:47
+#: ../src/backend/filters/dataLoad.cpp:56
+msgid "Auto"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:57
+msgid "Little"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:58
+msgid "Big"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:61
 msgid "POS Data"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:48
+#: ../src/backend/filters/dataLoad.cpp:62
 msgid "Text Data"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:227
+#: ../src/backend/filters/dataLoad.cpp:63
+msgid "ATO Data"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:242
 msgid " does not exist"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:264
-#: ../src/backend/filters/dataLoad.cpp:275
-#: ../src/backend/filters/dataLoad.cpp:295
-#: ../src/backend/filters/dataLoad.cpp:307
+#: ../src/backend/filters/dataLoad.cpp:280
+#: ../src/backend/filters/dataLoad.cpp:293
+#: ../src/backend/filters/dataLoad.cpp:336
+#: ../src/backend/filters/dataLoad.cpp:347
+#: ../src/backend/filters/dataLoad.cpp:408
 msgid "Error loading file: "
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:321
-msgid "Data file contained incorrect number of columns -- should be 4, was "
+#: ../src/backend/filters/dataLoad.cpp:310
+msgid "Sampling is active, loaded "
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:374
+#: ../src/backend/filters/dataLoad.cpp:311
+msgid " available."
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:319
+msgid "Loaded entire dataset, "
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:319
+#: ../src/backend/filters/dataLoad.cpp:418
+msgid " points."
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:362
 msgid ""
-"Warning:One or more bounds of the loaded data approaches the limits of "
-"numerical stability for the internal data type(magnitude too large). "
-"Consider rescaling data before loading"
+"Data file contained incorrect number of columns -- should be 3 or 4, was "
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:381
-msgid "Loaded "
+#: ../src/backend/filters/dataLoad.cpp:417
+msgid "Loaded dataset, "
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:381
-msgid " Points"
+#: ../src/backend/filters/dataLoad.cpp:449
+msgid ""
+"Warning:One or more bounds of the loaded data approaches the limits of "
+"numerical stability for the internal data type(magnitude too large). "
+"Consider rescaling data before loading"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:409
-#: ../src/backend/filters/rangeFile.cpp:559
+#: ../src/backend/filters/dataLoad.cpp:481
+#: ../src/backend/filters/rangeFile.cpp:567
 msgid "File"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:410
+#: ../src/backend/filters/dataLoad.cpp:482
 msgid "File from which to load data"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:421
+#: ../src/backend/filters/dataLoad.cpp:493
 msgid "File type"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:423
+#: ../src/backend/filters/dataLoad.cpp:495
 msgid "Type of file to be loaded"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:437
+#: ../src/backend/filters/dataLoad.cpp:509
 msgid "Entries per point"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:438
+#: ../src/backend/filters/dataLoad.cpp:510
 msgid "Number of decimal values in file per 3D point (normally 4)"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:466
+#: ../src/backend/filters/dataLoad.cpp:529
+msgid "File \"Endianness\""
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:530
+msgid "On-disk data storage format. If file won't load, just try each"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:555
 msgid "Relative offset of each entry in file for point's X position"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:474
+#: ../src/backend/filters/dataLoad.cpp:563
 msgid "Relative offset of each entry in file for point's Y position"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:482
+#: ../src/backend/filters/dataLoad.cpp:571
 msgid "Relative offset of each entry in file for point's Z position"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:490
+#: ../src/backend/filters/dataLoad.cpp:579
 msgid ""
 "Relative offset of each entry in file to use for scalar value of 3D point"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:493
+#: ../src/backend/filters/dataLoad.cpp:582
 msgid "Value Label"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:497
+#: ../src/backend/filters/dataLoad.cpp:586
 msgid "Name for the scalar value associated with each point"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:500
+#: ../src/backend/filters/dataLoad.cpp:589
 msgid "Format params."
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:506
+#: ../src/backend/filters/dataLoad.cpp:595
 msgid "Enabled"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:510
+#: ../src/backend/filters/dataLoad.cpp:599
 msgid "Load this file?"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:518
+#: ../src/backend/filters/dataLoad.cpp:610
 msgid "Sample data"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:521
+#: ../src/backend/filters/dataLoad.cpp:613
 msgid ""
 "Perform random selection on file contents, instead of loading entire file"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:528
+#: ../src/backend/filters/dataLoad.cpp:620
 msgid "Load Limit (MB)"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:531
+#: ../src/backend/filters/dataLoad.cpp:623
 msgid "Limit for size of data to load"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:537
+#: ../src/backend/filters/dataLoad.cpp:630
 msgid "Monitor"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:541
+#: ../src/backend/filters/dataLoad.cpp:634
 msgid ""
 "Watch file timestamp to track changes to file contents from other programs"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:543
+#: ../src/backend/filters/dataLoad.cpp:636
 msgid "Load params."
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:553
+#: ../src/backend/filters/dataLoad.cpp:646
 msgid "Default colour "
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:556
+#: ../src/backend/filters/dataLoad.cpp:649
 msgid "Default colour for points, if not overridden by other filters"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:561
+#: ../src/backend/filters/dataLoad.cpp:654
 msgid "Draw Size"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:564
+#: ../src/backend/filters/dataLoad.cpp:657
 msgid "Default size for points, if not overridden by other filters"
 msgstr ""
 
@@ -4183,508 +4430,524 @@ msgstr ""
 msgid "Mixed data"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:399
+#: ../src/backend/filters/spectrumPlot.cpp:400
 msgid "Step size for spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:408
+#: ../src/backend/filters/spectrumPlot.cpp:409
 msgid "Auto Min/max"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:412
+#: ../src/backend/filters/spectrumPlot.cpp:413
 msgid "Automatically compute spectrum upper and lower bound"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:417
+#: ../src/backend/filters/spectrumPlot.cpp:418
 msgid "Min"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:420
+#: ../src/backend/filters/spectrumPlot.cpp:421
 msgid "Starting position for spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:425
+#: ../src/backend/filters/spectrumPlot.cpp:426
 msgid "Max"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:428
+#: ../src/backend/filters/spectrumPlot.cpp:429
 msgid "Ending position for spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:436
+#: ../src/backend/filters/spectrumPlot.cpp:437
 msgid "Logarithmic"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:439
+#: ../src/backend/filters/spectrumPlot.cpp:440
 msgid "Convert the plot to logarithmic mode"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:461
+#: ../src/backend/filters/spectrumPlot.cpp:462
 msgid "Visual style of plot"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:474
+#: ../src/backend/filters/spectrumPlot.cpp:475
 msgid "Colour of plotted spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:708
+#: ../src/backend/filters/spectrumPlot.cpp:709
 msgid "Insufficient memory for spectrum filter."
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:710
+#: ../src/backend/filters/spectrumPlot.cpp:711
 msgid "Bad bincount value in spectrum filter."
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:143
+#: ../src/backend/filters/rangeFile.cpp:149
 msgid "Pre-Allocate"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:274 ../src/backend/filter.cpp:46
+#: ../src/backend/filters/rangeFile.cpp:280 ../src/backend/filter.cpp:46
 msgid "Range"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:561
+#: ../src/backend/filters/rangeFile.cpp:569
 msgid "File to use for range data"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:573
+#: ../src/backend/filters/rangeFile.cpp:581
 msgid "Drop unranged"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:575
+#: ../src/backend/filters/rangeFile.cpp:583
 msgid "Remove unranged points when generating output"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:595
+#: ../src/backend/filters/rangeFile.cpp:603
 msgid "All Ions"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:596
+#: ../src/backend/filters/rangeFile.cpp:604
 msgid "Enable/disable all ions at once"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:604
+#: ../src/backend/filters/rangeFile.cpp:612
 msgid "Species"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:611
+#: ../src/backend/filters/rangeFile.cpp:619
 msgid "IonID "
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:612
+#: ../src/backend/filters/rangeFile.cpp:620
 msgid "Enable/disable specified ion"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:625
+#: ../src/backend/filters/rangeFile.cpp:633
 msgid "Active Ion "
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:627
+#: ../src/backend/filters/rangeFile.cpp:635
 msgid "If true, ion is used in output"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:641
+#: ../src/backend/filters/rangeFile.cpp:649
 msgid "Colour "
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:644
+#: ../src/backend/filters/rangeFile.cpp:652
 msgid "Colour used to represent ion"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:668
+#: ../src/backend/filters/rangeFile.cpp:676
 msgid "All Ranges"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:669
+#: ../src/backend/filters/rangeFile.cpp:677
 msgid "Enable/disable all ranges"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:687
+#: ../src/backend/filters/rangeFile.cpp:695
 msgid "Active Rng "
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:690
+#: ../src/backend/filters/rangeFile.cpp:698
 msgid ""
 "Enable/disable specified range (ion must also be enabled to activiate range)"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:694
+#: ../src/backend/filters/rangeFile.cpp:702
 msgid "Ion "
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:697
+#: ../src/backend/filters/rangeFile.cpp:705
 msgid "Name of ion associate to this range"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:706
+#: ../src/backend/filters/rangeFile.cpp:714
 msgid "Start rng "
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:709
+#: ../src/backend/filters/rangeFile.cpp:717
 msgid "Start value for range"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:714
+#: ../src/backend/filters/rangeFile.cpp:722
 msgid "End rng "
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:717
+#: ../src/backend/filters/rangeFile.cpp:725
 msgid "Stopping value for range`"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:1021
+#: ../src/backend/filters/rangeFile.cpp:1029
 msgid "Ranging aborted by user"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:1023
+#: ../src/backend/filters/rangeFile.cpp:1031
 msgid "Insufficient memory for range"
 msgstr ""
 
-#: ../src/backend/state.cpp:120
+#: ../src/backend/state.cpp:137
 msgid ""
 "This file is a \"state\" file for the 3Depict program, and stores "
 "information about a particular analysis session. This file should be a valid "
 "\"XML\" file"
 msgstr ""
 
-#: ../src/backend/state.cpp:248
+#: ../src/backend/state.cpp:290
 msgid "Failed to allocate parser"
 msgstr ""
 
-#: ../src/backend/state.cpp:283
+#: ../src/backend/state.cpp:326
 msgid ""
 "Unable to retrieve root node in input state file... Is this really a non-"
 "empty XML file?"
 msgstr ""
 
-#: ../src/backend/state.cpp:290
+#: ../src/backend/state.cpp:333
 msgid "Base state node missing. Is this really a state XML file??"
 msgstr ""
 
-#: ../src/backend/state.cpp:319
+#: ../src/backend/state.cpp:362
 msgid "State was created by a newer version of this program.. "
 msgstr ""
 
-#: ../src/backend/state.cpp:320
+#: ../src/backend/state.cpp:363
 msgid "file reading will continue, but may fail."
 msgstr ""
 
-#: ../src/backend/state.cpp:325
+#: ../src/backend/state.cpp:368
 msgid ""
 "Warning, unparseable version number in state file. File reading will "
 "continue, but may fail"
 msgstr ""
 
-#: ../src/backend/state.cpp:332
+#: ../src/backend/state.cpp:375
 msgid "Unable to find the \"writer\" node"
 msgstr ""
 
-#: ../src/backend/state.cpp:342
+#: ../src/backend/state.cpp:385
 msgid "Unable to find the \"backcolour\" node."
 msgstr ""
 
-#: ../src/backend/state.cpp:349
+#: ../src/backend/state.cpp:392
 msgid "\"backcolour\" node missing \"r\" value."
 msgstr ""
 
-#: ../src/backend/state.cpp:354
+#: ../src/backend/state.cpp:397
 msgid "Unable to interpret \"backColour\" node's \"r\" value."
 msgstr ""
 
-#: ../src/backend/state.cpp:362
+#: ../src/backend/state.cpp:405
 msgid "\"backcolour\" node missing \"g\" value."
 msgstr ""
 
-#: ../src/backend/state.cpp:368
+#: ../src/backend/state.cpp:411
 msgid "Unable to interpret \"backColour\" node's \"g\" value."
 msgstr ""
 
-#: ../src/backend/state.cpp:376
+#: ../src/backend/state.cpp:419
 msgid "\"backcolour\" node missing \"b\" value."
 msgstr ""
 
-#: ../src/backend/state.cpp:382
+#: ../src/backend/state.cpp:425
 msgid "Unable to interpret \"backColour\" node's \"b\" value."
 msgstr ""
 
-#: ../src/backend/state.cpp:389
+#: ../src/backend/state.cpp:432
 msgid "\"backcolour\"s rgb values must be in range [0,1]"
 msgstr ""
 
-#: ../src/backend/state.cpp:417
+#: ../src/backend/state.cpp:460
 msgid "Unable to find or interpret \"showaxis\" node"
 msgstr ""
 
-#: ../src/backend/state.cpp:424
+#: ../src/backend/state.cpp:504
 msgid "Unable to locate \"filtertree\" node."
 msgstr ""
 
-#: ../src/backend/state.cpp:440
+#: ../src/backend/state.cpp:520
 msgid "Cameras section missing \"active\" node."
 msgstr ""
 
-#: ../src/backend/state.cpp:448
+#: ../src/backend/state.cpp:528
 msgid "Unable to find property \"value\"  for \"cameras->active\" node."
 msgstr ""
 
-#: ../src/backend/state.cpp:454
+#: ../src/backend/state.cpp:534
 msgid "Unable to interpret property \"value\"  for \"cameras->active\" node."
 msgstr ""
 
-#: ../src/backend/state.cpp:473
+#: ../src/backend/state.cpp:553
 msgid "Failed to interpret camera state for camera : "
 msgstr ""
 
-#: ../src/backend/state.cpp:481
+#: ../src/backend/state.cpp:561
 msgid "Unable to interpret the camera type for camera : "
 msgstr ""
 
-#: ../src/backend/state.cpp:517
+#: ../src/backend/state.cpp:597
 msgid "Unable to locate stash name for stash "
 msgstr ""
 
-#: ../src/backend/state.cpp:524
+#: ../src/backend/state.cpp:604
 msgid "Empty stash name for stash "
 msgstr ""
 
-#: ../src/backend/state.cpp:533
+#: ../src/backend/state.cpp:613
 msgid "No filter tree for stash:"
 msgstr ""
 
-#: ../src/backend/state.cpp:539
+#: ../src/backend/state.cpp:619
 msgid "For stash "
 msgstr ""
 
-#: ../src/backend/state.cpp:570
+#: ../src/backend/state.cpp:651
 msgid "Unrecognised effect :"
 msgstr ""
 
-#: ../src/backend/state.cpp:580
+#: ../src/backend/state.cpp:661
 msgid "Duplicate effect found"
 msgstr ""
 
-#: ../src/backend/state.cpp:580
+#: ../src/backend/state.cpp:661
 msgid " cannot use."
 msgstr ""
 
-#: ../src/backend/state.cpp:590
+#: ../src/backend/state.cpp:671
 msgid "Error reading effect : "
 msgstr ""
 
-#: ../src/backend/state.cpp:651
+#: ../src/backend/state.cpp:789
 msgid "-merge"
 msgstr ""
 
-#: ../src/backend/state.cpp:656
+#: ../src/backend/state.cpp:794
 msgid ""
 " Unable to merge stashes correctly. This is improbable, so please report "
 "this."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:198
+#: ../src/backend/filtertreeAnalyse.cpp:199
 msgid ""
 "Parent filter has no output, but filter requires input -- there is no point "
 "in placing a child filter here."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:199
+#: ../src/backend/filtertreeAnalyse.cpp:200
 msgid "Leaf-only filter with child"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:209
+#: ../src/backend/filtertreeAnalyse.cpp:210
 msgid ""
 "Parent filters' output will be blocked by child, without use. Parent results "
 "will be dropped."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:210
-#: ../src/backend/filtertreeAnalyse.cpp:224
+#: ../src/backend/filtertreeAnalyse.cpp:211
+#: ../src/backend/filtertreeAnalyse.cpp:225
 msgid "Bad parent->child pair"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:223
+#: ../src/backend/filtertreeAnalyse.cpp:224
 msgid ""
 "First filter does not output anything useable by child filter. Child filter "
 "not useful."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:303
+#: ../src/backend/filtertreeAnalyse.cpp:304
 msgid "Spatial results possibly altered"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:304
+#: ../src/backend/filtertreeAnalyse.cpp:305
 msgid ""
 "Filters and settings selected that could alter reported results that depend "
 "upon density. Check to see if spatial sampling may be happening in the "
 "filter tree - this warning is provisional only."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:372
+#: ../src/backend/filtertreeAnalyse.cpp:373
 msgid "Filter needs parent \""
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:373
+#: ../src/backend/filtertreeAnalyse.cpp:374
 msgid ""
 "\" but does not have one. Filter may not function correctly until this "
 "parent is given."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:374
+#: ../src/backend/filtertreeAnalyse.cpp:375
 msgid "Filter missing needed parent"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:553
+#: ../src/backend/filtertreeAnalyse.cpp:554
 msgid "Composition results possibly altered"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:554
+#: ../src/backend/filtertreeAnalyse.cpp:555
 msgid ""
 "Filters and settings selected that could bias reported composition. Check to "
 "see if species biasing may occcur in the filter tree - this warning is "
 "provisional only."
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:39
+#: ../src/backend/APT/APTFileIO.cpp:40
 msgid "Memory allocation failure on POS load"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:40
+#: ../src/backend/APT/APTFileIO.cpp:41
 msgid "Error opening pos file"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:41
+#: ../src/backend/APT/APTFileIO.cpp:42
 msgid "Pos file empty"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:42
+#: ../src/backend/APT/APTFileIO.cpp:43
 msgid "Pos file size appears to have non-integer number of entries"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:43
+#: ../src/backend/APT/APTFileIO.cpp:44
 msgid "Error reading from pos file (after open)"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:44
+#: ../src/backend/APT/APTFileIO.cpp:45
 msgid "Error - Found NaN in pos file"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:45
+#: ../src/backend/APT/APTFileIO.cpp:46
 msgid "Pos load aborted by interrupt."
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:62
+#: ../src/backend/APT/APTFileIO.cpp:66
 msgid "No numerical data found"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:63
+#: ../src/backend/APT/APTFileIO.cpp:67
 msgid "Error re-opening file, after first scan"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:64
+#: ../src/backend/APT/APTFileIO.cpp:68
 msgid "Unable to read file contents after open"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:66
+#: ../src/backend/APT/APTFileIO.cpp:70
 msgid "Incorrect number of fields in file"
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:67
+#: ../src/backend/APT/APTFileIO.cpp:71 ../src/backend/APT/APTFileIO.cpp:93
 msgid "Unable to allocate memory to store data"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:46
-msgid "Error opening file, check name and permissions."
+#: ../src/backend/APT/APTFileIO.cpp:90
+msgid "File is empty"
+msgstr ""
+
+#: ../src/backend/APT/APTFileIO.cpp:91
+msgid "Filesize does not match expected format"
+msgstr ""
+
+#: ../src/backend/APT/APTFileIO.cpp:92
+msgid "File version number not <4, as expected"
+msgstr ""
+
+#: ../src/backend/APT/APTFileIO.cpp:94
+msgid "Unable to detect endian-ness in file"
 msgstr ""
 
 #: ../src/backend/APT/APTRanges.cpp:47
+msgid "Error opening file, check name and permissions."
+msgstr ""
+
+#: ../src/backend/APT/APTRanges.cpp:48
 msgid ""
 "Error interpreting range file header, expecting ion count and range count, "
 "respectively."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:48
+#: ../src/backend/APT/APTRanges.cpp:49
 msgid ""
 "Range file appears to be empty, check file is a proper range file and is not "
 "empty."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:49
+#: ../src/backend/APT/APTRanges.cpp:50
 msgid "Error reading the long name for ion."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:50
+#: ../src/backend/APT/APTRanges.cpp:51
 msgid "Error reading the short name for ion."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:51
+#: ../src/backend/APT/APTRanges.cpp:52
 msgid ""
 "Error reading colour data in the file, expecting 3 decimal values, space "
 "separated."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:52
+#: ../src/backend/APT/APTRanges.cpp:53
 msgid ""
 "Tried skipping to table separator line (line with dashes), but did not find "
 "it."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:53
+#: ../src/backend/APT/APTRanges.cpp:54
 msgid ""
 "Number of ions in the table header did not match the number specified at the "
 "start of the file"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:54
+#: ../src/backend/APT/APTRanges.cpp:55
 msgid ""
 "Unexpected failure whilst trying to skip over range lead-in data (bit before "
 "range start value)"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:55
+#: ../src/backend/APT/APTRanges.cpp:56
 msgid ""
 "Range table had an incorrect number of entries, should be 2 or 3 + number of "
 "ranges"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:56
+#: ../src/backend/APT/APTRanges.cpp:57
 msgid "Unable to read range start and end values"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:57
+#: ../src/backend/APT/APTRanges.cpp:58
 msgid "Unable to read range table entry"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:58
+#: ../src/backend/APT/APTRanges.cpp:59
 msgid ""
 "Error reading file, unexpected format, are you sure it is a proper range "
 "file?"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:59
+#: ../src/backend/APT/APTRanges.cpp:60
 msgid ""
 "Too many ranges appeared to have range entries with no usable data (eg, all "
 "blank)"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:60
+#: ../src/backend/APT/APTRanges.cpp:61
 msgid ""
 "Range file appears to contain malformed data, check things like start and "
 "ends of m/c are not equal or flipped."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:61
+#: ../src/backend/APT/APTRanges.cpp:62
 msgid "Range file appears to be inconsistent (eg, overlapping ranges)"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:62
+#: ../src/backend/APT/APTRanges.cpp:63
 msgid "No ion name mapping found  for multiple ion."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:63
+#: ../src/backend/APT/APTRanges.cpp:64
 msgid "Polyatomic extension range matches multiple masses in first section"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:1273
+#: ../src/backend/APT/APTRanges.cpp:1387
 msgid ""
 "Range headings do not match order of the ions listed in the name "
 "specifications. The name specification ordering will be used when reading "
@@ -4701,11 +4964,15 @@ msgstr ""
 msgid "Voxel"
 msgstr ""
 
+#: ../src/wx/wxcomponents.h:98
+msgid "treeCtrl"
+msgstr ""
+
 #: ../src/backend/filters/transform.h:71
 msgid "Ion. Transform"
 msgstr ""
 
-#: ../src/backend/filters/ionColour.h:59
+#: ../src/backend/filters/ionColour.h:61
 msgid "Spectral Colour"
 msgstr ""
 
@@ -4721,11 +4988,11 @@ msgstr ""
 msgid "Ion info"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.h:131
+#: ../src/backend/filters/dataLoad.h:136
 msgid "Pos Data"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.h:56
+#: ../src/backend/filters/externalProgram.h:69
 msgid "Ext. Program"
 msgstr ""
 
@@ -4733,6 +5000,113 @@ msgstr ""
 msgid "Ranging"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.h:110
+#: ../src/backend/filters/compositionProfile.h:117
 msgid "Comp. Prof."
 msgstr ""
+
+#: ../data/startup-tips.txt:5
+msgid ""
+"You can reset the main view by tapping the space bar. Hold down modifier "
+"keys like shift,ctrl to change the axis. Double tap to switch which axis to "
+"look down"
+msgstr ""
+
+#: ../data/startup-tips.txt:6
+msgid ""
+"You can delete filters from the tree by selecting them, then tapping delete?"
+msgstr ""
+
+#: ../data/startup-tips.txt:7
+msgid ""
+"Multiple languages are supported? You can translate the program into your "
+"own language at https://www.transifex.com/projects/p/3depict/"
+msgstr ""
+
+#: ../data/startup-tips.txt:8
+msgid ""
+"Package files can be easily shared to allow others to view your analysis, "
+"using the File->Export->Package menu item"
+msgstr ""
+
+#: ../data/startup-tips.txt:9
+msgid ""
+"You can export plots to SVG \"Vector\" format, for easier editing - edit "
+"your plots in inkscape!"
+msgstr ""
+
+#: ../data/startup-tips.txt:10
+msgid "You can access the manual from the Help menu"
+msgstr ""
+
+#: ../data/startup-tips.txt:11
+msgid "You can change filter defaults using the Edit->Preferences menu item"
+msgstr ""
+
+#: ../data/startup-tips.txt:12
+msgid ""
+"You can overlay multiple plots at once, by selecting more than on plot at a "
+"time (e.g. using Ctrl)"
+msgstr ""
+
+#: ../data/startup-tips.txt:13
+msgid ""
+"Calculations are much faster (more than linear speedup) when working with "
+"smaller datasets - try sampling, or clipping out a small region to work "
+"faster, then remove the sampling when you are ready"
+msgstr ""
+
+#: ../data/startup-tips.txt:14
+msgid "You can abort most calculations by pressing Escape"
+msgstr ""
+
+#: ../data/startup-tips.txt:15
+msgid ""
+"That anyone can contribute to improving this program, even without knowing "
+"about computer programming?"
+msgstr ""
+
+#: ../data/startup-tips.txt:16
+msgid ""
+"You can load more than one file at a time, then either operate on the "
+"separately, or together"
+msgstr ""
+
+#: ../data/startup-tips.txt:17
+msgid ""
+"You can have more than one range file for different parts of your dataset"
+msgstr ""
+
+#: ../data/startup-tips.txt:18
+msgid ""
+"Cameras can be saved and retrieved whenever you like, using the camera tab"
+msgstr ""
+
+#: ../data/startup-tips.txt:19
+msgid ""
+"Subsections of the filter tree can be saved to the \"Stashed filters\" drop-"
+"down"
+msgstr ""
+
+#: ../data/startup-tips.txt:20
+msgid ""
+"The console tab along the bottom often shows useful messages from filters. "
+"When new messages appear, a small symbol is shown on the tab"
+msgstr ""
+
+#: ../data/startup-tips.txt:21
+msgid ""
+"The raw data used for any plot can be accessed from the \"Raw\" tab on the "
+"bottom panel"
+msgstr ""
+
+#: ../data/startup-tips.txt:22
+msgid ""
+"You can ask questions about the program, or using it on your data on our "
+"forums (http://sourceforge.net/apps/phpbb/threedepict/)"
+msgstr ""
+
+#: ../data/startup-tips.txt:23
+msgid ""
+"By creating a camera, you can switch between orthographic and perspective "
+"views"
+msgstr ""
diff --git a/translations/3Depict_de_DE.mo b/translations/3Depict_de_DE.mo
index e9ff0b8..cf1c383 100644
Binary files a/translations/3Depict_de_DE.mo and b/translations/3Depict_de_DE.mo differ
diff --git a/translations/3Depict_de_DE.po b/translations/3Depict_de_DE.po
index d2b47ba..888bc71 100644
--- a/translations/3Depict_de_DE.po
+++ b/translations/3Depict_de_DE.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 3Depict\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-05 22:42+0200\n"
+"POT-Creation-Date: 2014-04-12 18:12+0200\n"
 "PO-Revision-Date: 2012-07-09 08:21+0000\n"
 "Last-Translator: epix1234 <erich_s at gmx.de>\n"
 "Language-Team: German (Germany) (http://www.transifex.com/projects/p/3depict/"
@@ -21,274 +21,276 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../src/gl/cameras.cpp:688 ../src/gl/cameras.cpp:690
+#: ../src/gl/cameras.cpp:598 ../src/gl/cameras.cpp:600
 msgid "Lock"
 msgstr "Sperren"
 
-#: ../src/gl/cameras.cpp:697 ../src/backend/filters/ionClip.cpp:523
-#: ../src/backend/filters/ionClip.cpp:545
-#: ../src/backend/filters/ionClip.cpp:567
-#: ../src/backend/filters/ionClip.cpp:607
-#: ../src/backend/filters/compositionProfile.cpp:940
-#: ../src/backend/filters/compositionProfile.cpp:981
-#: ../src/backend/filters/spatialAnalysis.cpp:593
-#: ../src/backend/filters/transform.cpp:1258
-#: ../src/backend/filters/transform.cpp:1285
-#: ../src/backend/filters/transform.cpp:1311
+#: ../src/gl/cameras.cpp:607 ../src/backend/filters/ionClip.cpp:526
+#: ../src/backend/filters/ionClip.cpp:548
+#: ../src/backend/filters/ionClip.cpp:570
+#: ../src/backend/filters/ionClip.cpp:610
+#: ../src/backend/filters/compositionProfile.cpp:1015
+#: ../src/backend/filters/compositionProfile.cpp:1056
+#: ../src/backend/filters/spatialAnalysis.cpp:599
+#: ../src/backend/filters/transform.cpp:1264
+#: ../src/backend/filters/transform.cpp:1291
+#: ../src/backend/filters/transform.cpp:1317
 #: ../src/backend/filters/annotation.cpp:569
 msgid "Origin"
 msgstr "Ursprung"
 
-#: ../src/gl/cameras.cpp:702 ../src/backend/filters/spatialAnalysis.cpp:511
+#: ../src/gl/cameras.cpp:612 ../src/backend/filters/spatialAnalysis.cpp:518
 msgid "Target"
 msgstr "Ziel"
 
-#: ../src/gl/cameras.cpp:707
+#: ../src/gl/cameras.cpp:617
 msgid "Up Dir."
 msgstr "Up Dir."
 
-#: ../src/gl/cameras.cpp:715 ../src/gl/cameras.cpp:819
+#: ../src/gl/cameras.cpp:625 ../src/gl/cameras.cpp:729
 msgid "Perspective"
 msgstr "Perspektivisch"
 
-#: ../src/gl/cameras.cpp:717 ../src/gl/cameras.cpp:821
+#: ../src/gl/cameras.cpp:627 ../src/gl/cameras.cpp:731
+#: ../src/gui/mainFrame.cpp:5396
 msgid "Orthogonal"
 msgstr "Orthogonal"
 
-#: ../src/gl/cameras.cpp:721
+#: ../src/gl/cameras.cpp:631
 msgid "Projection"
 msgstr "Projektion"
 
-#: ../src/gl/cameras.cpp:729
+#: ../src/gl/cameras.cpp:639
 msgid "Field of View (deg)"
 msgstr "Bildausschnitt"
 
-#: ../src/gl/cameras.cpp:735
+#: ../src/gl/cameras.cpp:645
 msgid "View size"
 msgstr "Anzeigegröße"
 
-#: ../src/wxcomponents.cpp:428 ../src/gui/dialogs/ExportRngDialog.cpp:88
-#: ../src/gui/dialogs/prefDialog.cpp:108
+#: ../src/wx/wxcomponents.cpp:441 ../src/gui/dialogs/ExportRngDialog.cpp:88
+#: ../src/gui/dialogs/prefDialog.cpp:110
 msgid "Param"
 msgstr "Param."
 
-#: ../src/wxcomponents.cpp:429 ../src/gui/dialogs/ExportRngDialog.cpp:89
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1109
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1134
-#: ../src/gui/dialogs/prefDialog.cpp:109 ../src/gui/mainFrame.cpp:5489
-#: ../src/gui/mainFrame.cpp:5494 ../src/backend/filters/dataLoad.cpp:486
+#: ../src/wx/wxcomponents.cpp:442 ../src/gui/dialogs/ExportRngDialog.cpp:89
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:109
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1186
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1211
+#: ../src/gui/dialogs/prefDialog.cpp:111 ../src/gui/mainFrame.cpp:5849
+#: ../src/gui/mainFrame.cpp:5854 ../src/backend/filters/dataLoad.cpp:575
 msgid "Value"
 msgstr "Wert"
 
-#: ../src/wxcomponents.cpp:641
+#: ../src/wx/wxcomponents.cpp:655
 msgid "Save Data..."
 msgstr "Datei speichern..."
 
-#: ../src/wxcomponents.cpp:642
+#: ../src/wx/wxcomponents.cpp:656
 msgid "Text File (*.txt)|*.txt|All Files (*)|*"
 msgstr "Text Datei (*.txt)|*.txt|Alle Dateien (*)|*"
 
-#: ../src/wxcomponents.cpp:654
+#: ../src/wx/wxcomponents.cpp:668
 msgid "Error saving file. Check output dir is writable."
 msgstr ""
 "Fehler beim Schreiben der Datei. Stellen Sie sicher, dass das "
 "Zielverzeichnis nicht schreibgeschüzt ist."
 
-#: ../src/wxcomponents.cpp:654 ../src/gui/dialogs/ExportRngDialog.cpp:170
-#: ../src/gui/mainFrame.cpp:1371 ../src/gui/mainFrame.cpp:1500
-#: ../src/gui/mainFrame.cpp:1545 ../src/gui/mainFrame.cpp:1628
-#: ../src/gui/mainFrame.cpp:2122 ../src/gui/mainFrame.cpp:2137
-#: ../src/gui/mainFrame.cpp:2230 ../src/gui/mainFrame.cpp:2347
+#: ../src/wx/wxcomponents.cpp:668 ../src/gui/dialogs/ExportRngDialog.cpp:170
+#: ../src/gui/mainFrame.cpp:1422 ../src/gui/mainFrame.cpp:1548
+#: ../src/gui/mainFrame.cpp:1583 ../src/gui/mainFrame.cpp:1659
+#: ../src/gui/mainFrame.cpp:2213 ../src/gui/mainFrame.cpp:2279
+#: ../src/gui/mainFrame.cpp:2371 ../src/gui/mainFrame.cpp:2486
 msgid "Save error"
 msgstr "Fehler speichern"
 
-#: ../src/common/basics.cpp:52 ../src/backend/APT/APTFileIO.cpp:61
+#: ../src/common/basics.cpp:62 ../src/backend/APT/APTFileIO.cpp:65
+#: ../src/backend/APT/APTFileIO.cpp:89
 msgid "Error opening file"
 msgstr "Fehler beim Öffnen der Datei"
 
-#: ../src/common/basics.cpp:53
+#: ../src/common/basics.cpp:63
 msgid "Error whilst reading file contents"
 msgstr "Fehler beim Lesen des Dateiinhaltes"
 
-#: ../src/common/basics.cpp:54 ../src/backend/APT/APTFileIO.cpp:65
+#: ../src/common/basics.cpp:64 ../src/backend/APT/APTFileIO.cpp:69
 msgid "Error interpreting field in file"
 msgstr "Fehler beim Interpretieren eine Feldes in der Datei"
 
-#: ../src/common/basics.cpp:55
+#: ../src/common/basics.cpp:65
 msgid "Inconsistent number of columns found"
 msgstr "Inkonsistente Anzahl an Spalten gefunden"
 
-#: ../src/common/basics.cpp:167
+#: ../src/common/basics.cpp:197
 msgid "in the future?"
 msgstr "in Zukunft?"
 
-#: ../src/common/basics.cpp:218
+#: ../src/common/basics.cpp:248
 msgid "a decade ago"
 msgstr "vor zehn Jahren"
 
-#: ../src/common/basics.cpp:219
+#: ../src/common/basics.cpp:249
 msgid "a year ago"
 msgstr "vor einem Jahr"
 
-#: ../src/common/basics.cpp:220
+#: ../src/common/basics.cpp:250
 msgid "a month ago"
 msgstr "vor einem Monat"
 
-#: ../src/common/basics.cpp:221
+#: ../src/common/basics.cpp:251
 msgid "a week ago"
 msgstr "vor einer Woche"
 
-#: ../src/common/basics.cpp:222
+#: ../src/common/basics.cpp:252
 msgid "a day ago"
 msgstr "gestern"
 
-#: ../src/common/basics.cpp:223
+#: ../src/common/basics.cpp:253
 msgid "an hour ago"
 msgstr "vor einer Stunde"
 
-#: ../src/common/basics.cpp:224
+#: ../src/common/basics.cpp:254
 msgid "45 minutes ago"
 msgstr "vor 45 Minuten"
 
-#: ../src/common/basics.cpp:225
+#: ../src/common/basics.cpp:255
 msgid "30 minutes ago"
 msgstr "vor 30 Minuten"
 
-#: ../src/common/basics.cpp:226
+#: ../src/common/basics.cpp:256
 msgid "20 minutes ago"
 msgstr "vor 20 Minuten"
 
-#: ../src/common/basics.cpp:227
+#: ../src/common/basics.cpp:257
 msgid "15 minutes ago"
 msgstr "vor 15 Minuten"
 
-#: ../src/common/basics.cpp:228
+#: ../src/common/basics.cpp:258
 msgid "10 minutes ago"
 msgstr "vor 10 Minuten"
 
-#: ../src/common/basics.cpp:229
+#: ../src/common/basics.cpp:259
 msgid "5 minutes ago"
 msgstr "vor 5 Minuten"
 
-#: ../src/common/basics.cpp:230
+#: ../src/common/basics.cpp:260
 msgid "a minute ago"
 msgstr "vor einer Minute"
 
-#: ../src/common/basics.cpp:231
+#: ../src/common/basics.cpp:261
 msgid "30 seconds ago"
 msgstr "vor 30 Sekunden"
 
-#: ../src/common/basics.cpp:232
+#: ../src/common/basics.cpp:262
 msgid "10 seconds ago"
 msgstr "vor 10 Sekunden"
 
-#: ../src/common/basics.cpp:233
+#: ../src/common/basics.cpp:263
 msgid "a second ago"
 msgstr "vor einer Sekunde"
 
-#: ../src/common/basics.cpp:238
+#: ../src/common/basics.cpp:268
 msgid "a few decades ago"
 msgstr "vor einigen Dekaden"
 
-#: ../src/common/basics.cpp:239
+#: ../src/common/basics.cpp:269
 msgid "a few years ago"
 msgstr "vor einigen Jahren"
 
-#: ../src/common/basics.cpp:240
+#: ../src/common/basics.cpp:270
 msgid "a few months ago"
 msgstr "vor einigen Monaten"
 
-#: ../src/common/basics.cpp:241
+#: ../src/common/basics.cpp:271
 msgid "a few weeks ago"
 msgstr "vor einigen Wochen"
 
-#: ../src/common/basics.cpp:242
+#: ../src/common/basics.cpp:272
 msgid "a few days ago"
 msgstr "vor einigen Tagen"
 
-#: ../src/common/basics.cpp:243
+#: ../src/common/basics.cpp:273
 msgid "a few hours ago"
 msgstr "vor einigen Stunden"
 
-#: ../src/common/basics.cpp:250
+#: ../src/common/basics.cpp:280
 msgid "a few minutes ago"
 msgstr "vor einigen Minuten"
 
-#: ../src/common/basics.cpp:253
+#: ../src/common/basics.cpp:283
 msgid "a few seconds ago"
 msgstr "vor einigen Sekunden"
 
-#: ../src/common/basics.cpp:280
+#: ../src/common/basics.cpp:310
 msgid "moments ago"
 msgstr "kürzlich"
 
-#: ../src/common/colourmap.cpp:234
+#: ../src/common/colourmap.cpp:242
 msgid "Jet"
 msgstr "Jet"
 
-#: ../src/common/colourmap.cpp:235
+#: ../src/common/colourmap.cpp:243
 msgid "Hot"
 msgstr "Heiss"
 
-#: ../src/common/colourmap.cpp:236
+#: ../src/common/colourmap.cpp:244
 msgid "Cold"
 msgstr "Kalt"
 
-#: ../src/common/colourmap.cpp:237
+#: ../src/common/colourmap.cpp:245
 msgid "Grey"
 msgstr "Grau"
 
-#: ../src/common/colourmap.cpp:238
+#: ../src/common/colourmap.cpp:246
 msgid "Cyclic"
 msgstr "Cyclic"
 
-#: ../src/common/colourmap.cpp:239
+#: ../src/common/colourmap.cpp:247
 msgid "General"
 msgstr "Allgemein"
 
-#: ../src/common/colourmap.cpp:240
+#: ../src/common/colourmap.cpp:248
 msgid "Blue"
 msgstr "Blau"
 
-#: ../src/common/colourmap.cpp:241
+#: ../src/common/colourmap.cpp:249
 msgid "Pseudo-Random"
 msgstr "Pseudo-Random"
 
-#: ../src/gui/glPane.cpp:636
+#: ../src/gui/glPane.cpp:670
 msgid "Use shift/ctrl-space or double tap to alter reset axis"
 msgstr ""
 "Verwenden Sie Shift / ⌘-Leertaste oder doppeltippen, um Achsen "
 "zurückzusetzen oder zu verändern"
 
-#: ../src/gui/glPane.cpp:894
+#: ../src/gui/glPane.cpp:934
 msgid "Image progress"
 msgstr "Bild Fortschritt"
 
-#: ../src/gui/glPane.cpp:895
+#: ../src/gui/glPane.cpp:935
 msgid "Rendering tiles..."
 msgstr "Rendering tiles..."
 
-#: ../src/gui/glPane.cpp:911
+#: ../src/gui/glPane.cpp:969
 msgid "Tile "
 msgstr "Tile "
 
-#: ../src/gui/glPane.cpp:911 ../src/gui/glPane.cpp:1078
-#: ../src/gui/mainFrame.cpp:3975 ../src/gui/mainFrame.cpp:3979
-#: ../src/gui/mainFrame.cpp:3992
+#: ../src/gui/glPane.cpp:969 ../src/gui/glPane.cpp:1080
+#: ../src/gui/mainFrame.cpp:4279 ../src/gui/mainFrame.cpp:4283
+#: ../src/gui/mainFrame.cpp:4296 ../src/backend/filters/dataLoad.cpp:311
 msgid " of "
 msgstr " von "
 
-#: ../src/gui/glPane.cpp:1044
+#: ../src/gui/glPane.cpp:1041
 msgid "Animation progress"
 msgstr "Animation-Fortschritt"
 
-#: ../src/gui/glPane.cpp:1045
+#: ../src/gui/glPane.cpp:1042
 msgid "Rendering sequence..."
 msgstr "Renderreihenfolge..."
 
-#: ../src/gui/glPane.cpp:1078
+#: ../src/gui/glPane.cpp:1080
 msgid "Saving Image "
 msgstr "Speichere Bild "
 
@@ -309,7 +311,8 @@ msgid "Ions"
 msgstr "Ionen"
 
 #: ../src/gui/dialogs/ExportRngDialog.cpp:55
-#: ../src/backend/filters/rangeFile.cpp:721
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1606
+#: ../src/backend/filters/rangeFile.cpp:729
 msgid "Ranges"
 msgstr "Ranges"
 
@@ -325,7 +328,8 @@ msgstr "Ionenname"
 msgid "Num Ranges"
 msgstr "Num Ranges"
 
-#: ../src/gui/dialogs/ExportRngDialog.cpp:116 ../src/backend/filter.cpp:43
+#: ../src/gui/dialogs/ExportRngDialog.cpp:116
+#: ../src/gui/dialogs/rangeEditDialog.cpp:710 ../src/backend/filter.cpp:43
 msgid "Ion"
 msgstr "Ion"
 
@@ -337,7 +341,7 @@ msgstr "Range Anfang"
 msgid "Range end"
 msgstr "Range Ende"
 
-#: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2173
+#: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2315
 msgid "Save pos..."
 msgstr "pos speichern..."
 
@@ -345,10 +349,10 @@ msgstr "pos speichern..."
 msgid "ORNL format RNG (*.rng)|*.rng|All Files (*)|*"
 msgstr "ORNL Format RNG (*.rng)|*.rng|Alle Dateien (*)|*"
 
-#: ../src/gui/dialogs/ExportRngDialog.cpp:167 ../src/gui/mainFrame.cpp:1371
-#: ../src/gui/mainFrame.cpp:1546 ../src/gui/mainFrame.cpp:1628
-#: ../src/gui/mainFrame.cpp:2123 ../src/gui/mainFrame.cpp:2231
-#: ../src/gui/mainFrame.cpp:2348
+#: ../src/gui/dialogs/ExportRngDialog.cpp:167 ../src/gui/mainFrame.cpp:1422
+#: ../src/gui/mainFrame.cpp:1584 ../src/gui/mainFrame.cpp:1659
+#: ../src/gui/mainFrame.cpp:2214 ../src/gui/mainFrame.cpp:2372
+#: ../src/gui/mainFrame.cpp:2487
 msgid "Unable to save. Check output destination can be written to."
 msgstr ""
 "Speichern nicht möglich. Bitte überprüfen Sie ob der Ausgabepfad "
@@ -366,6 +370,97 @@ msgstr "Liste der Rangedateien im Filterbaum"
 msgid "Detailed view of selected range"
 msgstr "Detailierte Ansicht des ausgewählten Range"
 
+#: ../src/gui/dialogs/rangeEditDialog.cpp:218
+msgid "Show Overlays"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:243
+msgid "e.g. H2O"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:575
+#: ../src/gui/dialogs/rangeEditDialog.cpp:709 ../src/gui/mainFrame.cpp:6061
+#: ../src/backend/filter.cpp:44
+msgid "Plot"
+msgstr "Plot"
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:576
+msgid "Short Name"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:577
+msgid "Long Name"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:578
+#: ../src/backend/filters/voxelise.cpp:1022
+#: ../src/backend/filters/compositionProfile.cpp:1156
+#: ../src/backend/filters/annotation.cpp:903
+#: ../src/backend/filters/spectrumPlot.cpp:472
+msgid "Colour"
+msgstr "Farbe"
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:711
+#: ../src/backend/filters/annotation.cpp:606
+#: ../src/backend/filters/annotation.cpp:645
+#: ../src/backend/filters/annotation.cpp:812
+msgid "Start"
+msgstr "Anfang"
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:712
+#: ../src/backend/filters/annotation.cpp:614
+#: ../src/backend/filters/annotation.cpp:654
+#: ../src/backend/filters/annotation.cpp:820
+msgid "End"
+msgstr "Ende"
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1275
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1278
+msgid "Range or ion?"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1276
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1279
+msgid "Select type to add"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1561
+msgid "Range Editor"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1565
+msgid "Enable or disable all overlays"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1566
+msgid "Entered overlays, use delete to remove"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1567
+msgid "Available plots for ranging"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1568
+msgid "Enter species to display as overlay, e.g. SiO2"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1569
+msgid "Editable ranges"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1570
+msgid "Editable ions"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1605
+#: ../src/gui/dialogs/animateFilterDialog.cpp:172
+msgid "Plots"
+msgstr ""
+
+#: ../src/gui/dialogs/rangeEditDialog.cpp:1607
+msgid "Overlay"
+msgstr ""
+
 #: ../src/gui/dialogs/autosaveDialog.cpp:39
 msgid "Remove &All"
 msgstr ""
@@ -444,57 +539,57 @@ msgstr ""
 msgid "From Table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:108
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354
 #: ../src/gui/dialogs/animateFilterDialog.cpp:191
 msgid "Frame"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:244
 msgid "Select text file..."
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:245
 msgid "Text files (*.txt)|*.txt;|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346
 msgid "String Keyframes"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348
 msgid "Frame at which to start string sequence"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:349
 msgid "Frame offset for data start"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350
 msgid "File to use as string data source, one value per row"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:351
 msgid "Select file to use as data source"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352
 msgid "Use table below for data source"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:358
 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:359
 msgid "Remove selected strings from table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:360
 msgid "Abort value selection and return to previous window"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357
+#: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:361
 msgid "Accept data values"
 msgstr ""
 
@@ -515,12 +610,12 @@ msgid "Ramp"
 msgstr ""
 
 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1115
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1192
 msgid "Start Frame"
 msgstr ""
 
 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:66
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1116
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1193
 msgid "End Frame"
 msgstr ""
 
@@ -540,15 +635,15 @@ msgstr ""
 msgid "endColour"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:235
+#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:237
 msgid "Key Frame : Colour"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:237
+#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:239
 msgid "Colour at the start of the transtition"
 msgstr ""
 
-#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:238
+#: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:240
 msgid "Colour at end of transition"
 msgstr ""
 
@@ -593,7 +688,7 @@ msgid "3D Images"
 msgstr ""
 
 #: ../src/gui/dialogs/animateFilterDialog.cpp:166
-msgid "File Prefix: "
+msgid "File Suffix: "
 msgstr ""
 
 #: ../src/gui/dialogs/animateFilterDialog.cpp:168
@@ -608,10 +703,6 @@ msgstr ""
 msgid "Point data"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:172
-msgid "Plots"
-msgstr ""
-
 #: ../src/gui/dialogs/animateFilterDialog.cpp:173
 msgid "Voxel data"
 msgstr ""
@@ -624,159 +715,156 @@ msgstr ""
 msgid "Format"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:638
+#: ../src/gui/dialogs/animateFilterDialog.cpp:672
 msgid "transition frame"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:638
-#: ../src/gui/mainFrame.cpp:1601
+#: ../src/gui/dialogs/animateFilterDialog.cpp:672
+#: ../src/gui/mainFrame.cpp:1636
 msgid "Frame count"
 msgstr "Bildanzahl"
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:710
+#: ../src/gui/dialogs/animateFilterDialog.cpp:744
 msgid "Key frame : Colour"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:763
+#: ../src/gui/dialogs/animateFilterDialog.cpp:797
 msgid "File existed, but was unable to read or interpret file contents."
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:764
+#: ../src/gui/dialogs/animateFilterDialog.cpp:798
 msgid "String load failed"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:785
+#: ../src/gui/dialogs/animateFilterDialog.cpp:819
 msgid "Keyframe : decimal"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:794
+#: ../src/gui/dialogs/animateFilterDialog.cpp:828
 msgid "Keyframe : integer"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:803
+#: ../src/gui/dialogs/animateFilterDialog.cpp:837
 msgid "Keyframe : 3D Point"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:929
+#: ../src/gui/dialogs/animateFilterDialog.cpp:962
 msgid "Select or create new folder"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1105
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1182
 msgid "Export Animation"
 msgstr "Animation exportieren"
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1106
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1183
 msgid "Select filter"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1108
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1113
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1133
-#: ../src/gui/mainFrame.cpp:5488 ../src/gui/mainFrame.cpp:5493
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1185
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1190
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1210
+#: ../src/gui/mainFrame.cpp:5848 ../src/gui/mainFrame.cpp:5853
 msgid "Property"
 msgstr "Eigenschaft"
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1110
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1187
 msgid "Select property"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1112
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1132
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1189
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1209
 msgid "Filter"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1114
-#: ../src/backend/filters/transform.cpp:1176
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1191
+#: ../src/backend/filters/transform.cpp:1182
 #: ../src/backend/filters/annotation.cpp:547
 msgid "Mode"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1117
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1194
 msgid "Keyframe table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1118
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1195
 msgid "Remove the selected keyframe from the table"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1119
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1196
 msgid "Enter where the animation frames will be exported to"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1120
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1197
 msgid "Browse to directory where the animation frames will be exported to"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1122
-msgid "Enter a descriptive name for output files"
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1199
+msgid ""
+"Title for files, result will be saved as #-name.png, where # is image number."
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1123
-msgid "Enter the target resoltuion (image size)"
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1200
+msgid "Target resolution (image size)"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1125
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1202
 msgid "Select frame for property display"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1126
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1203
 msgid "Enter frame number to change frame (eg 1/20)"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1127
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1204
 msgid "Save point data (POS files) in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1128
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1205
 msgid "Save plots (as text files) in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1129
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1206
 msgid "Save voxel data (raw files) in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1130
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1207
 msgid "Save range files  in output folder?"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1135
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1212
 msgid "Animation parameters for current frame"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1136
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1213
 msgid "Abort animation"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1137
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1214
 msgid "Run Animation"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1208
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1285
 msgid "Filter view"
 msgstr ""
 
-#: ../src/gui/dialogs/animateFilterDialog.cpp:1209
+#: ../src/gui/dialogs/animateFilterDialog.cpp:1286
 msgid "Frame view"
 msgstr ""
 
-#: ../src/gui/dialogs/resolutionDialog.cpp:46
+#: ../src/gui/dialogs/resolutionDialog.cpp:45
 msgid "Width :"
 msgstr ""
 
-#: ../src/gui/dialogs/resolutionDialog.cpp:48
+#: ../src/gui/dialogs/resolutionDialog.cpp:47
 msgid "Height :"
 msgstr ""
 
 #: ../src/gui/dialogs/resolutionDialog.cpp:50
-msgid "Lock Aspect"
-msgstr ""
-
-#: ../src/gui/dialogs/resolutionDialog.cpp:54
-#: ../src/gui/dialogs/prefDialog.cpp:82
+#: ../src/gui/dialogs/prefDialog.cpp:83
 msgid "Reset"
 msgstr "Zurücksetzen"
 
-#: ../src/gui/dialogs/resolutionDialog.cpp:462
+#: ../src/gui/dialogs/resolutionDialog.cpp:350
 msgid "Resolution Selection"
 msgstr ""
 
@@ -785,7 +873,7 @@ msgid "Export:"
 msgstr "Exportieren:"
 
 #: ../src/gui/dialogs/ExportPos.cpp:76
-#: ../src/backend/filters/boundingBox.cpp:528
+#: ../src/backend/filters/boundingBox.cpp:520
 msgid "Visible"
 msgstr "Sichtbar"
 
@@ -806,10 +894,12 @@ msgid "Index"
 msgstr "Index"
 
 #: ../src/gui/dialogs/ExportPos.cpp:111 ../src/gui/dialogs/ExportPos.cpp:114
-#: ../src/backend/filters/compositionProfile.cpp:466
-#: ../src/backend/filters/spatialAnalysis.cpp:1667
-#: ../src/backend/filters/spatialAnalysis.cpp:1736
-#: ../src/backend/filters/spatialAnalysis.cpp:2670
+#: ../src/backend/filters/compositionProfile.cpp:549
+#: ../src/backend/filters/spatialAnalysis.cpp:1953
+#: ../src/backend/filters/spatialAnalysis.cpp:2022
+#: ../src/backend/filters/spatialAnalysis.cpp:3002
+#: ../src/backend/filters/spatialAnalysis.cpp:3221
+#: ../src/backend/filters/spatialAnalysis.cpp:3290
 #: ../src/backend/filters/spectrumPlot.cpp:240
 msgid "Count"
 msgstr "Anzahl"
@@ -834,105 +924,113 @@ msgstr ""
 msgid "Add selected data from currently selected filter"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:66 ../src/gui/dialogs/prefDialog.cpp:541
-msgid "Preferences"
-msgstr "Voreinstellungen"
+#: ../src/gui/dialogs/prefDialog.cpp:72
+msgid "Panel Display"
+msgstr "Panel Display"
 
-#: ../src/gui/dialogs/prefDialog.cpp:73
+#: ../src/gui/dialogs/prefDialog.cpp:74
 msgid "Online Updates"
 msgstr "Online Updates"
 
-#: ../src/gui/dialogs/prefDialog.cpp:75
-msgid "Panel Display"
-msgstr "Panel Display"
+#: ../src/gui/dialogs/prefDialog.cpp:76 ../src/gui/dialogs/prefDialog.cpp:654
+msgid "Startup"
+msgstr "Startup"
 
-#: ../src/gui/dialogs/prefDialog.cpp:76
+#: ../src/gui/dialogs/prefDialog.cpp:77
 msgid "Camera Speed"
 msgstr "Kamerageschwindigkeit"
 
-#: ../src/gui/dialogs/prefDialog.cpp:77
+#: ../src/gui/dialogs/prefDialog.cpp:78
 msgid "Filter Defaults"
 msgstr "Filtervoreinstellungen"
 
-#: ../src/gui/dialogs/prefDialog.cpp:78
+#: ../src/gui/dialogs/prefDialog.cpp:79
 msgid "Available Filters"
 msgstr "Verfügbare Filter"
 
-#: ../src/gui/dialogs/prefDialog.cpp:81
+#: ../src/gui/dialogs/prefDialog.cpp:82
 msgid "Reset All"
 msgstr "Alle zurücksetzen"
 
-#: ../src/gui/dialogs/prefDialog.cpp:84
+#: ../src/gui/dialogs/prefDialog.cpp:85
 msgid "Show all panels"
 msgstr "Zeige alle Fenster"
 
-#: ../src/gui/dialogs/prefDialog.cpp:85
+#: ../src/gui/dialogs/prefDialog.cpp:86
 msgid "Remember last"
 msgstr "Zuletzt verwendet"
 
-#: ../src/gui/dialogs/prefDialog.cpp:86
+#: ../src/gui/dialogs/prefDialog.cpp:87
 msgid "Show Selected"
 msgstr "Zeige Auswahl"
 
-#: ../src/gui/dialogs/prefDialog.cpp:89
+#: ../src/gui/dialogs/prefDialog.cpp:90
 msgid "Control Pane"
 msgstr "Kontrollfenster"
 
-#: ../src/gui/dialogs/prefDialog.cpp:90
+#: ../src/gui/dialogs/prefDialog.cpp:91
 msgid "Raw Data Panel"
 msgstr "Rohdatenfenster"
 
-#: ../src/gui/dialogs/prefDialog.cpp:91 ../src/gui/mainFrame.cpp:639
+#: ../src/gui/dialogs/prefDialog.cpp:92 ../src/gui/mainFrame.cpp:652
 msgid "Plot List"
 msgstr "Plotliste"
 
-#: ../src/gui/dialogs/prefDialog.cpp:93
+#: ../src/gui/dialogs/prefDialog.cpp:94
 msgid "Periodically notify about available updates"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:95
+#: ../src/gui/dialogs/prefDialog.cpp:96
+msgid "Prefer orthographic at startup"
+msgstr ""
+
+#: ../src/gui/dialogs/prefDialog.cpp:97
 msgid "Move Rate"
 msgstr "Bewegungsgeschwindigkeit"
 
-#: ../src/gui/dialogs/prefDialog.cpp:96 ../src/gui/dialogs/prefDialog.cpp:100
+#: ../src/gui/dialogs/prefDialog.cpp:98 ../src/gui/dialogs/prefDialog.cpp:102
 msgid "(slow)"
 msgstr "(langsam)"
 
-#: ../src/gui/dialogs/prefDialog.cpp:98 ../src/gui/dialogs/prefDialog.cpp:102
+#: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104
 msgid "(fast)"
 msgstr "(schnell)"
 
-#: ../src/gui/dialogs/prefDialog.cpp:99
+#: ../src/gui/dialogs/prefDialog.cpp:101
 msgid "Zoom Rate"
 msgstr "Zoomgeschwindigkeit"
 
-#: ../src/gui/dialogs/prefDialog.cpp:449
+#: ../src/gui/dialogs/prefDialog.cpp:456
 msgid "Notice"
 msgstr "Notiz"
 
-#: ../src/gui/dialogs/prefDialog.cpp:452
+#: ../src/gui/dialogs/prefDialog.cpp:459
 msgid "For security reasons, defaults are not modifiable for this filter"
 msgstr ""
 "Aus Sicherheitsgründen können die Voreinstellungen für diesen Filter nicht "
 "geändert werden."
 
-#: ../src/gui/dialogs/prefDialog.cpp:482
+#: ../src/gui/dialogs/prefDialog.cpp:496
 msgid "Show all panels when starting program"
 msgstr "Zeige alle Fenster beim Programmstart"
 
-#: ../src/gui/dialogs/prefDialog.cpp:485
+#: ../src/gui/dialogs/prefDialog.cpp:499
 msgid "Show panels visible at last shutdown when starting program"
 msgstr "Beim Programmstart zuletzt eingeschaltete Fenster anzeigen."
 
-#: ../src/gui/dialogs/prefDialog.cpp:492
+#: ../src/gui/dialogs/prefDialog.cpp:506
 msgid "Show selected panels when starting program"
 msgstr "Zeige ausgewählte Fenster beim Programmstart"
 
-#: ../src/gui/dialogs/prefDialog.cpp:543
+#: ../src/gui/dialogs/prefDialog.cpp:555
+msgid "Preferences"
+msgstr "Voreinstellungen"
+
+#: ../src/gui/dialogs/prefDialog.cpp:557
 msgid "Set the method of panel layout when starting the program"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:546
+#: ../src/gui/dialogs/prefDialog.cpp:560
 msgid ""
 "Lets the program check the internet to see if updates to the program version "
 "are available, then notifies you about updates now and again."
@@ -940,105 +1038,107 @@ msgstr ""
 "Lässt das Programm via Internet überprüfen ob Updates für diese "
 "Programmversion verfügbar sind. Danach informiert es über die neuen Updates."
 
-#: ../src/gui/dialogs/prefDialog.cpp:548
+#: ../src/gui/dialogs/prefDialog.cpp:562
+msgid ""
+"By default, use an orthographic camera at startup. State files will override "
+"this preference."
+msgstr ""
+
+#: ../src/gui/dialogs/prefDialog.cpp:563
 msgid "Camera translation, orbit and swivel rates. "
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:549
+#: ../src/gui/dialogs/prefDialog.cpp:564
 msgid "Camera zooming rate."
 msgstr "Zoomgeschwindigkeit der Kamera"
 
-#: ../src/gui/dialogs/prefDialog.cpp:551
+#: ../src/gui/dialogs/prefDialog.cpp:566
 msgid "Reset the filter initial values back to program defaults"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:552
+#: ../src/gui/dialogs/prefDialog.cpp:567
 msgid "Reset all filter initial values back to program defaults"
 msgstr ""
 
-#: ../src/gui/dialogs/prefDialog.cpp:614
+#: ../src/gui/dialogs/prefDialog.cpp:653
 msgid "Pref"
 msgstr "Pref"
 
-#: ../src/gui/dialogs/prefDialog.cpp:615
-msgid "Startup"
-msgstr "Startup"
-
-#: ../src/gui/dialogs/prefDialog.cpp:616
+#: ../src/gui/dialogs/prefDialog.cpp:655
 msgid "Camera"
 msgstr "Kamera"
 
-#: ../src/gui/mainFrame.cpp:89
+#: ../src/gui/mainFrame.cpp:91
 msgid "New camera name..."
 msgstr "Neuer Kameraname..."
 
-#: ../src/gui/mainFrame.cpp:90
+#: ../src/gui/mainFrame.cpp:92
 msgid "New stash name...."
 msgstr "Neuer Stashname..."
 
-#: ../src/gui/mainFrame.cpp:106 ../src/backend/filters/annotation.cpp:561
+#: ../src/gui/mainFrame.cpp:108 ../src/backend/filters/annotation.cpp:561
 #: ../src/backend/filters/annotation.cpp:663
 #: ../src/backend/filters/annotation.h:96
 msgid "Annotation"
 msgstr "Kommentar"
 
-#: ../src/gui/mainFrame.cpp:107
+#: ../src/gui/mainFrame.cpp:109
 msgid "Bounding Box"
 msgstr "Begrenzungs-Box"
 
-#: ../src/gui/mainFrame.cpp:108 ../src/backend/filters/ionClip.h:66
+#: ../src/gui/mainFrame.cpp:110 ../src/backend/filters/ionClip.h:66
 msgid "Clipping"
 msgstr "Zuschneiden"
 
-#: ../src/gui/mainFrame.cpp:109 ../src/backend/filters/clusterAnalysis.h:132
+#: ../src/gui/mainFrame.cpp:111 ../src/backend/filters/clusterAnalysis.h:140
 msgid "Cluster Analysis"
 msgstr "Clusteranalyse"
 
-#: ../src/gui/mainFrame.cpp:110
+#: ../src/gui/mainFrame.cpp:112
 msgid "Compos. Profiles"
 msgstr "Konz.Profil"
 
-#: ../src/gui/mainFrame.cpp:111
+#: ../src/gui/mainFrame.cpp:113
 msgid "Downsampling"
 msgstr "Datenreduktion"
 
-#: ../src/gui/mainFrame.cpp:112
+#: ../src/gui/mainFrame.cpp:114
 msgid "Extern. Prog."
 msgstr "Ext. Progr."
 
-#: ../src/gui/mainFrame.cpp:113
+#: ../src/gui/mainFrame.cpp:115
 msgid "Ion Colour"
 msgstr "Ionenfarbe"
 
-#: ../src/gui/mainFrame.cpp:114
+#: ../src/gui/mainFrame.cpp:116
 msgid "Ion Info"
 msgstr "Ion Info"
 
-#: ../src/gui/mainFrame.cpp:115
+#: ../src/gui/mainFrame.cpp:117
 msgid "Ion Transform"
 msgstr "Ionentransform."
 
-#: ../src/gui/mainFrame.cpp:116 ../src/backend/filters/spectrumPlot.h:53
+#: ../src/gui/mainFrame.cpp:118 ../src/backend/filters/spectrumPlot.h:53
 msgid "Spectrum"
 msgstr "Spektrum"
 
-#: ../src/gui/mainFrame.cpp:117
+#: ../src/gui/mainFrame.cpp:119
 msgid "Range File"
 msgstr "Rangedatei"
 
-#: ../src/gui/mainFrame.cpp:118 ../src/backend/filters/spatialAnalysis.h:142
+#: ../src/gui/mainFrame.cpp:120 ../src/backend/filters/spatialAnalysis.h:172
 msgid "Spat. Analysis"
 msgstr "Räumliche Analyse"
 
-#: ../src/gui/mainFrame.cpp:119 ../src/backend/filters/voxelise.h:121
+#: ../src/gui/mainFrame.cpp:121 ../src/backend/filters/voxelise.h:121
 msgid "Voxelisation"
 msgstr "Voxelisation"
 
-#: ../src/gui/mainFrame.cpp:415
+#: ../src/gui/mainFrame.cpp:421
 msgid "OpenGL Failed"
 msgstr "OpenGL fehlgeschlagen"
 
-#: ../src/gui/mainFrame.cpp:416 ../src/gui/mainFrame.cpp:418
+#: ../src/gui/mainFrame.cpp:422 ../src/gui/mainFrame.cpp:424
 msgid ""
 "Unable to initialise the openGL (3D) panel. Program cannot start. Please "
 "check your video drivers."
@@ -1046,419 +1146,445 @@ msgstr ""
 "Kann das OpenGL (3D)-Panel nicht initialisieren. Das Programm kann nicht "
 "gestartet werden. Bitte überprüfen Sie Ihren Video-Treiber."
 
-#: ../src/gui/mainFrame.cpp:438
+#: ../src/gui/mainFrame.cpp:444
 msgid "&Open...\tCtrl+O"
 msgstr "&Öffnen...\tCtrl+O"
 
-#: ../src/gui/mainFrame.cpp:438
+#: ../src/gui/mainFrame.cpp:444
 msgid "Open state file"
 msgstr "Statusdatei öffnen"
 
-#: ../src/gui/mainFrame.cpp:439
+#: ../src/gui/mainFrame.cpp:445
 msgid "&Merge...\tCtrl+Shift+O"
 msgstr "&Zusammenführen...\tCtrl+Shift+O"
 
-#: ../src/gui/mainFrame.cpp:439
+#: ../src/gui/mainFrame.cpp:445
 msgid "Merge other file"
 msgstr "Merge other file"
 
-#: ../src/gui/mainFrame.cpp:443
+#: ../src/gui/mainFrame.cpp:449
 msgid "&Recent"
 msgstr "&Letzte"
 
-#: ../src/gui/mainFrame.cpp:444
+#: ../src/gui/mainFrame.cpp:450
 msgid "&Save\tCtrl+S"
 msgstr "&Speichern\tCtrl+S"
 
-#: ../src/gui/mainFrame.cpp:444
+#: ../src/gui/mainFrame.cpp:450
 msgid "Save state to file"
 msgstr "Status in Datei speichern"
 
-#: ../src/gui/mainFrame.cpp:446
+#: ../src/gui/mainFrame.cpp:452
 msgid "Save &As...\tCtrl+Shift+S"
 msgstr "Speichern &als...\tCtrl+Shift+S"
 
-#: ../src/gui/mainFrame.cpp:446
+#: ../src/gui/mainFrame.cpp:452
 msgid "Save current state to new file"
 msgstr "Aktuellen Status als neue Datei speichern"
 
-#: ../src/gui/mainFrame.cpp:449
+#: ../src/gui/mainFrame.cpp:455
 msgid "&Plot...\tCtrl+P"
 msgstr "&Plot...\tCtrl+P"
 
-#: ../src/gui/mainFrame.cpp:449
+#: ../src/gui/mainFrame.cpp:455
 msgid "Export Current Plot"
 msgstr "Aktuellen Plot exportieren"
 
-#: ../src/gui/mainFrame.cpp:450
+#: ../src/gui/mainFrame.cpp:456
 msgid "&Image...\tCtrl+I"
 msgstr "&Bild...\tCtrl+I"
 
-#: ../src/gui/mainFrame.cpp:450
+#: ../src/gui/mainFrame.cpp:456
 msgid "Export Current 3D View"
 msgstr "Aktuelle 3D Ansicht exportieren"
 
-#: ../src/gui/mainFrame.cpp:451
+#: ../src/gui/mainFrame.cpp:457
 msgid "Ion&s...\tCtrl+N"
 msgstr "Ion&en...\tCtrl+N"
 
-#: ../src/gui/mainFrame.cpp:451
+#: ../src/gui/mainFrame.cpp:457
 msgid "Export Ion Data"
 msgstr "Ionendaten exportieren"
 
-#: ../src/gui/mainFrame.cpp:452
+#: ../src/gui/mainFrame.cpp:458
 msgid "Ran&ges...\tCtrl+G"
 msgstr "Ran&ges...\tCtrl+G"
 
-#: ../src/gui/mainFrame.cpp:452
+#: ../src/gui/mainFrame.cpp:458
 msgid "Export Range Data"
 msgstr "Rangedaten exportieren"
 
-#: ../src/gui/mainFrame.cpp:453
+#: ../src/gui/mainFrame.cpp:459
 msgid "&Animate Filters...\tCtrl+A"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:453
+#: ../src/gui/mainFrame.cpp:459
 msgid "Export Animated Filter"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:454
+#: ../src/gui/mainFrame.cpp:460
 msgid "Ani&mate Camera...\tCtrl+M"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:454
+#: ../src/gui/mainFrame.cpp:460
 msgid "Export Animated Camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:455
+#: ../src/gui/mainFrame.cpp:461
 msgid "Pac&kage...\tCtrl+K"
 msgstr "Pa&ket...\tCtrl+K"
 
-#: ../src/gui/mainFrame.cpp:455
+#: ../src/gui/mainFrame.cpp:461
 msgid "Export analysis package"
 msgstr "Analysepaket exportieren"
 
-#: ../src/gui/mainFrame.cpp:457
+#: ../src/gui/mainFrame.cpp:463
 msgid "&Export"
 msgstr "&Exportieren"
 
-#: ../src/gui/mainFrame.cpp:460
+#: ../src/gui/mainFrame.cpp:466
 msgid "&Quit\tCtrl+Q"
 msgstr "&Beenden\tCtrl+Q"
 
-#: ../src/gui/mainFrame.cpp:460 ../src/gui/mainFrame.cpp:462
+#: ../src/gui/mainFrame.cpp:466 ../src/gui/mainFrame.cpp:468
 msgid "Exit Program"
 msgstr "Programm beenden"
 
-#: ../src/gui/mainFrame.cpp:462
+#: ../src/gui/mainFrame.cpp:468
 msgid "E&xit"
 msgstr "E&xit"
 
-#: ../src/gui/mainFrame.cpp:464
+#: ../src/gui/mainFrame.cpp:470
 msgid "&File"
 msgstr "&Datei"
 
-#: ../src/gui/mainFrame.cpp:468
+#: ../src/gui/mainFrame.cpp:474
 msgid "&Background Colour...\tCtrl+B"
 msgstr "&Hintergrundfarbe...\tCtrl+B"
 
-#: ../src/gui/mainFrame.cpp:468
+#: ../src/gui/mainFrame.cpp:474
 msgid "Change background colour"
 msgstr "Hintergrundfarbe ändern"
 
-#: ../src/gui/mainFrame.cpp:472
-msgid "&Control Pane\tF3"
-msgstr "&Kontrollfenster\tF3"
+#: ../src/gui/mainFrame.cpp:478
+msgid "&Control Pane\tF2"
+msgstr "&Kontrollfenster\tF2"
 
-#: ../src/gui/mainFrame.cpp:472 ../src/gui/mainFrame.cpp:475
+#: ../src/gui/mainFrame.cpp:478 ../src/gui/mainFrame.cpp:481
 msgid "Toggle left control pane"
 msgstr "Linkes Kontrollfenster ein/aus schalten"
 
-#: ../src/gui/mainFrame.cpp:475
+#: ../src/gui/mainFrame.cpp:481
 msgid "&Control Pane\tAlt+C"
 msgstr "&Kontrollfenster\tAlt+C"
 
-#: ../src/gui/mainFrame.cpp:481
-msgid "&Raw Data Pane\tF4"
-msgstr "&Rohdatenfenster\tF4"
+#: ../src/gui/mainFrame.cpp:487
+msgid "&Raw Data Pane\tF3"
+msgstr "&Rohdatenfenster\tF3"
 
-#: ../src/gui/mainFrame.cpp:481 ../src/gui/mainFrame.cpp:484
+#: ../src/gui/mainFrame.cpp:487 ../src/gui/mainFrame.cpp:490
 msgid "Toggle raw data  pane (bottom)"
 msgstr "Rohdatenfenster (unten)"
 
-#: ../src/gui/mainFrame.cpp:484
+#: ../src/gui/mainFrame.cpp:490
 msgid "&Raw Data Pane\tAlt+R"
 msgstr "&Rohdatenfenster\tAlt+R"
 
-#: ../src/gui/mainFrame.cpp:488
-msgid "&Plot List\tF5"
-msgstr "&Plot Liste\tF5"
+#: ../src/gui/mainFrame.cpp:494
+msgid "&Plot List\tF4"
+msgstr "&Plot Liste\tF4"
 
-#: ../src/gui/mainFrame.cpp:488 ../src/gui/mainFrame.cpp:490
+#: ../src/gui/mainFrame.cpp:494 ../src/gui/mainFrame.cpp:496
 msgid "Toggle plot list"
 msgstr "Plotliste ein/aus schalten"
 
-#: ../src/gui/mainFrame.cpp:490
+#: ../src/gui/mainFrame.cpp:496
 msgid "&Plot List\tAlt+P"
 msgstr "&Plot Liste\tAlt+P"
 
-#: ../src/gui/mainFrame.cpp:496
+#: ../src/gui/mainFrame.cpp:502
 msgid "&Legend\tCtrl+L"
 msgstr "&Legende\tCtrl+L"
 
-#: ../src/gui/mainFrame.cpp:496
+#: ../src/gui/mainFrame.cpp:502
 msgid "Toggle Legend display"
 msgstr "Legende anzeigen ein/aus"
 
-#: ../src/gui/mainFrame.cpp:498
+#: ../src/gui/mainFrame.cpp:504
 msgid "P&lot..."
 msgstr "P&lot..."
 
-#: ../src/gui/mainFrame.cpp:499
+#: ../src/gui/mainFrame.cpp:505
 msgid "&Axis\tCtrl+Shift+I"
 msgstr "&Achsen\tCtrl+Shift+I"
 
-#: ../src/gui/mainFrame.cpp:499
+#: ../src/gui/mainFrame.cpp:505
 msgid "Toggle World Axis display"
 msgstr "Hauptachsen ein/aus schalten"
 
-#: ../src/gui/mainFrame.cpp:504
+#: ../src/gui/mainFrame.cpp:510
 msgid "&Fullscreen mode\tF11"
 msgstr "&Vollbildmodus\tF11"
 
-#: ../src/gui/mainFrame.cpp:504 ../src/gui/mainFrame.cpp:506
+#: ../src/gui/mainFrame.cpp:510 ../src/gui/mainFrame.cpp:512
 msgid "Next fullscreen mode: with toolbars"
 msgstr "Nächster Vollbildmodus: ohne Werkzeugleisten"
 
-#: ../src/gui/mainFrame.cpp:506
+#: ../src/gui/mainFrame.cpp:512
 msgid "&Fullscreen mode\tCtrl+Shift+F"
 msgstr "&Vollbildmodus\tCtrl+Shift+F"
 
-#: ../src/gui/mainFrame.cpp:511
+#: ../src/gui/mainFrame.cpp:517
 msgid "&Undo\tCtrl+Z"
 msgstr "&Zurück\tCtrl+Z"
 
-#: ../src/gui/mainFrame.cpp:513
+#: ../src/gui/mainFrame.cpp:519
 msgid "&Redo\tCtrl+Y"
 msgstr "&Wiederholen\tCtrl+Y"
 
-#: ../src/gui/mainFrame.cpp:516
+#: ../src/gui/mainFrame.cpp:522
+msgid "&Range"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:525
 msgid "&Preferences"
 msgstr "&Voreinstellungen"
 
-#: ../src/gui/mainFrame.cpp:518
+#: ../src/gui/mainFrame.cpp:527
 msgid "&Edit"
 msgstr "&Bearbeiten"
 
-#: ../src/gui/mainFrame.cpp:521
+#: ../src/gui/mainFrame.cpp:530
 msgid "&View"
 msgstr "&Ansicht"
 
-#: ../src/gui/mainFrame.cpp:523
+#: ../src/gui/mainFrame.cpp:532
 msgid "&Help...\tCtrl+H"
 msgstr "&Hilfe...\tCtrl+H"
 
-#: ../src/gui/mainFrame.cpp:523
+#: ../src/gui/mainFrame.cpp:532
 msgid "Show help files and documentation"
 msgstr "Hilfedateien und Dokumentation anzeigen"
 
-#: ../src/gui/mainFrame.cpp:524
+#: ../src/gui/mainFrame.cpp:533
 msgid "&Contact..."
 msgstr "&Kontakt..."
 
-#: ../src/gui/mainFrame.cpp:524
+#: ../src/gui/mainFrame.cpp:533
 msgid "Open contact page"
 msgstr "Kontaktseite öffnen"
 
-#: ../src/gui/mainFrame.cpp:526
+#: ../src/gui/mainFrame.cpp:535
 msgid "&About..."
 msgstr "Über 3Depict..."
 
-#: ../src/gui/mainFrame.cpp:526
+#: ../src/gui/mainFrame.cpp:535
 msgid "Information about this program"
 msgstr "Informationen zu diesem Programm"
 
-#: ../src/gui/mainFrame.cpp:527
+#: ../src/gui/mainFrame.cpp:536
 msgid "&Help"
 msgstr "&Hilfe"
 
-#: ../src/gui/mainFrame.cpp:529
+#: ../src/gui/mainFrame.cpp:538
 msgid "Stashed Filters"
 msgstr "Zwischengelagerte Filter"
 
-#: ../src/gui/mainFrame.cpp:534
-msgid "Data Filtering"
-msgstr "Daten filtern"
+#: ../src/gui/mainFrame.cpp:543
+msgid "New Filters"
+msgstr ""
 
-#: ../src/gui/mainFrame.cpp:558
+#: ../src/gui/mainFrame.cpp:571
 msgid "Last Outputs"
 msgstr "Letzte Ausgabe"
 
-#: ../src/gui/mainFrame.cpp:560
+#: ../src/gui/mainFrame.cpp:573
 msgid "Auto Refresh"
 msgstr ""
 "Autom.\n"
 "aktualisieren"
 
-#: ../src/gui/mainFrame.cpp:566
+#: ../src/gui/mainFrame.cpp:579
 msgid "Filter settings"
 msgstr "Filtereinstellungen"
 
-#: ../src/gui/mainFrame.cpp:568
+#: ../src/gui/mainFrame.cpp:581
 msgid "Camera Name"
 msgstr "Kameraname"
 
-#: ../src/gui/mainFrame.cpp:574
+#: ../src/gui/mainFrame.cpp:587
 msgid "3D Post-processing"
 msgstr "3D Nachbearbeitung"
 
-#: ../src/gui/mainFrame.cpp:576
+#: ../src/gui/mainFrame.cpp:589
 msgid "Enable Cropping"
 msgstr "Zuschneiden aktivieren"
 
-#: ../src/gui/mainFrame.cpp:578 ../src/gui/mainFrame.cpp:589
+#: ../src/gui/mainFrame.cpp:591 ../src/gui/mainFrame.cpp:602
 msgid "x-y"
 msgstr "x-y"
 
-#: ../src/gui/mainFrame.cpp:579 ../src/gui/mainFrame.cpp:590
+#: ../src/gui/mainFrame.cpp:592 ../src/gui/mainFrame.cpp:603
 msgid "x-z"
 msgstr "x-z"
 
-#: ../src/gui/mainFrame.cpp:580 ../src/gui/mainFrame.cpp:591
+#: ../src/gui/mainFrame.cpp:593 ../src/gui/mainFrame.cpp:604
 msgid "y-x"
 msgstr "y-x"
 
-#: ../src/gui/mainFrame.cpp:581 ../src/gui/mainFrame.cpp:592
+#: ../src/gui/mainFrame.cpp:594 ../src/gui/mainFrame.cpp:605
 msgid "y-z"
 msgstr "y-z"
 
-#: ../src/gui/mainFrame.cpp:582 ../src/gui/mainFrame.cpp:593
+#: ../src/gui/mainFrame.cpp:595 ../src/gui/mainFrame.cpp:606
 msgid "z-x"
 msgstr "z-x"
 
-#: ../src/gui/mainFrame.cpp:583 ../src/gui/mainFrame.cpp:594
+#: ../src/gui/mainFrame.cpp:596 ../src/gui/mainFrame.cpp:607
 msgid "z-y"
 msgstr "z-y"
 
-#: ../src/gui/mainFrame.cpp:598
+#: ../src/gui/mainFrame.cpp:611
 msgid "Use camera coordinates"
 msgstr "Verwende Kamerakoordinaten"
 
-#: ../src/gui/mainFrame.cpp:599
+#: ../src/gui/mainFrame.cpp:612
 msgid "dX"
 msgstr "dX"
 
-#: ../src/gui/mainFrame.cpp:601
+#: ../src/gui/mainFrame.cpp:614
 msgid "dY"
 msgstr "dY"
 
-#: ../src/gui/mainFrame.cpp:603
+#: ../src/gui/mainFrame.cpp:616
 msgid "dZ"
 msgstr "dZ"
 
-#: ../src/gui/mainFrame.cpp:605
+#: ../src/gui/mainFrame.cpp:618
 msgid "Enable Anaglyphic Stereo"
 msgstr "Anaglyphic Stereo aktivieren"
 
-#: ../src/gui/mainFrame.cpp:606
+#: ../src/gui/mainFrame.cpp:619
 msgid "Flip Channels"
 msgstr "Kanäle tauschen"
 
-#: ../src/gui/mainFrame.cpp:607
+#: ../src/gui/mainFrame.cpp:620
 msgid "Anaglyph Mode"
 msgstr "Anaglyphmodus"
 
-#: ../src/gui/mainFrame.cpp:609
+#: ../src/gui/mainFrame.cpp:622
 msgid "Red-Blue"
 msgstr "Rot-Blau"
 
-#: ../src/gui/mainFrame.cpp:610
+#: ../src/gui/mainFrame.cpp:623
 msgid "Red-Green"
 msgstr "Rot-Grün"
 
-#: ../src/gui/mainFrame.cpp:611
+#: ../src/gui/mainFrame.cpp:624
 msgid "Red-Cyan"
 msgstr "Rot-Zyan"
 
-#: ../src/gui/mainFrame.cpp:612
+#: ../src/gui/mainFrame.cpp:625
 msgid "Green-Magenta"
 msgstr "Grün-Magenta"
 
-#: ../src/gui/mainFrame.cpp:616
+#: ../src/gui/mainFrame.cpp:629
 msgid "Baseline Separation"
 msgstr "Basislinienabstand"
 
-#: ../src/gui/mainFrame.cpp:619
+#: ../src/gui/mainFrame.cpp:631 ../src/backend/filters/voxelise.cpp:981
+#: ../src/backend/filters/voxelise.cpp:1037
+#: ../src/backend/filters/compositionProfile.cpp:1165
+#: ../src/backend/filters/boundingBox.cpp:648
+#: ../src/backend/filters/dataLoad.cpp:660
+msgid "Appearance"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:632
 msgid "Smooth && translucent objects"
 msgstr "Glatte && durchsichtige Objekte"
 
-#: ../src/gui/mainFrame.cpp:621
+#: ../src/gui/mainFrame.cpp:634
 msgid "3D lighting"
 msgstr "3D Beleuchtung"
 
-#: ../src/gui/mainFrame.cpp:624
+#: ../src/gui/mainFrame.cpp:637
 msgid "Performance"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:625
+#: ../src/gui/mainFrame.cpp:638
 msgid "Fast and weak randomisation."
 msgstr "Schnelle aber schwache Randomisierung"
 
-#: ../src/gui/mainFrame.cpp:627
+#: ../src/gui/mainFrame.cpp:640
 msgid "Limit Output Pts"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:633
+#: ../src/gui/mainFrame.cpp:646
 msgid "Filter caching"
 msgstr "Filter zwischenspeichern"
 
-#: ../src/gui/mainFrame.cpp:635
+#: ../src/gui/mainFrame.cpp:648
 msgid "Max. Ram usage (%)"
 msgstr "Max. RAM-Nutzung (%)"
 
-#: ../src/gui/mainFrame.cpp:692
+#: ../src/gui/mainFrame.cpp:705
 msgid "Type"
 msgstr "Type"
 
-#: ../src/gui/mainFrame.cpp:693
+#: ../src/gui/mainFrame.cpp:706
 msgid "Num"
 msgstr "Num"
 
-#: ../src/gui/mainFrame.cpp:704
+#: ../src/gui/mainFrame.cpp:721
 msgid "Warning: Your configuration file appears to be invalid:\n"
 msgstr "Warnung: Ihre Konfigurationsdatei scheint ungültig zu sein.\n"
 
-#: ../src/gui/mainFrame.cpp:705
+#: ../src/gui/mainFrame.cpp:722
 msgid "\tConfig Load: "
 msgstr "\tConfig Load: "
 
-#: ../src/gui/mainFrame.cpp:940
+#: ../src/gui/mainFrame.cpp:974
 msgid "Current state has not been saved, would you like to save it now?"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:941
+#: ../src/gui/mainFrame.cpp:975
 msgid "State changed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:963 ../src/gui/mainFrame.cpp:1019
-msgid "Select Data or State File..."
-msgstr "Daten oder Statusdatei auswählen..."
+#: ../src/gui/mainFrame.cpp:995
+msgid "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)"
+msgstr "Lesbare Dateien (*.xml, *.pos, *.txt,*.csv,*.ato)"
 
-#: ../src/gui/mainFrame.cpp:964
-msgid ""
-"Readable files (*.xml, *.pos, *.txt,*.csv)|*.xml;*.pos;*.txt;*.csv|POS File "
-"(*.pos)|*.pos|XML State File (*.xml)|*.xml|Text Data Files (*.txt/csv)|*.txt;"
-"*.csv|All Files (*)|*"
+#: ../src/gui/mainFrame.cpp:997
+msgid "XML State File (*.xml)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:998
+msgid "POS File (*.pos)"
 msgstr ""
-"Lesbare Dateien (*.xml, *.pos, *.txt,*.csv)|*.xml;*.pos;*.txt;*.csv|POS "
-"Datei (*.pos)|*.pos|XML Status Datei (*.xml)|*.xml|Text Dateien (*.txt/csv)|"
-"*.txt;*.csv|Alle Dateien (*)|*"
 
-#: ../src/gui/mainFrame.cpp:1005 ../src/gui/mainFrame.cpp:1336
+#: ../src/gui/mainFrame.cpp:999
+msgid "LAWATAP ATO File (*.ato)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:1000
+msgid "Text File (*.txt, *.csv)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:1001
+msgid "All Files (*)"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:1014 ../src/gui/mainFrame.cpp:1068
+msgid "Select Data or State File..."
+msgstr "Daten oder Statusdatei auswählen..."
+
+#: ../src/gui/mainFrame.cpp:1056 ../src/gui/mainFrame.cpp:1387
 msgid "Loaded file."
-msgstr "Loaded file."
+msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1020
+#: ../src/gui/mainFrame.cpp:1069
 msgid ""
 "3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*.pos|"
 "XML State File (*.xml)|*.xml|All Files (*)|*"
@@ -1466,23 +1592,23 @@ msgstr ""
 "3Depictdateien (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS Datei (*.pos)|*."
 "pos|XML Status Datei (*.xml)|*.xml|All Files (*)|*"
 
-#: ../src/gui/mainFrame.cpp:1031
+#: ../src/gui/mainFrame.cpp:1080
 msgid "Merged file."
 msgstr "Datei zusammengeführt."
 
-#: ../src/gui/mainFrame.cpp:1135
+#: ../src/gui/mainFrame.cpp:1182
 msgid "Tip: You can use ⌘ (command) to merge"
 msgstr "Tip: Sie können ⌘ (command) zum Zusammenführen verwenden"
 
-#: ../src/gui/mainFrame.cpp:1137
+#: ../src/gui/mainFrame.cpp:1184
 msgid "Tip: You can use ctrl to merge"
 msgstr "Tip: Sie können strg zum Zusammen führen verwenden"
 
-#: ../src/gui/mainFrame.cpp:1174
+#: ../src/gui/mainFrame.cpp:1221
 msgid "Load error"
 msgstr "Fehler beim Laden"
 
-#: ../src/gui/mainFrame.cpp:1175
+#: ../src/gui/mainFrame.cpp:1222
 msgid ""
 "Error loading state file.\n"
 "See console for more info."
@@ -1490,7 +1616,7 @@ msgstr ""
 "Fehler beim Laden der Statusdatei.\n"
 "Konsole für mehr Informationen."
 
-#: ../src/gui/mainFrame.cpp:1183
+#: ../src/gui/mainFrame.cpp:1230
 msgid ""
 "This state file contains filters that can be unsafe to run\n"
 "Do you wish to remove these before continuing?."
@@ -1498,24 +1624,24 @@ msgstr ""
 "Diese Statusdatei enthält Filter deren Anwendung möglicherweise unsicher "
 "ist. Wollen Sie diese entfernen."
 
-#: ../src/gui/mainFrame.cpp:1184
+#: ../src/gui/mainFrame.cpp:1231
 msgid "Security warning"
 msgstr "Sicherheitswarnung"
 
-#: ../src/gui/mainFrame.cpp:1393 ../src/gui/mainFrame.cpp:1492
-#: ../src/gui/mainFrame.cpp:1875
+#: ../src/gui/mainFrame.cpp:1444 ../src/gui/mainFrame.cpp:1540
+#: ../src/gui/mainFrame.cpp:1957
 msgid "Unable to save"
 msgstr "Speichern nicht möglich"
 
-#: ../src/gui/mainFrame.cpp:1394
+#: ../src/gui/mainFrame.cpp:1445
 msgid "No plot available. Please create a plot before exporting."
 msgstr "Kein Plot vefügbar. Plot muss vor dem Exportieren erzeugt werden."
 
-#: ../src/gui/mainFrame.cpp:1398
+#: ../src/gui/mainFrame.cpp:1449
 msgid "Save plot..."
 msgstr "Plot speichern..."
 
-#: ../src/gui/mainFrame.cpp:1399
+#: ../src/gui/mainFrame.cpp:1450
 msgid ""
 "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*."
 "svg|PNG File (*.png)|*.png|All Files (*)|*"
@@ -1523,52 +1649,44 @@ msgstr ""
 "Dateierweiterung (svg,png)|*.svg;*.png|Skalierbare Vektorgrafik (*.svg)|*."
 "svg|PNG Datei (*.png)|*.png|Alle Dateien (*)|*"
 
-#: ../src/gui/mainFrame.cpp:1455
+#: ../src/gui/mainFrame.cpp:1504
 msgid "Select type for save"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1455
+#: ../src/gui/mainFrame.cpp:1505
 msgid "Choose file type"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1477 ../src/gui/mainFrame.cpp:1520
-#: ../src/gui/mainFrame.cpp:1567
+#: ../src/gui/mainFrame.cpp:1525 ../src/gui/mainFrame.cpp:1568
+#: ../src/gui/mainFrame.cpp:1604
 msgid "Choose resolution"
 msgstr "Auflösung auswählen"
 
-#: ../src/gui/mainFrame.cpp:1493
+#: ../src/gui/mainFrame.cpp:1541
 msgid "Unknown file extension. Please use \"svg\" or \"png\""
 msgstr "Unbekannte Dateierweiterung. Bitte verwenden Sie \"svg\" oder \"png\""
 
-#: ../src/gui/mainFrame.cpp:1504
+#: ../src/gui/mainFrame.cpp:1552
 msgid "Saved plot: "
 msgstr "Gespeicherter Plot:"
 
-#: ../src/gui/mainFrame.cpp:1511 ../src/gui/mainFrame.cpp:1559
+#: ../src/gui/mainFrame.cpp:1559 ../src/gui/mainFrame.cpp:1597
 msgid "Save Image..."
 msgstr "Speichere Bild..."
 
-#: ../src/gui/mainFrame.cpp:1512 ../src/gui/mainFrame.cpp:1560
+#: ../src/gui/mainFrame.cpp:1560 ../src/gui/mainFrame.cpp:1598
 msgid "PNG File (*.png)|*.png|All Files (*)|*"
 msgstr "PNG Datei (*.png)|*.png|Alle Dateien (*)|*"
 
-#: ../src/gui/mainFrame.cpp:1535 ../src/gui/mainFrame.cpp:1584
-msgid "Program limitation"
-msgstr "Programmeinschränkung"
-
-#: ../src/gui/mainFrame.cpp:1536
-msgid ""
-"Limitation on the screenshot dimension; please ensure that both width and "
-"height exceed the initial values,\n"
-" or that they are both smaller than the initial values.\n"
-" If this bothers you, please submit a bug."
-msgstr ""
-
-#: ../src/gui/mainFrame.cpp:1550 ../src/gui/mainFrame.cpp:1633
+#: ../src/gui/mainFrame.cpp:1588 ../src/gui/mainFrame.cpp:1664
 msgid "Saved 3D View :"
 msgstr "Gespeicherte 3D Ansicht"
 
-#: ../src/gui/mainFrame.cpp:1585
+#: ../src/gui/mainFrame.cpp:1618
+msgid "Program limitation"
+msgstr "Programmeinschränkung"
+
+#: ../src/gui/mainFrame.cpp:1619
 msgid ""
 "Limitation on the screenshot dimension; please ensure that both width and "
 "height exceed the initial values,\n"
@@ -1580,100 +1698,104 @@ msgstr ""
 "kleiner als die ursprünglichen Werte sind. Sollte Sie dies stören, melden "
 "Sie bitte einen Bug."
 
-#: ../src/gui/mainFrame.cpp:1601
+#: ../src/gui/mainFrame.cpp:1636
 msgid "Number of frames"
 msgstr "Bilderanzahl"
 
-#: ../src/gui/mainFrame.cpp:1760
+#: ../src/gui/mainFrame.cpp:1791
 msgid "Cannot animate with no filters."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1807
-msgid "Filter property change failed"
+#: ../src/gui/mainFrame.cpp:1868
+msgid "Animating"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1809
-msgid "Filter change error"
+#: ../src/gui/mainFrame.cpp:1869
+msgid "Performing refresh"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1832
-msgid "Refresh failed on frame :"
+#: ../src/gui/mainFrame.cpp:1898
+msgid "Filter property change failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1834
-msgid "Refresh failed"
+#: ../src/gui/mainFrame.cpp:1918
+msgid "Refresh failed on frame :"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1861
+#: ../src/gui/mainFrame.cpp:1943
 msgid "Scene generation failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1862
+#: ../src/gui/mainFrame.cpp:1944
 msgid "Unable to generate scene for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1876
+#: ../src/gui/mainFrame.cpp:1958
 msgid "Image save failed for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1901
+#: ../src/gui/mainFrame.cpp:1983
 msgid "Ion save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1902
+#: ../src/gui/mainFrame.cpp:1984
 msgid "Unable to save ions for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1933
+#: ../src/gui/mainFrame.cpp:2015
 msgid "Plot save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1934
+#: ../src/gui/mainFrame.cpp:2016
 msgid "Unable to save plot or frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1975
+#: ../src/gui/mainFrame.cpp:2057
 msgid "Range save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:1976
+#: ../src/gui/mainFrame.cpp:2058
 msgid "Unable to save range for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2005
+#: ../src/gui/mainFrame.cpp:2087
 msgid "Voxel save failed"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2006
+#: ../src/gui/mainFrame.cpp:2088
 msgid "Unable to save voxels for frame "
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2052 ../src/gui/mainFrame.cpp:2159
-#: ../src/gui/mainFrame.cpp:2256
+#: ../src/gui/mainFrame.cpp:2118
+msgid "Animate failed"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:2143 ../src/gui/mainFrame.cpp:2301
+#: ../src/gui/mainFrame.cpp:2397
 msgid "No filters means no data to export"
 msgstr "Keine Filter bedeutet keine Daten zum Exportieren"
 
-#: ../src/gui/mainFrame.cpp:2058
+#: ../src/gui/mainFrame.cpp:2157
 msgid "Package name"
 msgstr "Paketname"
 
-#: ../src/gui/mainFrame.cpp:2059
+#: ../src/gui/mainFrame.cpp:2158
 msgid "Package directory name"
 msgstr "Paketverzeichnis"
 
-#: ../src/gui/mainFrame.cpp:2061
+#: ../src/gui/mainFrame.cpp:2160
 msgid "AnalysisPackage"
 msgstr "Analysepaket"
 
-#: ../src/gui/mainFrame.cpp:2073
+#: ../src/gui/mainFrame.cpp:2173
 msgid "Package folder already exists, won't overwrite."
 msgstr "Paketverzeichnis existiert bereits. Werde es nicht überschreiben."
 
-#: ../src/gui/mainFrame.cpp:2074
+#: ../src/gui/mainFrame.cpp:2174
 msgid "Not available"
 msgstr "Nicht verfügbar"
 
-#: ../src/gui/mainFrame.cpp:2105
+#: ../src/gui/mainFrame.cpp:2199
 msgid ""
 "Package folder creation failed\n"
 "check writing to this location is possible."
@@ -1681,151 +1803,155 @@ msgstr ""
 "Anlegen des Paketverzeichnisses fehlgeschlagen\n"
 "Überprüfen Sie ob der angegenbene Ort schreibgeschützt ist."
 
-#: ../src/gui/mainFrame.cpp:2106
+#: ../src/gui/mainFrame.cpp:2200
 msgid "Folder creation failed"
 msgstr "Anlegen des Ordners ist fehlgeschlagen"
 
-#: ../src/gui/mainFrame.cpp:2128
+#: ../src/gui/mainFrame.cpp:2219
 msgid "Copying"
 msgstr "kopiere"
 
-#: ../src/gui/mainFrame.cpp:2129
+#: ../src/gui/mainFrame.cpp:2220
 msgid "Copying referenced files"
 msgstr "Copying referenced files"
 
-#: ../src/gui/mainFrame.cpp:2137
+#: ../src/gui/mainFrame.cpp:2279
 msgid "Error copying file"
 msgstr "Fehler beim Kopieren der Datei"
 
-#: ../src/gui/mainFrame.cpp:2148
+#: ../src/gui/mainFrame.cpp:2288
 msgid "Saved package: "
 msgstr "Gespeicherte Pakete: "
 
-#: ../src/gui/mainFrame.cpp:2169
+#: ../src/gui/mainFrame.cpp:2311
 msgid "Export"
 msgstr "Exportieren"
 
-#: ../src/gui/mainFrame.cpp:2174
+#: ../src/gui/mainFrame.cpp:2316
 msgid "POS Data (*.pos)|*.pos|All Files (*)|*"
 msgstr "POS-Daten (*.pos)|*.pos|All Files (*)|*"
 
-#: ../src/gui/mainFrame.cpp:2202 ../src/gui/mainFrame.cpp:2301
+#: ../src/gui/mainFrame.cpp:2344 ../src/gui/mainFrame.cpp:2442
 msgid "File already exists, overwrite?"
 msgstr "Datei existiert bereits. Überschreiben?"
 
-#: ../src/gui/mainFrame.cpp:2203 ../src/gui/mainFrame.cpp:2302
-#: ../src/gui/mainFrame.cpp:2328
+#: ../src/gui/mainFrame.cpp:2345 ../src/gui/mainFrame.cpp:2443
+#: ../src/gui/mainFrame.cpp:2467
 msgid "Overwrite?"
 msgstr "Überschreiben?"
 
-#: ../src/gui/mainFrame.cpp:2235
+#: ../src/gui/mainFrame.cpp:2376
 msgid "Saved ions: "
 msgstr "Gespeicherte Ionen:"
 
-#: ../src/gui/mainFrame.cpp:2260
+#: ../src/gui/mainFrame.cpp:2401
 msgid "Export Ranges"
 msgstr "Range exportieren"
 
-#: ../src/gui/mainFrame.cpp:2283
+#: ../src/gui/mainFrame.cpp:2424
 msgid "Save state..."
 msgstr "Speichere Status..."
 
-#: ../src/gui/mainFrame.cpp:2284
+#: ../src/gui/mainFrame.cpp:2425
 msgid "XML state file (*.xml)|*.xml|All Files (*)|*"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:2327
+#: ../src/gui/mainFrame.cpp:2466
 msgid "Files have been referred to using relative paths. Keep relative paths?"
 msgstr ""
 "Auf Dateien wurde mit relativen Pfaden verwiesen. Relative Pfade beibehalten?"
 
-#: ../src/gui/mainFrame.cpp:2360
+#: ../src/gui/mainFrame.cpp:2499
 msgid "Saved state: "
 msgstr "Gespeicherter Status: "
 
-#: ../src/gui/mainFrame.cpp:2698
+#: ../src/gui/mainFrame.cpp:2576
+msgid "Range editor"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:2872
 msgid "Manual not found locally. Launching web browser"
 msgstr "Anleitung konnte lokal nicht gefunden werden. Starte Webbrowser"
 
-#: ../src/gui/mainFrame.cpp:2707
+#: ../src/gui/mainFrame.cpp:2881
 msgid "Opening contact page in external web browser"
 msgstr "Öffne Kontaktseite in externem Browser"
 
-#: ../src/gui/mainFrame.cpp:2719
+#: ../src/gui/mainFrame.cpp:2893
 msgid "No filter stashes to edit."
 msgstr "Keine Filterstashes zum Bearbeiten."
 
-#: ../src/gui/mainFrame.cpp:2723
+#: ../src/gui/mainFrame.cpp:2897
 msgid "Filter Stashes"
 msgstr "Filter Stashes"
 
-#: ../src/gui/mainFrame.cpp:2752
+#: ../src/gui/mainFrame.cpp:2926
 msgid "Quick and dirty analysis for point data."
 msgstr "\"Quick and dirty\" Analyse von Punktdaten."
 
-#: ../src/gui/mainFrame.cpp:2762
+#: ../src/gui/mainFrame.cpp:2936
 msgid "Compiled with wx Version: "
 msgstr "Kompiliert mit wx Version: "
 
-#: ../src/gui/mainFrame.cpp:2783
+#: ../src/gui/mainFrame.cpp:2957
 msgid "Press enter to store new stash"
 msgstr "Eingabe drücken um neuen Filterstash zu speichern"
 
-#: ../src/gui/mainFrame.cpp:2789
+#: ../src/gui/mainFrame.cpp:2963
 msgid "Press enter to restore stash"
 msgstr "Eingabe drücken um Stash wiederherzustellen"
 
-#: ../src/gui/mainFrame.cpp:2824
+#: ../src/gui/mainFrame.cpp:2998
 msgid "Unable to create stash, selection invalid"
 msgstr "Stash kann nicht erstellt werden, Auswahl ungültig"
 
-#: ../src/gui/mainFrame.cpp:2832
+#: ../src/gui/mainFrame.cpp:3006
 msgid "Created new filter tree stash"
 msgstr "Neuer Filterstash wurde erzeugt"
 
-#: ../src/gui/mainFrame.cpp:2954
+#: ../src/gui/mainFrame.cpp:3128
 msgid "Filter type not a data source - can't be at tree base"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3112
+#: ../src/gui/mainFrame.cpp:3302
 msgid "Moving - Hold ⌘ (command) to copy"
 msgstr "Verschieben - Halte ⌘ (command) um zu kopieren"
 
-#: ../src/gui/mainFrame.cpp:3114
+#: ../src/gui/mainFrame.cpp:3304
 msgid "Moving - Hold control to copy"
 msgstr "Verschieben - Halte Strg zum kopieren"
 
-#: ../src/gui/mainFrame.cpp:3370
+#: ../src/gui/mainFrame.cpp:3647
 msgid "Press enter to store new camera"
 msgstr "Eingabe drücken um neue Kamera zu speichern"
 
-#: ../src/gui/mainFrame.cpp:3372
+#: ../src/gui/mainFrame.cpp:3649
 msgid "Press enter to restore camera"
 msgstr "Eingabe drücken um Kamera wiederherzustellen"
 
-#: ../src/gui/mainFrame.cpp:3397 ../src/gui/mainFrame.cpp:3438
+#: ../src/gui/mainFrame.cpp:3674 ../src/gui/mainFrame.cpp:3715
 msgid "Restored camera: "
 msgstr "Wiederhergestellte Kamera: "
 
-#: ../src/gui/mainFrame.cpp:3417
+#: ../src/gui/mainFrame.cpp:3694
 msgid "Stored camera: "
 msgstr "Gespeicherte Kamera: "
 
-#: ../src/gui/mainFrame.cpp:3498
+#: ../src/gui/mainFrame.cpp:3775
 msgid "Select an item from the filter tree before choosing a new filter"
 msgstr ""
 "Aktivieren Sie zuerst ein Punkt aus dem Filterverlauf bevor Sie einen neuen "
 "Filter auswählen"
 
-#: ../src/gui/mainFrame.cpp:3500
+#: ../src/gui/mainFrame.cpp:3777
 msgid "Load data source (file->open) before choosing a new filter"
 msgstr "Lade Datenquelle (Datei->öffnen) vor dem Auswählen eines neuen Filters"
 
-#: ../src/gui/mainFrame.cpp:3521
+#: ../src/gui/mainFrame.cpp:3798
 msgid "Select RNG File..."
 msgstr "RNG Datei auswählen..."
 
-#: ../src/gui/mainFrame.cpp:3522
+#: ../src/gui/mainFrame.cpp:3799
 msgid ""
 "Range Files (*rng; *env; *rrng)|*rng;*env;*rrng|RNG File (*.rng)|*.rng|"
 "Environment File (*.env)|*.env|RRNG Files (*.rrng)|*.rrng|All Files (*)|*"
@@ -1833,88 +1959,88 @@ msgstr ""
 "Rangedatei (*rng; *env; *rrng)|*rng;*env;*rrng|RNG File (*.rng)|*.rng|"
 "Environment Datei (*.env)|*.env|RRNG Files (*.rrng)|*.rrng|Alle Dateien (*)|*"
 
-#: ../src/gui/mainFrame.cpp:3542
+#: ../src/gui/mainFrame.cpp:3819
 msgid "Failed reading range file."
 msgstr "Fehler beim Lesen der Rangedatei."
 
-#: ../src/gui/mainFrame.cpp:3546
+#: ../src/gui/mainFrame.cpp:3823
 msgid "Error loading file"
 msgstr "Fehler beim Laden der Datei"
 
-#: ../src/gui/mainFrame.cpp:3604 ../src/gui/mainFrame.cpp:3658
-#: ../src/gui/mainFrame.cpp:5150 ../src/gui/mainFrame.cpp:5703
+#: ../src/gui/mainFrame.cpp:3881 ../src/gui/mainFrame.cpp:3947
+#: ../src/gui/mainFrame.cpp:5508 ../src/gui/mainFrame.cpp:6063
 msgid "Cons."
 msgstr "Kons."
 
-#: ../src/gui/mainFrame.cpp:3634
+#: ../src/gui/mainFrame.cpp:3914
 msgid "Refresh Aborted."
 msgstr "Aktualisieren abgebrochen"
 
-#: ../src/gui/mainFrame.cpp:3662
+#: ../src/gui/mainFrame.cpp:3951
 msgid "*Cons."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:3664
+#: ../src/gui/mainFrame.cpp:3953
 msgid "§Cons."
 msgstr "§Kons."
 
-#: ../src/gui/mainFrame.cpp:3781
+#: ../src/gui/mainFrame.cpp:4076
 msgid "Autosave complete."
 msgstr "Autosave beendet."
 
-#: ../src/gui/mainFrame.cpp:3940
+#: ../src/gui/mainFrame.cpp:4243
 msgid "Aborted."
 msgstr "Abgebrochen"
 
-#: ../src/gui/mainFrame.cpp:3990
+#: ../src/gui/mainFrame.cpp:4294
 msgid "Updated."
 msgstr "Updated."
 
-#: ../src/gui/mainFrame.cpp:3997
+#: ../src/gui/mainFrame.cpp:4301
 msgid "\\% Done (Esc aborts)"
 msgstr "\\% fertig (Esc abbrechen)"
 
-#: ../src/gui/mainFrame.cpp:3999
+#: ../src/gui/mainFrame.cpp:4303
 msgid "\\% Done"
 msgstr "\\% fertig"
 
-#: ../src/gui/mainFrame.cpp:4258 ../src/gui/mainFrame.cpp:4265
+#: ../src/gui/mainFrame.cpp:4562 ../src/gui/mainFrame.cpp:4569
 msgid "Next Fullscreen mode: none"
 msgstr "Nächster Vollbildmodus: keiner"
 
-#: ../src/gui/mainFrame.cpp:4261
+#: ../src/gui/mainFrame.cpp:4565
 msgid "Next Fullscreen mode: complete"
 msgstr "Nächster Vollbildmodus: vollständig"
 
-#: ../src/gui/mainFrame.cpp:4269
+#: ../src/gui/mainFrame.cpp:4573
 msgid "Next Fullscreen mode: with toolbars"
 msgstr "Nächster Vollbildmodus: mit Werkzeugleisten"
 
-#: ../src/gui/mainFrame.cpp:4285
+#: ../src/gui/mainFrame.cpp:4589
 msgid "Next Mode: No fullscreen"
 msgstr "Nächster Modus: Kein Vollbild"
 
-#: ../src/gui/mainFrame.cpp:4289
+#: ../src/gui/mainFrame.cpp:4593
 msgid "Next Mode: fullscreen w/o toolbar"
 msgstr "Nächster Modus: Vollbild ohne Werkzeugleiste"
 
-#: ../src/gui/mainFrame.cpp:4293
+#: ../src/gui/mainFrame.cpp:4597
 msgid "Next Mode: fullscreen with toolbar"
 msgstr "Nächster Modus: Vollbild mit Werkzeugleiste"
 
-#: ../src/gui/mainFrame.cpp:4334
+#: ../src/gui/mainFrame.cpp:4638
 msgid "Tip: You can shift-click to force full refresh, if required"
 msgstr "Tipp: Verwende shift-click um komplettes Aktualisieren zu erzwingen"
 
-#: ../src/gui/mainFrame.cpp:4590
+#: ../src/gui/mainFrame.cpp:4910
 msgid "No data to save"
 msgstr "Keine Daten zum Sichern"
 
-#: ../src/gui/mainFrame.cpp:4759
+#: ../src/gui/mainFrame.cpp:5082
 msgid "Aborting..."
 msgstr "Abbrechen..."
 
-#: ../src/gui/mainFrame.cpp:4765
+#: ../src/gui/mainFrame.cpp:5088
 msgid ""
 "Waiting for refresh to abort. Exiting could lead to the program "
 "backgrounding. Exit anyway? "
@@ -1922,58 +2048,63 @@ msgstr ""
 "Waiting for refresh to abort. Exiting could lead to the program "
 "backgrounding. Exit anyway? "
 
-#: ../src/gui/mainFrame.cpp:4766 ../src/gui/mainFrame.cpp:4788
+#: ../src/gui/mainFrame.cpp:5089 ../src/gui/mainFrame.cpp:5109
 msgid "Confirmation request"
 msgstr "Bestätigungsabfrage"
 
-#: ../src/gui/mainFrame.cpp:4787
+#: ../src/gui/mainFrame.cpp:5108
 msgid "Are you sure you wish to exit 3Depict?"
 msgstr "Sind Sie sicher, dass Sie 3Depict beenden wollen?"
 
-#: ../src/gui/mainFrame.cpp:5178
+#: ../src/gui/mainFrame.cpp:5536
 msgid "Update Notice: New version "
 msgstr "Updatenotiz: Neue Version "
 
-#: ../src/gui/mainFrame.cpp:5178
+#: ../src/gui/mainFrame.cpp:5536
 msgid " found online."
 msgstr " online gefunden."
 
-#: ../src/gui/mainFrame.cpp:5182
+#: ../src/gui/mainFrame.cpp:5540
 msgid "Online Check: "
 msgstr "Überprüfe online:"
 
-#: ../src/gui/mainFrame.cpp:5182
+#: ../src/gui/mainFrame.cpp:5540
 msgid " is up-to-date."
 msgstr "ist up-to-date."
 
-#: ../src/gui/mainFrame.cpp:5272
+#: ../src/gui/mainFrame.cpp:5630
 msgid "An auto-save state was found, would you like to restore it?."
 msgstr "Ein auto-save Status wurde gefunden. Wollen Sie ihn wiederherstellen?"
 
-#: ../src/gui/mainFrame.cpp:5273
+#: ../src/gui/mainFrame.cpp:5631
 msgid "Autosave"
 msgstr "Automatisch speichern"
 
-#: ../src/gui/mainFrame.cpp:5280
+#: ../src/gui/mainFrame.cpp:5638
 msgid "Unable to load autosave file.."
 msgstr "Kann Autosavedatei nicht laden.."
 
-#: ../src/gui/mainFrame.cpp:5474
+#: ../src/gui/mainFrame.cpp:5830
 msgid "List of available filters"
 msgstr "Liste der verfügbaren Filter"
 
-#: ../src/gui/mainFrame.cpp:5475
-msgid "Tree of data filters"
+#: ../src/gui/mainFrame.cpp:5832
+msgid "Tree - drag to move items, hold ⌘ for copy. Tap delete to remove items"
+msgstr ""
+
+#: ../src/gui/mainFrame.cpp:5834
+msgid ""
+"Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5476
+#: ../src/gui/mainFrame.cpp:5836
 msgid ""
 "Enable/Disable automatic updates of data when filter change takes effect"
 msgstr ""
 "Ein/Ausschalten vom automatischen Aktualisieren der Daten wenn Änderungen am "
 "Filter wirksam werden"
 
-#: ../src/gui/mainFrame.cpp:5479
+#: ../src/gui/mainFrame.cpp:5839
 msgid ""
 "Enable/Disable \"Alpha blending\" (transparency) in rendering system. "
 "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") "
@@ -1985,7 +2116,7 @@ msgstr ""
 "und transparente Oberflächen zu generieren. Ausschalten erlaubt schnelleres "
 "Renden führt jedoch zu blockigerer Darstellung."
 
-#: ../src/gui/mainFrame.cpp:5480
+#: ../src/gui/mainFrame.cpp:5840
 msgid ""
 "Enable/Disable lighting calculations in rendering, for objects that request "
 "this. Lighting provides important depth cues for objects comprised of 3D "
@@ -1996,7 +2127,7 @@ msgstr ""
 "umrandete Objekte. Deaktivieren erlaubt u.U. schnelleres Rendern bei "
 "komplizierten Szenen."
 
-#: ../src/gui/mainFrame.cpp:5481
+#: ../src/gui/mainFrame.cpp:5841
 msgid ""
 "Enable/Disable weak randomisation (Galois linear feedback shift register). "
 "Strong randomisation uses a much slower random selection method, but "
@@ -2008,14 +2139,14 @@ msgstr ""
 "Auswahlmethode bietet dafür aber einen besseren Schutz gegen unbeabsichtigte "
 "Korrelationen und wird für die endgültige Analyse empfohlen."
 
-#: ../src/gui/mainFrame.cpp:5483
+#: ../src/gui/mainFrame.cpp:5843
 msgid ""
 "Limit the number of points that can be displayed in the 3D  scene. Does not "
 "affect filter tree calculations. Disabling this can severely reduce "
 "performance, due to large numbers of points being visible at once."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5484
+#: ../src/gui/mainFrame.cpp:5844
 msgid ""
 "Enable/Disable caching of intermediate results during filter updates. "
 "Disabling caching will use less system RAM, though changes to any filter "
@@ -2027,30 +2158,30 @@ msgstr ""
 "bei Änderungen der Filterparameter der ganze Filterbaum neu berechnet wird. "
 "Dies erhöht den Rechenaufwand deutlich."
 
-#: ../src/gui/mainFrame.cpp:5495
+#: ../src/gui/mainFrame.cpp:5855
 msgid "Camera data information"
 msgstr "Kamerainformation"
 
-#: ../src/gui/mainFrame.cpp:5499
+#: ../src/gui/mainFrame.cpp:5859
 msgid "Enable/disable visual effects on final 3D output"
 msgstr "Ein/Ausschalten von visuellen Effekten in der finalen 3D Ausgabe."
 
-#: ../src/gui/mainFrame.cpp:5501
+#: ../src/gui/mainFrame.cpp:5861
 msgid "Enable cropping post-process effect"
 msgstr "Cropping post-Prozess Effect einschalten"
 
-#: ../src/gui/mainFrame.cpp:5504
+#: ../src/gui/mainFrame.cpp:5864
 msgid ""
 "Colour based 3D effect enable/disable - requires appropriate colour filter "
 "3D glasses."
 msgstr ""
 "Farbbasierte 3D-Effekte ein/ausschalten - erfordert geeignete 3D-Brillen"
 
-#: ../src/gui/mainFrame.cpp:5505
+#: ../src/gui/mainFrame.cpp:5865
 msgid "Glasses colour mode"
 msgstr "Brillenfarbmodus"
 
-#: ../src/gui/mainFrame.cpp:5507
+#: ../src/gui/mainFrame.cpp:5867
 msgid ""
 "Level of separation between left and right images, which sets 3D depth to "
 "visual distortion tradeoff"
@@ -2058,96 +2189,92 @@ msgstr ""
 "Level of separation between left and right images, which sets 3D depth to "
 "visual distortion tradeoff"
 
-#: ../src/gui/mainFrame.cpp:5511
+#: ../src/gui/mainFrame.cpp:5871
 msgid "X"
 msgstr "X"
 
-#: ../src/gui/mainFrame.cpp:5512
+#: ../src/gui/mainFrame.cpp:5872
 msgid "Y"
 msgstr "Y"
 
-#: ../src/gui/mainFrame.cpp:5513
+#: ../src/gui/mainFrame.cpp:5873
 msgid "Save raw data to file"
 msgstr "Speichere Rohdaten in Datei"
 
-#: ../src/gui/mainFrame.cpp:5514
+#: ../src/gui/mainFrame.cpp:5874
 msgid "Copy raw data to clipboard"
 msgstr "Kopiere Rohdaten in die Zwischenablage"
 
-#: ../src/gui/mainFrame.cpp:5515
+#: ../src/gui/mainFrame.cpp:5875
 msgid "Manage \"stashed\" data."
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5516
+#: ../src/gui/mainFrame.cpp:5876
 msgid "Program text output"
 msgstr "Programm Textausgabe"
 
-#: ../src/gui/mainFrame.cpp:5517
+#: ../src/gui/mainFrame.cpp:5877
 msgid "Select active camera, or type to create new named camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5518
+#: ../src/gui/mainFrame.cpp:5878
 msgid "Remove the selected camera"
 msgstr "Ausgewählte Kamera entfernen"
 
-#: ../src/gui/mainFrame.cpp:5519
+#: ../src/gui/mainFrame.cpp:5879
 msgid "Perform cropping from coordinate frame of camera"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5520
+#: ../src/gui/mainFrame.cpp:5880
 msgid ""
 "Set the maximum amount of RAM to use in order to speed repeat computations"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5521
+#: ../src/gui/mainFrame.cpp:5881
 msgid "Collapse the filter tree"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5522
+#: ../src/gui/mainFrame.cpp:5882
 msgid "Expand the filter tree"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5523
+#: ../src/gui/mainFrame.cpp:5883
 msgid "Process the filter tree, hold shift to purge cached filter data"
 msgstr ""
 
-#: ../src/gui/mainFrame.cpp:5663
+#: ../src/gui/mainFrame.cpp:6023
 msgid "Crop"
 msgstr "Zuschneiden"
 
-#: ../src/gui/mainFrame.cpp:5664
+#: ../src/gui/mainFrame.cpp:6024
 msgid "Stereo"
 msgstr "Stereo"
 
-#: ../src/gui/mainFrame.cpp:5681
+#: ../src/gui/mainFrame.cpp:6041
 msgid "Data"
 msgstr "Daten"
 
-#: ../src/gui/mainFrame.cpp:5682
+#: ../src/gui/mainFrame.cpp:6042
 msgid "Cam"
 msgstr "Cam"
 
-#: ../src/gui/mainFrame.cpp:5683
+#: ../src/gui/mainFrame.cpp:6043
 msgid "Post"
 msgstr "Post"
 
-#: ../src/gui/mainFrame.cpp:5684
+#: ../src/gui/mainFrame.cpp:6044
 msgid "Tools"
 msgstr "Werkz."
 
-#: ../src/gui/mainFrame.cpp:5701 ../src/backend/filter.cpp:44
-msgid "Plot"
-msgstr "Plot"
-
-#: ../src/gui/mainFrame.cpp:5702
+#: ../src/gui/mainFrame.cpp:6062
 msgid "Raw"
 msgstr "Roh"
 
-#: ../src/gui/mathglPane.cpp:209
+#: ../src/gui/mathglPane.cpp:230
 msgid "No plots selected."
 msgstr "Kein Plot ausgewählt."
 
-#: ../src/gui/mathglPane.cpp:1134
+#: ../src/gui/mathglPane.cpp:1202
 msgid ""
 "Unable to allocate requested memory.\n"
 " Try a lower resolution, or save as vector (SVG)."
@@ -2155,15 +2282,15 @@ msgstr ""
 "Kann den notwendigen Speicher nicht zuordnen. Versuche eine geringer "
 "Auflösung oder speichere als Vektografik (svg)."
 
-#: ../src/gui/mathglPane.cpp:1136
+#: ../src/gui/mathglPane.cpp:1204
 msgid "Plotting functions returned an error:\n"
 msgstr "Plot-Funktion meldete einen Fehler:\n"
 
-#: ../src/gui/mathglPane.cpp:1138
+#: ../src/gui/mathglPane.cpp:1206
 msgid "File readback check failed"
 msgstr "File readback check failed"
 
-#: ../src/gui/mathglPane.cpp:1140
+#: ../src/gui/mathglPane.cpp:1208
 msgid "Filesize during readback appears to be zero."
 msgstr "Filesize during readback appears to be zero."
 
@@ -2181,11 +2308,11 @@ msgid ""
 "\t\tXML files may be passed to run, instead of default tests"
 msgstr ""
 
-#: ../src/3Depict.cpp:375
+#: ../src/3Depict.cpp:383
 msgid "File : "
 msgstr "Datei : "
 
-#: ../src/3Depict.cpp:375
+#: ../src/3Depict.cpp:383
 msgid " does not exist. Skipping"
 msgstr " existiert nicht. Überspringe"
 
@@ -2201,12 +2328,12 @@ msgstr "Kann den letzten Dateieintrag nicht interpretieren"
 msgid "Unable to determine filter type in defaults listing."
 msgstr "Kann den Filtertyp im Defaultslisting nicht bestimmen."
 
-#: ../src/backend/configFile.cpp:577
+#: ../src/backend/configFile.cpp:610
 msgid "Online access for non win32/apple platforms is intentionally disabled, "
 msgstr ""
 "Onlinezugang für nicht Win32/apple systeme wurde absichtlich deaktiviert."
 
-#: ../src/backend/configFile.cpp:578
+#: ../src/backend/configFile.cpp:611
 msgid ""
 "regardless of the settings you use here. Use your package manager to keep up-"
 "to-date"
@@ -2243,103 +2370,99 @@ msgstr "Stem"
 msgid "Points"
 msgstr "Punkte"
 
-#: ../src/backend/plot.cpp:648 ../src/backend/plot.cpp:656
+#: ../src/backend/plot.cpp:841 ../src/backend/plot.cpp:849
 msgid "Multiple data types"
 msgstr ""
 
-#: ../src/backend/plot.cpp:808
-msgid "Mixed log/non-log:"
-msgstr "Gemischt log/nicht-log"
-
-#: ../src/backend/plot.cpp:1261
+#: ../src/backend/plot.cpp:1550
 msgid "error"
 msgstr "Fehler"
 
-#: ../src/backend/filtertree.cpp:951
+#: ../src/backend/filtertree.cpp:1051
 msgid "WARNING: Skipping node "
 msgstr "WARNUNG: Skipping node "
 
-#: ../src/backend/filtertree.cpp:951
+#: ../src/backend/filtertree.cpp:1051
 msgid " as it was not recognised"
 msgstr " wurde nicht erkannt."
 
-#: ../src/backend/filtertree.cpp:989
+#: ../src/backend/filtertree.cpp:1089
 msgid "Error processing node: "
 msgstr "Fehler beim Verarbeiten von Node: "
 
-#: ../src/backend/filters/externalProgram.cpp:515
+#: ../src/backend/filters/externalProgram.cpp:543
 msgid "Command"
 msgstr "Befehl"
 
-#: ../src/backend/filters/externalProgram.cpp:518
+#: ../src/backend/filters/externalProgram.cpp:546
 msgid ""
 "Full command to send to operating system. See manual for escape sequence "
 "meanings"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:522
+#: ../src/backend/filters/externalProgram.cpp:550
 msgid "Work Dir"
 msgstr "Arbeitsverzeichnis"
 
-#: ../src/backend/filters/externalProgram.cpp:525
+#: ../src/backend/filters/externalProgram.cpp:553
 msgid "Directory to run the command in"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:535
+#: ../src/backend/filters/externalProgram.cpp:563
 msgid "Cleanup input"
 msgstr "Bereinige Eingabe"
 
-#: ../src/backend/filters/externalProgram.cpp:538
+#: ../src/backend/filters/externalProgram.cpp:566
 msgid "Erase input files when command completed"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:547
+#: ../src/backend/filters/externalProgram.cpp:575
 msgid "Cache"
 msgstr "Zwischenspeicher"
 
-#: ../src/backend/filters/externalProgram.cpp:550
+#: ../src/backend/filters/externalProgram.cpp:578
 msgid ""
 "Assume program does not alter its output, unless inputs from 3Depict are "
 "altered"
 msgstr ""
 
-#: ../src/backend/filters/externalProgram.cpp:632
+#: ../src/backend/filters/externalProgram.cpp:660
 msgid "Error processing command line"
 msgstr "Fehler beim Ausführen der Kommandozeile"
 
-#: ../src/backend/filters/externalProgram.cpp:634
+#: ../src/backend/filters/externalProgram.cpp:662
 msgid "Unable to set working directory"
 msgstr "Kann Arbeitsverzeichnis nicht festlegen"
 
-#: ../src/backend/filters/externalProgram.cpp:636
+#: ../src/backend/filters/externalProgram.cpp:664
 msgid "Error saving posfile result for external program"
 msgstr "Fehler beim Speichern von Posdateiergebnis für externes Programm"
 
-#: ../src/backend/filters/externalProgram.cpp:638
+#: ../src/backend/filters/externalProgram.cpp:666
 msgid "Error saving plot result for externalprogram"
 msgstr "Fehler beim Speichern von Posdateiergebnis für externes Programm"
 
-#: ../src/backend/filters/externalProgram.cpp:640
+#: ../src/backend/filters/externalProgram.cpp:668
 msgid "Error creating temporary directory"
 msgstr "Fehler beim Anlegen des temporären Verzeichnisses"
 
-#: ../src/backend/filters/externalProgram.cpp:642
+#: ../src/backend/filters/externalProgram.cpp:670
 msgid "Detected unusable number of columns in plot"
 msgstr "Detected unusable number of columns in plot"
 
-#: ../src/backend/filters/externalProgram.cpp:644
+#: ../src/backend/filters/externalProgram.cpp:672
 msgid "Unable to parse plot result from external program"
 msgstr "Unable to parse plot result from external program"
 
-#: ../src/backend/filters/externalProgram.cpp:646
+#: ../src/backend/filters/externalProgram.cpp:674
 msgid "Unable to load ions from external program"
 msgstr "Kann Ionen von externem Programm nicht laden"
 
-#: ../src/backend/filters/externalProgram.cpp:648
+#: ../src/backend/filters/externalProgram.cpp:676
 msgid "Unable to perform commandline substitution"
 msgstr "Unable to perform commandline substitution"
 
-#: ../src/backend/filters/externalProgram.cpp:650
+#: ../src/backend/filters/externalProgram.cpp:678
 msgid "Error executing external program"
 msgstr "Fehler beim Ausführen von externem Programm"
 
@@ -2361,126 +2484,127 @@ msgstr "Zylinder"
 msgid "Aligned box"
 msgstr "Ausgerichtete Box"
 
-#: ../src/backend/filters/ionClip.cpp:492
+#: ../src/backend/filters/ionClip.cpp:495
 msgid "Primitive"
 msgstr "Primitiv"
 
-#: ../src/backend/filters/ionClip.cpp:495
+#: ../src/backend/filters/ionClip.cpp:498
 msgid "Shape of clipping object"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:501
-#: ../src/backend/filters/compositionProfile.cpp:925
+#: ../src/backend/filters/ionClip.cpp:504
+#: ../src/backend/filters/compositionProfile.cpp:1000
 msgid "Show Primitive"
 msgstr "Zeige Primitiv"
 
-#: ../src/backend/filters/ionClip.cpp:504
+#: ../src/backend/filters/ionClip.cpp:507
 msgid "Display the 3D interaction object"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:509
+#: ../src/backend/filters/ionClip.cpp:512
 msgid "Invert Clip"
 msgstr "Invertiere Clip"
 
-#: ../src/backend/filters/ionClip.cpp:512
+#: ../src/backend/filters/ionClip.cpp:515
 msgid ""
 "Switch between retaining points inside (false) and outside (true) of "
 "primitive"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:526
-#: ../src/backend/filters/compositionProfile.cpp:984
+#: ../src/backend/filters/ionClip.cpp:529
+#: ../src/backend/filters/compositionProfile.cpp:1059
 msgid "Position for centre of sphere"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:531
-#: ../src/backend/filters/ionClip.cpp:594
-#: ../src/backend/filters/compositionProfile.cpp:967
-#: ../src/backend/filters/compositionProfile.cpp:989
-#: ../src/backend/filters/spatialAnalysis.cpp:610
+#: ../src/backend/filters/ionClip.cpp:534
+#: ../src/backend/filters/ionClip.cpp:597
+#: ../src/backend/filters/compositionProfile.cpp:1042
+#: ../src/backend/filters/compositionProfile.cpp:1064
+#: ../src/backend/filters/spatialAnalysis.cpp:93
+#: ../src/backend/filters/spatialAnalysis.cpp:616
 msgid "Radius"
 msgstr "Radius"
 
-#: ../src/backend/filters/ionClip.cpp:534
-#: ../src/backend/filters/compositionProfile.cpp:992
+#: ../src/backend/filters/ionClip.cpp:537
+#: ../src/backend/filters/compositionProfile.cpp:1067
 msgid "Radius of sphere"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:548
+#: ../src/backend/filters/ionClip.cpp:551
 msgid "Position that plane passes through"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:553
+#: ../src/backend/filters/ionClip.cpp:556
 msgid "Plane Normal"
 msgstr "Plane Normal"
 
-#: ../src/backend/filters/ionClip.cpp:556
+#: ../src/backend/filters/ionClip.cpp:559
 msgid "Perpendicular direction for plane"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:570
+#: ../src/backend/filters/ionClip.cpp:573
 msgid "Centre of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:575
-#: ../src/backend/filters/compositionProfile.cpp:948
-#: ../src/backend/filters/spatialAnalysis.cpp:601
-#: ../src/backend/filters/transform.cpp:1319
+#: ../src/backend/filters/ionClip.cpp:578
+#: ../src/backend/filters/compositionProfile.cpp:1023
+#: ../src/backend/filters/spatialAnalysis.cpp:607
+#: ../src/backend/filters/transform.cpp:1325
 msgid "Axis"
 msgstr "Achse"
 
-#: ../src/backend/filters/ionClip.cpp:578
+#: ../src/backend/filters/ionClip.cpp:581
 msgid "Positive vector for cylinder"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:586
-#: ../src/backend/filters/compositionProfile.cpp:959
+#: ../src/backend/filters/ionClip.cpp:589
+#: ../src/backend/filters/compositionProfile.cpp:1034
 msgid "Lock Axis Mag."
 msgstr "Achsen Vergr. sperren"
 
-#: ../src/backend/filters/ionClip.cpp:589
+#: ../src/backend/filters/ionClip.cpp:592
 msgid "Prevent changing length of cylinder during 3D interaction"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:597
-#: ../src/backend/filters/compositionProfile.cpp:970
-#: ../src/backend/filters/spatialAnalysis.cpp:613
+#: ../src/backend/filters/ionClip.cpp:600
+#: ../src/backend/filters/compositionProfile.cpp:1045
+#: ../src/backend/filters/spatialAnalysis.cpp:619
 msgid "Radius of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:610
+#: ../src/backend/filters/ionClip.cpp:613
 msgid "Centre of axis aligned box"
 msgstr ""
 
-#: ../src/backend/filters/ionClip.cpp:615
+#: ../src/backend/filters/ionClip.cpp:618
 msgid "Corner offset"
 msgstr "Corner offset"
 
-#: ../src/backend/filters/ionClip.cpp:618
+#: ../src/backend/filters/ionClip.cpp:621
 msgid "Vector to corner of box"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:74
-#: ../src/backend/filters/clusterAnalysis.cpp:998
+#: ../src/backend/filters/clusterAnalysis.cpp:77
+#: ../src/backend/filters/clusterAnalysis.cpp:1017
 msgid "Size Distribution"
 msgstr "Größenverteilung"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:75
+#: ../src/backend/filters/clusterAnalysis.cpp:78
 msgid "Chemistry Distribution"
 msgstr "Chemische Verteilung"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:487
+#: ../src/backend/filters/clusterAnalysis.cpp:491
 msgid "No range data. Can't cluster."
 msgstr "Keine Rangedaten. Clusteranalyse nicht möglich."
 
-#: ../src/backend/filters/clusterAnalysis.cpp:498
+#: ../src/backend/filters/clusterAnalysis.cpp:502
 msgid ""
 "No ranges selected for cluster \"core\". Cannot continue with clustering."
 msgstr ""
 "Kein Range für cluster \"core\" ausgewählt. Kann mit Clusteranalyse nicht "
 "weitermachen."
 
-#: ../src/backend/filters/clusterAnalysis.cpp:510
+#: ../src/backend/filters/clusterAnalysis.cpp:511
 msgid ""
 "No ranges selected for cluster \"bulk\". Cannot continue with clustering."
 msgstr ""
@@ -2528,8 +2652,8 @@ msgid "Core Link + Erode"
 msgstr "Core Link + Erode"
 
 #: ../src/backend/filters/clusterAnalysis.cpp:902
-#: ../src/backend/filters/spatialAnalysis.cpp:360
-#: ../src/backend/filters/ionInfo.cpp:447
+#: ../src/backend/filters/spatialAnalysis.cpp:373
+#: ../src/backend/filters/ionInfo.cpp:440
 msgid "Algorithm"
 msgstr "Algorithmus"
 
@@ -2538,163 +2662,178 @@ msgid "Cluster algorithm mode"
 msgstr ""
 
 #: ../src/backend/filters/clusterAnalysis.cpp:915
+msgid "Core Classify"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:918
+msgid ""
+"Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:924
 msgid "Core Classify Dist"
 msgstr "Core Classify Dist"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:918
+#: ../src/backend/filters/clusterAnalysis.cpp:927
 msgid "Restrict only atoms by distance to be cluster sources"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:923
+#: ../src/backend/filters/clusterAnalysis.cpp:932
 msgid "Classify Knn Max"
 msgstr "Classify Knn Max"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:926
+#: ../src/backend/filters/clusterAnalysis.cpp:935
 msgid ""
 "Require that the kth NN (this number) is within the classify distance, to be "
 "a cluster source"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:931
+#: ../src/backend/filters/clusterAnalysis.cpp:941
 msgid "Core Link Dist"
 msgstr "Core Link Dist"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:934
+#: ../src/backend/filters/clusterAnalysis.cpp:944
 msgid "Distance between clusters to allow linking"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:939
+#: ../src/backend/filters/clusterAnalysis.cpp:949
+msgid "Bulk Link"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:952
+#: ../src/backend/filters/clusterAnalysis.cpp:970
+msgid "Enable  linking of non-cluster species - eg for composition analysis "
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:959
 msgid "Bulk Link (Envelope) Dist"
 msgstr "Bulk Link (Envelope) Dist"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:942
+#: ../src/backend/filters/clusterAnalysis.cpp:962
 msgid ""
 "Distance from core points that form cluster that is used to grab surrounding "
 "bulk points"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:947
+#: ../src/backend/filters/clusterAnalysis.cpp:967
+msgid "Erosion"
+msgstr ""
+
+#: ../src/backend/filters/clusterAnalysis.cpp:976
 msgid "Erode Dist"
 msgstr "Erode Dist"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:950
+#: ../src/backend/filters/clusterAnalysis.cpp:979
 msgid ""
 "Distance from unclustered material in which bulk points are eroded from "
 "cluster"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:955
+#: ../src/backend/filters/clusterAnalysis.cpp:985
 msgid "Clustering Params"
 msgstr "Cluster Parameter"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:962
-msgid "Count bulk"
-msgstr "Bulk mitrechnen"
-
-#: ../src/backend/filters/clusterAnalysis.cpp:965
-msgid "Include bulk ions in size distribution."
-msgstr ""
-
-#: ../src/backend/filters/clusterAnalysis.cpp:971
+#: ../src/backend/filters/clusterAnalysis.cpp:990
 msgid "Size Cropping"
 msgstr "Größeneinschrankungen"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:974
-msgid "Perform removal of clusters based upon size distribution"
+#: ../src/backend/filters/clusterAnalysis.cpp:993
+msgid "Remove clusters based upon size distribution"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:981
+#: ../src/backend/filters/clusterAnalysis.cpp:1000
 msgid "Min Size"
 msgstr "Min Größe"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:984
+#: ../src/backend/filters/clusterAnalysis.cpp:1003
 msgid "Remove clusters below this size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:989
+#: ../src/backend/filters/clusterAnalysis.cpp:1008
 msgid "Max Size"
 msgstr "Max Größe"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:992
+#: ../src/backend/filters/clusterAnalysis.cpp:1011
 msgid "Remove clusters above this size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1001
+#: ../src/backend/filters/clusterAnalysis.cpp:1020
 msgid "Show number of clusters as a function of cluster size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1007
+#: ../src/backend/filters/clusterAnalysis.cpp:1026
 msgid "Log Scale"
 msgstr "Log. Skala"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1010
+#: ../src/backend/filters/clusterAnalysis.cpp:1029
 msgid "Use logarithmic scale for size distribution"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1026
+#: ../src/backend/filters/clusterAnalysis.cpp:1045
 msgid "Chemistry Dist."
 msgstr "Chemistry Dist."
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1029
+#: ../src/backend/filters/clusterAnalysis.cpp:1048
 msgid "Create a plot showing chemistry for each cluster size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1036
-#: ../src/backend/filters/compositionProfile.cpp:1032
-#: ../src/backend/filters/ionInfo.cpp:419
+#: ../src/backend/filters/clusterAnalysis.cpp:1055
+#: ../src/backend/filters/compositionProfile.cpp:1107
+#: ../src/backend/filters/spatialAnalysis.cpp:674
+#: ../src/backend/filters/ionInfo.cpp:412
 msgid "Normalise"
 msgstr "Normalisieren"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1039
+#: ../src/backend/filters/clusterAnalysis.cpp:1058
 msgid "Convert cluster counts to composition"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1045
+#: ../src/backend/filters/clusterAnalysis.cpp:1064
 msgid "Postprocess"
 msgstr "Postprozess"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1064
+#: ../src/backend/filters/clusterAnalysis.cpp:1083
 msgid "If selected, use as \"core\" ion type (can make clusters)"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1069
+#: ../src/backend/filters/clusterAnalysis.cpp:1088
 msgid "Core Ranges"
 msgstr "Core Ranges"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1081
+#: ../src/backend/filters/clusterAnalysis.cpp:1102
 msgid ""
 "If selected, use as \"bulk\" ion type (can be included in existing clusters)"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1086
+#: ../src/backend/filters/clusterAnalysis.cpp:1107
 msgid "Bulk Ranges"
 msgstr "Bulk Ranges"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1101
+#: ../src/backend/filters/clusterAnalysis.cpp:1123
 msgid "Max. Sep + Erode"
 msgstr "Max. Sep + Erode"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1730
+#: ../src/backend/filters/clusterAnalysis.cpp:1803
 msgid "Clustering aborted"
 msgstr "Clustering abgebrochen"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1732
+#: ../src/backend/filters/clusterAnalysis.cpp:1805
 msgid "No core ions for cluster"
 msgstr "Keine Kernionen für Cluster"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1734
+#: ../src/backend/filters/clusterAnalysis.cpp:1807
 msgid "No bulk ions for cluster"
 msgstr "Keine Bulkionen für Cluster"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1812
+#: ../src/backend/filters/clusterAnalysis.cpp:1885
 msgid " --------------------------- Parameter selection notice ------------- "
 msgstr " --------------------------- Parameterauswahl Notiz ------------- "
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1813
+#: ../src/backend/filters/clusterAnalysis.cpp:1886
 msgid "You have specified a bulk distance larger than half your link distance."
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1814
+#: ../src/backend/filters/clusterAnalysis.cpp:1887
 msgid ""
 "You can do this; thats OK, but the output is no longer independent of the "
 "computational process;"
@@ -2702,7 +2841,7 @@ msgstr ""
 "Sie könne das machen, das ist in Ordnung, aber die Ausgabe ist nicht länger "
 "unabhängig vom Berechnungsprozess"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1815
+#: ../src/backend/filters/clusterAnalysis.cpp:1888
 msgid ""
 "This will be a problem in the case where two or more clusters can equally "
 "lay claim to a \"bulk\" ion. "
@@ -2710,7 +2849,7 @@ msgstr ""
 "Dies ist ein Problem wenn zwei oder mehrere Cluster auf dasselbe \"bulk\" "
 "Ion Anspruch erheben. "
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1816
+#: ../src/backend/filters/clusterAnalysis.cpp:1889
 msgid ""
 " If your inter-cluster distance is sufficiently large (larger than your bulk "
 "linking distance), then you can get away with this."
@@ -2718,7 +2857,7 @@ msgstr ""
 " If your inter-cluster distance is sufficiently large (larger than your bulk "
 "linking distance), then you can get away with this."
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1817
+#: ../src/backend/filters/clusterAnalysis.cpp:1890
 msgid ""
 " In theory it is possible to \"join\" the clusters, but this has not been "
 "implemented for speed reasons."
@@ -2726,7 +2865,7 @@ msgstr ""
 "Theoretisch ist es möglich die Cluster zu 'verbinden', dies wurde jedoch aus "
 "Gescheindigkeitsgründen nicht implementiert."
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1818
+#: ../src/backend/filters/clusterAnalysis.cpp:1891
 msgid ""
 "If you want this, please contact the author, or just use the source to add "
 "this in yourself."
@@ -2734,57 +2873,58 @@ msgstr ""
 "Sollten Sie dies wollen, kontaktieren Sie den Autor oder verwenden Sie den "
 "Sourcecode um es selbst hinzuzufügen."
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1819
+#: ../src/backend/filters/clusterAnalysis.cpp:1892
 msgid "---------------------------------------------------------------------- "
 msgstr "---------------------------------------------------------------------- "
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1829
-#: ../src/backend/filters/spatialAnalysis.cpp:1469
-#: ../src/backend/filters/spatialAnalysis.cpp:1798
-#: ../src/backend/filters/spatialAnalysis.cpp:2094
-#: ../src/backend/filters/transform.cpp:1035
+#: ../src/backend/filters/clusterAnalysis.cpp:1902
+#: ../src/backend/filters/spatialAnalysis.cpp:1757
+#: ../src/backend/filters/spatialAnalysis.cpp:2084
+#: ../src/backend/filters/spatialAnalysis.cpp:2382
+#: ../src/backend/filters/spatialAnalysis.cpp:3078
+#: ../src/backend/filters/transform.cpp:1033
 msgid "Collate"
 msgstr "Abgleichen"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1848
+#: ../src/backend/filters/clusterAnalysis.cpp:1921
 msgid "Build Core"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1866
+#: ../src/backend/filters/clusterAnalysis.cpp:1939
 msgid "Classify Core"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1959
+#: ../src/backend/filters/clusterAnalysis.cpp:2032
 msgid "Build Bulk"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:1979
+#: ../src/backend/filters/clusterAnalysis.cpp:2052
 msgid "Core"
 msgstr "Kern"
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2124
+#: ../src/backend/filters/clusterAnalysis.cpp:2197
 msgid "Bulk"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2254
+#: ../src/backend/filters/clusterAnalysis.cpp:2327
 msgid "Erode"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2328
+#: ../src/backend/filters/clusterAnalysis.cpp:2401
 msgid "Re-Collate"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2596
-#: ../src/backend/filters/clusterAnalysis.cpp:2823
+#: ../src/backend/filters/clusterAnalysis.cpp:2669
+#: ../src/backend/filters/clusterAnalysis.cpp:2873
 msgid "Cluster Size"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2597
-#: ../src/backend/filters/clusterAnalysis.cpp:2827
+#: ../src/backend/filters/clusterAnalysis.cpp:2670
+#: ../src/backend/filters/clusterAnalysis.cpp:2877
 msgid "Frequency"
 msgstr ""
 
-#: ../src/backend/filters/clusterAnalysis.cpp:2825
+#: ../src/backend/filters/clusterAnalysis.cpp:2875
 msgid "Composition"
 msgstr ""
 
@@ -2965,14 +3105,6 @@ msgstr "Representation"
 msgid "3D display method"
 msgstr ""
 
-#: ../src/backend/filters/voxelise.cpp:981
-#: ../src/backend/filters/voxelise.cpp:1037
-#: ../src/backend/filters/compositionProfile.cpp:1079
-#: ../src/backend/filters/boundingBox.cpp:656
-#: ../src/backend/filters/dataLoad.cpp:567
-msgid "Appearance"
-msgstr ""
-
 #: ../src/backend/filters/voxelise.cpp:984
 msgid "Spot size"
 msgstr "Spot size"
@@ -3002,13 +3134,6 @@ msgstr "Isovalue"
 msgid "Scalar value to show as isosurface"
 msgstr ""
 
-#: ../src/backend/filters/voxelise.cpp:1022
-#: ../src/backend/filters/compositionProfile.cpp:1070
-#: ../src/backend/filters/annotation.cpp:903
-#: ../src/backend/filters/spectrumPlot.cpp:471
-msgid "Colour"
-msgstr "Farbe"
-
 #: ../src/backend/filters/voxelise.cpp:1025
 msgid "Colour of isosurface"
 msgstr ""
@@ -3050,12 +3175,12 @@ msgid "Colour mode"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1097
-#: ../src/backend/filters/ionColour.cpp:263
+#: ../src/backend/filters/ionColour.cpp:262
 msgid "Colour scheme used to assign points colours by value"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1106
-#: ../src/backend/filters/ionColour.cpp:271
+#: ../src/backend/filters/ionColour.cpp:274
 msgid "Show Bar"
 msgstr "Zeige Balken"
 
@@ -3068,22 +3193,22 @@ msgid "Auto-compute min/max values in map"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1127
-#: ../src/backend/filters/ionColour.cpp:286
+#: ../src/backend/filters/ionColour.cpp:289
 msgid "Map start"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1128
-#: ../src/backend/filters/ionColour.cpp:287
+#: ../src/backend/filters/ionColour.cpp:290
 msgid "Assign points with this value to the first colour in map"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1135
-#: ../src/backend/filters/ionColour.cpp:294
+#: ../src/backend/filters/ionColour.cpp:297
 msgid "Map end"
 msgstr ""
 
 #: ../src/backend/filters/voxelise.cpp:1136
-#: ../src/backend/filters/ionColour.cpp:295
+#: ../src/backend/filters/ionColour.cpp:298
 msgid "Assign points with this value to the last colour in map"
 msgstr ""
 
@@ -3103,313 +3228,397 @@ msgstr "Kann Filter convolution nicht durchführen"
 msgid "Voxelisation bounds are invalid"
 msgstr "Voxelisation Grenzen sin ungültig"
 
-#: ../src/backend/filters/ionColour.cpp:259
+#: ../src/backend/filters/ionColour.cpp:258
 msgid "Colour Map"
 msgstr "Farbtabelle"
 
-#: ../src/backend/filters/ionColour.cpp:278
+#: ../src/backend/filters/ionColour.cpp:266
+msgid "Reverse map"
+msgstr ""
+
+#: ../src/backend/filters/ionColour.cpp:267
+msgid "Reverse the colour scale"
+msgstr ""
+
+#: ../src/backend/filters/ionColour.cpp:281
 msgid "Num Colours"
 msgstr ""
 
-#: ../src/backend/filters/ionColour.cpp:280
+#: ../src/backend/filters/ionColour.cpp:283
 msgid "Number of unique colours to use in colour map"
 msgstr ""
 
-#: ../src/backend/filters/ionColour.cpp:395
-#: ../src/backend/filters/transform.cpp:1573
-#: ../src/backend/filters/ionInfo.cpp:548
+#: ../src/backend/filters/ionColour.cpp:416
+#: ../src/backend/filters/transform.cpp:1579
+#: ../src/backend/filters/ionInfo.cpp:541
 msgid "Aborted"
 msgstr "Abgebrochen"
 
-#: ../src/backend/filters/compositionProfile.cpp:453
+#: ../src/backend/filters/compositionProfile.cpp:536
 msgid "Distance"
 msgstr "Abstand"
 
-#: ../src/backend/filters/compositionProfile.cpp:461
+#: ../src/backend/filters/compositionProfile.cpp:544
 msgid "Fraction"
 msgstr "Anteil"
 
-#: ../src/backend/filters/compositionProfile.cpp:463
-msgid "Density (\\#.len^3)"
-msgstr "Dichte (\\#.len^3)"
+#: ../src/backend/filters/compositionProfile.cpp:546
+msgid "Density (\\frac{\\#}{len^3})"
+msgstr "Dichte (\\frac{\\#}{len^3})"
 
-#: ../src/backend/filters/compositionProfile.cpp:490
+
+#: ../src/backend/filters/compositionProfile.cpp:573
 msgid "Freq. Profile"
 msgstr "Häufigkeitsprofil"
 
-#: ../src/backend/filters/compositionProfile.cpp:588
+#: ../src/backend/filters/compositionProfile.cpp:641
 msgid "Too many bins in comp. profile."
 msgstr "Zu viele Bins im Konzentrationsprofil."
 
-#: ../src/backend/filters/compositionProfile.cpp:590
+#: ../src/backend/filters/compositionProfile.cpp:643
 msgid "Not enough memory for comp. profile."
 msgstr "Nicht genug Speicher für Konz.-Profil."
 
-#: ../src/backend/filters/compositionProfile.cpp:592
+#: ../src/backend/filters/compositionProfile.cpp:645
 msgid "Aborted composition prof."
 msgstr "Konzentrationspr. abgebr."
 
-#: ../src/backend/filters/compositionProfile.cpp:914
+#: ../src/backend/filters/compositionProfile.cpp:989
 msgid "Primitive type"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:918
+#: ../src/backend/filters/compositionProfile.cpp:993
 msgid "Basic shape to use for profile"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:929
+#: ../src/backend/filters/compositionProfile.cpp:1004
 msgid "Display the 3D composition profile interaction object"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:943
-#: ../src/backend/filters/spatialAnalysis.cpp:596
+#: ../src/backend/filters/compositionProfile.cpp:1018
+#: ../src/backend/filters/spatialAnalysis.cpp:602
 msgid "Position for centre of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:951
+#: ../src/backend/filters/compositionProfile.cpp:1026
 msgid "Vector between ends of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:962
+#: ../src/backend/filters/compositionProfile.cpp:1037
 msgid "Prevent length of cylinder changing during interaction"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1002
+#: ../src/backend/filters/compositionProfile.cpp:1077
 msgid "Fixed Bin Num"
 msgstr "Fix. Bin-Anz."
 
-#: ../src/backend/filters/compositionProfile.cpp:1005
+#: ../src/backend/filters/compositionProfile.cpp:1080
 msgid ""
 "If true, use a fixed number of bins for profile, otherwise use fixed step "
 "size"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1011
-#: ../src/backend/filters/spatialAnalysis.cpp:420
-#: ../src/backend/filters/spatialAnalysis.cpp:569
+#: ../src/backend/filters/compositionProfile.cpp:1086
+#: ../src/backend/filters/spatialAnalysis.cpp:433
+#: ../src/backend/filters/spatialAnalysis.cpp:575
 msgid "Num Bins"
 msgstr "Bin-Anz."
 
-#: ../src/backend/filters/compositionProfile.cpp:1016
+#: ../src/backend/filters/compositionProfile.cpp:1091
 msgid "Number of bins to use for profile"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1021
-#: ../src/backend/filters/spectrumPlot.cpp:395
+#: ../src/backend/filters/compositionProfile.cpp:1096
+#: ../src/backend/filters/spectrumPlot.cpp:396
 msgid "Bin width"
 msgstr "Bin-Breite"
 
-#: ../src/backend/filters/compositionProfile.cpp:1027
+#: ../src/backend/filters/compositionProfile.cpp:1102
 msgid "Size of each bin in profile"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1036
+#: ../src/backend/filters/compositionProfile.cpp:1111
 msgid "Convert bin counts into relative frequencies in each bin"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1057
-#: ../src/backend/filters/spectrumPlot.cpp:458
+#: ../src/backend/filters/compositionProfile.cpp:1115
+msgid "Min. events"
+msgstr ""
+
+#: ../src/backend/filters/compositionProfile.cpp:1119
+msgid "Drop data that does not have this many events"
+msgstr ""
+
+#: ../src/backend/filters/compositionProfile.cpp:1143
+#: ../src/backend/filters/spectrumPlot.cpp:459
 msgid "Plot Type"
 msgstr "Plot Type"
 
-#: ../src/backend/filters/compositionProfile.cpp:1060
+#: ../src/backend/filters/compositionProfile.cpp:1146
 msgid "Visual style for plot"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1073
+#: ../src/backend/filters/compositionProfile.cpp:1159
 msgid "Colour of plot"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1089
+#: ../src/backend/filters/compositionProfile.cpp:1175
 msgid "Err. Estimator"
 msgstr "Fehlerschätzer"
 
-#: ../src/backend/filters/compositionProfile.cpp:1092
+#: ../src/backend/filters/compositionProfile.cpp:1178
 msgid "Method of estimating error associated with each bin"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1099
+#: ../src/backend/filters/compositionProfile.cpp:1185
 msgid "Avg. Window"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1102
+#: ../src/backend/filters/compositionProfile.cpp:1188
 msgid "Number of bins to include in moving average filter"
 msgstr ""
 
-#: ../src/backend/filters/compositionProfile.cpp:1106
+#: ../src/backend/filters/compositionProfile.cpp:1192
 msgid "Error analysis"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:72
+#: ../src/backend/filters/spatialAnalysis.cpp:84
 msgid "Local Density"
 msgstr "Lokale Dichte"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:73
+#: ../src/backend/filters/spatialAnalysis.cpp:85
 msgid "Density Filtering"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:74
+#: ../src/backend/filters/spatialAnalysis.cpp:86
 msgid "Radial Distribution"
 msgstr "Radial Distribution"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:75
+#: ../src/backend/filters/spatialAnalysis.cpp:87
 msgid "Axial Distribution"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:79
-msgid "Fixed Neighbour Count"
-msgstr "Fixed Neighbour Count"
+#: ../src/backend/filters/spatialAnalysis.cpp:88
+msgid "Binomial Distribution"
+msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:80
-msgid "Fixed Radius"
-msgstr "Fixierter Radius"
+#: ../src/backend/filters/spatialAnalysis.cpp:92
+msgid "Neighbour Count"
+msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:363
+#: ../src/backend/filters/spatialAnalysis.cpp:376
 msgid "Spatial analysis algorithm to use"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:385
+#: ../src/backend/filters/spatialAnalysis.cpp:398
 msgid "Stop Mode"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:388
+#: ../src/backend/filters/spatialAnalysis.cpp:401
 msgid "Method to use to terminate algorithm when examining each point"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:395
+#: ../src/backend/filters/spatialAnalysis.cpp:408
 msgid "NN Max"
 msgstr "NN Max"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:398
+#: ../src/backend/filters/spatialAnalysis.cpp:411
 msgid "Maximum number of neighbours to examine"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:404
+#: ../src/backend/filters/spatialAnalysis.cpp:417
 msgid "Dist Max"
 msgstr "Abst. Max."
 
-#: ../src/backend/filters/spatialAnalysis.cpp:407
+#: ../src/backend/filters/spatialAnalysis.cpp:420
 msgid "Maximum distance from each point for search"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:423
-#: ../src/backend/filters/spatialAnalysis.cpp:572
+#: ../src/backend/filters/spatialAnalysis.cpp:436
+#: ../src/backend/filters/spatialAnalysis.cpp:578
 msgid "Number of bins for output 1D RDF plot"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:432
+#: ../src/backend/filters/spatialAnalysis.cpp:442
 msgid "Surface Remove"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:435
+#: ../src/backend/filters/spatialAnalysis.cpp:445
 msgid ""
 "Exclude surface as part of source to minimise bias in RDF (at cost of "
 "increased noise)"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:442
+#: ../src/backend/filters/spatialAnalysis.cpp:452
 msgid "Remove Dist"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:445
+#: ../src/backend/filters/spatialAnalysis.cpp:455
 msgid "Minimum distance to remove from surface"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:456
-#: ../src/backend/filters/spatialAnalysis.cpp:581
+#: ../src/backend/filters/spatialAnalysis.cpp:466
+#: ../src/backend/filters/spatialAnalysis.cpp:587
 msgid "Plot colour "
 msgstr "Plotfarbe "
 
-#: ../src/backend/filters/spatialAnalysis.cpp:459
-#: ../src/backend/filters/spatialAnalysis.cpp:584
+#: ../src/backend/filters/spatialAnalysis.cpp:469
+#: ../src/backend/filters/spatialAnalysis.cpp:590
 msgid "Colour of output plot"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:478
+#: ../src/backend/filters/spatialAnalysis.cpp:488
 msgid "Source"
 msgstr "Quelle"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:481
+#: ../src/backend/filters/spatialAnalysis.cpp:491
 msgid "Ions to use for initiating RDF search"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:497
+#: ../src/backend/filters/spatialAnalysis.cpp:504
 msgid "Enable/disable ion as source"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:514
+#: ../src/backend/filters/spatialAnalysis.cpp:521
 msgid "Enable/disable all ions as target"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:529
+#: ../src/backend/filters/spatialAnalysis.cpp:533
 msgid "Enable/disable this ion as target"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:542
+#: ../src/backend/filters/spatialAnalysis.cpp:541
+#: ../src/backend/filters/spatialAnalysis.cpp:564
+#: ../src/backend/filters/spatialAnalysis.cpp:569
+#: ../src/backend/filters/spatialAnalysis.cpp:622
+#: ../src/backend/filters/spatialAnalysis.cpp:661
+msgid "Alg. Params."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:548
 msgid "Cutoff"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:545
+#: ../src/backend/filters/spatialAnalysis.cpp:551
 msgid "Remove points with local density above/below this value"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:555
+#: ../src/backend/filters/spatialAnalysis.cpp:557
 msgid "Retain Upper"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:558
+#: ../src/backend/filters/spatialAnalysis.cpp:560
 msgid "Retain either points with density above (enabled) or below cutoff"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:604
+#: ../src/backend/filters/spatialAnalysis.cpp:610
 msgid "Vector between centre and end of cylinder"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:622
-msgid "Alg. Params."
+#: ../src/backend/filters/spatialAnalysis.cpp:629
+#: ../src/backend/filters/spatialAnalysis.cpp:3217
+#: ../src/backend/filters/spatialAnalysis.cpp:3286
+msgid "Block size"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1022
+#: ../src/backend/filters/spatialAnalysis.cpp:632
+msgid "Number of ions to use per block"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:639
+msgid "Max Block Aspect"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:642
+msgid ""
+"Maximum allowable block aspect ratio. Blocks above this aspect are "
+"discarded. Setting too high decreases correlation strength. Too low causes "
+"loss of statistical power."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:653
+msgid "Extrusion Direction"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:656
+msgid "Direction in which blocks are extended during construction."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:665
+msgid "Plot Counts"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:668
+msgid "Show the counts in the binomial histogram"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:677
+msgid ""
+"Normalise the counts in the binomial histogram to a probability density "
+"function"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:691
+msgid "Display Grid"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:700
+msgid "View Options"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1227
 msgid "Spatial analysis aborted by user"
 msgstr "Spatial analysis aborted by user"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1024
+#: ../src/backend/filters/spatialAnalysis.cpp:1229
 msgid "Insufficient data to complete analysis."
 msgstr "Ungenügend Daten zum Fertigstellen der Analyse."
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1503
-#: ../src/backend/filters/spatialAnalysis.cpp:1557
-#: ../src/backend/filters/spatialAnalysis.cpp:1804
-#: ../src/backend/filters/spatialAnalysis.cpp:2100
-#: ../src/backend/filters/spatialAnalysis.cpp:2589
+#: ../src/backend/filters/spatialAnalysis.cpp:1231
+msgid "Insufficient bins in histogram for analysis."
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1233
+msgid "Insufficient memory for binomial. Reduce input size?"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1235
+msgid "Binomial requires a parent range file"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:1791
+#: ../src/backend/filters/spatialAnalysis.cpp:1843
+#: ../src/backend/filters/spatialAnalysis.cpp:2090
+#: ../src/backend/filters/spatialAnalysis.cpp:2388
+#: ../src/backend/filters/spatialAnalysis.cpp:2920
 msgid "Build"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1515
-#: ../src/backend/filters/spatialAnalysis.cpp:1569
+#: ../src/backend/filters/spatialAnalysis.cpp:1803
+#: ../src/backend/filters/spatialAnalysis.cpp:1855
 msgid "Surface"
 msgstr "Oberfläche"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1609
-#: ../src/backend/filters/spatialAnalysis.cpp:1831
-#: ../src/backend/filters/spatialAnalysis.cpp:2127
+#: ../src/backend/filters/spatialAnalysis.cpp:1895
+#: ../src/backend/filters/spatialAnalysis.cpp:2117
+#: ../src/backend/filters/spatialAnalysis.cpp:2415
 msgid "Analyse"
 msgstr "Analyse"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1666
-#: ../src/backend/filters/spatialAnalysis.cpp:1735
+#: ../src/backend/filters/spatialAnalysis.cpp:1952
+#: ../src/backend/filters/spatialAnalysis.cpp:2021
 msgid "Radial Distance"
 msgstr "Radialer Abstand"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1670
+#: ../src/backend/filters/spatialAnalysis.cpp:1956
 msgid "NN Freq."
 msgstr "NN Freq."
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1726
+#: ../src/backend/filters/spatialAnalysis.cpp:2012
 msgid "Warning, "
 msgstr "Warnung, "
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1727
+#: ../src/backend/filters/spatialAnalysis.cpp:2013
 msgid ""
 " points were unable to find neighbour points that exceeded the search "
 "radius, and thus terminated prematurely"
@@ -3417,54 +3626,63 @@ msgstr ""
 " Punkte konnten keine Nachbapunkte die den Suchradius überschritten finden "
 "und beendeten vorzeitig."
 
-#: ../src/backend/filters/spatialAnalysis.cpp:1737
+#: ../src/backend/filters/spatialAnalysis.cpp:2023
 msgid " RDF"
 msgstr " RDF"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2027
-#: ../src/backend/filters/spatialAnalysis.cpp:2333
+#: ../src/backend/filters/spatialAnalysis.cpp:2313
+#: ../src/backend/filters/spatialAnalysis.cpp:2621
 msgid "Number Density (\\#/Vol^3)"
 msgstr "Number Density (\\#/Vol^3)"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2054
-#: ../src/backend/filters/spatialAnalysis.cpp:2358
+#: ../src/backend/filters/spatialAnalysis.cpp:2342
+#: ../src/backend/filters/spatialAnalysis.cpp:2648
 msgid "Warning,"
 msgstr "Warnung,"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2055
-#: ../src/backend/filters/spatialAnalysis.cpp:2359
+#: ../src/backend/filters/spatialAnalysis.cpp:2343
+#: ../src/backend/filters/spatialAnalysis.cpp:2649
 msgid " points were un-analysable. These have been dropped"
 msgstr " points were un-analysable. These have been dropped"
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2077
-#: ../src/backend/filters/spatialAnalysis.cpp:2381
+#: ../src/backend/filters/spatialAnalysis.cpp:2365
+#: ../src/backend/filters/spatialAnalysis.cpp:2671
 msgid "And so on..."
 msgstr "Und so weiter..."
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2461
+#: ../src/backend/filters/spatialAnalysis.cpp:2754
 msgid "Extract"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2512
+#: ../src/backend/filters/spatialAnalysis.cpp:2829
 msgid "Reduce"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2606
+#: ../src/backend/filters/spatialAnalysis.cpp:2937
 msgid "Compute"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2631
+#: ../src/backend/filters/spatialAnalysis.cpp:2965
 msgid "Insufficient points to complete analysis"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2669
+#: ../src/backend/filters/spatialAnalysis.cpp:3001
 msgid "Axial Distance"
 msgstr ""
 
-#: ../src/backend/filters/spatialAnalysis.cpp:2671
+#: ../src/backend/filters/spatialAnalysis.cpp:3003
 msgid " 1D Dist. Func."
 msgstr ""
 
+#: ../src/backend/filters/spatialAnalysis.cpp:3087
+msgid "Binomial"
+msgstr ""
+
+#: ../src/backend/filters/spatialAnalysis.cpp:3219
+#: ../src/backend/filters/spatialAnalysis.cpp:3288
+msgid "Rel. Frequency"
+msgstr ""
+
 #: ../src/backend/filters/transform.cpp:77
 msgid "Translate"
 msgstr "Translate"
@@ -3505,122 +3723,122 @@ msgstr "Boundbox Zentrum"
 msgid "Mass Centre"
 msgstr "Massen-Zentrum"
 
-#: ../src/backend/filters/transform.cpp:1054
+#: ../src/backend/filters/transform.cpp:1052
 msgid "Mass-to-Charge (amu/e)"
 msgstr "Masse-zu-Ladung (amu/e)"
 
-#: ../src/backend/filters/transform.cpp:1108
+#: ../src/backend/filters/transform.cpp:1106
 msgid "Shuffle"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1124
+#: ../src/backend/filters/transform.cpp:1130
 msgid "Splice"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1179
+#: ../src/backend/filters/transform.cpp:1185
 msgid "Algorithm to use to transform point data"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1195
+#: ../src/backend/filters/transform.cpp:1201
 msgid "Origin mode"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1198
+#: ../src/backend/filters/transform.cpp:1204
 msgid "Select how transform origin is computed"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1203
+#: ../src/backend/filters/transform.cpp:1209
 msgid "Show marker"
 msgstr "Zeige Markierung"
 
-#: ../src/backend/filters/transform.cpp:1207
+#: ../src/backend/filters/transform.cpp:1213
 msgid "Display an interactive object to set transform origin"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1209
+#: ../src/backend/filters/transform.cpp:1215
 msgid "Display a small marker to denote transform origin"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1225
+#: ../src/backend/filters/transform.cpp:1231
 msgid "Translation"
 msgstr "Translation"
 
-#: ../src/backend/filters/transform.cpp:1228
+#: ../src/backend/filters/transform.cpp:1234
 msgid "Translation vector for transform"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1240
+#: ../src/backend/filters/transform.cpp:1246
 msgid "Offset"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1244
+#: ../src/backend/filters/transform.cpp:1250
 msgid "Scalar to use to offset each point's associated value"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1261
-#: ../src/backend/filters/transform.cpp:1288
+#: ../src/backend/filters/transform.cpp:1267
+#: ../src/backend/filters/transform.cpp:1294
 msgid "Origin of scale trasnform"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1268
-#: ../src/backend/filters/transform.cpp:1295
+#: ../src/backend/filters/transform.cpp:1274
+#: ../src/backend/filters/transform.cpp:1301
 msgid "Scale Fact."
 msgstr "Skalierungsfaktor"
 
-#: ../src/backend/filters/transform.cpp:1271
-#: ../src/backend/filters/transform.cpp:1298
+#: ../src/backend/filters/transform.cpp:1277
+#: ../src/backend/filters/transform.cpp:1304
 msgid "Enlargement factor for scaling around origin"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1314
+#: ../src/backend/filters/transform.cpp:1320
 msgid "Origin of rotation"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1322
+#: ../src/backend/filters/transform.cpp:1328
 msgid "Axis around which to revolve"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1327
+#: ../src/backend/filters/transform.cpp:1333
 msgid "Angle (deg)"
 msgstr "Winkel (deg)"
 
-#: ../src/backend/filters/transform.cpp:1330
+#: ../src/backend/filters/transform.cpp:1336
 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1347
+#: ../src/backend/filters/transform.cpp:1353
 msgid "Noise Type"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1350
+#: ../src/backend/filters/transform.cpp:1356
 msgid "Method to use to degrade point data"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1357
+#: ../src/backend/filters/transform.cpp:1363
 msgid "Noise level"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1359
+#: ../src/backend/filters/transform.cpp:1365
 msgid "Standard dev."
 msgstr "Standardabweichung"
 
-#: ../src/backend/filters/transform.cpp:1367
+#: ../src/backend/filters/transform.cpp:1373
 msgid "Amplitude of noise"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1379
+#: ../src/backend/filters/transform.cpp:1385
 msgid "Transform Params"
 msgstr "Transformationsparameter"
 
-#: ../src/backend/filters/transform.cpp:1576
+#: ../src/backend/filters/transform.cpp:1582
 msgid "Unable to allocate memory"
 msgstr "Kann Speicher nicht zuweisen"
 
-#: ../src/backend/filters/transform.cpp:1755
+#: ../src/backend/filters/transform.cpp:1761
 msgid "White"
 msgstr ""
 
-#: ../src/backend/filters/transform.cpp:1757
+#: ../src/backend/filters/transform.cpp:1763
 msgid "Gaussian"
 msgstr ""
 
@@ -3636,102 +3854,102 @@ msgstr ""
 msgid "Dimension"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:532
+#: ../src/backend/filters/boundingBox.cpp:524
 msgid "If true, show box, otherwise hide box"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:545
+#: ../src/backend/filters/boundingBox.cpp:537
 msgid "Style"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:548
+#: ../src/backend/filters/boundingBox.cpp:540
 msgid "Box display mode"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:559
+#: ../src/backend/filters/boundingBox.cpp:551
 msgid "Fixed Tick Num"
 msgstr "Fixed Tick Num"
 
-#: ../src/backend/filters/boundingBox.cpp:563
+#: ../src/backend/filters/boundingBox.cpp:555
 msgid ""
 "If true, evenly use specified number of ticks. Otherwise, use distance to "
 "determine tick count"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:571
+#: ../src/backend/filters/boundingBox.cpp:563
 msgid "Num X"
 msgstr "Num X"
 
-#: ../src/backend/filters/boundingBox.cpp:574
+#: ../src/backend/filters/boundingBox.cpp:566
 msgid "Tick count in X direction"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:579
+#: ../src/backend/filters/boundingBox.cpp:571
 msgid "Num Y"
 msgstr "Num Y"
 
-#: ../src/backend/filters/boundingBox.cpp:582
+#: ../src/backend/filters/boundingBox.cpp:574
 msgid "Tick count in Y direction"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:587
+#: ../src/backend/filters/boundingBox.cpp:579
 msgid "Num Z"
 msgstr "Num Z"
 
-#: ../src/backend/filters/boundingBox.cpp:590
+#: ../src/backend/filters/boundingBox.cpp:582
 msgid "Tick count in Z direction"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:596
+#: ../src/backend/filters/boundingBox.cpp:588
 msgid "Spacing X"
 msgstr "X-Abstand"
 
-#: ../src/backend/filters/boundingBox.cpp:600
+#: ../src/backend/filters/boundingBox.cpp:592
 msgid "Distance between ticks on X axis"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:604
+#: ../src/backend/filters/boundingBox.cpp:596
 msgid "Spacing Y"
 msgstr "Y-Abstand"
 
-#: ../src/backend/filters/boundingBox.cpp:608
+#: ../src/backend/filters/boundingBox.cpp:600
 msgid "Distance between ticks on Y axis"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:612
+#: ../src/backend/filters/boundingBox.cpp:604
 msgid "Spacing Z"
 msgstr "Z-Abstand"
 
-#: ../src/backend/filters/boundingBox.cpp:616
+#: ../src/backend/filters/boundingBox.cpp:608
 msgid "Distance between ticks on Z axis"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:619
+#: ../src/backend/filters/boundingBox.cpp:611
 msgid "Tick marks"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:629
+#: ../src/backend/filters/boundingBox.cpp:621
 msgid "Box Colour"
 msgstr "Box Farbe"
 
-#: ../src/backend/filters/boundingBox.cpp:633
+#: ../src/backend/filters/boundingBox.cpp:625
 msgid "Colour of the bounding box"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:638
+#: ../src/backend/filters/boundingBox.cpp:630
 msgid "Line thickness"
 msgstr "Linienbreite"
 
-#: ../src/backend/filters/boundingBox.cpp:642
+#: ../src/backend/filters/boundingBox.cpp:634
 msgid "Thickness of the lines used to draw the box"
 msgstr ""
 
-#: ../src/backend/filters/boundingBox.cpp:650
+#: ../src/backend/filters/boundingBox.cpp:642
 #: ../src/backend/filters/annotation.cpp:845
 msgid "Font Size"
 msgstr "Schriftgröße"
 
-#: ../src/backend/filters/boundingBox.cpp:653
+#: ../src/backend/filters/boundingBox.cpp:645
 msgid "Relative size for text"
 msgstr ""
 
@@ -3812,23 +4030,11 @@ msgstr "Textgröße"
 msgid "Relative size of annotation text"
 msgstr ""
 
-#: ../src/backend/filters/annotation.cpp:606
-#: ../src/backend/filters/annotation.cpp:645
-#: ../src/backend/filters/annotation.cpp:812
-msgid "Start"
-msgstr "Anfang"
-
 #: ../src/backend/filters/annotation.cpp:610
 #: ../src/backend/filters/annotation.cpp:649
 msgid "3D position for tail of arrow"
 msgstr ""
 
-#: ../src/backend/filters/annotation.cpp:614
-#: ../src/backend/filters/annotation.cpp:654
-#: ../src/backend/filters/annotation.cpp:820
-msgid "End"
-msgstr "Ende"
-
 #: ../src/backend/filters/annotation.cpp:618
 #: ../src/backend/filters/annotation.cpp:658
 msgid "3D Position to which arrow points"
@@ -3961,51 +4167,51 @@ msgstr ""
 msgid "Colour for ruler and ticks"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:464
+#: ../src/backend/filters/ionDownsample.cpp:460
 msgid "By Count"
 msgstr "Nach Anzahl"
 
-#: ../src/backend/filters/ionDownsample.cpp:467
+#: ../src/backend/filters/ionDownsample.cpp:463
 msgid "Sample up to a fixed number of ions"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:473
+#: ../src/backend/filters/ionDownsample.cpp:469
 msgid "Per Species"
 msgstr "Nach Spezies"
 
-#: ../src/backend/filters/ionDownsample.cpp:477
+#: ../src/backend/filters/ionDownsample.cpp:473
 msgid "Use species specific (from ranging) sampling values"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:482
+#: ../src/backend/filters/ionDownsample.cpp:478
 msgid "Sampling rates"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:505
+#: ../src/backend/filters/ionDownsample.cpp:501
 msgid "Sampling value for species"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:517
+#: ../src/backend/filters/ionDownsample.cpp:513
 msgid "Output Count"
 msgstr "Ausgabe Anzahl"
 
-#: ../src/backend/filters/ionDownsample.cpp:520
+#: ../src/backend/filters/ionDownsample.cpp:516
 msgid "Sample up to this value of points"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:525
+#: ../src/backend/filters/ionDownsample.cpp:521
 msgid "Out Fraction"
 msgstr "Ausgabe Anteil"
 
-#: ../src/backend/filters/ionDownsample.cpp:529
+#: ../src/backend/filters/ionDownsample.cpp:525
 msgid "Sample this fraction of points"
 msgstr ""
 
-#: ../src/backend/filters/ionDownsample.cpp:677
+#: ../src/backend/filters/ionDownsample.cpp:669
 msgid "Downsample Aborted"
 msgstr "Datenreduktion abgebrochen"
 
-#: ../src/backend/filters/ionDownsample.cpp:679
+#: ../src/backend/filters/ionDownsample.cpp:671
 msgid "Insuffient memory for downsample"
 msgstr "Nicht genug Speicher zur Datenreduktion"
 
@@ -4017,122 +4223,161 @@ msgstr "Geradlinig"
 msgid "Convex hull"
 msgstr "Konvexe Hülle"
 
-#: ../src/backend/filters/ionInfo.cpp:195
+#: ../src/backend/filters/ionInfo.cpp:193
 msgid "No ions"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:233
+#: ../src/backend/filters/ionInfo.cpp:231
 msgid "--Counts--"
 msgstr "- Anzahl -"
 
-#: ../src/backend/filters/ionInfo.cpp:245
+#: ../src/backend/filters/ionInfo.cpp:241
 msgid "Total Ranged\t"
 msgstr "Gesamt ranged\t"
 
-#: ../src/backend/filters/ionInfo.cpp:250
+#: ../src/backend/filters/ionInfo.cpp:246
 msgid "Total (incl. unranged)\t"
 msgstr "Total (inkl. nicht geranged)"
 
-#: ../src/backend/filters/ionInfo.cpp:263
+#: ../src/backend/filters/ionInfo.cpp:259
 msgid "n/a"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:273
+#: ../src/backend/filters/ionInfo.cpp:269
 msgid "Unranged"
 msgstr "Nicht Geranged"
 
-#: ../src/backend/filters/ionInfo.cpp:289
+#: ../src/backend/filters/ionInfo.cpp:282
 msgid "Number of points : "
 msgstr "Anzahl der Punkte: "
 
-#: ../src/backend/filters/ionInfo.cpp:318
+#: ../src/backend/filters/ionInfo.cpp:311
 msgid "Rectilinear Bounds : "
 msgstr "Geradlinige Grenzen:"
 
-#: ../src/backend/filters/ionInfo.cpp:323
+#: ../src/backend/filters/ionInfo.cpp:316
 msgid "Volume (len^3): "
 msgstr "Volumen (Läng.^3)"
 
-#: ../src/backend/filters/ionInfo.cpp:339
+#: ../src/backend/filters/ionInfo.cpp:332
 msgid "Convex Volume (len^3): "
 msgstr "Konvexes Volumen (Läng.^3)"
 
-#: ../src/backend/filters/ionInfo.cpp:341
+#: ../src/backend/filters/ionInfo.cpp:334
 msgid "Unable to compute volume"
 msgstr "Kann Volumen nicht berechnen"
 
-#: ../src/backend/filters/ionInfo.cpp:370
+#: ../src/backend/filters/ionInfo.cpp:363
 msgid "Ranged Density (pts/vol):"
 msgstr "Ranged Dichte (pts / vol):"
 
-#: ../src/backend/filters/ionInfo.cpp:375
+#: ../src/backend/filters/ionInfo.cpp:368
 msgid "Total Density (pts/vol):"
 msgstr "Gesamtdichte (pts / vol):"
 
-#: ../src/backend/filters/ionInfo.cpp:403
+#: ../src/backend/filters/ionInfo.cpp:396
 msgid "Compositions"
 msgstr "Zusammensetzungen"
 
-#: ../src/backend/filters/ionInfo.cpp:404
+#: ../src/backend/filters/ionInfo.cpp:397
 msgid "Display compositional data for points in console"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:408
+#: ../src/backend/filters/ionInfo.cpp:401
 msgid "Counts"
 msgstr "Anzahl"
 
-#: ../src/backend/filters/ionInfo.cpp:409
+#: ../src/backend/filters/ionInfo.cpp:402
 msgid "Display count data for points in console"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:423
+#: ../src/backend/filters/ionInfo.cpp:416
 msgid "Normalise count data"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:432
+#: ../src/backend/filters/ionInfo.cpp:425
 msgid "Volume"
 msgstr "Volumen"
 
-#: ../src/backend/filters/ionInfo.cpp:435
+#: ../src/backend/filters/ionInfo.cpp:428
 msgid "Compute volume for point data"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:450
+#: ../src/backend/filters/ionInfo.cpp:443
 msgid "Select volume counting technique"
 msgstr ""
 
-#: ../src/backend/filters/ionInfo.cpp:546
+#: ../src/backend/filters/ionInfo.cpp:539
 msgid "Insufficient memory for operation"
 msgstr "Nicht genügend Speicher für Operation"
 
-#: ../src/backend/filters/ionInfo.cpp:550
+#: ../src/backend/filters/ionInfo.cpp:543
 msgid "Bug? Problem with qhull library, cannot run convex hull."
 msgstr "Bug? Problem mit qhull Bibliothek. Kann convex hull nicht ausführen."
 
-#: ../src/backend/filters/dataLoad.cpp:47
+#: ../src/backend/filters/dataLoad.cpp:56
+msgid "Auto"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:57
+msgid "Little"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:58
+msgid "Big"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:61
 msgid "POS Data"
 msgstr "Pos-Daten"
 
-#: ../src/backend/filters/dataLoad.cpp:48
+#: ../src/backend/filters/dataLoad.cpp:62
 msgid "Text Data"
 msgstr "Text-Daten"
 
-#: ../src/backend/filters/dataLoad.cpp:227
+#: ../src/backend/filters/dataLoad.cpp:63
+msgid "ATO Data"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:242
 msgid " does not exist"
 msgstr " existiert nicht"
 
-#: ../src/backend/filters/dataLoad.cpp:264
-#: ../src/backend/filters/dataLoad.cpp:275
-#: ../src/backend/filters/dataLoad.cpp:295
-#: ../src/backend/filters/dataLoad.cpp:307
+#: ../src/backend/filters/dataLoad.cpp:280
+#: ../src/backend/filters/dataLoad.cpp:293
+#: ../src/backend/filters/dataLoad.cpp:336
+#: ../src/backend/filters/dataLoad.cpp:347
+#: ../src/backend/filters/dataLoad.cpp:408
 msgid "Error loading file: "
 msgstr "Fehler beim Laden der Datei: "
 
-#: ../src/backend/filters/dataLoad.cpp:321
-msgid "Data file contained incorrect number of columns -- should be 4, was "
-msgstr "Datei enthielt falsche Anzahl von Spalten - sollte 4 sein, war "
+#: ../src/backend/filters/dataLoad.cpp:310
+msgid "Sampling is active, loaded "
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:311
+msgid " available."
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:319
+msgid "Loaded entire dataset, "
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:319
+#: ../src/backend/filters/dataLoad.cpp:418
+msgid " points."
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:362
+msgid ""
+"Data file contained incorrect number of columns -- should be 3 or 4, was "
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:417
+msgid "Loaded dataset, "
+msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:374
+#: ../src/backend/filters/dataLoad.cpp:449
 msgid ""
 "Warning:One or more bounds of the loaded data approaches the limits of "
 "numerical stability for the internal data type(magnitude too large). "
@@ -4142,119 +4387,119 @@ msgstr ""
 "der numerischen Stabilität des internen Datentyps (Größenordnung zu groß). "
 "Erwägen Sie die Daten vor dem Laden zu skalieren. "
 
-#: ../src/backend/filters/dataLoad.cpp:381
-msgid "Loaded "
-msgstr "Geladen "
-
-#: ../src/backend/filters/dataLoad.cpp:381
-msgid " Points"
-msgstr " Punkte"
-
-#: ../src/backend/filters/dataLoad.cpp:409
-#: ../src/backend/filters/rangeFile.cpp:559
+#: ../src/backend/filters/dataLoad.cpp:481
+#: ../src/backend/filters/rangeFile.cpp:567
 msgid "File"
 msgstr "Datei"
 
-#: ../src/backend/filters/dataLoad.cpp:410
+#: ../src/backend/filters/dataLoad.cpp:482
 msgid "File from which to load data"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:421
+#: ../src/backend/filters/dataLoad.cpp:493
 msgid "File type"
 msgstr "Dateityp"
 
-#: ../src/backend/filters/dataLoad.cpp:423
+#: ../src/backend/filters/dataLoad.cpp:495
 msgid "Type of file to be loaded"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:437
+#: ../src/backend/filters/dataLoad.cpp:509
 msgid "Entries per point"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:438
+#: ../src/backend/filters/dataLoad.cpp:510
 msgid "Number of decimal values in file per 3D point (normally 4)"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:466
+#: ../src/backend/filters/dataLoad.cpp:529
+msgid "File \"Endianness\""
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:530
+msgid "On-disk data storage format. If file won't load, just try each"
+msgstr ""
+
+#: ../src/backend/filters/dataLoad.cpp:555
 msgid "Relative offset of each entry in file for point's X position"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:474
+#: ../src/backend/filters/dataLoad.cpp:563
 msgid "Relative offset of each entry in file for point's Y position"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:482
+#: ../src/backend/filters/dataLoad.cpp:571
 msgid "Relative offset of each entry in file for point's Z position"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:490
+#: ../src/backend/filters/dataLoad.cpp:579
 msgid ""
 "Relative offset of each entry in file to use for scalar value of 3D point"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:493
+#: ../src/backend/filters/dataLoad.cpp:582
 msgid "Value Label"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:497
+#: ../src/backend/filters/dataLoad.cpp:586
 msgid "Name for the scalar value associated with each point"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:500
+#: ../src/backend/filters/dataLoad.cpp:589
 msgid "Format params."
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:506
+#: ../src/backend/filters/dataLoad.cpp:595
 msgid "Enabled"
 msgstr "Aktiviert"
 
-#: ../src/backend/filters/dataLoad.cpp:510
+#: ../src/backend/filters/dataLoad.cpp:599
 msgid "Load this file?"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:518
+#: ../src/backend/filters/dataLoad.cpp:610
 msgid "Sample data"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:521
+#: ../src/backend/filters/dataLoad.cpp:613
 msgid ""
 "Perform random selection on file contents, instead of loading entire file"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:528
+#: ../src/backend/filters/dataLoad.cpp:620
 msgid "Load Limit (MB)"
 msgstr "Ladelimit (MB)"
 
-#: ../src/backend/filters/dataLoad.cpp:531
+#: ../src/backend/filters/dataLoad.cpp:623
 msgid "Limit for size of data to load"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:537
+#: ../src/backend/filters/dataLoad.cpp:630
 msgid "Monitor"
 msgstr "Monitor"
 
-#: ../src/backend/filters/dataLoad.cpp:541
+#: ../src/backend/filters/dataLoad.cpp:634
 msgid ""
 "Watch file timestamp to track changes to file contents from other programs"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:543
+#: ../src/backend/filters/dataLoad.cpp:636
 msgid "Load params."
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:553
+#: ../src/backend/filters/dataLoad.cpp:646
 msgid "Default colour "
 msgstr "Bevorzugte Farbe "
 
-#: ../src/backend/filters/dataLoad.cpp:556
+#: ../src/backend/filters/dataLoad.cpp:649
 msgid "Default colour for points, if not overridden by other filters"
 msgstr ""
 
-#: ../src/backend/filters/dataLoad.cpp:561
+#: ../src/backend/filters/dataLoad.cpp:654
 msgid "Draw Size"
 msgstr "Draw Size"
 
-#: ../src/backend/filters/dataLoad.cpp:564
+#: ../src/backend/filters/dataLoad.cpp:657
 msgid "Default size for points, if not overridden by other filters"
 msgstr ""
 
@@ -4270,164 +4515,164 @@ msgstr "Anzahl"
 msgid "Mixed data"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:399
+#: ../src/backend/filters/spectrumPlot.cpp:400
 msgid "Step size for spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:408
+#: ../src/backend/filters/spectrumPlot.cpp:409
 msgid "Auto Min/max"
 msgstr "Auto Min/max"
 
-#: ../src/backend/filters/spectrumPlot.cpp:412
+#: ../src/backend/filters/spectrumPlot.cpp:413
 msgid "Automatically compute spectrum upper and lower bound"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:417
+#: ../src/backend/filters/spectrumPlot.cpp:418
 msgid "Min"
 msgstr "Min"
 
-#: ../src/backend/filters/spectrumPlot.cpp:420
+#: ../src/backend/filters/spectrumPlot.cpp:421
 msgid "Starting position for spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:425
+#: ../src/backend/filters/spectrumPlot.cpp:426
 msgid "Max"
 msgstr "Max"
 
-#: ../src/backend/filters/spectrumPlot.cpp:428
+#: ../src/backend/filters/spectrumPlot.cpp:429
 msgid "Ending position for spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:436
+#: ../src/backend/filters/spectrumPlot.cpp:437
 msgid "Logarithmic"
 msgstr "Logarithmisch"
 
-#: ../src/backend/filters/spectrumPlot.cpp:439
+#: ../src/backend/filters/spectrumPlot.cpp:440
 msgid "Convert the plot to logarithmic mode"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:461
+#: ../src/backend/filters/spectrumPlot.cpp:462
 msgid "Visual style of plot"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:474
+#: ../src/backend/filters/spectrumPlot.cpp:475
 msgid "Colour of plotted spectrum"
 msgstr ""
 
-#: ../src/backend/filters/spectrumPlot.cpp:708
+#: ../src/backend/filters/spectrumPlot.cpp:709
 msgid "Insufficient memory for spectrum filter."
 msgstr "Nicht genügend Speicher für Spektrumfilter"
 
-#: ../src/backend/filters/spectrumPlot.cpp:710
+#: ../src/backend/filters/spectrumPlot.cpp:711
 msgid "Bad bincount value in spectrum filter."
 msgstr "Falsche Binanzahl im Spektrumfilter."
 
-#: ../src/backend/filters/rangeFile.cpp:143
+#: ../src/backend/filters/rangeFile.cpp:149
 msgid "Pre-Allocate"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:274 ../src/backend/filter.cpp:46
+#: ../src/backend/filters/rangeFile.cpp:280 ../src/backend/filter.cpp:46
 msgid "Range"
 msgstr "Range"
 
-#: ../src/backend/filters/rangeFile.cpp:561
+#: ../src/backend/filters/rangeFile.cpp:569
 msgid "File to use for range data"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:573
+#: ../src/backend/filters/rangeFile.cpp:581
 msgid "Drop unranged"
 msgstr "Nicht gerangete ausschalten"
 
-#: ../src/backend/filters/rangeFile.cpp:575
+#: ../src/backend/filters/rangeFile.cpp:583
 msgid "Remove unranged points when generating output"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:595
+#: ../src/backend/filters/rangeFile.cpp:603
 msgid "All Ions"
 msgstr "Alle Ionen"
 
-#: ../src/backend/filters/rangeFile.cpp:596
+#: ../src/backend/filters/rangeFile.cpp:604
 msgid "Enable/disable all ions at once"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:604
+#: ../src/backend/filters/rangeFile.cpp:612
 msgid "Species"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:611
+#: ../src/backend/filters/rangeFile.cpp:619
 msgid "IonID "
 msgstr "IonID "
 
-#: ../src/backend/filters/rangeFile.cpp:612
+#: ../src/backend/filters/rangeFile.cpp:620
 msgid "Enable/disable specified ion"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:625
+#: ../src/backend/filters/rangeFile.cpp:633
 msgid "Active Ion "
 msgstr "Actives Ion "
 
-#: ../src/backend/filters/rangeFile.cpp:627
+#: ../src/backend/filters/rangeFile.cpp:635
 msgid "If true, ion is used in output"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:641
+#: ../src/backend/filters/rangeFile.cpp:649
 msgid "Colour "
 msgstr "Farbe"
 
-#: ../src/backend/filters/rangeFile.cpp:644
+#: ../src/backend/filters/rangeFile.cpp:652
 msgid "Colour used to represent ion"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:668
+#: ../src/backend/filters/rangeFile.cpp:676
 msgid "All Ranges"
 msgstr "Alle Range"
 
-#: ../src/backend/filters/rangeFile.cpp:669
+#: ../src/backend/filters/rangeFile.cpp:677
 msgid "Enable/disable all ranges"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:687
+#: ../src/backend/filters/rangeFile.cpp:695
 msgid "Active Rng "
 msgstr "Activer Rng "
 
-#: ../src/backend/filters/rangeFile.cpp:690
+#: ../src/backend/filters/rangeFile.cpp:698
 msgid ""
 "Enable/disable specified range (ion must also be enabled to activiate range)"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:694
+#: ../src/backend/filters/rangeFile.cpp:702
 msgid "Ion "
 msgstr "Ion "
 
-#: ../src/backend/filters/rangeFile.cpp:697
+#: ../src/backend/filters/rangeFile.cpp:705
 msgid "Name of ion associate to this range"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:706
+#: ../src/backend/filters/rangeFile.cpp:714
 msgid "Start rng "
 msgstr "Start rng "
 
-#: ../src/backend/filters/rangeFile.cpp:709
+#: ../src/backend/filters/rangeFile.cpp:717
 msgid "Start value for range"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:714
+#: ../src/backend/filters/rangeFile.cpp:722
 msgid "End rng "
 msgstr "End rng "
 
-#: ../src/backend/filters/rangeFile.cpp:717
+#: ../src/backend/filters/rangeFile.cpp:725
 msgid "Stopping value for range`"
 msgstr ""
 
-#: ../src/backend/filters/rangeFile.cpp:1021
+#: ../src/backend/filters/rangeFile.cpp:1029
 msgid "Ranging aborted by user"
 msgstr "Ranging durch User abgebrochen"
 
-#: ../src/backend/filters/rangeFile.cpp:1023
+#: ../src/backend/filters/rangeFile.cpp:1031
 msgid "Insufficient memory for range"
 msgstr "Nicht genug Speicher für Range"
 
-#: ../src/backend/state.cpp:120
+#: ../src/backend/state.cpp:137
 msgid ""
 "This file is a \"state\" file for the 3Depict program, and stores "
 "information about a particular analysis session. This file should be a valid "
@@ -4437,29 +4682,29 @@ msgstr ""
 "Informationen über die jeweiligen Analysesitzung. Dies sollte ein gültige "
 "\"XML\" Datei sein."
 
-#: ../src/backend/state.cpp:248
+#: ../src/backend/state.cpp:290
 msgid "Failed to allocate parser"
 msgstr "Kann Parser nicht zuordnen"
 
-#: ../src/backend/state.cpp:283
+#: ../src/backend/state.cpp:326
 msgid ""
 "Unable to retrieve root node in input state file... Is this really a non-"
 "empty XML file?"
 msgstr ""
 
-#: ../src/backend/state.cpp:290
+#: ../src/backend/state.cpp:333
 msgid "Base state node missing. Is this really a state XML file??"
 msgstr ""
 
-#: ../src/backend/state.cpp:319
+#: ../src/backend/state.cpp:362
 msgid "State was created by a newer version of this program.. "
 msgstr "Status wurde von einer neueren Version dieses Programmes erstellt.. "
 
-#: ../src/backend/state.cpp:320
+#: ../src/backend/state.cpp:363
 msgid "file reading will continue, but may fail."
 msgstr "Datei wird weiter eingelesen kann aber unter Umständen fehlschlagen."
 
-#: ../src/backend/state.cpp:325
+#: ../src/backend/state.cpp:368
 msgid ""
 "Warning, unparseable version number in state file. File reading will "
 "continue, but may fail"
@@ -4467,108 +4712,108 @@ msgstr ""
 "Warnung: Nicht lesbare Versionsnummer in Statusdatei. Datei wird weiter "
 "eingelesen kann aber unter Umständen fehlschlagen."
 
-#: ../src/backend/state.cpp:332
+#: ../src/backend/state.cpp:375
 msgid "Unable to find the \"writer\" node"
 msgstr "Kann \"writer\" node nicht finden"
 
-#: ../src/backend/state.cpp:342
+#: ../src/backend/state.cpp:385
 msgid "Unable to find the \"backcolour\" node."
 msgstr "Unable to find the \"backcolour\" node."
 
-#: ../src/backend/state.cpp:349
+#: ../src/backend/state.cpp:392
 msgid "\"backcolour\" node missing \"r\" value."
 msgstr "\"backcolour\" node fehlt \"r\" Wert."
 
-#: ../src/backend/state.cpp:354
+#: ../src/backend/state.cpp:397
 msgid "Unable to interpret \"backColour\" node's \"r\" value."
 msgstr "Kann \"backColour\" node's \"r\" Wert nicht interpretieren."
 
-#: ../src/backend/state.cpp:362
+#: ../src/backend/state.cpp:405
 msgid "\"backcolour\" node missing \"g\" value."
 msgstr "\"backcolour\" node fehlt \"g\" Wert."
 
-#: ../src/backend/state.cpp:368
+#: ../src/backend/state.cpp:411
 msgid "Unable to interpret \"backColour\" node's \"g\" value."
 msgstr "Kann \"backColour\" node's \"g\" Wert nicht interpretieren."
 
-#: ../src/backend/state.cpp:376
+#: ../src/backend/state.cpp:419
 msgid "\"backcolour\" node missing \"b\" value."
 msgstr "\"backcolour\" node fehlt \"b\" Wert."
 
-#: ../src/backend/state.cpp:382
+#: ../src/backend/state.cpp:425
 msgid "Unable to interpret \"backColour\" node's \"b\" value."
 msgstr "Kann \"backColour\" node's \"b\" Wert nicht interpretieren."
 
-#: ../src/backend/state.cpp:389
+#: ../src/backend/state.cpp:432
 msgid "\"backcolour\"s rgb values must be in range [0,1]"
 msgstr "\"backcolour\"s rgb Wert muss im Bereich [0,1] liegen"
 
-#: ../src/backend/state.cpp:417
+#: ../src/backend/state.cpp:460
 msgid "Unable to find or interpret \"showaxis\" node"
 msgstr "Kann \"showaxis\" node nicht interpretieren"
 
-#: ../src/backend/state.cpp:424
+#: ../src/backend/state.cpp:504
 msgid "Unable to locate \"filtertree\" node."
 msgstr "Kann \"filtertree\" node nicht finden."
 
-#: ../src/backend/state.cpp:440
+#: ../src/backend/state.cpp:520
 msgid "Cameras section missing \"active\" node."
 msgstr "Cameras section fehlt \"active\" node."
 
-#: ../src/backend/state.cpp:448
+#: ../src/backend/state.cpp:528
 msgid "Unable to find property \"value\"  for \"cameras->active\" node."
 msgstr "Kann \"Eigenschaftswert\"  für \"Kamera->aktiv\" Node nicht finden."
 
-#: ../src/backend/state.cpp:454
+#: ../src/backend/state.cpp:534
 msgid "Unable to interpret property \"value\"  for \"cameras->active\" node."
 msgstr ""
 "Kann \"Eigenschaftswert\"  für \"Kamera->aktiv\" Node nicht interpretieren."
 
-#: ../src/backend/state.cpp:473
+#: ../src/backend/state.cpp:553
 msgid "Failed to interpret camera state for camera : "
 msgstr ""
 
-#: ../src/backend/state.cpp:481
+#: ../src/backend/state.cpp:561
 msgid "Unable to interpret the camera type for camera : "
 msgstr "Kann den Kameratype nicht interpretieren für :"
 
-#: ../src/backend/state.cpp:517
+#: ../src/backend/state.cpp:597
 msgid "Unable to locate stash name for stash "
 msgstr "Kann den Stashnamen für Stash  nicht finden"
 
-#: ../src/backend/state.cpp:524
+#: ../src/backend/state.cpp:604
 msgid "Empty stash name for stash "
 msgstr "Leerer Stashname für Stash"
 
-#: ../src/backend/state.cpp:533
+#: ../src/backend/state.cpp:613
 msgid "No filter tree for stash:"
 msgstr ""
 
-#: ../src/backend/state.cpp:539
+#: ../src/backend/state.cpp:619
 msgid "For stash "
 msgstr "Für Stash "
 
-#: ../src/backend/state.cpp:570
+#: ../src/backend/state.cpp:651
 msgid "Unrecognised effect :"
 msgstr "Nichterkannter Effekt :"
 
-#: ../src/backend/state.cpp:580
+#: ../src/backend/state.cpp:661
 msgid "Duplicate effect found"
 msgstr "Doppelter Effekt gefunden"
 
-#: ../src/backend/state.cpp:580
+#: ../src/backend/state.cpp:661
 msgid " cannot use."
 msgstr "kann nicht   verwenden."
 
-#: ../src/backend/state.cpp:590
+#: ../src/backend/state.cpp:671
 msgid "Error reading effect : "
 msgstr "Fehler beim Lesen:"
 
-#: ../src/backend/state.cpp:651
+#: ../src/backend/state.cpp:789
 msgid "-merge"
 msgstr ""
 
-#: ../src/backend/state.cpp:656
+#: ../src/backend/state.cpp:794
 msgid ""
 " Unable to merge stashes correctly. This is improbable, so please report "
 "this."
@@ -4576,130 +4821,146 @@ msgstr ""
 " Kann stashes nicht korrekt zusammenführen. Dies ist nicht möglich bitte "
 "melden Sie das."
 
-#: ../src/backend/filtertreeAnalyse.cpp:198
+#: ../src/backend/filtertreeAnalyse.cpp:199
 msgid ""
 "Parent filter has no output, but filter requires input -- there is no point "
 "in placing a child filter here."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:199
+#: ../src/backend/filtertreeAnalyse.cpp:200
 msgid "Leaf-only filter with child"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:209
+#: ../src/backend/filtertreeAnalyse.cpp:210
 msgid ""
 "Parent filters' output will be blocked by child, without use. Parent results "
 "will be dropped."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:210
-#: ../src/backend/filtertreeAnalyse.cpp:224
+#: ../src/backend/filtertreeAnalyse.cpp:211
+#: ../src/backend/filtertreeAnalyse.cpp:225
 msgid "Bad parent->child pair"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:223
+#: ../src/backend/filtertreeAnalyse.cpp:224
 msgid ""
 "First filter does not output anything useable by child filter. Child filter "
 "not useful."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:303
+#: ../src/backend/filtertreeAnalyse.cpp:304
 msgid "Spatial results possibly altered"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:304
+#: ../src/backend/filtertreeAnalyse.cpp:305
 msgid ""
 "Filters and settings selected that could alter reported results that depend "
 "upon density. Check to see if spatial sampling may be happening in the "
 "filter tree - this warning is provisional only."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:372
+#: ../src/backend/filtertreeAnalyse.cpp:373
 msgid "Filter needs parent \""
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:373
+#: ../src/backend/filtertreeAnalyse.cpp:374
 msgid ""
 "\" but does not have one. Filter may not function correctly until this "
 "parent is given."
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:374
+#: ../src/backend/filtertreeAnalyse.cpp:375
 msgid "Filter missing needed parent"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:553
+#: ../src/backend/filtertreeAnalyse.cpp:554
 msgid "Composition results possibly altered"
 msgstr ""
 
-#: ../src/backend/filtertreeAnalyse.cpp:554
+#: ../src/backend/filtertreeAnalyse.cpp:555
 msgid ""
 "Filters and settings selected that could bias reported composition. Check to "
 "see if species biasing may occcur in the filter tree - this warning is "
 "provisional only."
 msgstr ""
 
-#: ../src/backend/APT/APTFileIO.cpp:39
+#: ../src/backend/APT/APTFileIO.cpp:40
 msgid "Memory allocation failure on POS load"
 msgstr "Speicherzuweisungsfeher beim Laden der pos-Datei"
 
-#: ../src/backend/APT/APTFileIO.cpp:40
+#: ../src/backend/APT/APTFileIO.cpp:41
 msgid "Error opening pos file"
 msgstr "Fehler beim Öffnen der pos-Datei"
 
-#: ../src/backend/APT/APTFileIO.cpp:41
+#: ../src/backend/APT/APTFileIO.cpp:42
 msgid "Pos file empty"
 msgstr "Pos-Datei ist leer"
 
-#: ../src/backend/APT/APTFileIO.cpp:42
+#: ../src/backend/APT/APTFileIO.cpp:43
 msgid "Pos file size appears to have non-integer number of entries"
 msgstr ""
 "Pos-Dateigröße scheint eine nicht ganzzahlige Anzahl an Einträgen zu haben"
 
-#: ../src/backend/APT/APTFileIO.cpp:43
+#: ../src/backend/APT/APTFileIO.cpp:44
 msgid "Error reading from pos file (after open)"
 msgstr "Fehler beim Lesen aus pos-Datei (nach dem öffnen)"
 
-#: ../src/backend/APT/APTFileIO.cpp:44
+#: ../src/backend/APT/APTFileIO.cpp:45
 msgid "Error - Found NaN in pos file"
 msgstr "Fehler - Fand NaN in pos-Datei"
 
-#: ../src/backend/APT/APTFileIO.cpp:45
+#: ../src/backend/APT/APTFileIO.cpp:46
 msgid "Pos load aborted by interrupt."
 msgstr "Pos laden durch Interrupt abgebrochen."
 
-#: ../src/backend/APT/APTFileIO.cpp:62
+#: ../src/backend/APT/APTFileIO.cpp:66
 msgid "No numerical data found"
 msgstr "Keine numerischen Daten gefunden"
 
-#: ../src/backend/APT/APTFileIO.cpp:63
+#: ../src/backend/APT/APTFileIO.cpp:67
 msgid "Error re-opening file, after first scan"
 msgstr "Fehler beim nochmaligen Öffnen der Datei nach dem ersten Scan"
 
-#: ../src/backend/APT/APTFileIO.cpp:64
+#: ../src/backend/APT/APTFileIO.cpp:68
 msgid "Unable to read file contents after open"
 msgstr "Kann den Dateiinhalt nach dem Öffnen nich lesen"
 
-#: ../src/backend/APT/APTFileIO.cpp:66
+#: ../src/backend/APT/APTFileIO.cpp:70
 msgid "Incorrect number of fields in file"
 msgstr "Die Datei enthält eine falsche Anzahl von Feldern"
 
-#: ../src/backend/APT/APTFileIO.cpp:67
+#: ../src/backend/APT/APTFileIO.cpp:71 ../src/backend/APT/APTFileIO.cpp:93
 msgid "Unable to allocate memory to store data"
 msgstr "Kann Speicher nicht zuordnen"
 
-#: ../src/backend/APT/APTRanges.cpp:46
+#: ../src/backend/APT/APTFileIO.cpp:90
+msgid "File is empty"
+msgstr ""
+
+#: ../src/backend/APT/APTFileIO.cpp:91
+msgid "Filesize does not match expected format"
+msgstr ""
+
+#: ../src/backend/APT/APTFileIO.cpp:92
+msgid "File version number not <4, as expected"
+msgstr ""
+
+#: ../src/backend/APT/APTFileIO.cpp:94
+msgid "Unable to detect endian-ness in file"
+msgstr ""
+
+#: ../src/backend/APT/APTRanges.cpp:47
 msgid "Error opening file, check name and permissions."
 msgstr "Fehler beim Öffnen der Datei, überprüfe Namen und Berechtigungen."
 
-#: ../src/backend/APT/APTRanges.cpp:47
+#: ../src/backend/APT/APTRanges.cpp:48
 msgid ""
 "Error interpreting range file header, expecting ion count and range count, "
 "respectively."
 msgstr ""
 "Fehler beim Rangedatei interpretieren, erwarte Ionenanzahl bzw. Rangeanzahl."
 
-#: ../src/backend/APT/APTRanges.cpp:48
+#: ../src/backend/APT/APTRanges.cpp:49
 msgid ""
 "Range file appears to be empty, check file is a proper range file and is not "
 "empty."
@@ -4707,15 +4968,15 @@ msgstr ""
 "Rangedatei scheint leer zu sein. Prüfe ob die Datei wirklich ein Rangedatei "
 "und nicht leer ist."
 
-#: ../src/backend/APT/APTRanges.cpp:49
+#: ../src/backend/APT/APTRanges.cpp:50
 msgid "Error reading the long name for ion."
 msgstr "Fehler beim Lesen des langen Namens für Ion."
 
-#: ../src/backend/APT/APTRanges.cpp:50
+#: ../src/backend/APT/APTRanges.cpp:51
 msgid "Error reading the short name for ion."
 msgstr "Fehler beim Lesen des kurzen Namens für Ion."
 
-#: ../src/backend/APT/APTRanges.cpp:51
+#: ../src/backend/APT/APTRanges.cpp:52
 msgid ""
 "Error reading colour data in the file, expecting 3 decimal values, space "
 "separated."
@@ -4723,39 +4984,39 @@ msgstr ""
 "Fehler beim Lesen der Farbinformationen in der Datei. Erwarte 3, durch "
 "Leerzeichen getrennte, Dezimalwerte."
 
-#: ../src/backend/APT/APTRanges.cpp:52
+#: ../src/backend/APT/APTRanges.cpp:53
 msgid ""
 "Tried skipping to table separator line (line with dashes), but did not find "
 "it."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:53
+#: ../src/backend/APT/APTRanges.cpp:54
 msgid ""
 "Number of ions in the table header did not match the number specified at the "
 "start of the file"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:54
+#: ../src/backend/APT/APTRanges.cpp:55
 msgid ""
 "Unexpected failure whilst trying to skip over range lead-in data (bit before "
 "range start value)"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:55
+#: ../src/backend/APT/APTRanges.cpp:56
 msgid ""
 "Range table had an incorrect number of entries, should be 2 or 3 + number of "
 "ranges"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:56
+#: ../src/backend/APT/APTRanges.cpp:57
 msgid "Unable to read range start and end values"
 msgstr "Kann Anfangs und Endwert des Range nicht lesen"
 
-#: ../src/backend/APT/APTRanges.cpp:57
+#: ../src/backend/APT/APTRanges.cpp:58
 msgid "Unable to read range table entry"
 msgstr "Kann Rangetabelleneintrag nich lesen"
 
-#: ../src/backend/APT/APTRanges.cpp:58
+#: ../src/backend/APT/APTRanges.cpp:59
 msgid ""
 "Error reading file, unexpected format, are you sure it is a proper range "
 "file?"
@@ -4763,31 +5024,31 @@ msgstr ""
 "Fehler beim Lesen der Datei: Unerwartetes Format, sind Sie sicher, dass dies "
 "eine korrekte Rangedatei ist?"
 
-#: ../src/backend/APT/APTRanges.cpp:59
+#: ../src/backend/APT/APTRanges.cpp:60
 msgid ""
 "Too many ranges appeared to have range entries with no usable data (eg, all "
 "blank)"
 msgstr "Zu viele Ranges scheinen  ungültige Einträge zu haben (z.B. alle leer)"
 
-#: ../src/backend/APT/APTRanges.cpp:60
+#: ../src/backend/APT/APTRanges.cpp:61
 msgid ""
 "Range file appears to contain malformed data, check things like start and "
 "ends of m/c are not equal or flipped."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:61
+#: ../src/backend/APT/APTRanges.cpp:62
 msgid "Range file appears to be inconsistent (eg, overlapping ranges)"
 msgstr "Rangedatei schein inkonsistent zu sein (z.B. überlappende Ranges)"
 
-#: ../src/backend/APT/APTRanges.cpp:62
+#: ../src/backend/APT/APTRanges.cpp:63
 msgid "No ion name mapping found  for multiple ion."
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:63
+#: ../src/backend/APT/APTRanges.cpp:64
 msgid "Polyatomic extension range matches multiple masses in first section"
 msgstr ""
 
-#: ../src/backend/APT/APTRanges.cpp:1273
+#: ../src/backend/APT/APTRanges.cpp:1387
 msgid ""
 "Range headings do not match order of the ions listed in the name "
 "specifications. The name specification ordering will be used when reading "
@@ -4804,11 +5065,15 @@ msgstr "Zeichnen"
 msgid "Voxel"
 msgstr "Voxel"
 
+#: ../src/wx/wxcomponents.h:98
+msgid "treeCtrl"
+msgstr ""
+
 #: ../src/backend/filters/transform.h:71
 msgid "Ion. Transform"
 msgstr "Ion. Transformieren"
 
-#: ../src/backend/filters/ionColour.h:59
+#: ../src/backend/filters/ionColour.h:61
 msgid "Spectral Colour"
 msgstr "Spectral Farbe"
 
@@ -4824,11 +5089,11 @@ msgstr "Ion Sampler"
 msgid "Ion info"
 msgstr "Ioneninfo"
 
-#: ../src/backend/filters/dataLoad.h:131
+#: ../src/backend/filters/dataLoad.h:136
 msgid "Pos Data"
 msgstr "POS-Daten"
 
-#: ../src/backend/filters/externalProgram.h:56
+#: ../src/backend/filters/externalProgram.h:69
 msgid "Ext. Program"
 msgstr "Ext. Programm"
 
@@ -4836,6 +5101,116 @@ msgstr "Ext. Programm"
 msgid "Ranging"
 msgstr "Ranging"
 
-#: ../src/backend/filters/compositionProfile.h:110
+#: ../src/backend/filters/compositionProfile.h:117
 msgid "Comp. Prof."
 msgstr "Konz. Prof."
+
+#: ../data/startup-tips.txt:5
+msgid ""
+"You can reset the main view by tapping the space bar. Hold down modifier "
+"keys like shift,ctrl to change the axis. Double tap to switch which axis to "
+"look down"
+msgstr ""
+
+#: ../data/startup-tips.txt:6
+msgid ""
+"You can delete filters from the tree by selecting them, then tapping delete?"
+msgstr ""
+
+#: ../data/startup-tips.txt:7
+msgid ""
+"Multiple languages are supported? You can translate the program into your "
+"own language at https://www.transifex.com/projects/p/3depict/"
+msgstr ""
+
+#: ../data/startup-tips.txt:8
+msgid ""
+"Package files can be easily shared to allow others to view your analysis, "
+"using the File->Export->Package menu item"
+msgstr ""
+
+#: ../data/startup-tips.txt:9
+msgid ""
+"You can export plots to SVG \"Vector\" format, for easier editing - edit "
+"your plots in inkscape!"
+msgstr ""
+
+#: ../data/startup-tips.txt:10
+msgid "You can access the manual from the Help menu"
+msgstr ""
+
+#: ../data/startup-tips.txt:11
+msgid "You can change filter defaults using the Edit->Preferences menu item"
+msgstr ""
+
+#: ../data/startup-tips.txt:12
+msgid ""
+"You can overlay multiple plots at once, by selecting more than on plot at a "
+"time (e.g. using Ctrl)"
+msgstr ""
+
+#: ../data/startup-tips.txt:13
+msgid ""
+"Calculations are much faster (more than linear speedup) when working with "
+"smaller datasets - try sampling, or clipping out a small region to work "
+"faster, then remove the sampling when you are ready"
+msgstr ""
+
+#: ../data/startup-tips.txt:14
+msgid "You can abort most calculations by pressing Escape"
+msgstr ""
+
+#: ../data/startup-tips.txt:15
+msgid ""
+"That anyone can contribute to improving this program, even without knowing "
+"about computer programming?"
+msgstr ""
+
+#: ../data/startup-tips.txt:16
+msgid ""
+"You can load more than one file at a time, then either operate on the "
+"separately, or together"
+msgstr ""
+
+#: ../data/startup-tips.txt:17
+msgid ""
+"You can have more than one range file for different parts of your dataset"
+msgstr ""
+
+#: ../data/startup-tips.txt:18
+msgid ""
+"Cameras can be saved and retrieved whenever you like, using the camera tab"
+msgstr ""
+
+#: ../data/startup-tips.txt:19
+msgid ""
+"Subsections of the filter tree can be saved to the \"Stashed filters\" drop-"
+"down"
+msgstr ""
+
+#: ../data/startup-tips.txt:20
+msgid ""
+"The console tab along the bottom often shows useful messages from filters. "
+"When new messages appear, a small symbol is shown on the tab"
+msgstr ""
+
+#: ../data/startup-tips.txt:21
+msgid ""
+"The raw data used for any plot can be accessed from the \"Raw\" tab on the "
+"bottom panel"
+msgstr ""
+
+#: ../data/startup-tips.txt:22
+msgid ""
+"You can ask questions about the program, or using it on your data on our "
+"forums (http://sourceforge.net/apps/phpbb/threedepict/)"
+msgstr ""
+
+#: ../data/startup-tips.txt:23
+msgid ""
+"By creating a camera, you can switch between orthographic and perspective "
+"views"
+msgstr ""
+
+
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/3depict.git



More information about the debian-science-commits mailing list