[med-svn] [beast2-mcmc] 02/08: Imported Upstream version 2.4.1+dfsg

Andreas Tille tille at debian.org
Wed May 4 09:36:12 UTC 2016


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

tille pushed a commit to branch master
in repository beast2-mcmc.

commit 531b3f57459d7ff47856a79ff9de39cf0ba9ff4a
Author: Andreas Tille <tille at debian.org>
Date:   Wed May 4 11:09:31 2016 +0200

    Imported Upstream version 2.4.1+dfsg
---
 build.xml                                          |  26 ++-
 examples/nexus/primate-mtDNA.nex                   |   2 +-
 release/Linux/bin/beast                            |  11 +-
 release/common/README.txt                          |   6 +-
 release/common/VERSION HISTORY.txt                 |  18 +-
 src/beast/app/BEASTVersion.java                    |   4 +-
 src/beast/app/BEASTVersion2.java                   |  36 ++++
 src/beast/app/BeastMCMC.java                       |   2 +-
 src/beast/app/DocMaker.java                        |   2 +-
 src/beast/app/beastapp/BeastLauncher.java          | 121 +++++++++--
 src/beast/app/beastapp/BeastMain.java              |  46 ++---
 src/beast/app/beauti/Beauti.java                   |  79 +++++---
 src/beast/app/beauti/BeautiAlignmentProvider.java  |  20 +-
 src/beast/app/beauti/BeautiConfig.java             |   9 +
 src/beast/app/beauti/BeautiDoc.java                |  61 ++++++
 src/beast/app/beauti/BeautiLauncher.java           |   3 +-
 src/beast/app/beauti/MRCAPriorInputEditor.java     |  11 +-
 src/beast/app/beauti/PriorListInputEditor.java     |  13 ++
 src/beast/app/beauti/TaxonSetInputEditor.java      |  93 +++++----
 src/beast/app/tools/EBSPAnalyser.java              |   4 +-
 src/beast/app/tools/LogCombiner.java               |   4 +-
 src/beast/app/treeannotator/TreeAnnotator.java     |  10 +-
 src/beast/app/util/Utils.java                      |  62 ------
 src/beast/app/util/Utils6.java                     |  68 +++++++
 src/beast/core/MCMC.java                           |   7 +-
 .../evolution/alignment/FilteredAlignment.java     |  27 ++-
 .../evolution/likelihood/BeagleTreeLikelihood.java |  44 ++--
 src/beast/evolution/operators/Exchange.java        |  95 +++------
 .../evolution/substitutionmodel/Frequencies.java   |   2 +-
 src/beast/evolution/tree/Node.java                 |   2 +-
 src/beast/util/AddOnManager.java                   |   4 +-
 src/beast/util/JSONProducer.java                   |   4 +-
 src/beast/util/LogAnalyser.java                    |  39 ++--
 src/beast/util/LogComparator.java                  |   4 +-
 src/beast/util/NexusParser.java                    | 225 ++++++++++++++++++---
 .../evolution/alignment/FilteredAlignmentTest.java |  20 ++
 src/test/beast/integration/XMLProducerTest.java    |  84 +++++++-
 version.xml                                        |   2 +-
 38 files changed, 942 insertions(+), 328 deletions(-)

diff --git a/build.xml b/build.xml
index ee8e6f8..ba0e4f1 100644
--- a/build.xml
+++ b/build.xml
@@ -163,13 +163,18 @@
         <copy file="${dist}/beast.jar" todir="${release_dir}/package/lib/"/>
         <copy file="../beast2/version.xml" todir="${release_dir}/package/"/>
 
-        <jar jarfile="${release_dir}/package/beast.package.${version}.zip">
+        <jar jarfile="${release_dir}/package/BEAST.addon.v${version}.zip">
             <fileset dir="${release_dir}/package">
                 <include name="version.xml" />
                 <include name="lib/beast.jar" />
                 <include name="beast.src.jar" />
             </fileset>
-        </jar>
+            <fileset dir=".">
+                <include name="templates/*.xml" />
+                <include name="examples/*.*" />
+                <include name="examples/nexus/*.*" />
+            </fileset>
+         </jar>
 
 </target>
 
@@ -237,7 +242,7 @@
 
 
     <!-- Release -->
-    <property name="version" value="2.4.0" />
+    <property name="version" value="2.4.1" />
     <property name="version_number" value="2.4.0" />
     <property name="release_dir" value="release" />
     <property name="copyright" value="Beast 2 development team 2011-2016" />
@@ -311,7 +316,15 @@
                   fileVersion="${version_number}.0"
                   txtFileVersion="${version}"
                   productVersion="${version_number}.0"
-                  txtProductVersion="${version}" />
+                  txtProductVersion="${version}" >
+                  <!-- to bunle a JRE, copy the desired JRE to folder ../jre 
+                       (so java.exe is in ../jre/bin/) and uncomment following fragment
+                       TODO: needs testing
+                  <jre>
+                      <path>../jre</path>
+    			  </jre>
+    			  -->
+         </launch4j>
 
         <!-- BEAST v?.?.?.exe -->
         <launch4j configFile="${Windows_dir}/BEAST_launch4j.xml"
@@ -512,6 +525,9 @@
                    copyright="${BEAST_name}, ${copyright}"
                    mainclassname="beast.app.beastapp.BeastLauncher">
             <!--librarypath file="${dist}/beast.jar"/-->
+            <!-- adding a 'runtime' entry will include the JRE for OSX
+            <runtime dir="/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home"/>
+            -->
             <classpath file="${Mac_package_dir}/lib/launcher.jar"/>
             <option value="-Xmx4g"/>
             <option value="-Dapple.laf.useScreenMenuBar=true"/>
@@ -670,7 +686,7 @@
 
         <delete file="${Mac_dir}/pack.temp.dmg"/>
         
-       <copy file="${Mac_dir}/${BEAST_name} v${version}.dmg" tofile="../../tmp/${Mac_dir}/${BEAST_name}.v${version}.dmg" />
+       <copy file="${Mac_dir}/${BEAST_name} v${version}.dmg" tofile="../../tmp/${BEAST_name}.v${version}.dmg" />
 
 
         <echo message="Mac version release is finished." />
diff --git a/examples/nexus/primate-mtDNA.nex b/examples/nexus/primate-mtDNA.nex
index bf738b4..6a3d8c7 100644
--- a/examples/nexus/primate-mtDNA.nex
+++ b/examples/nexus/primate-mtDNA.nex
@@ -1 +1 @@
-#NEXUS

[!Data from:
	Hayasaka, K., T. Gojobori, and S. Horai. 1988. Molecular phylogeny
		and evolution of primate mitochondrial DNA. Mol. Biol. Evol.
		5:626-644.
]

begin taxa;
	dimensions ntax=12;
	taxlabels
Lemur_catta	
Homo_sapiens
Pan
Gorilla
Pongo
Hylobates
Macaca_fuscata
M._mulatta
M._fascicularis 
M._sylvanus
Saimiri_sciureus
Tarsius_syrichta
;
end;

begin characters;
	dimensions nchar=898;
	format missing=? gap=- matchchar=. datatype=dna;
	options gapmode=missing;
	matrix
[                                                                                                                      1                                                                                                   2                                                                                                   3                                                                                                   4                                                                          [...]
[                            1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7    [...]
[                   12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 [...]

Lemur_catta         AAGCTTCATAGGAGCAACCATTCTAATAATCGCACATGGCCTTACATCATCCATATTATTCTGTCTAGCCAACTCTAACTACGAACGAATCCATAGCCGTACAATACTACTAGCACGAGGGATCCAAACCATTCTCCCTCTTATAGCCACCTGATGACTACTCGCCAGCCTAACTAACCTAGCCCTACCCACCTCTATCAATTTAATTGGCGAACTATTCGTCACTATAGCATCCTTCTCATGATCAAACATTACAATTATCTTAATAGGCTTAAATATGCTCATCACCGCTCTCTATTCCCTCTATATATTAACTACTACACAACGAGGAAAACTCACATATCATTCGCACAACCTAAACCCATCCTTTACACGAGAAAACACCCTTATATCCATACACATACTCCCCCTTCTCCTATTTACCTTAAACCCCAAAATTATTCTAGGACCCACGTACTGTAAATATAGTTTAA [...]
Homo_sapiens        ........CC..C...GT......C........C..C..G........C..AT..C.......C.....A.....A...........C.CT..C..T..C.TC...A.C..CT.T.A...AC.T.....TC.A.....A..A.....TTTT........T..A..A.....CG.......C...T.....C..A....T..CC..C.G..A.....C.CT..GCTAG..A.CA.G.....C........T..C..TC.CC.AC.T.C...AC.C..C..A..AG....A..C..A..C........C.....T..C..A......T.G..CTC......CC.C..CATTA.....A....A..C..A..C.................C..G.T.......C..TC....A.......CC.AT..C.C......G.C..C...ACC..GTTTT.C.CT................ [...]
Pan                 ........CC..C....TT..C..C........C..C..A........C..AT..........C.....A.....A..T..T.....C.C...C..T..C.TC...A.T..CT.C.A...AC.T.....TC.A.....A..A......TTT........C..A..A.....CG.......C.........C.TA.C..T...C.CC.A..G.....C.C...GCTAG..A.C..A.....C........T.CC..TC.CC.AC.C.C...A..C..C..A..A.....A..C..G..C........C..G..T..C..A......T....CTC......CC.C..CATTA.T...A....G..C..A..C...........T..T..C....TTT.....C..TC....A.C.....TC.AT..C.C..T..TG.T..C..CACT...TT...C.C................. [...]
Gorilla             ........CC..C...GTTG....T.....T..C..C..A...........AT..........C.....A.....A.............C...C.....C.TC...A.T..CT.T.A...AC........C.A.....A..A......CTT........T..G..A.....CG.C.....C...T.....C..A.C..T..CC..C.A..A..G..C.C...ACTAG..A.CA.A.....C..........CC..CC..T.AC.T.C...A.CT..C..A..A..T..A..C..G..C.....T........T..C..A......T....CCC.......C.C..CATCAC....A....A..C..A................T...C....T...G...C..TC....A.C.....CC.AT..C.C......G.T.....CACC..GTT...C.C................. [...]
Pongo               ........CC..C.......CC..C..G..T..C.....A..C.....C...C..C.G.....C.....A.....A.............C...C.....C.TC...A.C..CT.T.A...CC.T.....TC.A.....C..A......CT.........T..A..A.....C........T........AC..A.C.....CC.TC.A..A.....C.C...ACTA.....CATA.....T.....T.....C..C..CC.AC...C...AC.C..C..A..A.....AA.C..A..C..T...........C..C..A...........T.C..C....C.C..CATCA.....A....A..T..T..C.....C.....T.....C..GCT.......C..TC....A.C.....C..AT..C.C.......GC..C..CGCT..GTT.G.C................... [...]
Hylobates           ......T.C...T......G.C..C........C..C..A..A..C..T...C.GC.......C..T..A.....A.............CT..C.....C.TC...A.C...T.T......C.....G..T.A.....A..G......TT.........CGCA..A.....CG.......C.........C..A....T..CC.CC.A..T.....C.....ACTA..G..C........C..GG......C...T....CAC.C.CC..GC.C..CG.A..A.....G..C..A..C.....T..C.....T.TC.TA...........C.C...T...C.C..CATTA.A...A....A..C..AC.C.............TAT.A...CTT..G...C.CT.......C.....CC.A...C.C.....T..C..C...ACT..CTTT..TCC.......C......... [...]
Macaca_fuscata      ......TTCC..C........C..T..G.....T..C..A..C..C..T.......AT.....C........T..A.....T.....C.CT..C.A......C........GT.C.....AC.T....T.C.A..T..A..A.C....TTT......T..ACA..A.....T........T.........C..A........C..C.A..T.....C..T..A.TCGC.A.C..A.....C.....CC.T..C..C.....GC...C...AC.T..C..AT.A..T..G..C.....C..T...C.C.....C.....A.............C.......C....CATAAT....A....G..CC....C..............AT.A....T.......C.CGCT..AA..A....TC.AT..C.C........C..C..C..G..GTTT..C.C.....G........... [...]
M._mulatta          ......TTCT..C........C..C..G..T..T..C..A..C..C..T.......AT.....C........T..A.....T.....C.CT..C.A......C........GT.C..G..AC.T....T.C.A..T..A..A.C...TTT.......T..ACA..A.....T........T.........C..A.......CC..C.A..T.....C..T..A.TCGCGA.C..A.....C..G..CC.T..C..C.....A....C...A..T..C..A..A..T..G..C.....C......C.C.....C..C..A............GC.......C....CATAAT....A....A..CC....C.............TAT.A....T.......C.CGCT..AA.CA....CC.AT.TC.C........C..C..C..G..GTTT..T.C.....G........... [...]
M._fascicularis     .......TCC..C.......CC..T........C..C..G..C..C..T.....G.AT.....CT.G.....T..A.....T..G..C.CT....A......C.........T.C.....AC.T....TTC.A..T..AT.G.C....TT.........CACA..A.....T........T.........C..A....T...C..C.A........C..T..A.TC.C.A.T..A..T..C.....CC.T..C..C...G.G....CG...C.T.....A..A.....A..C.....C..T...C.C..G..C.T...AGT...........C.......C.C..CATAAT...TA....A..CC....C.............TAT.A....T.......C.CGCT..AA..A....TC.AT.TC.C........C..C..C..G..GTTT..C.C................. [...]
M._sylvanus         .......TCC..T.....T..C..T...G.T..C.....A..C..C..T.......AC.....CT.G........A...........C.C...C.....C.TC.........T.C.....AC......T.C.A.....A..A.C....TT.......T.CACA..A.....T.....T..T..T......T..A....T...C..C.G........C.....A.TCGC.A.C..A..T..C.....CC....C..C..C..AC...C...AC.G..C..A..A..T..A..C.....C..T..TC.C.....C..C..A............GCG......C.C..CATAATT...A....A...C.T..C.............TAT.A...CT.......C.CGCT..AA..A.T..TC.AT.TC.T........C..C.........TTT..T.C................. [...]
Saimiri_sciureus    ........CC..C....TG..C...........T..C..GT....T..G..T..GC.......C.....A.....A..T...........T..C.....A......AC.T.TA.T......C.......AC.AT....G.......G.CT.........C..A..A.AT..CG.......C...........AG....T...C..G.A..A...T..C..ACA.TCG..T.T........T.....C...T....T.....A..C.C...AC.T.....A..A..T..A..A.....C..A..TC....G.ATG.CT.......G.....TCC...T.....CAGCA.CAG...TA....A...ATA..............T..G..A....TT.....T...ACA..AA.C.....CC.......G.G......GG.A...A........T.ACCT.....T.........G [...]
Tarsius_syrichta    ...T.....T.....C....C...T.....T..C........C..C..C...C.......T..C.....A..TA.A............G....C..T..A......GC......C..T..CC.T......C.AT.A......GC...A..A........C.........T....C.....G.....T...C.AA.A..T........C..T.....G.C...A.TA......G.A..T.....G...C..C.A..T.........G.....C.T..C.CC..T........C..A........A......C...TC.TA..T............TA..........ATCA....TA.C.TG..CC.T..C..C........T..AT.A...AT.......C..T.T...T.AA.....C.AT.TACC.........G.A...A.....A...T.................... [...]
	;
end;

begin assumptions;
	charset coding = 2-457 660-896;
	charset noncoding = 1 458-659 897-898;
	charset 1stpos = 2-457\3 660-896\3;
	charset 2ndpos = 3-457\3 661-896\3;
	charset 3rdpos = 4-457\3 662-.\3;
	
	exset coding = noncoding;
	exset noncoding = coding;
	
	usertype 2_1 = 4		[weights transversions 2 times transitions]
		a  c  g  t
	[a]	.  2  1  2
	[c] 2  .  2  1
	[g]	1  2  .  2
	[t]	2  1  2  .
		;
	usertype 3_1 = 4		[weights transversions 3 times transitions]
		a  c  g  t
	[a]	.  3  1  3
	[c] 3  .  3  1
	[g]	1  3  .  3
	[t]	3  1  3  .
		;
		
	taxset hominoids = Homo_sapiens Pan Gorilla Pongo Hylobates;
end;

begin paup;
	constraints ch = ((Homo_sapiens,Pan));
	constraints chg = ((Homo_sapiens,Pan,Gorilla));
end;

\ No newline at end of file
+#NEXUS

[!Data from:
	Hayasaka, K., T. Gojobori, and S. Horai. 1988. Molecular phylogeny
		and evolution of primate mitochondrial DNA. Mol. Biol. Evol.
		5:626-644.
]

begin taxa;
	dimensions ntax=12;
	taxlabels
Lemur_catta	
Homo_sapiens
Pan
Gorilla
Pongo
Hylobates
Macaca_fuscata
M._mulatta
M._fascicularis 
M._sylvanus
Saimiri_sciureus
Tarsius_syrichta
;
end;

begin characters;
	dimensions nchar=898;
	format missing=? gap=- matchchar=. datatype=dna;
	options gapmode=missing;
	matrix
[                                                                                                                      1                                                                                                   2                                                                                                   3                                                                                                   4                                                                          [...]
[                            1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7    [...]
[                   12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 [...]

Lemur_catta         AAGCTTCATAGGAGCAACCATTCTAATAATCGCACATGGCCTTACATCATCCATATTATTCTGTCTAGCCAACTCTAACTACGAACGAATCCATAGCCGTACAATACTACTAGCACGAGGGATCCAAACCATTCTCCCTCTTATAGCCACCTGATGACTACTCGCCAGCCTAACTAACCTAGCCCTACCCACCTCTATCAATTTAATTGGCGAACTATTCGTCACTATAGCATCCTTCTCATGATCAAACATTACAATTATCTTAATAGGCTTAAATATGCTCATCACCGCTCTCTATTCCCTCTATATATTAACTACTACACAACGAGGAAAACTCACATATCATTCGCACAACCTAAACCCATCCTTTACACGAGAAAACACCCTTATATCCATACACATACTCCCCCTTCTCCTATTTACCTTAAACCCCAAAATTATTCTAGGACCCACGTACTGTAAATATAGTTTAA [...]
Homo_sapiens        ........CC..C...GT......C........C..C..G........C..AT..C.......C.....A.....A...........C.CT..C..T..C.TC...A.C..CT.T.A...AC.T.....TC.A.....A..A.....TTTT........T..A..A.....CG.......C...T.....C..A....T..CC..C.G..A.....C.CT..GCTAG..A.CA.G.....C........T..C..TC.CC.AC.T.C...AC.C..C..A..AG....A..C..A..C........C.....T..C..A......T.G..CTC......CC.C..CATTA.....A....A..C..A..C.................C..G.T.......C..TC....A.......CC.AT..C.C......G.C..C...ACC..GTTTT.C.CT................ [...]
Pan                 ........CC..C....TT..C..C........C..C..A........C..AT..........C.....A.....A..T..T.....C.C...C..T..C.TC...A.T..CT.C.A...AC.T.....TC.A.....A..A......TTT........C..A..A.....CG.......C.........C.TA.C..T...C.CC.A..G.....C.C...GCTAG..A.C..A.....C........T.CC..TC.CC.AC.C.C...A..C..C..A..A.....A..C..G..C........C..G..T..C..A......T....CTC......CC.C..CATTA.T...A....G..C..A..C...........T..T..C....TTT.....C..TC....A.C.....TC.AT..C.C..T..TG.T..C..CACT...TT...C.C................. [...]
Gorilla             ........CC..C...GTTG....T.....T..C..C..A...........AT..........C.....A.....A.............C...C.....C.TC...A.T..CT.T.A...AC........C.A.....A..A......CTT........T..G..A.....CG.C.....C...T.....C..A.C..T..CC..C.A..A..G..C.C...ACTAG..A.CA.A.....C..........CC..CC..T.AC.T.C...A.CT..C..A..A..T..A..C..G..C.....T........T..C..A......T....CCC.......C.C..CATCAC....A....A..C..A................T...C....T...G...C..TC....A.C.....CC.AT..C.C......G.T.....CACC..GTT...C.C................. [...]
Pongo               ........CC..C.......CC..C..G..T..C.....A..C.....C...C..C.G.....C.....A.....A.............C...C.....C.TC...A.C..CT.T.A...CC.T.....TC.A.....C..A......CT.........T..A..A.....C........T........AC..A.C.....CC.TC.A..A.....C.C...ACTA.....CATA.....T.....T.....C..C..CC.AC...C...AC.C..C..A..A.....AA.C..A..C..T...........C..C..A...........T.C..C....C.C..CATCA.....A....A..T..T..C.....C.....T.....C..GCT.......C..TC....A.C.....C..AT..C.C.......GC..C..CGCT..GTT.G.C................... [...]
Hylobates           ......T.C...T......G.C..C........C..C..A..A..C..T...C.GC.......C..T..A.....A.............CT..C.....C.TC...A.C...T.T......C.....G..T.A.....A..G......TT.........CGCA..A.....CG.......C.........C..A....T..CC.CC.A..T.....C.....ACTA..G..C........C..GG......C...T....CAC.C.CC..GC.C..CG.A..A.....G..C..A..C.....T..C.....T.TC.TA...........C.C...T...C.C..CATTA.A...A....A..C..AC.C.............TAT.A...CTT..G...C.CT.......C.....CC.A...C.C.....T..C..C...ACT..CTTT..TCC.......C......... [...]
Macaca_fuscata      ......TTCC..C........C..T..G.....T..C..A..C..C..T.......AT.....C........T..A.....T.....C.CT..C.A......C........GT.C.....AC.T....T.C.A..T..A..A.C....TTT......T..ACA..A.....T........T.........C..A........C..C.A..T.....C..T..A.TCGC.A.C..A.....C.....CC.T..C..C.....GC...C...AC.T..C..AT.A..T..G..C.....C..T...C.C.....C.....A.............C.......C....CATAAT....A....G..CC....C..............AT.A....T.......C.CGCT..AA..A....TC.AT..C.C........C..C..C..G..GTTT..C.C.....G........... [...]
M._mulatta          ......TTCT..C........C..C..G..T..T..C..A..C..C..T.......AT.....C........T..A.....T.....C.CT..C.A......C........GT.C..G..AC.T....T.C.A..T..A..A.C...TTT.......T..ACA..A.....T........T.........C..A.......CC..C.A..T.....C..T..A.TCGCGA.C..A.....C..G..CC.T..C..C.....A....C...A..T..C..A..A..T..G..C.....C......C.C.....C..C..A............GC.......C....CATAAT....A....A..CC....C.............TAT.A....T.......C.CGCT..AA.CA....CC.AT.TC.C........C..C..C..G..GTTT..T.C.....G........... [...]
M._fascicularis     .......TCC..C.......CC..T........C..C..G..C..C..T.....G.AT.....CT.G.....T..A.....T..G..C.CT....A......C.........T.C.....AC.T....TTC.A..T..AT.G.C....TT.........CACA..A.....T........T.........C..A....T...C..C.A........C..T..A.TC.C.A.T..A..T..C.....CC.T..C..C...G.G....CG...C.T.....A..A.....A..C.....C..T...C.C..G..C.T...AGT...........C.......C.C..CATAAT...TA....A..CC....C.............TAT.A....T.......C.CGCT..AA..A....TC.AT.TC.C........C..C..C..G..GTTT..C.C................. [...]
M._sylvanus         .......TCC..T.....T..C..T...G.T..C.....A..C..C..T.......AC.....CT.G........A...........C.C...C.....C.TC.........T.C.....AC......T.C.A.....A..A.C....TT.......T.CACA..A.....T.....T..T..T......T..A....T...C..C.G........C.....A.TCGC.A.C..A..T..C.....CC....C..C..C..AC...C...AC.G..C..A..A..T..A..C.....C..T..TC.C.....C..C..A............GCG......C.C..CATAATT...A....A...C.T..C.............TAT.A...CT.......C.CGCT..AA..A.T..TC.AT.TC.T........C..C.........TTT..T.C................. [...]
Saimiri_sciureus    ........CC..C....TG..C...........T..C..GT....T..G..T..GC.......C.....A.....A..T...........T..C.....A......AC.T.TA.T......C.......AC.AT....G.......G.CT.........C..A..A.AT..CG.......C...........AG....T...C..G.A..A...T..C..ACA.TCG..T.T........T.....C...T....T.....A..C.C...AC.T.....A..A..T..A..A.....C..A..TC....G.ATG.CT.......G.....TCC...T.....CAGCA.CAG...TA....A...ATA..............T..G..A....TT.....T...ACA..AA.C.....CC.......G.G......GG.A...A........T.ACCT.....T.........G [...]
Tarsius_syrichta    ...T.....T.....C....C...T.....T..C........C..C..C...C.......T..C.....A..TA.A............G....C..T..A......GC......C..T..CC.T......C.AT.A......GC...A..A........C.........T....C.....G.....T...C.AA.A..T........C..T.....G.C...A.TA......G.A..T.....G...C..C.A..T.........G.....C.T..C.CC..T........C..A........A......C...TC.TA..T............TA..........ATCA....TA.C.TG..CC.T..C..C........T..AT.A...AT.......C..T.T...T.AA.....C.AT.TACC.........G.A...A.....A...T.................... [...]
	;
end;

begin assumptions;
	charset coding = 2-457 660-896;
	charset noncoding = 1 458-659 897-898;
	charset 1stpos = 2-457\3 660-896\3;
	charset 2ndpos = 3-457\3 661-896\3;
	charset 3rdpos = 4-457\3 662-.\3;
	
	exset coding = noncoding;
	exset noncoding = coding;
	
	usertype 2_1 = 4		[weights transversions 2 times transitions]
		a  c  g  t
	[a]	.  2  1  2
	[c] 2  .  2  1
	[g]	1  2  .  2
	[t]	2  1  2  .
		;
	usertype 3_1 = 4		[weights transversions 3 times transitions]
		a  c  g  t
	[a]	.  3  1  3
	[c] 3  .  3  1
	[g]	1  3  .  3
	[t]	3  1  3  .
		;
		
end;
#	taxset hominoids = Homo_sapiens Pan Gorilla Pongo Hylobates;

begin paup;
	constraints ch = ((Homo_sapiens,Pan));
	constraints chg = ((Homo_sapiens,Pan,Gorilla));
end;

\ No newline at end of file
diff --git a/release/Linux/bin/beast b/release/Linux/bin/beast
index c947df4..9fc5a7c 100755
--- a/release/Linux/bin/beast
+++ b/release/Linux/bin/beast
@@ -31,7 +31,7 @@ else
 fi
 
 
-# use BEAGL_LIB if the BEAGLE library is not in a standard location
+# use BEAGLE_LIB if the BEAGLE library is not in a standard location
 if [ -n "$BEAGLE_LIB" ]; then
 	if [ -n "$BEAST_EXTRA_LIBS" ]; then
 		BEAST_EXTRA_LIBS=$BEAST_EXTRA_LIBS:$BEAGLE_LIB
@@ -40,6 +40,15 @@ if [ -n "$BEAGLE_LIB" ]; then
 	fi
 fi
 
+# Explicitly add /usr/local/lib to library search path to ensure 
+# beast continues to find beagle when installed here.  (This is
+# necessary due to known problems with certain JREs.)
+if [ -z "$LD_LIBRARY_PATH" ]; then
+    export LD_LIBRARY_PATH=/usr/local/lib
+else
+    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":/usr/local/lib
+fi
+
 # use BEAST_EXTRA_LIBS variable to load BEAGLE and other libraries from non-default locations 
 # this assumes that the library path contains all these libraries (or are set through LD_LIBRARY_PATH)
 if [ -n "$BEAST_EXTRA_LIBS" ]; then 
diff --git a/release/common/README.txt b/release/common/README.txt
index bf68ffb..44ca6a8 100644
--- a/release/common/README.txt
+++ b/release/common/README.txt
@@ -1,7 +1,7 @@
-                    BEAST v2.4.0 2016
+                    BEAST v2.4.1 2016
                  Beast 2 development team 2011-2016
 
-Last updated: March 2016
+Last updated: April 2016
 
 Contents:
 1) INTRODUCTION
@@ -46,7 +46,7 @@ BEAST requires a Java Virtual Machine to run. Many systems will already
 have this installed. It requires at least version 1.8 of Java to run. The
 latest versions of Java can be downloaded from:
 
-<http://java.sun.com/>
+<http://java.com/>
 
 If in doubt type "java -version" to see what version of java is installed
 (or if it is installed at all).
diff --git a/release/common/VERSION HISTORY.txt b/release/common/VERSION HISTORY.txt
index 77610f2..116e751 100644
--- a/release/common/VERSION HISTORY.txt	
+++ b/release/common/VERSION HISTORY.txt	
@@ -1,10 +1,26 @@
-                    BEAST v2.4.0 2016
+                    BEAST v2.4.1 2016
                  Beast 2 development team 2011-2016
 Version History
 Last updated: March 2016
 
 All issues can be viewed at https://github.com/CompEvol/beast2/issues
 ================================================================================
+Version 2.4.1 April 2016
+     BEAUti
+         import of calibrations from NEXUS files
+         add App Launcher menu
+         make missing *BEAST template available again
+         save in old style XML, with less restricions on taxa names 
+     Streamlined upgrades of BEAST
+     
+     BEAST
+     	improved BEAGLE library loading from CLI
+        test for spurious CUDA drivers on OSX, which used to cause a crash, but now provides instructions on how to solve this
+        improved operator tuning for slightly better performance
+        improved error reporting
+
+     LogAnalyser shows progress on CLI again by default
+        
 Version 2.4.0 February 2016
     BEAST improved performance
         up to 2x faster when using proportion invariant sites
diff --git a/src/beast/app/BEASTVersion.java b/src/beast/app/BEASTVersion.java
index 999d551..9674787 100644
--- a/src/beast/app/BEASTVersion.java
+++ b/src/beast/app/BEASTVersion.java
@@ -19,11 +19,11 @@ public class BEASTVersion extends Version {
     /**
      * Version string: assumed to be in format x.x.x
      */
-    private static final String VERSION = "2.4.0";
+    private static final String VERSION = "2.4.1";
 
     private static final String DATE_STRING = "2002-2016";
 
-    private static final boolean IS_PRERELEASE = true;
+    private static final boolean IS_PRERELEASE = false;
 
     private static final String BEAST2_WEBPAGE = "http://beast2.org/";
     
diff --git a/src/beast/app/BEASTVersion2.java b/src/beast/app/BEASTVersion2.java
new file mode 100644
index 0000000..c1c0a28
--- /dev/null
+++ b/src/beast/app/BEASTVersion2.java
@@ -0,0 +1,36 @@
+package beast.app;
+
+/**
+ * This is a duplicate of BEASTVersion, however the BEASTVersion class should be used by BEASTLauncher 
+ * and derivatives, but this class should be used in any other place
+ * */
+public class BEASTVersion2 extends BEASTVersion {
+
+    /**
+     * Version string: assumed to be in format x.x.x
+     */
+    private static final String VERSION = "2.4.1";
+
+    private static final String DATE_STRING = "2002-2016";
+
+    private static final boolean IS_PRERELEASE = false;
+//
+//    private static final String BEAST2_WEBPAGE = "http://beast2.org/";
+//    
+//    private static final String BEAST2_SOURCE = "http://github.com/CompEvol/beast2";
+//
+    @Override
+	public String getVersion() {
+        return VERSION;
+    }
+
+    @Override
+	public String getVersionString() {
+        return "v" + VERSION + (IS_PRERELEASE ? " Prerelease" : "");
+    }
+
+    @Override
+	public String getDateString() {
+        return DATE_STRING;
+    }
+}
diff --git a/src/beast/app/BeastMCMC.java b/src/beast/app/BeastMCMC.java
index a87e3ba..b091cc1 100644
--- a/src/beast/app/BeastMCMC.java
+++ b/src/beast/app/BeastMCMC.java
@@ -171,7 +171,7 @@ public class BeastMCMC {
             // Not resuming so get starting options...
 
             List<String> MCMCargs = new ArrayList<>();
-            Version version = new BEASTVersion();
+            Version version = new BEASTVersion2();
             String titleString = "<html><center><p>Bayesian Evolutionary Analysis Sampling Trees<br>" +
                     "Version " + version.getVersionString() + ", " + version.getDateString() + "</p></center></html>";
             javax.swing.Icon icon = IconUtils.getIcon(BeastMain.class, "images/beast.png");
diff --git a/src/beast/app/DocMaker.java b/src/beast/app/DocMaker.java
index 2578d8e..8bded67 100644
--- a/src/beast/app/DocMaker.java
+++ b/src/beast/app/DocMaker.java
@@ -87,7 +87,7 @@ public class DocMaker {
 
     Set<String> m_sLoggables;
     
-    BEASTVersion version = new BEASTVersion();
+    BEASTVersion2 version = new BEASTVersion2();
     
     public DocMaker(String[] args) {
         this();
diff --git a/src/beast/app/beastapp/BeastLauncher.java b/src/beast/app/beastapp/BeastLauncher.java
index c162ab0..128d90f 100644
--- a/src/beast/app/beastapp/BeastLauncher.java
+++ b/src/beast/app/beastapp/BeastLauncher.java
@@ -2,9 +2,11 @@ package beast.app.beastapp;
 
 
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
@@ -17,8 +19,6 @@ import java.net.URLDecoder;
 
 import javax.swing.JOptionPane;
 
-import beast.app.BEASTVersion;
-import beast.app.util.Utils;
 import beast.app.util.Utils6;
 
 
@@ -29,11 +29,15 @@ import beast.app.util.Utils6;
  * remainder of BEAST can be compiled against Java 1.8
  * **/
 public class BeastLauncher {
+	private static String getVersion() {return "2.4.1";}
+	private static String getMajorVersion() {return "2.4";}
+	
+	private static String pathDelimiter;
 
 	public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
 		if (javaVersionCheck("BEAST")) {
 			loadBEASTJars();
-			Utils.testCudaStatusOnMac();
+			Utils6.testCudaStatusOnMac();
 			BeastMain.main(args);
 		}
 	}
@@ -48,30 +52,29 @@ public class BeastLauncher {
 
 		// first try beast from the package_user_dir/lib/beast.jar
 		String beastUserDir = getPackageUserDir();
-		String pathDelimiter = isWindows() ? "\\\\" : "/";
+		pathDelimiter = isWindows() ? "\\\\" : "/";
 		beastUserDir +=  pathDelimiter + "BEAST" + pathDelimiter;
 		String beastJar = beastUserDir + "lib";
-		boolean foundOne = checkForBEAST(new File(beastJar), clu);
+		boolean foundJavaJarFile = checkForBEAST(new File(beastJar), clu);
 		
 		String launcherJar = clu.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
 		// deal with special characters and spaces in path
 		launcherJar = URLDecoder.decode(launcherJar, "UTF-8");
 		System.err.println("jardir = " + launcherJar);
 		File jarDir0 = new File(launcherJar).getParentFile();
-		while ((!foundOne) && (jarDir0 != null)) { // && jarDir0.exists() &&
-											// jarDir0.isDirectory()) {
-			foundOne = checkForBEAST(jarDir0, clu);
-			foundOne = foundOne ||
-			    checkForBEAST((isWindows() ? new File(jarDir0.getAbsolutePath() + "\\lib") : new File(jarDir0.getAbsolutePath() + "/lib")), clu);
+		while ((!foundJavaJarFile) && (jarDir0 != null)) {
+			foundJavaJarFile = checkForBEAST(jarDir0, clu);
+			foundJavaJarFile = foundJavaJarFile ||
+			    checkForBEAST(new File(jarDir0.getAbsolutePath() + pathDelimiter +"lib"), clu);
 			
-			if (foundOne) {
-				createBeastPackage(jarDir0, pathDelimiter);
+			if (foundJavaJarFile) {
+				createBeastPackage(jarDir0);
 			}
 			
 			jarDir0 = jarDir0.getParentFile();
 		}
 		
-		if (!foundOne) {
+		if (!foundJavaJarFile) {
 			System.err.println("WARNING: could not find beast.jar");
 			// if beast.jar or its classes are not already in the class path (as is when launched e.g. as developer)
 			// the next line will fail
@@ -83,34 +86,53 @@ public class BeastLauncher {
 
 	}
 
-	private static void createBeastPackage(File jarDir0, String pathDelimiter) {
+	private static void createBeastPackage(File jarDir0) {
 		try {
 	        if (jarDir0.toString().toLowerCase().endsWith("lib")) {
 	        	jarDir0 = jarDir0.getParentFile();
 	        }
 
 			// create package user dir, if it not already exists
-	        File dir = new File(getPackageUserDir() + pathDelimiter + "BEAST" + pathDelimiter + "lib");
+	        String userDir = getPackageUserDir();
+	        File dir = new File(userDir + pathDelimiter + "BEAST" + pathDelimiter + "lib");
 	        if (!dir.exists()) {
 	            if (!dir.mkdirs()) {
 	            	// cannot create dir, let alone create a beast package
 	            	return;
 	            }
 	        }
+	        File exampleDir = new File(userDir + pathDelimiter + "BEAST" + pathDelimiter + "examples" + pathDelimiter + "nexus");
+	        if (!exampleDir.exists()) {
+	            if (!exampleDir.mkdirs()) {
+	            	// cannot create dir, let alone create a beast package
+	            	return;
+	            }
+	        }
+	        File templateDir = new File(userDir + pathDelimiter + "BEAST" + pathDelimiter + "templates");
+	        if (!templateDir.exists()) {
+	            if (!templateDir.mkdirs()) {
+	            	// cannot create dir, let alone create a beast package
+	            	return;
+	            }
+	        }
 	        
 	        File beastJar = new File(jarDir0 + pathDelimiter + "lib" + pathDelimiter + "beast.jar");
 	        File target = new File(dir + pathDelimiter + "beast.jar");
 	        copyFileUsingStream(beastJar, target);
 	        
-	        String version = "<addon name='BEAST' version='" + (new BEASTVersion()).getVersion() + "'>\n" +
+	        String version = "<addon name='BEAST' version='" + getVersion() + "'>\n" +
 	        		"</addon>";
-	        FileWriter outfile = new FileWriter(getPackageUserDir() + pathDelimiter + "BEAST" + pathDelimiter + "version.xml");
+	        FileWriter outfile = new FileWriter(userDir + pathDelimiter + "BEAST" + pathDelimiter + "version.xml");
 	        outfile.write(version);
 	        outfile.close();
 
 	        File beastSrcJar = new File(jarDir0 + pathDelimiter + "lib" + pathDelimiter + "beast.src.jar");
 	        File srcTarget = new File(dir + pathDelimiter + "beast.src.jar");
 	        copyFileUsingStream(beastSrcJar, srcTarget);
+	        
+	        copyFilesInDir(new File(jarDir0 + pathDelimiter + "examples"), new File(userDir + pathDelimiter + "BEAST" + pathDelimiter + "examples"));
+	        copyFilesInDir(new File(jarDir0 + pathDelimiter + "examples" + pathDelimiter + "nexus"), exampleDir);
+	        copyFilesInDir(new File(jarDir0 + pathDelimiter + "templates"), templateDir);
 
 	        // TODO: include templates?
 	        // if so, how to prevent clashes with templates in package and in installation dir?
@@ -122,6 +144,15 @@ public class BeastLauncher {
 
 	}
 	
+	private static void copyFilesInDir(File srcDir, File targetDir) throws IOException {
+		String targetDirName = targetDir.getAbsolutePath();
+		for (File src : srcDir.listFiles()) {
+			if (src.isFile()) {
+				copyFileUsingStream(src, new File(targetDirName + pathDelimiter + src.getName()));		
+			}
+		}
+	}
+
 	// copy files using Java 6 code
 	private static void copyFileUsingStream(File source, File dest) throws IOException {
 
@@ -146,6 +177,29 @@ public class BeastLauncher {
 		if (jarDir.exists()) {
 			URL url = new URL("file://" + (isWindows() ? "/" : "") + jarDir.getAbsolutePath() + "/beast.jar");
 			if (new File(jarDir.getAbsoluteFile()+File.separator+"beast.jar").exists()) {
+				File versionFile = new File(jarDir.getParent() + pathDelimiter + "version.xml");
+				if (versionFile.exists()) {
+			        BufferedReader fin = new BufferedReader(new FileReader(versionFile));
+			        String str = null;
+			        while (fin.ready()) {
+			            str += fin.readLine();
+			        }
+			        fin.close();
+			        
+			        
+			        int start = str.indexOf("version=");
+			        int end = str.indexOf("'", start + 9);
+			        String version = str.substring(start + 9, end);
+			        double localVersion = parseVersion(version);
+			        double desiredVersion = parseVersion(getVersion());
+			        if (localVersion < desiredVersion) {
+			        	return false;
+			        }
+				}
+				
+				
+				
+				
 				URLClassLoader sysLoader = (URLClassLoader) clu.getClass().getClassLoader();
 				Class<?> sysclass = URLClassLoader.class;
 				try {
@@ -220,12 +274,39 @@ public class BeastLauncher {
             return System.getProperty("beast.user.package.dir");
         
         if (Utils6.isWindows()) {
-            return System.getProperty("user.home") + "\\BEAST\\" + (new BEASTVersion()).getMajorVersion();
+            return System.getProperty("user.home") + "\\BEAST\\" + getMajorVersion();
         }
         if (Utils6.isMac()) {
-            return System.getProperty("user.home") + "/Library/Application Support/BEAST/" + (new BEASTVersion()).getMajorVersion();
+            return System.getProperty("user.home") + "/Library/Application Support/BEAST/" + getMajorVersion();
         }
         // Linux and unices
-        return System.getProperty("user.home") + "/.beast/" + (new BEASTVersion()).getMajorVersion();
+        return System.getProperty("user.home") + "/.beast/" + getMajorVersion();
+    }
+    
+	/** Parse version string, assume it is of the form 1.2.3
+     * returns version where each sub-version is divided by 100,
+     * so 2.0 -> return 2
+     * 2.1 return 2.01
+     * 2.2.3 return 2.0103
+     * Letters are ignored, so
+     * 2.0.e -> 2.0
+     * 2.x.1 -> 2.0001
+     * @return
+     */
+    private static double parseVersion(String versionString) {
+        // is of the form 1.2.3
+        String [] strs = versionString.split("\\.");
+        double version = 0;
+        double divider = 1.0;
+        for (int i = 0; i < strs.length; i++) {
+            try {
+                version += Double.parseDouble(strs[i]) / divider;
+                divider = divider * 100.0;
+            } catch (NumberFormatException e) {
+                // ignore
+            }
+        }
+        return version;
     }
+
 }
diff --git a/src/beast/app/beastapp/BeastMain.java b/src/beast/app/beastapp/BeastMain.java
index b7f1807..a92ee3b 100644
--- a/src/beast/app/beastapp/BeastMain.java
+++ b/src/beast/app/beastapp/BeastMain.java
@@ -18,7 +18,7 @@ import javax.swing.filechooser.FileFilter;
 
 import beagle.BeagleFlag;
 import beagle.BeagleInfo;
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.app.BeastMCMC;
 import beast.app.util.Arguments;
 import beast.app.util.ErrorLogHandler;
@@ -32,7 +32,7 @@ import jam.util.IconUtils;
 
 public class BeastMain {
 
-    private final static Version version = new BEASTVersion();
+    private final static Version version = new BEASTVersion2();
 
     static class BeastConsoleApp extends jam.console.ConsoleApplication {
 
@@ -156,17 +156,17 @@ public class BeastMain {
                 // This call never returns as another RuntimeException exception is raised by
                 // the error log handler???
                 infoLogger.warning("Error running file: " + fileName);
-                Log.err.println("Fatal exception: " + rex.getMessage());
+                System.err.println("Fatal exception: " + rex.getMessage());
                 rex.printStackTrace(System.err);
             }
             */
         } catch (XMLParserException e) {
-           Log.info.println(e.getMessage());
+           System.out.println(e.getMessage());
             //e.printStackTrace();
         } catch (Exception e) {
+            System.out.println("Fatal exception: " + e.getMessage());
+            e.printStackTrace(System.err);
             infoLogger.severe("Fatal exception: " + e.getMessage());
-            Log.info.println("Fatal exception: " + e.getMessage());
-            e.printStackTrace(Log.err);
         }
     }
 
@@ -206,22 +206,22 @@ public class BeastMain {
         final int n = pageWidth - line.length();
         final int n1 = n / 2;
         for (int i = 0; i < n1; i++) {
-            Log.info.print(" ");
+            System.out.print(" ");
         }
-        Log.info.println(line);
+        System.out.println(line);
     }
 
     public static void printTitle() {
 
         int pageWidth = 72;
 
-        Log.info.println();
+        System.out.println();
         centreLine("BEAST " + version.getVersionString() + ", " + version.getDateString(), pageWidth);
         centreLine("Bayesian Evolutionary Analysis Sampling Trees", pageWidth);
         for (final String creditLine : version.getCredits()) {
             centreLine(creditLine, pageWidth);
         }
-        Log.info.println();
+        System.out.println();
     }
 
     public static void printUsage(final Arguments arguments) {
@@ -279,15 +279,15 @@ public class BeastMain {
         try {
             arguments.parseArguments(args);
         } catch (Arguments.ArgumentException ae) {
-        	Log.info.println();
-        	Log.info.println(ae.getMessage());
-        	Log.info.println();
+        	System.out.println();
+        	System.out.println(ae.getMessage());
+        	System.out.println();
             printUsage(arguments);
             System.exit(1);
         }
 
         if (arguments.hasOption("version")) {
-        	Log.info.println((new BEASTVersion()).getVersionString());
+        	System.out.println((new BEASTVersion2()).getVersionString());
         	System.exit(0);
         }
 
@@ -389,14 +389,14 @@ public class BeastMain {
         }
         if (threadCount <= 0) {
         	threadCount = Runtime.getRuntime().availableProcessors();
-        	Log.warning.println("Setting number of threads to " + threadCount);
+        	System.err.println("Setting number of threads to " + threadCount);
         }
 
         if (arguments.hasOption("seed")) {
             seed = arguments.getLongOption("seed");
             if (seed <= 0) {
                 printTitle();
-                Log.err.println("The random number seed should be > 0");
+                System.err.println("The random number seed should be > 0");
                 System.exit(1);
             }
         }
@@ -486,7 +486,7 @@ public class BeastMain {
 
             inputFile = dialog.getInputFile();
             if (!beagleShowInfo && inputFile == null) {
-            	Log.err.println("No input file specified");
+            	System.err.println("No input file specified");
                 System.exit(1);
             }
 
@@ -510,8 +510,8 @@ public class BeastMain {
             final String[] args2 = arguments.getLeftoverArguments();
 
             if (args2.length > 1) {
-            	Log.err.println("Unknown option: " + args2[1]);
-            	Log.err.println();
+            	System.err.println("Unknown option: " + args2[1]);
+            	System.err.println();
                 printUsage(arguments);
                 System.exit(1);
             }
@@ -577,7 +577,7 @@ public class BeastMain {
 
         if (stateFileName!= null && stateFileName.trim().length() > 0) {
             System.setProperty("state.file.name", stateFileName.trim());
-            Log.info.println("Writing state to file " + stateFileName);
+            System.out.println("Writing state to file " + stateFileName);
         }
 
 //        if (allowOverwrite) {
@@ -599,8 +599,8 @@ public class BeastMain {
         MCMCargs.add(seed + "");
         Randomizer.setSeed(seed);
 
-        Log.info.println("Random number seed: " + seed);
-        Log.info.println();
+        System.out.println("Random number seed: " + seed);
+        System.out.println();
 
         // Construct the beast object
         final BeastMCMC beastMCMC = new BeastMCMC();
@@ -613,7 +613,7 @@ public class BeastMain {
             if (!doNotRun) {
             	new BeastMain(beastMCMC, consoleApp, maxErrorCount);
             } else {
-            	Log.info.println("Done!");
+            	System.out.println("Done!");
             }
         } catch (RuntimeException rte) {
             if (window) {
diff --git a/src/beast/app/beauti/Beauti.java b/src/beast/app/beauti/Beauti.java
index 3842a55..66110c2 100644
--- a/src/beast/app/beauti/Beauti.java
+++ b/src/beast/app/beauti/Beauti.java
@@ -23,7 +23,9 @@ import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -49,17 +51,19 @@ import javax.xml.parsers.DocumentBuilderFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.app.beauti.BeautiDoc.ActionOnExit;
 import beast.app.beauti.BeautiDoc.DOC_STATUS;
 import beast.app.draw.BEASTObjectPanel;
 import beast.app.draw.HelpBrowser;
 import beast.app.draw.ModelBuilder;
 import beast.app.draw.MyAction;
+import beast.app.tools.AppStore;
 import beast.app.util.Utils;
 import beast.core.BEASTInterface;
 import beast.core.util.Log;
 import beast.evolution.alignment.Alignment;
+import beast.math.distributions.MRCAPrior;
 import beast.util.AddOnManager;
 import jam.framework.DocumentFrame;
 
@@ -166,6 +170,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener {
     public Action a_load = new ActionLoad();
     Action a_template = new ActionTemplate();
     Action a_addOn = new ActionAddOn();
+    Action a_appLauncher = new ActionAppLauncher();
 //    public Action a_import = new ActionImport();
     public Action a_save = new ActionSave();
     Action a_saveas = new ActionSaveAs();
@@ -416,7 +421,20 @@ public class Beauti extends JTabbedPane implements BeautiDocListener {
         } // actionPerformed
     }
 
-//    class ActionImport extends MyAction {
+    class ActionAppLauncher extends MyAction {
+        private static final long serialVersionUID = 1;
+
+        public ActionAppLauncher() {
+            super("Launch Apps", "Launch BEAST Apps supplied by packages", "launch", -1);
+        } // c'tor
+
+        @Override
+		public void actionPerformed(ActionEvent ae) {
+        	AppStore.main(new String[]{});
+        } // actionPerformed
+    }
+
+    //    class ActionImport extends MyAction {
 //        private static final long serialVersionUID = 1;
 //
 //        public ActionImport() {
@@ -584,7 +602,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener {
 
         @Override
 		public void actionPerformed(ActionEvent ae) {
-            BEASTVersion version = new BEASTVersion();
+            BEASTVersion2 version = new BEASTVersion2();
             JOptionPane.showMessageDialog(null, version.getCredits(),
                     "About Beauti " + version.getVersionString(), JOptionPane.PLAIN_MESSAGE,
                     Utils.getIcon(BEAUTI_ICON));
@@ -803,6 +821,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener {
         templateMenu.addSeparator();
         templateMenu.add(a_template);
         fileMenu.add(a_addOn);
+        fileMenu.add(a_appLauncher);
         fileMenu.addSeparator();
         fileMenu.add(a_save);
         fileMenu.add(a_saveas);
@@ -840,6 +859,14 @@ public class Beauti extends JTabbedPane implements BeautiDocListener {
 
 		                doc.connectModel();
 		                doc.fireDocHasChanged();
+		                
+				        if (beastObjects != null) {
+					        for (BEASTInterface o : beastObjects) {
+					        	if (o instanceof MRCAPrior) {
+				        			doc.addMRCAPrior((MRCAPrior) o);
+					        	}
+					        }
+				        }
 		                a_save.setEnabled(true);
 		                a_saveas.setEnabled(true);
 		            } catch (Exception exx) {
@@ -986,27 +1013,31 @@ public class Beauti extends JTabbedPane implements BeautiDocListener {
     private List<AbstractAction> getWorkDirActions() {
         List<AbstractAction> actions = new ArrayList<>();
         List<String> beastDirectories = AddOnManager.getBeastDirectories();
+        Set<String> doneDirs = new HashSet<>();
         for (String dir : beastDirectories) {
-        	String exampledir = dir + File.separator+ "examples";
-        	if (new File(exampledir).exists()) {
-	        	AbstractAction action = new AbstractAction() {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					public void actionPerformed(ActionEvent e) {
-						g_sDir = dir;
-					}
-
-	            };
-	            String workDirInfo = "Set working directory to " + dir;
-	            String name = dir;
-	            if (name.indexOf(File.separator) >= 0) {
-	            	name = dir.substring(dir.lastIndexOf(File.separator) + 1);
-	            }
-	            action.putValue(Action.SHORT_DESCRIPTION, workDirInfo);
-	            action.putValue(Action.LONG_DESCRIPTION, workDirInfo);
-	            action.putValue(Action.NAME, name);
-	            actions.add(action);
+        	if (!doneDirs.contains(dir)) {
+	        	doneDirs.add(dir);
+	        	String exampledir = dir + File.separator+ "examples";
+	        	if (new File(exampledir).exists()) {
+		        	AbstractAction action = new AbstractAction() {
+						private static final long serialVersionUID = 1L;
+	
+						@Override
+						public void actionPerformed(ActionEvent e) {
+							g_sDir = dir;
+						}
+	
+		            };
+		            String workDirInfo = "Set working directory to " + dir;
+		            String name = dir;
+		            if (name.indexOf(File.separator) >= 0) {
+		            	name = dir.substring(dir.lastIndexOf(File.separator) + 1);
+		            }
+		            action.putValue(Action.SHORT_DESCRIPTION, workDirInfo);
+		            action.putValue(Action.LONG_DESCRIPTION, workDirInfo);
+		            action.putValue(Action.NAME, name);
+		            actions.add(action);
+	        	}
         	}
         }
         return actions;
@@ -1105,7 +1136,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener {
         	ByteArrayOutputStream baos = null;
             for (String arg : args) {
             	if (arg.equals("-v") || arg.equals("-version")) {
-                    System.out.println((new BEASTVersion()).getVersionString());
+                    System.out.println((new BEASTVersion2()).getVersionString());
                     System.exit(0);
             	}
             	if (arg.equals("-h") || arg.equals("-help")) {
diff --git a/src/beast/app/beauti/BeautiAlignmentProvider.java b/src/beast/app/beauti/BeautiAlignmentProvider.java
index 66e4fac..fb526e1 100644
--- a/src/beast/app/beauti/BeautiAlignmentProvider.java
+++ b/src/beast/app/beauti/BeautiAlignmentProvider.java
@@ -35,6 +35,7 @@ import beast.evolution.alignment.Alignment;
 import beast.evolution.alignment.FilteredAlignment;
 import beast.evolution.alignment.Sequence;
 import beast.evolution.datatype.DataType;
+import beast.math.distributions.MRCAPrior;
 import beast.util.NexusParser;
 import beast.util.XMLParser;
 
@@ -44,7 +45,6 @@ import beast.util.XMLParser;
 public class BeautiAlignmentProvider extends BEASTObject {
 	
 	final public Input<BeautiSubTemplate> template = new Input<>("template", "template to be used after creating a new alignment. ", Validate.REQUIRED);
-
 	
 	@Override
 	public void initAndValidate() {
@@ -80,6 +80,7 @@ public class BeautiAlignmentProvider extends BEASTObject {
      */
     public List<BEASTInterface> getAlignments(BeautiDoc doc, File[] files) {
         List<BEASTInterface> selectedBEASTObjects = new ArrayList<>();
+        List<MRCAPrior> calibrations = new ArrayList<>();
         for (File file : files) {
             String fileName = file.getName();
 			String fileExtension = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
@@ -126,8 +127,20 @@ public class BeautiAlignmentProvider extends BEASTObject {
 								sortByTaxonName(data.sequenceInput.get());
 								selectedBEASTObjects.add(data);
 							}
+							if (parser.calibrations != null) {
+								if (calibrations == null) {
+									calibrations = new ArrayList<>();
+								}
+								calibrations.addAll(parser.calibrations);
+							}
 						} else {
 							selectedBEASTObjects.add(parser.m_alignment);
+							if (parser.calibrations != null) {
+								if (calibrations == null) {
+									calibrations = new ArrayList<>();
+								}
+								calibrations.addAll(parser.calibrations);
+							}
 						}
 					} catch (Exception ex) {
 						ex.printStackTrace();
@@ -162,9 +175,14 @@ public class BeautiAlignmentProvider extends BEASTObject {
 			}
         }
         addAlignments(doc, selectedBEASTObjects);
+        if (calibrations != null) {
+        	selectedBEASTObjects.addAll(calibrations);
+        }
+        // doc.addMRCAPriors(calibrations);
         return selectedBEASTObjects;
     }
     
+    
     protected void addAlignments(BeautiDoc doc, List<BEASTInterface> selectedBEASTObjects) {
         for (BEASTInterface beastObject : selectedBEASTObjects) {
         	// ensure ID of alignment is unique
diff --git a/src/beast/app/beauti/BeautiConfig.java b/src/beast/app/beauti/BeautiConfig.java
index a1e8bbe..9101d0a 100644
--- a/src/beast/app/beauti/BeautiConfig.java
+++ b/src/beast/app/beauti/BeautiConfig.java
@@ -16,6 +16,7 @@ import beast.core.Description;
 import beast.core.Input;
 import beast.core.Input.Validate;
 import beast.evolution.alignment.Alignment;
+import beast.math.distributions.MRCAPrior;
 import beast.util.XMLParser;
 
 @Description("Beauti configuration object, used to find Beauti configuration " +
@@ -195,6 +196,14 @@ public class BeautiConfig extends BEASTObject {
 	        	}
 	        }
         }
+        doc.connectModel();
+        if (beastObjects != null) {
+	        for (BEASTInterface o : beastObjects) {
+	        	if (o instanceof MRCAPrior) {
+        			doc.addMRCAPrior((MRCAPrior) o);
+	        	}
+	        }
+        }
         return beastObjects;
     } // selectAlignments
     
diff --git a/src/beast/app/beauti/BeautiDoc.java b/src/beast/app/beauti/BeautiDoc.java
index b58f7bf..e63e4d3 100644
--- a/src/beast/app/beauti/BeautiDoc.java
+++ b/src/beast/app/beauti/BeautiDoc.java
@@ -64,10 +64,13 @@ import beast.evolution.alignment.TaxonSet;
 import beast.evolution.branchratemodel.BranchRateModel;
 import beast.evolution.branchratemodel.StrictClockModel;
 import beast.evolution.likelihood.GenericTreeLikelihood;
+import beast.evolution.operators.TipDatesRandomWalker;
 import beast.evolution.substitutionmodel.SubstitutionModel;
 import beast.evolution.tree.TraitSet;
 import beast.evolution.tree.Tree;
 import beast.math.distributions.MRCAPrior;
+import beast.math.distributions.ParametricDistribution;
+import beast.math.distributions.Uniform;
 import beast.util.JSONProducer;
 import beast.util.NexusParser;
 import beast.util.XMLParser;
@@ -2443,5 +2446,63 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider {
 		return null;
 	}
 
+	public void addMRCAPrior(MRCAPrior mrcaPrior) {
+			Tree tree = (Tree) pluginmap.get("Tree.t:" + alignments.get(0).getID());
+			// TODO: make sure we have the appropriate tree
+			CompoundDistribution prior = (CompoundDistribution) pluginmap.get("prior");
+			mrcaPrior.treeInput.setValue(tree, mrcaPrior);
+			ParametricDistribution distr = mrcaPrior.distInput.get();
+
+			TaxonSet t = mrcaPrior.taxonsetInput.get();
+			if (taxaset.keySet().contains(t.getID())) {
+				Log.warning.println("taxonset " + t.getID() + " already exists: MRCAPrior " + mrcaPrior.getID() + " can not be added");
+			} else {
+				taxaset.put(t.getID(), t);
+				// ensure TaxonSets are not duplicated
+				List<Taxon> taxa = t.taxonsetInput.get();
+				for (int i = 0; i< taxa.size(); i++) {
+					if (taxaset.containsKey(taxa.get(i).getID())) {
+						taxa.set(i, taxaset.get(taxa.get(i).getID()));
+					} else {
+						taxaset.put(taxa.get(i).getID(), taxa.get(i));
+					}
+				}
+				if (distr instanceof Uniform && ((Uniform)distr).lowerInput.get() == ((Uniform)distr).upperInput.get()) {
+					// it is a 'fixed' calibration, no need to add a distribution
+				} else {
+					prior.pDistributions.setValue(mrcaPrior, prior);
+				}
+			}
+			if (t.taxonsetInput.get().size() == 1) {
+				// it is a calibration on a tip -- better start sampling that tip
+		        TipDatesRandomWalker operator = new TipDatesRandomWalker();
+		        t.initAndValidate();
+		        operator.initByName("taxonset", t, "weight", 1.0, "tree", tree, "windowSize", 1.0);
+		        operator.setID("TipDatesRandomWalker." + t.getID());
+		        MCMC mcmc = (MCMC) this.mcmc.get();
+		        mcmc.operatorsInput.setValue(operator, mcmc);
+		        
+		        // set up date trait
+		        double date = distr.getMean();
+		        TraitSet dateTrait = null;
+		        for (TraitSet ts : tree.m_traitList.get()) {
+		        	if (ts.isDateTrait()) {
+		        		dateTrait = ts;
+		        	}
+		        }
+		        if (dateTrait == null) {
+		        	dateTrait = new TraitSet();
+		        	dateTrait.initByName("traitname", TraitSet.DATE_BACKWARD_TRAIT, "taxa", tree.getTaxonset(), 
+		        			"value", t.taxonsetInput.get().get(0).getID() + "=" + date);
+		        	tree.m_traitList.setValue(dateTrait, tree);
+		        	tree.initAndValidate();
+		        } else {
+		        	dateTrait.traitsInput.setValue(dateTrait.traitsInput.get() + ",\n" +
+		        			t.taxonsetInput.get().get(0).getID() + "=" + date
+		        			, dateTrait);	
+		        }
+			}
+	}
+
 
 } // class BeautiDoc
diff --git a/src/beast/app/beauti/BeautiLauncher.java b/src/beast/app/beauti/BeautiLauncher.java
index f326e8c..d6c8c0c 100644
--- a/src/beast/app/beauti/BeautiLauncher.java
+++ b/src/beast/app/beauti/BeautiLauncher.java
@@ -5,7 +5,6 @@ import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 
 import beast.app.beastapp.BeastLauncher;
-import beast.app.util.Utils;
 import beast.app.util.Utils6;
 
 /** 
@@ -20,7 +19,7 @@ public class BeautiLauncher extends BeastLauncher {
 		Utils6.startSplashScreen();
 		if (javaVersionCheck("BEAUti")) {
 			loadBEASTJars();
-			Utils.testCudaStatusOnMac();
+			Utils6.testCudaStatusOnMac();
 			Beauti.main(args);
 		}
         Utils6.endSplashScreen();
diff --git a/src/beast/app/beauti/MRCAPriorInputEditor.java b/src/beast/app/beauti/MRCAPriorInputEditor.java
index 3f275f7..69cc002 100644
--- a/src/beast/app/beauti/MRCAPriorInputEditor.java
+++ b/src/beast/app/beauti/MRCAPriorInputEditor.java
@@ -11,6 +11,7 @@ import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 
+import beast.app.draw.BEASTObjectPanel;
 import beast.app.draw.InputEditor;
 import beast.app.draw.SmallButton;
 import beast.core.BEASTInterface;
@@ -60,8 +61,16 @@ public class MRCAPriorInputEditor extends InputEditor.Base {
                     Set<Taxon> candidates = getTaxonCandidates(prior2);
                     TaxonSetDialog dlg = new TaxonSetDialog(taxonset, candidates, doc);
                     if (dlg.showDialog()) {
-                        prior2.setID(dlg.taxonSet.getID());
                         prior2.taxonsetInput.setValue(dlg.taxonSet, prior2);
+                        int i = 1;
+                        String id = dlg.taxonSet.getID();
+                        while (doc.pluginmap.containsKey(dlg.taxonSet.getID()) && doc.pluginmap.get(dlg.taxonSet.getID()) != dlg.taxonSet) {
+                        	dlg.taxonSet.setID(id + i);
+                        	i++;
+                        }
+                        BEASTObjectPanel.addPluginToMap(dlg.taxonSet, doc);
+                        prior2.setID(dlg.taxonSet.getID() + ".prior");
+
                     }
                 } catch (Exception e1) {
                     // TODO Auto-generated catch block
diff --git a/src/beast/app/beauti/PriorListInputEditor.java b/src/beast/app/beauti/PriorListInputEditor.java
index bbe5c78..48aa72c 100644
--- a/src/beast/app/beauti/PriorListInputEditor.java
+++ b/src/beast/app/beauti/PriorListInputEditor.java
@@ -117,6 +117,13 @@ public class PriorListInputEditor extends ListInputEditor {
         super.init(input, beastObject, itemNr, isExpandOption, addButtons);
 
         
+        if (beastObject instanceof BeautiPanelConfig) {
+        	BeautiPanelConfig config = (BeautiPanelConfig) beastObject;
+        	if (config.parentBEASTObjects != null && config.parentBEASTObjects.size() > 0 && config.parentBEASTObjects.get(0).getID().equals("speciescoalescent")) {
+        		m_buttonStatus = ButtonStatus.NONE;
+        	}
+        }
+        
         if (m_buttonStatus == ButtonStatus.ALL || m_buttonStatus == ButtonStatus.ADD_ONLY) {
 	        addButton = new SmallButton("+", true);
 	        addButton.setName("addItem");
@@ -244,6 +251,12 @@ public class PriorListInputEditor extends ListInputEditor {
                 return null;
             }
             taxonSet = dlg.taxonSet;
+            int i = 1;
+            String id = taxonSet.getID();
+            while (doc.pluginmap.containsKey(taxonSet.getID()) && doc.pluginmap.get(taxonSet.getID()) != taxonSet) {
+            	taxonSet.setID(id + i);
+            	i++;
+            }
             BEASTObjectPanel.addPluginToMap(taxonSet, doc);
             prior.taxonsetInput.setValue(taxonSet, prior);
             prior.setID(taxonSet.getID() + ".prior");
diff --git a/src/beast/app/beauti/TaxonSetInputEditor.java b/src/beast/app/beauti/TaxonSetInputEditor.java
index 4eda6c9..9b06762 100644
--- a/src/beast/app/beauti/TaxonSetInputEditor.java
+++ b/src/beast/app/beauti/TaxonSetInputEditor.java
@@ -21,8 +21,10 @@ import java.util.regex.PatternSyntaxException;
 import javax.swing.Box;
 import javax.swing.JButton;
 import javax.swing.JLabel;
+import javax.swing.JOptionPane;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
+import javax.swing.JTextArea;
 import javax.swing.JTextField;
 import javax.swing.event.CellEditorListener;
 import javax.swing.event.DocumentEvent;
@@ -105,10 +107,12 @@ public class TaxonSetInputEditor extends InputEditor.Base {
         m_taxonMap = new HashMap<>();
         m_lineageset = new ArrayList<>();
         for (Taxon taxonset2 : m_taxonset) {
-            for (Taxon taxon : ((TaxonSet) taxonset2).taxonsetInput.get()) {
-                m_lineageset.add(taxon);
-                m_taxonMap.put(taxon.getID(), taxonset2.getID());
-            }
+        	if (taxonset2 instanceof TaxonSet) {
+		        for (Taxon taxon : ((TaxonSet) taxonset2).taxonsetInput.get()) {
+		            m_lineageset.add(taxon);
+		            m_taxonMap.put(taxon.getID(), taxonset2.getID());
+		        }
+        	}
         }
 
         // set up table.
@@ -335,26 +339,34 @@ public class TaxonSetInputEditor extends InputEditor.Base {
             }
         }
 
+        List<String> unknowns = new ArrayList<>();
         for (Taxon taxon : taxa) {
             if (!(taxon instanceof TaxonSet)) {
                 Matcher matcher = m_pattern.matcher(taxon.getID());
+                String match;
                 if (matcher.find()) {
-                    String match = matcher.group(1);
-                    try {
-                        if (map.containsKey(match)) {
-                            TaxonSet set = map.get(match);
-                            set.taxonsetInput.setValue(taxon, set);
-                        } else {
-                        	TaxonSet set = newTaxonSet(match);
-                            set.taxonsetInput.setValue(taxon, set);
-                            map.put(match, set);
-                        }
-                    } catch (Exception ex) {
-                        ex.printStackTrace();
+                    match = matcher.group(1);
+                } else {
+                   	match = "UNKNOWN";
+                   	unknowns.add(taxon.getID());
+                }
+                try {
+                    if (map.containsKey(match)) {
+                        TaxonSet set = map.get(match);
+                        set.taxonsetInput.setValue(taxon, set);
+                    } else {
+                    	TaxonSet set = newTaxonSet(match);
+                        set.taxonsetInput.setValue(taxon, set);
+                        map.put(match, set);
                     }
+                } catch (Exception ex) {
+                    ex.printStackTrace();
                 }
             }
         }
+        if (unknowns.size() > 0) {
+        	showMisMatchMessage(unknowns);
+        }
         // add taxon sets
         int ignored = 0;
         for (TaxonSet set : map.values()) {
@@ -400,14 +412,9 @@ public class TaxonSetInputEditor extends InputEditor.Base {
         	if (alignment instanceof FilteredAlignment) {
         		alignment = ((FilteredAlignment)alignment).alignmentInput.get();
         	}
-            for (Sequence sequence : alignment.sequenceInput.get()) {
-                String id = sequence.taxonInput.get();
+            for (String id : alignment.getTaxaNames()) {
                 if (!taxonIDs.contains(id)) {
-                    Taxon taxon = getDoc().getTaxon(sequence.taxonInput.get());
-                    // ensure sequence and taxon do not get same ID
-                    if (sequence.getID().equals(sequence.taxonInput.get())) {
-                        sequence.setID("_" + sequence.getID());
-                    }
+                    Taxon taxon = getDoc().getTaxon(id);
                     taxa.add(taxon);
                     taxonIDs.add(id);
                 }
@@ -415,22 +422,25 @@ public class TaxonSetInputEditor extends InputEditor.Base {
         }
 
         HashMap<String, TaxonSet> map = new HashMap<>();
+        List<String> unknowns = new ArrayList<>();
         for (Taxon taxon : taxa) {
             if (!(taxon instanceof TaxonSet)) {
                 String match = traitmap.get(taxon.getID());
-                if (match != null) {
-                    try {
-                        if (map.containsKey(match)) {
-                            TaxonSet set = map.get(match);
-                            set.taxonsetInput.setValue(taxon, set);
-                        } else {
-                            TaxonSet set = newTaxonSet(match);
-                            set.taxonsetInput.setValue(taxon, set);
-                            map.put(match, set);
-                        }
-                    } catch (Exception ex) {
-                        ex.printStackTrace();
+                if (match == null) {
+                	match = "UNKNOWN";
+                	unknowns.add(taxon.getID());
+                }
+                try {
+                    if (map.containsKey(match)) {
+                        TaxonSet set = map.get(match);
+                        set.taxonsetInput.setValue(taxon, set);
+                    } else {
+                        TaxonSet set = newTaxonSet(match);
+                        set.taxonsetInput.setValue(taxon, set);
+                        map.put(match, set);
                     }
+                } catch (Exception ex) {
+                    ex.printStackTrace();
                 }
             }
         }
@@ -438,9 +448,20 @@ public class TaxonSetInputEditor extends InputEditor.Base {
         for (TaxonSet set : map.values()) {
              m_taxonset.add(set);
         }
+        if (unknowns.size() > 0) {
+        	showMisMatchMessage(unknowns);
+        }
     }
     
-    String m_sPattern = "^(.+)[-_\\. ](.*)$";
+    private void showMisMatchMessage(List<String> unknowns) {
+    	JOptionPane.showMessageDialog(
+    	    this, 
+    	    "Some taxa did not have a match and are set to UNKNOWN:\n" + unknowns.toString().replaceAll(",", "\n"), 
+    	    "Warning", 
+    	    JOptionPane.INFORMATION_MESSAGE);
+	}
+
+	String m_sPattern = "^(.+)[-_\\. ](.*)$";
 
 
     private Component createFilterBox() {
diff --git a/src/beast/app/tools/EBSPAnalyser.java b/src/beast/app/tools/EBSPAnalyser.java
index a67c412..d5c21bb 100644
--- a/src/beast/app/tools/EBSPAnalyser.java
+++ b/src/beast/app/tools/EBSPAnalyser.java
@@ -22,7 +22,7 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 import javax.swing.border.EmptyBorder;
 
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.app.util.Utils;
 import beast.app.util.WholeNumberField;
 import beast.core.util.Log;
@@ -376,7 +376,7 @@ public class EBSPAnalyser {
      * @param args
      */
     public static void main(String[] args) {
-        BEASTVersion version = new BEASTVersion();
+        BEASTVersion2 version = new BEASTVersion2();
         final String versionString = version.getVersionString();
         String nameString = "EBSP Analyser " + versionString;
         String aboutString = "<html><center><p>" + versionString + ", " + version.getDateString() + "</p>" +
diff --git a/src/beast/app/tools/LogCombiner.java b/src/beast/app/tools/LogCombiner.java
index 88b0d96..b74d1a7 100644
--- a/src/beast/app/tools/LogCombiner.java
+++ b/src/beast/app/tools/LogCombiner.java
@@ -17,7 +17,7 @@ import java.util.Locale;
 import javax.swing.JFrame;
 import javax.swing.table.TableCellEditor;
 
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.core.util.Log;
 import beast.util.LogAnalyser;
 import jam.console.ConsoleApplication;
@@ -405,7 +405,7 @@ public class LogCombiner extends LogAnalyser {
      * @param args
      */
     public static void main(String[] args) {
-        BEASTVersion version = new BEASTVersion();
+        BEASTVersion2 version = new BEASTVersion2();
         final String versionString = version.getVersionString();
         String nameString = "LogCombiner " + versionString;
         String aboutString = "<html><center><p>" + versionString + ", " + version.getDateString() + "</p>" +
diff --git a/src/beast/app/treeannotator/TreeAnnotator.java b/src/beast/app/treeannotator/TreeAnnotator.java
index 68f708f..0c0e218 100644
--- a/src/beast/app/treeannotator/TreeAnnotator.java
+++ b/src/beast/app/treeannotator/TreeAnnotator.java
@@ -1297,6 +1297,14 @@ public class TreeAnnotator {
             }
 
             int burninPercentage = dialog.getBurninPercentage();
+            if (burninPercentage < 0) {
+            	Log.warning.println("burnin percentage is " + burninPercentage + " but should be non-negative. Setting it to zero");
+            	burninPercentage = 0;
+            }
+            if (burninPercentage >= 100) {
+            	Log.err.println("burnin percentage is " + burninPercentage + " but should be less than 100.");
+            	return;
+            }
             double posteriorLimit = dialog.getPosteriorLimit();
             double hpd2D = 0.80;
             Target targetOption = dialog.getTargetOption();
@@ -1408,7 +1416,7 @@ public class TreeAnnotator {
             burnin = arguments.getIntegerOption("b");        	
         }
         if (burnin >= 100) {
-        	Log.err.println("burnin is a percentage and should be less than 100.");
+        	Log.err.println("burnin percentage is " + burnin + " but should be less than 100.");
         	System.exit(1);
         }
 
diff --git a/src/beast/app/util/Utils.java b/src/beast/app/util/Utils.java
index 16e571d..2982456 100644
--- a/src/beast/app/util/Utils.java
+++ b/src/beast/app/util/Utils.java
@@ -329,68 +329,6 @@ public class Utils {
 	    }
 	
 	}
-
-	
-	public static boolean testCudaStatusOnMac() {
-		String cudaStatusOnMac = "<html>It appears you have CUDA installed, but your computer hardware does not support it.<br>"
-				+ "You need to remove CUDA before BEAST/BEAUti can start.<br>"
-				+ "To remove CUDA, delete the following folders by typing in a terminal:<br>"
-				+ "rm -r /Library/Frameworks/CUDA.framework<br>"
-				+ "rm -r /Developer/NVIDIA<br>"
-				+ "rm -r /usr/local/cuda<br>"
-				+ "You may need 'sudo rm' instead of 'rm'</html>";
-				
-		if (isMac()) {
-			// check any of these directories exist
-			// /Library/Frameworks/CUDA.framework
-			// /Developer/NVIDIA
-			// /usr/local/cuda
-			if (new File("/Library/Frameworks/CUDA.framework").exists() ||
-					new File("/Developer/NVIDIA").exists() ||
-					new File("/usr/local/cuda").exists()) {
-				// there is evidence of CUDA being installed on this computer
-				// try to create a BeagleTreeLikelihood using a separate process
-				try {
-				      String java = System.getenv("java.home");
-				      if (java == null) {
-				    	  java ="/usr/bin/java";
-				      } else {
-				    	  java += "/bin/java";
-				      }
-				      String beastJar = AddOnManager.getPackageUserDir();
-				      beastJar += "/" + "BEAST" + "/" + "lib" + "/" + "beast.jar";
-				      if (!new File(beastJar).exists()) {
-				    	  Log.debug.println("Could not find beast.jar, giving up testCudaStatusOnMac");
-				    	  return true;
-				      }
-				      //beastJar = "\"" + beastJar + "\"";
-				      //beastJar = "/Users/remco/workspace/beast2/build/dist/beast.jar";
-				      Process p = Runtime.getRuntime().exec(new String[]{java , "-cp" , beastJar , "beast.app.util.Utils"});
-				      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
-				      String line;
-				      while ((line = input.readLine()) != null) {
-				        Log.debug.println(line);
-				      }
-				      input.close();
-				      if (p.exitValue() != 0) {
-				    	  if (GraphicsEnvironment.isHeadless()) {
-				    		  cudaStatusOnMac = cudaStatusOnMac.replaceAll("<br>", "\n");
-				    		  cudaStatusOnMac = cudaStatusOnMac.replaceAll("<.?html>","\n");
-				    		  Log.warning.println("WARNING: " + cudaStatusOnMac);
-				    	  } else {
-				    		  JOptionPane.showMessageDialog(null, cudaStatusOnMac);
-				    	  }
-				    	  return false;
-				      }
-				    }
-				    catch (Exception err) {
-				      err.printStackTrace();
-				    }
-			}
-			
-		}
-		return true;
-	}
 	
 	
     public static void main(String[] args) {
diff --git a/src/beast/app/util/Utils6.java b/src/beast/app/util/Utils6.java
index 0f67209..fb32c7e 100644
--- a/src/beast/app/util/Utils6.java
+++ b/src/beast/app/util/Utils6.java
@@ -3,16 +3,22 @@ package beast.app.util;
 import java.awt.Dimension;
 import java.awt.Frame;
 import java.awt.Graphics;
+import java.awt.GraphicsEnvironment;
 import java.awt.Image;
 import java.awt.MediaTracker;
 import java.awt.Toolkit;
 import java.awt.Window;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
 import java.net.URL;
 
 import javax.swing.ImageIcon;
 import javax.swing.JComponent;
+import javax.swing.JOptionPane;
 
 import beast.core.util.Log;
+import beast.util.AddOnManager;
 
 /** Utils that work with Java6 **/
 public class Utils6 {
@@ -98,6 +104,68 @@ public class Utils6 {
 	        return null;
 	    }
 	}
+	
+	public static boolean testCudaStatusOnMac() {
+		String cudaStatusOnMac = "<html>It appears you have CUDA installed, but your computer hardware does not support it.<br>"
+				+ "You need to remove CUDA before BEAST/BEAUti can start.<br>"
+				+ "To remove CUDA, delete the following folders by typing in a terminal:<br>"
+				+ "rm -r /Library/Frameworks/CUDA.framework<br>"
+				+ "rm -r /Developer/NVIDIA<br>"
+				+ "rm -r /usr/local/cuda<br>"
+				+ "You may need 'sudo rm' instead of 'rm'</html>";
+				
+		if (isMac()) {
+			// check any of these directories exist
+			// /Library/Frameworks/CUDA.framework
+			// /Developer/NVIDIA
+			// /usr/local/cuda
+			if (new File("/Library/Frameworks/CUDA.framework").exists() ||
+					new File("/Developer/NVIDIA").exists() ||
+					new File("/usr/local/cuda").exists()) {
+				// there is evidence of CUDA being installed on this computer
+				// try to create a BeagleTreeLikelihood using a separate process
+				try {
+				      String java = System.getenv("java.home");
+				      if (java == null) {
+				    	  java ="/usr/bin/java";
+				      } else {
+				    	  java += "/bin/java";
+				      }
+				      String beastJar = AddOnManager.getPackageUserDir();
+				      beastJar += "/" + "BEAST" + "/" + "lib" + "/" + "beast.jar";
+				      if (!new File(beastJar).exists()) {
+				    	  Log.debug.println("Could not find beast.jar, giving up testCudaStatusOnMac");
+				    	  return true;
+				      }
+				      //beastJar = "\"" + beastJar + "\"";
+				      //beastJar = "/Users/remco/workspace/beast2/build/dist/beast.jar";
+				      Process p = Runtime.getRuntime().exec(new String[]{java , "-cp" , beastJar , "beast.app.util.Utils"});
+				      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
+				      String line;
+				      while ((line = input.readLine()) != null) {
+				        Log.debug.println(line);
+				      }
+				      input.close();
+				      if (p.exitValue() != 0) {
+				    	  if (GraphicsEnvironment.isHeadless()) {
+				    		  cudaStatusOnMac = cudaStatusOnMac.replaceAll("<br>", "\n");
+				    		  cudaStatusOnMac = cudaStatusOnMac.replaceAll("<.?html>","\n");
+				    		  Log.warning.println("WARNING: " + cudaStatusOnMac);
+				    	  } else {
+				    		  JOptionPane.showMessageDialog(null, cudaStatusOnMac);
+				    	  }
+				    	  return false;
+				      }
+				    }
+				    catch (Exception err) {
+				      err.printStackTrace();
+				    }
+			}
+			
+		}
+		return true;
+	}
+
 
     public static boolean isMac() {
         return System.getProperty("os.name").toLowerCase().startsWith("mac");
diff --git a/src/beast/core/MCMC.java b/src/beast/core/MCMC.java
index c57c33f..2406f12 100644
--- a/src/beast/core/MCMC.java
+++ b/src/beast/core/MCMC.java
@@ -215,7 +215,7 @@ public class MCMC extends Runnable {
         for (final Operator op : operatorsInput.get()) {
             List<StateNode> nodes = op.listStateNodes();
             if (nodes.size() == 0) {
-                    throw new RuntimeException("Operator " + op.getID() + "has no state nodes in the state. "
+                    throw new RuntimeException("Operator " + op.getID() + " has no state nodes in the state. "
                                     + "Each operator should operate on at least one estimated state node in the state. "
                                     + "Remove the operator or add its statenode(s) to the state and/or set estimate='true'.");
                     // otherwise the chain may hang without obvious reason
@@ -227,6 +227,11 @@ public class MCMC extends Runnable {
 	        }
 	    }
     
+        // sanity check: at least one operator required to run MCMC
+        if (operatorsInput.get().size() == 0) {
+        	Log.warning.println("Warning: at least one operator required to run the MCMC properly, but none found.");
+        }
+        
         // sanity check: all state nodes should be operated on
         for (final StateNode stateNode : stateNodes) {
             if (!operatorStateNodes.contains(stateNode)) {
diff --git a/src/beast/evolution/alignment/FilteredAlignment.java b/src/beast/evolution/alignment/FilteredAlignment.java
index 1a75dde..88492a5 100644
--- a/src/beast/evolution/alignment/FilteredAlignment.java
+++ b/src/beast/evolution/alignment/FilteredAlignment.java
@@ -1,6 +1,7 @@
 package beast.evolution.alignment;
 
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -13,7 +14,7 @@ import beast.evolution.datatype.DataType;
 
 
 
- at Description("Alignemnt based on a filter operation on another alignment")
+ at Description("Alignment based on a filter operation on another alignment")
 public class FilteredAlignment extends Alignment {
     final public Input<String> filterInput = new Input<>("filter", "specifies which of the sites in the input alignment should be selected " +
             "First site is 1." +
@@ -64,7 +65,7 @@ public class FilteredAlignment extends Alignment {
         	}
     	}
         
-        counts = data.counts;
+   		counts = data.getCounts();
         taxaNames = data.taxaNames;
         stateCounts = data.stateCounts;
         if (convertDataType && m_dataType.getStateCount() > 0) {
@@ -156,6 +157,24 @@ public class FilteredAlignment extends Alignment {
         }
     }
 
+    
+    @Override
+    public List<List<Integer>> getCounts() {
+    	if (counts == null) {
+			counts = new ArrayList<>();
+			for (int j = 0; j < sitePatterns[0].length; j++) {
+				counts.add(new ArrayList<>());
+			}
+			for (int i = 0; i < getSiteCount(); i++) {
+				int [] sites = getPattern(getPatternIndex(i));
+    			for (int j = 0; j < getTaxonCount(); j++) {
+    				counts.get(j).add(sites[j]);
+    			}
+			}
+    	}
+    	return counts;
+    }
+    
     @Override
     protected void calcPatterns() {
         int nrOfTaxa = counts.size();
@@ -323,6 +342,10 @@ public class FilteredAlignment extends Alignment {
         	Log.info.println(getSiteCount() + " sites");
         }
         Log.info.println(getPatternCount() + " patterns");
+        
+        // counts are not valid any more -- better set to null in case
+        // someone gets bitten by this.
+        this.counts = null;
     }
     
     /** return indices of the sites that the filter uses **/
diff --git a/src/beast/evolution/likelihood/BeagleTreeLikelihood.java b/src/beast/evolution/likelihood/BeagleTreeLikelihood.java
index abd4fc6..a49ef18 100644
--- a/src/beast/evolution/likelihood/BeagleTreeLikelihood.java
+++ b/src/beast/evolution/likelihood/BeagleTreeLikelihood.java
@@ -84,7 +84,9 @@ public class BeagleTreeLikelihood extends TreeLikelihood {
     int m_nNodeCount;
     
     private double [] currentCategoryRates;
-    private double [] storedCurrentCategoryRates;
+//    private double [] storedCurrentCategoryRates;
+    private double [] currentFreqs;
+    private double [] currentCategoryWeights;
     
     private int invariantCategory = -1;
 
@@ -143,7 +145,7 @@ public class BeagleTreeLikelihood extends TreeLikelihood {
 	        		break;
 	        	}
 	        }
-	        if (constantPattern.size() > dataInput.get().getPatternCount()) {
+	        if (constantPattern != null && constantPattern.size() > dataInput.get().getPatternCount()) {
 	        	// if there are many more constant patterns than patterns (each pattern can
 	        	// have a number of constant patters, one for each state) it is less efficient
 	        	// to just calculate the TreeLikelihood for constant sites than optimising
@@ -364,7 +366,8 @@ public class BeagleTreeLikelihood extends TreeLikelihood {
         
         beagle.setCategoryRates(categoryRates);
         currentCategoryRates = categoryRates;
-        storedCurrentCategoryRates = categoryRates.clone();
+        currentFreqs = new double[m_nStateCount];
+        currentCategoryWeights = new double[categoryRates.length];
         
         return true;
     }
@@ -571,20 +574,11 @@ public class BeagleTreeLikelihood extends TreeLikelihood {
         }
         super.store();
         System.arraycopy(m_branchLengths, 0, storedBranchLengths, 0, m_branchLengths.length);
-        System.arraycopy(currentCategoryRates, 0, storedCurrentCategoryRates, 0, currentCategoryRates.length);
     }
 
     @Override
     public void restore() {
-        for (int i = 0; i < currentCategoryRates.length; i++) {
-        	if (currentCategoryRates[i] != storedCurrentCategoryRates[i]) {
-        		updateSiteModel = true; // this is required to upload the categoryRates to BEAGLE after the restore
-        		break;
-        	}
-        }
-        double [] tmp = storedCurrentCategoryRates;
-        storedCurrentCategoryRates = currentCategoryRates;
-        currentCategoryRates = tmp;
+  		updateSiteModel = true; // this is required to upload the categoryRates to BEAGLE after the restore
         
         partialBufferHelper.restoreState();
         eigenBufferHelper.restoreState();
@@ -686,7 +680,12 @@ public class BeagleTreeLikelihood extends TreeLikelihood {
 	            }
 	            categoryRates = tmp;
 	        }
-            beagle.setCategoryRates(categoryRates);
+            for (int i = 0; i < categoryRates.length; i++) {
+            	if (categoryRates[i] != currentCategoryRates[i]) {
+                    beagle.setCategoryRates(categoryRates);
+                    i = categoryRates.length;
+            	}
+            }
             currentCategoryRates = categoryRates;
         }
 
@@ -751,8 +750,21 @@ public class BeagleTreeLikelihood extends TreeLikelihood {
             }
 
             // these could be set only when they change but store/restore would need to be considered
-            beagle.setCategoryWeights(0, categoryWeights);
-            beagle.setStateFrequencies(0, frequencies);
+            
+            for (int i = 0; i < categoryWeights.length; i++) {
+            	if (categoryWeights[i] != currentCategoryWeights[i]) {
+                    beagle.setCategoryWeights(0, categoryWeights);
+            		i = categoryWeights.length;
+            	}
+            }
+            currentCategoryWeights = categoryWeights;
+            for (int i = 0; i < frequencies.length; i++) {
+            	if (frequencies[i] != currentFreqs[i]) {
+                    beagle.setStateFrequencies(0, frequencies);
+            		i = frequencies.length;
+            	}
+            }
+            currentFreqs = frequencies;
 
             double[] sumLogLikelihoods = new double[1];
 
diff --git a/src/beast/evolution/operators/Exchange.java b/src/beast/evolution/operators/Exchange.java
index 738dd8d..086f0cc 100644
--- a/src/beast/evolution/operators/Exchange.java
+++ b/src/beast/evolution/operators/Exchange.java
@@ -103,77 +103,43 @@ public class Exchange extends TreeOperator {
      */
     public double narrow(final Tree tree) {
 
-        if( true ) {
-            //        Alternative implementation that has less risk of rejection due to
-            //    	  selecting an invalid initial node
-            //
-            final int internalNodes = tree.getInternalNodeCount();
-            if (internalNodes <= 1) {
-                return Double.NEGATIVE_INFINITY;
-            }
+        final int internalNodes = tree.getInternalNodeCount();
+        if (internalNodes <= 1) {
+            return Double.NEGATIVE_INFINITY;
+        }
 
-            Node grandParent = tree.getNode(internalNodes + 1 + Randomizer.nextInt(internalNodes));
-            while (grandParent.getLeft().isLeaf() && grandParent.getRight().isLeaf()) {
-                grandParent = tree.getNode(internalNodes + 1 + Randomizer.nextInt(internalNodes));
-            }
+        Node grandParent = tree.getNode(internalNodes + 1 + Randomizer.nextInt(internalNodes));
+        while (grandParent.getLeft().isLeaf() && grandParent.getRight().isLeaf()) {
+            grandParent = tree.getNode(internalNodes + 1 + Randomizer.nextInt(internalNodes));
+        }
 
-            Node parentIndex = grandParent.getLeft();
-            Node uncle = grandParent.getRight();
-            if (parentIndex.getHeight() < uncle.getHeight()) {
-                parentIndex = grandParent.getRight();
-                uncle = grandParent.getLeft();
-            }
+        Node parentIndex = grandParent.getLeft();
+        Node uncle = grandParent.getRight();
+        if (parentIndex.getHeight() < uncle.getHeight()) {
+            parentIndex = grandParent.getRight();
+            uncle = grandParent.getLeft();
+        }
 
-            if( parentIndex.isLeaf() ) {
-                // tree with dated tips
-                return Double.NEGATIVE_INFINITY;
-            }
+        if( parentIndex.isLeaf() ) {
+            // tree with dated tips
+            return Double.NEGATIVE_INFINITY;
+        }
 
-            int validGP = 0;
-            {
-                for(int i = internalNodes + 1; i < 1 + 2*internalNodes; ++i) {
-                    validGP += isg(tree.getNode(i));
-                }
+        int validGP = 0;
+        {
+            for(int i = internalNodes + 1; i < 1 + 2*internalNodes; ++i) {
+                validGP += isg(tree.getNode(i));
             }
+        }
 
-            final int c2 = sisg(parentIndex) + sisg(uncle);
-
-            final Node i = (Randomizer.nextBoolean() ? parentIndex.getLeft() : parentIndex.getRight());
-            exchangeNodes(i, uncle, parentIndex, grandParent);
-
-            final int validGPafter = validGP - c2 + sisg(parentIndex) + sisg(uncle);
-
-            return Math.log((float)validGP/validGPafter);
-        } else {
-
-            final int nodeCount = tree.getNodeCount();
-
-            Node i = tree.getRoot();
-
-            while (i.isRoot() || i.getParent().isRoot()) {
-                i = tree.getNode(Randomizer.nextInt(nodeCount));
-            }
+        final int c2 = sisg(parentIndex) + sisg(uncle);
 
-            final Node parentIndex = i.getParent();
-            final Node grandParent = parentIndex.getParent();
-            Node uncle = grandParent.getLeft();
-            if (uncle.getNr() == parentIndex.getNr()) {
-                uncle = grandParent.getRight();
-                assert (uncle.getNr() != parentIndex.getNr());
-            }
-            assert uncle == getOtherChild(grandParent, parentIndex);
+        final Node i = (Randomizer.nextBoolean() ? parentIndex.getLeft() : parentIndex.getRight());
+        exchangeNodes(i, uncle, parentIndex, grandParent);
 
-            assert i.getHeight() <= grandParent.getHeight();
+        final int validGPafter = validGP - c2 + sisg(parentIndex) + sisg(uncle);
 
-            if (//i.getHeight() < uncle.getHeight() &&
-                    uncle.getHeight() < parentIndex.getHeight()) {
-                exchangeNodes(i, uncle, parentIndex, grandParent);
-                return 0;
-            } else {
-                // Couldn't find valid narrow move on this beast.tree!!
-                return Double.NEGATIVE_INFINITY;
-            }
-        }
+        return Math.log((float)validGP/validGPafter);
     }
 
     /**
@@ -200,10 +166,7 @@ public class Exchange extends TreeOperator {
 
         if ((p != jP) && (i != jP) && (j != p)
                 && (j.getHeight() < p.getHeight())
-                && (i.getHeight() < jP.getHeight())
-//                && ((p.getHeight() < jP.getHeight() && i.getHeight() < j.getHeight()) ||
-//                (p.getHeight() > jP.getHeight() && i.getHeight() > j.getHeight()))
-                ) {
+                && (i.getHeight() < jP.getHeight())) {
             exchangeNodes(i, j, p, jP);
 
             // All the nodes on the path from i/j to the common ancestor of i/j parents had a topology change,
diff --git a/src/beast/evolution/substitutionmodel/Frequencies.java b/src/beast/evolution/substitutionmodel/Frequencies.java
index d49221d..d3f0134 100644
--- a/src/beast/evolution/substitutionmodel/Frequencies.java
+++ b/src/beast/evolution/substitutionmodel/Frequencies.java
@@ -79,7 +79,7 @@ public class Frequencies extends CalculationNode {
             }			
 		}
 
-        return freqs;
+        return freqs.clone();
     }
 
     /**
diff --git a/src/beast/evolution/tree/Node.java b/src/beast/evolution/tree/Node.java
index 5bf959a..734e478 100644
--- a/src/beast/evolution/tree/Node.java
+++ b/src/beast/evolution/tree/Node.java
@@ -711,7 +711,7 @@ public class Node extends BEASTObject {
     }
 
     public void setChild(final int childIndex, final Node node) {
-        while (children.size() < childIndex) {
+        while (children.size() <= childIndex) {
             children.add(null);
         }
         children.set(childIndex, node);
diff --git a/src/beast/util/AddOnManager.java b/src/beast/util/AddOnManager.java
index 9f1ab5e..2a3bb99 100644
--- a/src/beast/util/AddOnManager.java
+++ b/src/beast/util/AddOnManager.java
@@ -58,7 +58,7 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.app.beastapp.BeastMain;
 import beast.app.util.Arguments;
 import beast.app.util.Utils;
@@ -77,7 +77,7 @@ import beast.evolution.alignment.Alignment;
 // TODO: on windows allow installation on drive D: and pick up add-ons in drive C:
 @Description("Manage all BEAUti packages and list their dependencies")
 public class AddOnManager {
-    public static final BEASTVersion beastVersion = new BEASTVersion();
+    public static final BEASTVersion2 beastVersion = new BEASTVersion2();
 
     public final static String[] IMPLEMENTATION_DIR = {"beast", "snap"};
     public final static String TO_DELETE_LIST_FILE = "toDeleteList";
diff --git a/src/beast/util/JSONProducer.java b/src/beast/util/JSONProducer.java
index 8309a6f..668969e 100644
--- a/src/beast/util/JSONProducer.java
+++ b/src/beast/util/JSONProducer.java
@@ -16,7 +16,7 @@ import javax.xml.parsers.ParserConfigurationException;
 
 import org.xml.sax.SAXException;
 
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.core.BEASTInterface;
 import beast.core.Input;
 import beast.core.State;
@@ -85,7 +85,7 @@ public class JSONProducer {
             StringBuffer buf = new StringBuffer();
             //buf.append("{\"version\": \"2.0\",\n\"namespace\": \"" + DEFAULT_NAMESPACE + "\",\n\n" +
             //		"\"" + JSONParser.ANALYSIS_ELEMENT + "\": [\n");
-            buf.append("{version: \"" + (new BEASTVersion()).getMajorVersion() + "\",\nnamespace: \"" + DEFAULT_NAMESPACE + "\",\n\n" +
+            buf.append("{version: \"" + (new BEASTVersion2()).getMajorVersion() + "\",\nnamespace: \"" + DEFAULT_NAMESPACE + "\",\n\n" +
             		XMLParser.BEAST_ELEMENT + ": [\n");
             //buf.append("\n\n");
             isDone = new HashSet<>();
diff --git a/src/beast/util/LogAnalyser.java b/src/beast/util/LogAnalyser.java
index de58c49..b1fc8f1 100644
--- a/src/beast/util/LogAnalyser.java
+++ b/src/beast/util/LogAnalyser.java
@@ -11,7 +11,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.app.util.Utils;
 import beast.core.util.ESS;
 import beast.core.util.Log;
@@ -73,32 +73,43 @@ public class LogAnalyser {
      * @throws IOException 
      */
     public LogAnalyser(String[] args, int burnInPercentage) throws IOException {
+    	this(args, burnInPercentage, false, true);
+    }
+
+    public LogAnalyser(String[] args, int burnInPercentage, boolean quiet, boolean calcStats) throws IOException {
         fileName = args[args.length - 1];
         readLogFile(fileName, burnInPercentage);
-        calcStats();
+        this.quiet = quiet;
+        if (calcStats) {
+        	calcStats();
+        }
     }
 
     public LogAnalyser(String[] args) throws IOException {
-        this(args, BURN_IN_PERCENTAGE);
+        this(args, BURN_IN_PERCENTAGE, false, true);
     }
 
     public LogAnalyser(String fileName, int burnInPercentage) throws IOException {
-        this.fileName = fileName;
-        readLogFile(fileName, burnInPercentage);
-        calcStats();
+    	this(fileName, burnInPercentage, false, true);
     }
 
     public LogAnalyser(String fileName, int burnInPercentage, boolean quiet) throws IOException {
-        this.fileName = fileName;
-        this.quiet = quiet;
-        readLogFile(fileName, burnInPercentage);
-        calcStats();
+    	this(fileName, burnInPercentage, quiet, true);
     }
-
+    
     public LogAnalyser(String fileName) throws IOException {
         this(fileName, BURN_IN_PERCENTAGE);
     }
 
+    public LogAnalyser(String fileName, int burnInPercentage, boolean quiet, boolean calcStats) throws IOException {
+        this.fileName = fileName;
+        this.quiet = quiet;
+        readLogFile(fileName, burnInPercentage);
+        if (calcStats) {
+        	calcStats();
+        }
+    }
+
     @SuppressWarnings("unchecked")
 	protected void readLogFile(String fileName, int burnInPercentage) throws IOException {
         log("\nLoading " + fileName);
@@ -178,7 +189,7 @@ public class LogAnalyser {
      * calculate statistics on the data, one per column.
      * First column (sample nr) is not set *
      */
-    void calcStats() {
+    public void calcStats() {
         logln("\nCalculating statistics\n\n" + BAR);
         int stars = 0;
         int items = m_sLabels.length;
@@ -537,7 +548,7 @@ public class LogAnalyser {
             	// process args
             	int burninPercentage = BURN_IN_PERCENTAGE;
                 boolean oneLine = false;
-                boolean quiet = true;
+                boolean quiet = false;
             	List<String> files = new ArrayList<>();
             	int i = 0;
             	while (i < args.length) {
@@ -580,7 +591,7 @@ public class LogAnalyser {
             	}
             	if (files.size() == 0) {
             		// no file specified, open file dialog to select one
-	                BEASTVersion version = new BEASTVersion();
+	                BEASTVersion2 version = new BEASTVersion2();
 	                File file = Utils.getLoadFile("LogAnalyser " + version.getVersionString() + " - Select log file to analyse",
 	                        null, "BEAST log (*.log) Files", "log", "txt");
 	                if (file == null) {
diff --git a/src/beast/util/LogComparator.java b/src/beast/util/LogComparator.java
index 291acbc..0fd6748 100644
--- a/src/beast/util/LogComparator.java
+++ b/src/beast/util/LogComparator.java
@@ -8,7 +8,7 @@ import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.List;
 
-import beast.app.BEASTVersion;
+import beast.app.BEASTVersion2;
 import beast.app.util.Utils;
 
 /**
@@ -135,7 +135,7 @@ public class LogComparator {
         LogAnalyser analyser2 = null;
         try {
             if (args.length == 0) {
-                BEASTVersion version = new BEASTVersion();
+                BEASTVersion2 version = new BEASTVersion2();
                 File file = Utils.getLoadFile("LogComparator " + version.getVersionString() + " - Select first log file to analyse",
                         null, "BEAST log (*.log) Files", "log", "txt");
                 if (file == null) {
diff --git a/src/beast/util/NexusParser.java b/src/beast/util/NexusParser.java
index 290574e..39221ef 100644
--- a/src/beast/util/NexusParser.java
+++ b/src/beast/util/NexusParser.java
@@ -18,6 +18,7 @@ import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import beast.core.BEASTInterface;
 import beast.core.util.Log;
 import beast.evolution.alignment.Alignment;
 import beast.evolution.alignment.FilteredAlignment;
@@ -29,6 +30,13 @@ import beast.evolution.datatype.StandardData;
 import beast.evolution.datatype.UserDataType;
 import beast.evolution.tree.TraitSet;
 import beast.evolution.tree.Tree;
+import beast.math.distributions.Exponential;
+import beast.math.distributions.Gamma;
+import beast.math.distributions.LogNormalDistributionModel;
+import beast.math.distributions.MRCAPrior;
+import beast.math.distributions.Normal;
+import beast.math.distributions.ParametricDistribution;
+import beast.math.distributions.Uniform;
 
 
 /**
@@ -46,8 +54,10 @@ public class NexusParser {
     public Alignment m_alignment;
     public List<Alignment> filteredAlignments = new ArrayList<>();
     public TraitSet traitSet;
+    public List<MRCAPrior> calibrations;
 
     public List<String> taxa;
+    List<Taxon> taxonList = new ArrayList<>();
     public List<Tree> trees;
 
     static Set<String> g_sequenceIDs;
@@ -101,6 +111,7 @@ public class NexusParser {
             while (fin.ready()) {
                 final String str = nextLine(fin);
                 if (str == null) {
+                    processSets();
                     return;
                 }
                 final String lower = str.toLowerCase();
@@ -119,13 +130,14 @@ public class NexusParser {
                     parseTreesBlock(fin);
                 }
             }
+            processSets();
         } catch (Exception e) {
             e.printStackTrace();
             throw new IOException("Around line " + lineNr + "\n" + e.getMessage());
         }
     } // parseFile
 
-    private void parseTreesBlock(final BufferedReader fin) throws IOException {
+	private void parseTreesBlock(final BufferedReader fin) throws IOException {
         trees = new ArrayList<>();
         // read to first non-empty line within trees block
         String str = fin.readLine().trim();
@@ -274,11 +286,12 @@ public class NexusParser {
                             	taxon = taxon.substring(1, taxon.length() - 1);
                             }
                             taxa.add(taxon);
+                            taxonList.add(new Taxon(taxon));
                     	}
                     }
-                } while (!str.toLowerCase().equals("end"));
+                } while (!str.toLowerCase().replaceAll(";", "").equals("end"));
             }
-        } while (!str.toLowerCase().equals("end"));
+        } while (!str.toLowerCase().replaceAll(";", "").equals("end"));
         if (expectedTaxonCount >= 0 && taxa.size() != expectedTaxonCount) {
             throw new IOException("Number of taxa (" + taxa.size() + ") is not equal to 'dimension' " +
             		"field (" + expectedTaxonCount + ") specified in 'taxa' block");
@@ -605,6 +618,7 @@ public class NexusParser {
 
         HashSet<String> sortedAmbiguities = new HashSet<>();
         for (final String taxon : taxa) {
+        	taxonList.add(new Taxon(taxon));
             final StringBuilder bsData = seqMap.get(taxon);
             String data = bsData.toString().replaceAll("\\s", "");
             seqMap.put(taxon, new StringBuilder(data));
@@ -662,16 +676,23 @@ public class NexusParser {
                 }
             }
 
-            if (alignment.dataTypeInput.get().equals("nucleotide") || 
-            	alignment.dataTypeInput.get().equals("binary")  ||
-            	alignment.dataTypeInput.get().equals("aminoacid") ) {
-            	alignment.setInputValue(taxon, data);
-            } else {
+            // Using Alignment as Map gives problems when producing XML: 
+            // Sequence names are used as attribute names, producing very readable XML
+            // However, since attribute names cannot start with a number or contain
+            // special characters (like ":" or "]") but sequence names do contain them
+            // on occasion, it is more robust to create a Sequence object for each 
+            // sequence where the taxon name is stored as an XML attribute values
+            // that do not have the attribute name restrictions.
+//            if (alignment.dataTypeInput.get().equals("nucleotide") || 
+//            	alignment.dataTypeInput.get().equals("binary")  ||
+//            	alignment.dataTypeInput.get().equals("aminoacid") ) {
+//            	alignment.setInputValue(taxon, data);
+//            } else {
 	            final Sequence sequence = new Sequence();
 	            sequence.init(totalCount, taxon, data);
 	            sequence.setID(generateSequenceID(taxon));
 	            alignment.sequenceInput.setValue(sequence, alignment);
-            }
+//            }
         }
 
 
@@ -759,11 +780,160 @@ public class NexusParser {
             			Log.warning.println("WTSET was specified before alignment. WTSET is ignored.");
             		}
             	}
+            } else if (str.toLowerCase().matches("\\s*taxset\\s.*")) {
+            	String [] strs = str.split("=");
+            	if (strs.length > 1) {
+            		String str0 = strs[0].trim();
+            		String [] strs2 = str0.split("\\s+");
+            		if (strs2.length != 2) {
+            			throw new RuntimeException("expected 'taxset <name> = ...;' but did not get two words before the = sign: " + str);
+            		}
+            		String taxonSetName = strs2[1];
+            		str0 = strs[strs.length - 1].trim();
+            		if (!str0.endsWith(";")) {
+            			Log.warning.println("expected 'taxset <name> = ...;' semi-colin is missing: " + str + "\n"
+            					+ "Taxa from following lines may be missing.");
+            		}
+            		str0 = str0.replaceAll(";", "");
+            		String [] taxonNames = str0.split("\\s+");
+            		TaxonSet taxonset = new TaxonSet();
+            		for (String taxon : taxonNames) {
+            			taxonset.taxonsetInput.get().add(new Taxon(taxon.replaceAll("'\"", "")));
+            		}
+            		taxonset.setID(taxonSetName.replaceAll("'\"", ""));
+            		taxonsets.add(taxonset);
+            	}
+            } else if (str.toLowerCase().matches("^\\s*calibrate\\s.*")) {
+            	// define calibration represented by an MRCAPRior, 
+            	// taxon sets need to be specified earlier, but can also be a single taxon
+            	// e.g.
+            	// begin mrbayes;
+            	// calibrate germanic = normal(1000,50)
+            	// calibrate hittite = normal(3450,100)
+            	// calibrate english = fixed(0)
+            	// end;
+            	String [] strs = str.split("=");
+            	if (strs.length > 1) {
+            		String str0 = strs[0].trim();
+            		String [] strs2 = str0.split("\\s+");
+            		if (strs2.length != 2) {
+            			throw new RuntimeException("expected 'calibrate <name> = ...' but did not get two words before the = sign: " + str);
+            		}
+            		// first, get the taxon
+            		String taxonSetName = strs2[1].replaceAll("'\"", "");
+            		TaxonSet taxonset = null;
+            		for (Taxon t : taxonsets) {
+            			if (t.getID().equals(taxonSetName) && t instanceof TaxonSet) {
+            				taxonset = (TaxonSet) t;
+            			}
+            		}
+            		if (taxonset == null) {
+            			// perhaps it is a singleton
+            			for (Taxon t : taxonList) {
+            				if (t.getID().equals(taxonSetName)) {
+            					taxonset = new TaxonSet();
+            					taxonset.setID(t.getID() + ".leaf");
+            					taxonset.taxonsetInput.setValue(t, taxonset);
+            				}
+            			}
+            		}
+            		if (taxonset == null) {
+            			throw new RuntimeException("Could not find taxon/taxonset " + taxonSetName + " in calibration: " + str);
+            		}
+            		
+            		// next get the calibration
+            		str0 = strs[strs.length - 1].trim();
+            		String [] strs3 = str0.split("[\\(,\\)]");
+            		ParametricDistribution distr  = null;
+            		switch (strs3[0]) {
+            		case "normal":
+            			distr = new Normal();
+            			distr.initByName("mean", strs3[1], "sigma", strs3[2]);
+            			distr.setID("Normal.0");
+            			break;
+            		case "uniform":
+            			distr = new Uniform();
+            			distr.initByName("lower", strs3[1], "upper", strs3[2]);
+            			distr.setID("Uniform.0");
+            			break;
+            		case "fixed":
+            			// uniform with lower == upper
+            			distr = new Uniform();
+            			distr.initByName("lower", strs3[1], "upper", strs3[1]);
+            			distr.setID("Uniform.0");
+            			break;
+            		case "offsetlognormal":
+            			distr = new LogNormalDistributionModel();
+            			distr.initByName("offset", strs3[1], "M", strs3[2], "S", strs3[3], "meanInRealSpace", true);
+            			distr.setID("LogNormal.0");
+            			break;
+            		case "lognormal":
+            			distr = new LogNormalDistributionModel();
+            			distr.initByName("M", strs3[1], "S", strs3[2], "meanInRealSpace", true);
+            			distr.setID("LogNormal.0");
+            			break;
+            		case "offsetexponential":
+            			distr = new Exponential();
+            			distr.initByName("offset", strs3[1], "mean", strs3[2]);
+            			distr.setID("Exponential.0");
+            			break;
+            		case "gamma":
+            			distr = new Gamma();
+            			distr.initByName("alpha", strs3[1], "beta", strs3[2]);
+            			distr.setID("Gamma.0");
+            			break;
+            		case "offsetgamma":
+            			distr = new Gamma();
+            			distr.initByName("offset", strs3[1], "alpha", strs3[2], "beta", strs3[3]);
+            			distr.setID("Gamma.0");
+            			break;
+            		default:
+            			throw new RuntimeException("Unknwon distribution "+ strs3[0] +"in calibration: " + str);
+            		}
+            		MRCAPrior prior = new MRCAPrior();
+            		prior.isMonophyleticInput.setValue(true, prior);
+            		prior.distInput.setValue(distr, prior);
+            		prior.taxonsetInput.setValue(taxonset, prior);
+            		prior.setID(taxonset.getID() + ".prior");
+            		// should set Tree before initialising, but we do not know the tree yet...
+            		if (calibrations == null) {
+            			calibrations = new ArrayList<>();
+            		}
+            		calibrations.add(prior);
+            	}
             }
 
+
         } while (!str.toLowerCase().contains("end;"));
     }
 
+    
+    private void processSets() {
+    	// create monophyletic MRCAPrior for each taxon set that 
+    	// does not already have a calibration associated with it
+    	for (TaxonSet taxonset : taxonsets) {
+    		boolean found = false;
+    		for (BEASTInterface o : taxonset.getOutputs()) {
+    			if (o instanceof MRCAPrior) {
+    				found = true;
+    				break;
+    			}
+    		}
+    		if (!found) {
+        		MRCAPrior prior = new MRCAPrior();
+        		prior.isMonophyleticInput.setValue(true, prior);
+        		prior.taxonsetInput.setValue(taxonset, prior);
+        		prior.setID(taxonset.getID() + ".prior");
+        		// should set Tree before initialising, but we do not know the tree yet...
+        		if (calibrations == null) {
+        			calibrations = new ArrayList<>();
+        		}
+        		calibrations.add(prior);
+    		}
+    	}
+	}
+
+
     /**
      * parse sets block
      * BEGIN Sets;
@@ -776,21 +946,28 @@ public class NexusParser {
         do {
             str = nextLine(fin);
             if (str.toLowerCase().matches("\\s*taxset\\s.*")) {
-                str = str.replaceAll("^\\s+", "");
-                str = str.replaceAll(";", "");
-                final String[] strs = str.split("\\s+");
-                String id = strs[1];
-                id = id.replaceAll("'\"", "");
-                final TaxonSet set = new TaxonSet();
-                set.setID(id);
-                for (int i = 3; i < strs.length; i++) {
-                    id = strs[i];
-                    id = id.replaceAll("'\"", "");
-                    final Taxon taxon = new Taxon();
-                    taxon.setID(id);
-                    set.taxonsetInput.setValue(taxon, set);
-                }
-                taxonsets.add(set);
+            	String [] strs = str.split("=");
+            	if (strs.length > 1) {
+            		String str0 = strs[0].trim();
+            		String [] strs2 = str0.split("\\s+");
+            		if (strs2.length != 2) {
+            			throw new RuntimeException("expected 'taxset <name> = ...;' but did not get two words before the = sign: " + str);
+            		}
+            		String taxonSetName = strs2[1];
+            		str0 = strs[strs.length - 1].trim();
+            		if (!str0.endsWith(";")) {
+            			Log.warning.println("expected 'taxset <name> = ...;' semi-colin is missing: " + str + "\n"
+            					+ "Taxa from following lines may be missing.");
+            		}
+            		str0 = str0.replaceAll(";", "");
+            		String [] taxonNames = str0.split("\\s+");
+            		TaxonSet taxonset = new TaxonSet();
+            		for (String taxon : taxonNames) {
+            			taxonset.taxonsetInput.get().add(new Taxon(taxon.replaceAll("'\"", "")));
+            		}
+            		taxonset.setID(taxonSetName.replaceAll("'\"", ""));
+            		taxonsets.add(taxonset);
+            	}
             }
         } while (!str.toLowerCase().contains("end;"));
     }
diff --git a/src/test/beast/evolution/alignment/FilteredAlignmentTest.java b/src/test/beast/evolution/alignment/FilteredAlignmentTest.java
index 1fabb81..d23b823 100644
--- a/src/test/beast/evolution/alignment/FilteredAlignmentTest.java
+++ b/src/test/beast/evolution/alignment/FilteredAlignmentTest.java
@@ -271,7 +271,27 @@ public class FilteredAlignmentTest extends TestCase {
 
 //        System.out.println(alignmentToString(data2, 1));
     }
+    
+    @Test
+    public void testFilteredFileredAlignment() throws Exception {
+        Alignment data1 = getAlignment();
+        FilteredAlignment data2 = new FilteredAlignment();
+        data2.initByName("data", data1, "filter", "2:16:2");
 
+        
+        FilteredAlignment data3 = new FilteredAlignment();
+        data3.initByName("data", data2, "filter", "-");//, "ascertained", true, "excludeto", 1);
+        
+        assertEquals(alignmentToString(data2,0), alignmentToString(data3, 0));
+        assertEquals(alignmentToString(data2,1), alignmentToString(data3, 1));
+
+        FilteredAlignment data4 = new FilteredAlignment();
+        data4.initByName("data", data3, "filter", "-", "ascertained", true, "excludeto", 1);
+
+        assertEquals(alignmentToString(data2,0), alignmentToString(data4, 0));
+        assertEquals(alignmentToString(data2,1), alignmentToString(data4, 1));
+}
+    
     String alignmentToString(Alignment data, int iTaxon) throws Exception {
         int[] states = new int[data.getPatternCount()];
 //        for (int i = 0; i < data.getSiteCount(); i++) {
diff --git a/src/test/beast/integration/XMLProducerTest.java b/src/test/beast/integration/XMLProducerTest.java
index 59fad5b..bdae5ed 100644
--- a/src/test/beast/integration/XMLProducerTest.java
+++ b/src/test/beast/integration/XMLProducerTest.java
@@ -9,6 +9,8 @@ import org.junit.Test;
 
 import beast.core.BEASTInterface;
 import beast.core.Logger;
+import beast.evolution.datatype.Nucleotide;
+import beast.util.NexusParser;
 import beast.util.Randomizer;
 import beast.util.XMLParser;
 import beast.util.XMLProducer;
@@ -16,15 +18,76 @@ import junit.framework.TestCase;
 
 public class XMLProducerTest extends TestCase {
 
+//    @Test
+//    public void test_ThatXmlExamplesProduces() {
+//    	System.setProperty("java.only", "true");
+//        String dir = System.getProperty("user.dir") + "/examples";
+//        //String dir = "/tmp";
+//        List<String> exceptions = new ArrayList<String>();
+//        exceptions.add("testExponentialGrowth.xml");
+//    	test_ThatXmlExamplesProduces(dir, exceptions);
+//    }
+    
+    
+    
     @Test
-    public void test_ThatXmlExamplesProduces() {
-    	System.setProperty("java.only", "true");
-        String dir = System.getProperty("user.dir") + "/examples";
-        //String dir = "/tmp";
-        List<String> exceptions = new ArrayList<String>();
-        exceptions.add("testExponentialGrowth.xml");
-    	test_ThatXmlExamplesProduces(dir, exceptions);
+    public void test_ThatNexusExamplesProduces() {
+        try {
+            String dirName = System.getProperty("user.dir") + "/examples/nexus";
+            System.out.println("Test Nexus Examples in " + dirName);
+            File exampleDir = new File(dirName);
+            String[] exampleFiles = exampleDir.list(new FilenameFilter() {
+                @Override
+				public boolean accept(File dir, String name) {
+                    return name.endsWith(".nex") || name.endsWith(".nxs") ;
+                }
+            });
+
+            List<String> failedFiles = new ArrayList<>();
+            for (String fileName : exampleFiles) {
+                System.out.println("Processing " + fileName);
+                NexusParser parser = new NexusParser();
+                try {
+                    parser.parseFile(new File(dirName + "/" + fileName));
+                } catch (Exception e) {
+                    System.out.println("ExampleNexusParsing::Failed for " + fileName
+                            + ": " + e.getMessage());
+                    failedFiles.add(fileName);
+                }
+                
+                XMLProducer producer = new XMLProducer();
+                BEASTInterface o = parser.m_alignment;
+                if (o != null) {
+                	String xml = producer.toXML(o);
+                	
+                    //FileWriter outfile = new FileWriter(new File("/tmp/XMLProducerTest.xml"));
+                    //outfile.write(xml);
+                    //outfile.close();
+
+                	XMLParser parser2 = new XMLParser();
+                    try {
+                    	BEASTInterface o2 = parser2.parseFragment(xml, false);
+                    	System.out.println(o2);
+                    } catch (Exception e) {
+                        System.out.println("test_ThatNexusExamplesProduces::Failed for " + fileName
+                                + ": " + e.getMessage());
+                        failedFiles.add(fileName);
+                    }
+                }
+                System.out.println("Done " + fileName);
+            }
+            if (failedFiles.size() > 0) {
+                System.out.println("\test_ThatNexusExamplesProduces::Failed for : " + failedFiles.toString());
+            } else {
+                System.out.println("\test_ThatNexusExamplesProduces::Success");
+            }
+            assertTrue(failedFiles.toString(), failedFiles.size() == 0);
+        } catch (Exception e) {
+            System.out.println("exception thrown ");
+            System.out.println(e.getMessage());
+        }
     }
+
     
     /** parse all XML files in the given directory, then produce XML from it, and see if the produced XML still parses **/
     public void test_ThatXmlExamplesProduces(String dir, List<String> exceptions) {
@@ -84,4 +147,11 @@ public class XMLProducerTest extends TestCase {
         }
     } // test_XmlExamples
 
+    
+    @Test
+    public void testObjectWithoutID() {
+    	BEASTInterface o = new Nucleotide();
+    	XMLProducer producer = new XMLProducer();
+    	System.out.println(producer.toXML(o));
+    }
 }
diff --git a/version.xml b/version.xml
index 9af90d5..2a25ca7 100644
--- a/version.xml
+++ b/version.xml
@@ -1 +1 @@
-<addon name='BEAST' version='2.4.0' url="https://github.com/CompEvol/beast2/releases/download/2.4.0pre/BEAST.v2.4.0.addon.zip"/>
+<addon name='BEAST' version='2.4.1' url="https://github.com/CompEvol/beast2/releases/download/2.4.1pre/BEAST.v2.4.1.addon.zip"/>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/beast2-mcmc.git



More information about the debian-med-commit mailing list