diff --git a/tools/beast2/.shed.yml b/tools/beast2/.shed.yml
new file mode 100644
index 00000000000..4e920264517
--- /dev/null
+++ b/tools/beast2/.shed.yml
@@ -0,0 +1,16 @@
+name: beast2
+owner: iuc
+categories:
+- Phylogenetics
+description: "BEAST 2: Bayesian Evolutionary Analysis Sampling Trees"
+long_description: BEAST 2 is a software platform for Bayesian evolutionary analysis of molecular sequences using MCMC. It is designed for phylogenetic inference, divergence time estimation, and testing evolutionary hypotheses based on genetic data.
+homepage_url: https://www.beast2.org/
+remote_repository_url: https://github.com/galaxyproject/tools-iuc/tree/main/tools/beast2
+type: unrestricted
+suite:
+ name: "suite_beast2"
+ description: "A suite of tools for BEAST 2 in Galaxy"
+ type: repository_suite_definition
+auto_tool_repositories:
+ name_template: "{{ tool_id }}"
+ description_template: "Wrapper for the BEAST 2 tool suite: {{ tool_name }}"
\ No newline at end of file
diff --git a/tools/beast2/logcombiner.xml b/tools/beast2/logcombiner.xml
new file mode 100644
index 00000000000..116b203edcc
--- /dev/null
+++ b/tools/beast2/logcombiner.xml
@@ -0,0 +1,98 @@
+
+ Combine multiple trace or tree log files into a single log file
+
+ macros.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10.1371/journal.pcbi.1006650
+
+
\ No newline at end of file
diff --git a/tools/beast2/macros.xml b/tools/beast2/macros.xml
new file mode 100644
index 00000000000..6ec7b2d6c35
--- /dev/null
+++ b/tools/beast2/macros.xml
@@ -0,0 +1,29 @@
+
+ 2.6.3
+ 0
+ 25.0
+
+ beast2
+
+
+
+ beast2
+
+
+
+
+ beast2
+
+
+
+
+ 10.1371/journal.pcbi.1003537
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tools/beast2/test-data/input.trees b/tools/beast2/test-data/input.trees
new file mode 100644
index 00000000000..1ea00680453
--- /dev/null
+++ b/tools/beast2/test-data/input.trees
@@ -0,0 +1,11 @@
+#NEXUS
+begin trees;
+ translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD;
+ tree STATE_0 = [&R] ((1:0.1,2:0.1):0.2,(3:0.15,4:0.15):0.25):0.1;
+ tree STATE_1 = [&R] ((1:0.12,2:0.12):0.18,(3:0.14,4:0.14):0.27):0.11;
+ tree STATE_2 = [&R] ((1:0.09,2:0.09):0.22,(3:0.16,4:0.16):0.24):0.09;
+end
\ No newline at end of file
diff --git a/tools/beast2/test-data/log1.log b/tools/beast2/test-data/log1.log
new file mode 100644
index 00000000000..b54f296fc95
--- /dev/null
+++ b/tools/beast2/test-data/log1.log
@@ -0,0 +1,21 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1234.56 -1000.12 -234.44 5.67 2.34 0.89
+1000 -1230.45 -995.23 -235.22 5.65 2.36 0.91
+2000 -1228.34 -992.11 -236.23 5.63 2.38 0.90
+3000 -1225.67 -990.34 -235.33 5.61 2.35 0.92
+4000 -1223.45 -988.56 -234.89 5.59 2.37 0.89
+5000 -1221.23 -986.78 -234.45 5.57 2.39 0.91
+6000 -1219.12 -985.01 -234.11 5.55 2.36 0.90
+7000 -1217.89 -983.45 -234.44 5.53 2.38 0.92
+8000 -1216.34 -982.12 -234.22 5.51 2.35 0.88
+9000 -1215.23 -981.00 -234.23 5.49 2.37 0.91
+10000 -1214.56 -980.34 -234.22 5.48 2.36 0.90
+11000 -1213.45 -979.23 -234.22 5.47 2.38 0.89
+12000 -1212.67 -978.45 -234.22 5.46 2.35 0.92
+13000 -1211.89 -977.67 -234.22 5.45 2.37 0.91
+14000 -1211.23 -977.01 -234.22 5.44 2.36 0.90
+15000 -1210.67 -976.45 -234.22 5.43 2.38 0.89
+16000 -1210.12 -975.90 -234.22 5.42 2.35 0.91
+17000 -1209.67 -975.45 -234.22 5.41 2.37 0.90
+18000 -1209.23 -975.01 -234.22 5.40 2.36 0.92
+19000 -1208.89 -974.67 -234.22 5.39 2.38 0.89
\ No newline at end of file
diff --git a/tools/beast2/test-data/log2.log b/tools/beast2/test-data/log2.log
new file mode 100644
index 00000000000..7ea2736b998
--- /dev/null
+++ b/tools/beast2/test-data/log2.log
@@ -0,0 +1,21 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1235.67 -1001.23 -234.44 5.68 2.33 0.88
+1000 -1231.23 -996.01 -235.22 5.66 2.35 0.90
+2000 -1229.12 -993.67 -235.45 5.64 2.37 0.89
+3000 -1226.45 -991.23 -235.22 5.62 2.36 0.91
+4000 -1224.23 -989.45 -234.78 5.60 2.38 0.90
+5000 -1222.01 -987.67 -234.34 5.58 2.35 0.92
+6000 -1220.23 -986.01 -234.22 5.56 2.37 0.89
+7000 -1218.67 -984.45 -234.22 5.54 2.36 0.91
+8000 -1217.12 -983.12 -234.00 5.52 2.38 0.90
+9000 -1216.01 -982.01 -234.00 5.50 2.35 0.92
+10000 -1215.34 -981.34 -234.00 5.49 2.37 0.89
+11000 -1214.23 -980.23 -234.00 5.48 2.36 0.91
+12000 -1213.45 -979.45 -234.00 5.47 2.38 0.90
+13000 -1212.67 -978.67 -234.00 5.46 2.35 0.92
+14000 -1212.01 -978.01 -234.00 5.45 2.37 0.89
+15000 -1211.45 -977.45 -234.00 5.44 2.36 0.91
+16000 -1210.90 -976.90 -234.00 5.43 2.38 0.90
+17000 -1210.45 -976.45 -234.00 5.42 2.35 0.92
+18000 -1210.01 -976.01 -234.00 5.41 2.37 0.89
+19000 -1209.67 -975.67 -234.00 5.40 2.36 0.91
diff --git a/tools/beast2/test-data/log3.log b/tools/beast2/test-data/log3.log
new file mode 100644
index 00000000000..1e26a537017
--- /dev/null
+++ b/tools/beast2/test-data/log3.log
@@ -0,0 +1,21 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1236.78 -1002.34 -234.44 5.69 2.32 0.87
+1000 -1232.34 -997.12 -235.22 5.67 2.34 0.89
+2000 -1230.23 -994.78 -235.45 5.65 2.36 0.88
+3000 -1227.56 -992.34 -235.22 5.63 2.35 0.90
+4000 -1225.34 -990.56 -234.78 5.61 2.37 0.89
+5000 -1223.12 -988.78 -234.34 5.59 2.34 0.91
+6000 -1221.34 -987.12 -234.22 5.57 2.36 0.88
+7000 -1219.78 -985.56 -234.22 5.55 2.35 0.90
+8000 -1218.23 -984.23 -234.00 5.53 2.37 0.89
+9000 -1217.12 -983.12 -234.00 5.51 2.34 0.91
+10000 -1216.45 -982.45 -234.00 5.50 2.36 0.88
+11000 -1215.34 -981.34 -234.00 5.49 2.35 0.90
+12000 -1214.56 -980.56 -234.00 5.48 2.37 0.89
+13000 -1213.78 -979.78 -234.00 5.47 2.34 0.91
+14000 -1213.12 -979.12 -234.00 5.46 2.36 0.88
+15000 -1212.56 -978.56 -234.00 5.45 2.35 0.90
+16000 -1212.01 -978.01 -234.00 5.44 2.37 0.89
+17000 -1211.56 -977.56 -234.00 5.43 2.34 0.91
+18000 -1211.12 -977.12 -234.00 5.42 2.36 0.88
+19000 -1210.78 -976.78 -234.00 5.41 2.35 0.90
diff --git a/tools/beast2/test-data/output.trees b/tools/beast2/test-data/output.trees
new file mode 100644
index 00000000000..08cd60ce9d2
--- /dev/null
+++ b/tools/beast2/test-data/output.trees
@@ -0,0 +1,20 @@
+#NEXUS
+
+Begin taxa;
+ Dimensions ntax=4;
+ Taxlabels
+ taxonA
+ taxonB
+ taxonC
+ taxonD
+ ;
+End;
+Begin trees;
+ Translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD
+;
+tree TREE1 = ((1[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335,2[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335)[&CAheight_95%_HPD={0.18,0.23000000000000004},CAheight_mean=0.20333333333333334,CAheight_median=0.19999999999999996,CAheight_range={0.18,0.23000000000000004},height=0.20333333333333334,height_95%_HPD={0.18,0.23000000000000004},height_median=0.19999999999999996,height_range={0.18,0.23000000000000004},length=0.20000000000000004,length_95%_HPD={0.18,0.22000000000000003},length_median=0.20000000000000007,length_range={0.18,0.22000000000000003},posterior=1.0]:0.19999999999999998,(3[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002,4[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002)[&CAheight_95%_HPD={0.14,0.16000000000000003},CAheight_mean=0.15000000000000002,CAheight_median=0.15000000000000002,CAheight_range={0.14,0.16000000000000003},height=0.15000000000000002,height_95%_HPD={0.14,0.16000000000000003},height_median=0.15000000000000002,height_range={0.14,0.16000000000000003},length=0.25333333333333335,length_95%_HPD={0.24,0.27},length_median=0.25,length_range={0.24,0.27},posterior=1.0]:0.2533333333333333)[&CAheight_95%_HPD={0.4,0.41000000000000003},CAheight_mean=0.4033333333333333,CAheight_median=0.4,CAheight_range={0.4,0.41000000000000003},height=0.4033333333333333,height_95%_HPD={0.4,0.41000000000000003},height_median=0.4,height_range={0.4,0.41000000000000003},length=0.0,posterior=1.0]:0.0;
+End;
diff --git a/tools/beast2/test-data/output_burnout.trees b/tools/beast2/test-data/output_burnout.trees
new file mode 100644
index 00000000000..2b40c57d106
--- /dev/null
+++ b/tools/beast2/test-data/output_burnout.trees
@@ -0,0 +1,20 @@
+#NEXUS
+
+Begin taxa;
+ Dimensions ntax=4;
+ Taxlabels
+ taxonA
+ taxonB
+ taxonC
+ taxonD
+ ;
+End;
+Begin trees;
+ Translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD
+;
+tree TREE1 = ((1[&height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.09999999999999998,2[&height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.09999999999999998)[&height=0.20333333333333334,height_95%_HPD={0.18,0.23000000000000004},height_median=0.19999999999999996,height_range={0.18,0.23000000000000004},length=0.20000000000000004,length_95%_HPD={0.18,0.22000000000000003},length_median=0.20000000000000007,length_range={0.18,0.22000000000000003},posterior=1.0]:0.20000000000000007,(3[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002,4[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002)[&height=0.15000000000000002,height_95%_HPD={0.14,0.16000000000000003},height_median=0.15000000000000002,height_range={0.14,0.16000000000000003},length=0.25333333333333335,length_95%_HPD={0.24,0.27},length_median=0.25,length_range={0.24,0.27},posterior=1.0]:0.25)[&height=0.4033333333333333,height_95%_HPD={0.4,0.41000000000000003},height_median=0.4,height_range={0.4,0.41000000000000003},length=0.0,posterior=1.0]:0.0;
+End;
diff --git a/tools/beast2/test-data/output_hpd.trees b/tools/beast2/test-data/output_hpd.trees
new file mode 100644
index 00000000000..08cd60ce9d2
--- /dev/null
+++ b/tools/beast2/test-data/output_hpd.trees
@@ -0,0 +1,20 @@
+#NEXUS
+
+Begin taxa;
+ Dimensions ntax=4;
+ Taxlabels
+ taxonA
+ taxonB
+ taxonC
+ taxonD
+ ;
+End;
+Begin trees;
+ Translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD
+;
+tree TREE1 = ((1[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335,2[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335)[&CAheight_95%_HPD={0.18,0.23000000000000004},CAheight_mean=0.20333333333333334,CAheight_median=0.19999999999999996,CAheight_range={0.18,0.23000000000000004},height=0.20333333333333334,height_95%_HPD={0.18,0.23000000000000004},height_median=0.19999999999999996,height_range={0.18,0.23000000000000004},length=0.20000000000000004,length_95%_HPD={0.18,0.22000000000000003},length_median=0.20000000000000007,length_range={0.18,0.22000000000000003},posterior=1.0]:0.19999999999999998,(3[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002,4[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002)[&CAheight_95%_HPD={0.14,0.16000000000000003},CAheight_mean=0.15000000000000002,CAheight_median=0.15000000000000002,CAheight_range={0.14,0.16000000000000003},height=0.15000000000000002,height_95%_HPD={0.14,0.16000000000000003},height_median=0.15000000000000002,height_range={0.14,0.16000000000000003},length=0.25333333333333335,length_95%_HPD={0.24,0.27},length_median=0.25,length_range={0.24,0.27},posterior=1.0]:0.2533333333333333)[&CAheight_95%_HPD={0.4,0.41000000000000003},CAheight_mean=0.4033333333333333,CAheight_median=0.4,CAheight_range={0.4,0.41000000000000003},height=0.4033333333333333,height_95%_HPD={0.4,0.41000000000000003},height_median=0.4,height_range={0.4,0.41000000000000003},length=0.0,posterior=1.0]:0.0;
+End;
diff --git a/tools/beast2/test-data/output_limit.trees b/tools/beast2/test-data/output_limit.trees
new file mode 100644
index 00000000000..653bfaf6db4
--- /dev/null
+++ b/tools/beast2/test-data/output_limit.trees
@@ -0,0 +1,20 @@
+#NEXUS
+
+Begin taxa;
+ Dimensions ntax=4;
+ Taxlabels
+ taxonA
+ taxonB
+ taxonC
+ taxonD
+ ;
+End;
+Begin trees;
+ Translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD
+;
+tree TREE1 = ((1[&height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335,2[&height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335)[&height=0.20333333333333334,height_95%_HPD={0.18,0.23000000000000004},height_median=0.19999999999999996,height_range={0.18,0.23000000000000004},length=0.20000000000000004,length_95%_HPD={0.18,0.22000000000000003},length_median=0.20000000000000007,length_range={0.18,0.22000000000000003},posterior=1.0]:0.19999999999999998,(3[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002,4[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002)[&height=0.15000000000000002,height_95%_HPD={0.14,0.16000000000000003},height_median=0.15000000000000002,height_range={0.14,0.16000000000000003},length=0.25333333333333335,length_95%_HPD={0.24,0.27},length_median=0.25,length_range={0.24,0.27},posterior=1.0]:0.2533333333333333)[&height=0.4033333333333333,height_95%_HPD={0.4,0.41000000000000003},height_median=0.4,height_range={0.4,0.41000000000000003},length=0.0,posterior=1.0]:0.0;
+End;
diff --git a/tools/beast2/test-data/output_no_sa.trees b/tools/beast2/test-data/output_no_sa.trees
new file mode 100644
index 00000000000..08cd60ce9d2
--- /dev/null
+++ b/tools/beast2/test-data/output_no_sa.trees
@@ -0,0 +1,20 @@
+#NEXUS
+
+Begin taxa;
+ Dimensions ntax=4;
+ Taxlabels
+ taxonA
+ taxonB
+ taxonC
+ taxonD
+ ;
+End;
+Begin trees;
+ Translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD
+;
+tree TREE1 = ((1[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335,2[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335)[&CAheight_95%_HPD={0.18,0.23000000000000004},CAheight_mean=0.20333333333333334,CAheight_median=0.19999999999999996,CAheight_range={0.18,0.23000000000000004},height=0.20333333333333334,height_95%_HPD={0.18,0.23000000000000004},height_median=0.19999999999999996,height_range={0.18,0.23000000000000004},length=0.20000000000000004,length_95%_HPD={0.18,0.22000000000000003},length_median=0.20000000000000007,length_range={0.18,0.22000000000000003},posterior=1.0]:0.19999999999999998,(3[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002,4[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002)[&CAheight_95%_HPD={0.14,0.16000000000000003},CAheight_mean=0.15000000000000002,CAheight_median=0.15000000000000002,CAheight_range={0.14,0.16000000000000003},height=0.15000000000000002,height_95%_HPD={0.14,0.16000000000000003},height_median=0.15000000000000002,height_range={0.14,0.16000000000000003},length=0.25333333333333335,length_95%_HPD={0.24,0.27},length_median=0.25,length_range={0.24,0.27},posterior=1.0]:0.2533333333333333)[&CAheight_95%_HPD={0.4,0.41000000000000003},CAheight_mean=0.4033333333333333,CAheight_median=0.4,CAheight_range={0.4,0.41000000000000003},height=0.4033333333333333,height_95%_HPD={0.4,0.41000000000000003},height_median=0.4,height_range={0.4,0.41000000000000003},length=0.0,posterior=1.0]:0.0;
+End;
diff --git a/tools/beast2/test-data/output_target.trees b/tools/beast2/test-data/output_target.trees
new file mode 100644
index 00000000000..08cd60ce9d2
--- /dev/null
+++ b/tools/beast2/test-data/output_target.trees
@@ -0,0 +1,20 @@
+#NEXUS
+
+Begin taxa;
+ Dimensions ntax=4;
+ Taxlabels
+ taxonA
+ taxonB
+ taxonC
+ taxonD
+ ;
+End;
+Begin trees;
+ Translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD
+;
+tree TREE1 = ((1[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335,2[&CAheight_95%_HPD={0.08999999999999997,0.11000000000000004},CAheight_mean=0.09999999999999999,CAheight_median=0.09999999999999998,CAheight_range={0.08999999999999997,0.11000000000000004},height=0.09999999999999999,height_95%_HPD={0.08999999999999997,0.11000000000000004},height_median=0.09999999999999998,height_range={0.08999999999999997,0.11000000000000004},length=0.10333333333333333,length_95%_HPD={0.09000000000000002,0.12},length_median=0.09999999999999998,length_range={0.09000000000000002,0.12}]:0.10333333333333335)[&CAheight_95%_HPD={0.18,0.23000000000000004},CAheight_mean=0.20333333333333334,CAheight_median=0.19999999999999996,CAheight_range={0.18,0.23000000000000004},height=0.20333333333333334,height_95%_HPD={0.18,0.23000000000000004},height_median=0.19999999999999996,height_range={0.18,0.23000000000000004},length=0.20000000000000004,length_95%_HPD={0.18,0.22000000000000003},length_median=0.20000000000000007,length_range={0.18,0.22000000000000003},posterior=1.0]:0.19999999999999998,(3[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002,4[&height=0.0,length=0.15000000000000002,length_95%_HPD={0.14,0.16000000000000003},length_median=0.15000000000000002,length_range={0.14,0.16000000000000003}]:0.15000000000000002)[&CAheight_95%_HPD={0.14,0.16000000000000003},CAheight_mean=0.15000000000000002,CAheight_median=0.15000000000000002,CAheight_range={0.14,0.16000000000000003},height=0.15000000000000002,height_95%_HPD={0.14,0.16000000000000003},height_median=0.15000000000000002,height_range={0.14,0.16000000000000003},length=0.25333333333333335,length_95%_HPD={0.24,0.27},length_median=0.25,length_range={0.24,0.27},posterior=1.0]:0.2533333333333333)[&CAheight_95%_HPD={0.4,0.41000000000000003},CAheight_mean=0.4033333333333333,CAheight_median=0.4,CAheight_range={0.4,0.41000000000000003},height=0.4033333333333333,height_95%_HPD={0.4,0.41000000000000003},height_median=0.4,height_range={0.4,0.41000000000000003},length=0.0,posterior=1.0]:0.0;
+End;
diff --git a/tools/beast2/test-data/target.trees b/tools/beast2/test-data/target.trees
new file mode 100644
index 00000000000..b256ade77d5
--- /dev/null
+++ b/tools/beast2/test-data/target.trees
@@ -0,0 +1,9 @@
+#NEXUS
+begin trees;
+ translate
+ 1 taxonA,
+ 2 taxonB,
+ 3 taxonC,
+ 4 taxonD;
+ tree TARGET = [&R] ((1:0.1,2:0.1):0.2,(3:0.15,4:0.15):0.25):0.1;
+end;
diff --git a/tools/beast2/test-data/test1_logcombiner.log b/tools/beast2/test-data/test1_logcombiner.log
new file mode 100644
index 00000000000..86079028d74
--- /dev/null
+++ b/tools/beast2/test-data/test1_logcombiner.log
@@ -0,0 +1,9 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1228.34 -992.11 -236.23 5.63 2.38 0.90
+1000 -1225.67 -990.34 -235.33 5.61 2.35 0.92
+2000 -1223.45 -988.56 -234.89 5.59 2.37 0.89
+3000 -1221.23 -986.78 -234.45 5.57 2.39 0.91
+4000 -1219.12 -985.01 -234.11 5.55 2.36 0.90
+5000 -1217.89 -983.45 -234.44 5.53 2.38 0.92
+6000 -1216.34 -982.12 -234.22 5.51 2.35 0.88
+7000 -1215.23 -981.00 -234.23 5.49 2.37 0.91
diff --git a/tools/beast2/test-data/test2_logcombiner.log b/tools/beast2/test-data/test2_logcombiner.log
new file mode 100644
index 00000000000..3b1861d0d37
--- /dev/null
+++ b/tools/beast2/test-data/test2_logcombiner.log
@@ -0,0 +1,7 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1223.45 -988.56 -234.89 5.59 2.37 0.89
+1000 -1221.23 -986.78 -234.45 5.57 2.39 0.91
+2000 -1219.12 -985.01 -234.11 5.55 2.36 0.90
+3000 -1217.89 -983.45 -234.44 5.53 2.38 0.92
+4000 -1216.34 -982.12 -234.22 5.51 2.35 0.88
+5000 -1215.23 -981.00 -234.23 5.49 2.37 0.91
diff --git a/tools/beast2/test-data/test3_logcombiner.log b/tools/beast2/test-data/test3_logcombiner.log
new file mode 100644
index 00000000000..5b6db08e875
--- /dev/null
+++ b/tools/beast2/test-data/test3_logcombiner.log
@@ -0,0 +1,37 @@
+#NEXUS
+Begin trees;
+ Translate
+ 1 taxon_A,
+ 2 taxon_B,
+ 3 taxon_C,
+ 4 taxon_D
+ ;
+
+tree STATE_0 = ((1:0.9,2:0.9):1.1,(3:1.4,4:1.4):0.6);
+tree STATE_1000 = ((1:0.95,2:0.95):1.05,(3:1.45,4:1.45):0.55);
+tree STATE_2000 = ((1:1.05,2:1.05):0.95,(3:1.55,4:1.55):0.45);
+tree STATE_3000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_4000 = ((1:0.98,2:0.98):1.02,(3:1.48,4:1.48):0.52);
+tree STATE_5000 = ((1:1.02,2:1.02):0.98,(3:1.52,4:1.52):0.48);
+tree STATE_6000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_7000 = ((1:0.97,2:0.97):1.03,(3:1.47,4:1.47):0.53);
+tree STATE_8000 = ((1:1.03,2:1.03):0.97,(3:1.53,4:1.53):0.47);
+tree STATE_9000 = ((1:0.85,2:0.85):1.15,(3:1.35,4:1.35):0.65);
+tree STATE_10000 = ((1:0.92,2:0.92):1.08,(3:1.42,4:1.42):0.58);
+tree STATE_11000 = ((1:1.08,2:1.08):0.92,(3:1.58,4:1.58):0.42);
+tree STATE_12000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_13000 = ((1:0.96,2:0.96):1.04,(3:1.46,4:1.46):0.54);
+tree STATE_14000 = ((1:1.04,2:1.04):0.96,(3:1.54,4:1.54):0.46);
+tree STATE_15000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_16000 = ((1:0.95,2:0.95):1.05,(3:1.45,4:1.45):0.55);
+tree STATE_17000 = ((1:1.05,2:1.05):0.95,(3:1.55,4:1.55):0.45);
+tree STATE_18000 = ((1:0.88,2:0.88):1.12,(3:1.38,4:1.38):0.62);
+tree STATE_19000 = ((1:0.94,2:0.94):1.06,(3:1.44,4:1.44):0.56);
+tree STATE_20000 = ((1:1.06,2:1.06):0.94,(3:1.56,4:1.56):0.44);
+tree STATE_21000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_22000 = ((1:0.99,2:0.99):1.01,(3:1.49,4:1.49):0.51);
+tree STATE_23000 = ((1:1.01,2:1.01):0.99,(3:1.51,4:1.51):0.49);
+tree STATE_24000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_25000 = ((1:0.98,2:0.98):1.02,(3:1.48,4:1.48):0.52);
+tree STATE_26000 = ((1:1.02,2:1.02):0.98,(3:1.52,4:1.52):0.48);
+End;
diff --git a/tools/beast2/test-data/test4_logcombiner.log b/tools/beast2/test-data/test4_logcombiner.log
new file mode 100644
index 00000000000..00803cc5717
--- /dev/null
+++ b/tools/beast2/test-data/test4_logcombiner.log
@@ -0,0 +1,9 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1228.34 -992.11 -236.23 5.63 2.38 0.90
+10 -1225.67 -990.34 -235.33 5.61 2.35 0.92
+20 -1223.45 -988.56 -234.89 5.59 2.37 0.89
+30 -1221.23 -986.78 -234.45 5.57 2.39 0.91
+40 -1219.12 -985.01 -234.11 5.55 2.36 0.90
+50 -1217.89 -983.45 -234.44 5.53 2.38 0.92
+60 -1216.34 -982.12 -234.22 5.51 2.35 0.88
+70 -1215.23 -981.00 -234.23 5.49 2.37 0.91
diff --git a/tools/beast2/test-data/test5_logcombiner.log b/tools/beast2/test-data/test5_logcombiner.log
new file mode 100644
index 00000000000..0f8bb408e1b
--- /dev/null
+++ b/tools/beast2/test-data/test5_logcombiner.log
@@ -0,0 +1,10 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1230.45 -995.23 -235.22 5.65 2.36 0.91
+1000 -1228.34 -992.11 -236.23 5.63 2.38 0.9
+2000 -1225.67 -990.34 -235.33 5.61 2.35 0.92
+3000 -1223.45 -988.56 -234.89 5.59 2.37 0.89
+4000 -1221.23 -986.78 -234.45 5.57 2.39 0.91
+5000 -1219.12 -985.01 -234.11 5.55 2.36 0.9
+6000 -1217.89 -983.45 -234.44 5.53 2.38 0.92
+7000 -1216.34 -982.12 -234.22 5.51 2.35 0.88
+8000 -1215.23 -981 -234.23 5.49 2.37 0.91
diff --git a/tools/beast2/test-data/test6_logcombiner.log b/tools/beast2/test-data/test6_logcombiner.log
new file mode 100644
index 00000000000..15810af9037
--- /dev/null
+++ b/tools/beast2/test-data/test6_logcombiner.log
@@ -0,0 +1,10 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1230.45 -995.23 -235.22 5.65 2.36 0.91
+1 -1228.34 -992.11 -236.23 5.63 2.38 0.9
+2 -1225.67 -990.34 -235.33 5.61 2.35 0.92
+3 -1223.45 -988.56 -234.89 5.59 2.37 0.89
+4 -1221.23 -986.78 -234.45 5.57 2.39 0.91
+5 -1219.12 -985.01 -234.11 5.55 2.36 0.9
+6 -1217.89 -983.45 -234.44 5.53 2.38 0.92
+7 -1216.34 -982.12 -234.22 5.51 2.35 0.88
+8 -1215.23 -981 -234.23 5.49 2.37 0.91
diff --git a/tools/beast2/test-data/trace_scientific.log b/tools/beast2/test-data/trace_scientific.log
new file mode 100644
index 00000000000..f78160e7d2b
--- /dev/null
+++ b/tools/beast2/test-data/trace_scientific.log
@@ -0,0 +1,11 @@
+Sample posterior likelihood prior TreeHeight kappa alpha
+0 -1.23456e+03 -1.00012e+03 -2.34440e+02 5.67000e+00 2.34000e+00 8.90000e-01
+1000 -1.23045e+03 -9.95230e+02 -2.35220e+02 5.65000e+00 2.36000e+00 9.10000e-01
+2000 -1.22834e+03 -9.92110e+02 -2.36230e+02 5.63000e+00 2.38000e+00 9.00000e-01
+3000 -1.22567e+03 -9.90340e+02 -2.35330e+02 5.61000e+00 2.35000e+00 9.20000e-01
+4000 -1.22345e+03 -9.88560e+02 -2.34890e+02 5.59000e+00 2.37000e+00 8.90000e-01
+5000 -1.22123e+03 -9.86780e+02 -2.34450e+02 5.57000e+00 2.39000e+00 9.10000e-01
+6000 -1.21912e+03 -9.85010e+02 -2.34110e+02 5.55000e+00 2.36000e+00 9.00000e-01
+7000 -1.21789e+03 -9.83450e+02 -2.34440e+02 5.53000e+00 2.38000e+00 9.20000e-01
+8000 -1.21634e+03 -9.82120e+02 -2.34220e+02 5.51000e+00 2.35000e+00 8.80000e-01
+9000 -1.21523e+03 -9.81000e+02 -2.34230e+02 5.49000e+00 2.37000e+00 9.10000e-01
diff --git a/tools/beast2/test-data/trees1.trees b/tools/beast2/test-data/trees1.trees
new file mode 100644
index 00000000000..1f4dfe288a4
--- /dev/null
+++ b/tools/beast2/test-data/trees1.trees
@@ -0,0 +1,19 @@
+#NEXUS
+Begin trees;
+ Translate
+ 1 taxon_A,
+ 2 taxon_B,
+ 3 taxon_C,
+ 4 taxon_D
+ ;
+tree STATE_0 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_1000 = ((1:0.9,2:0.9):1.1,(3:1.4,4:1.4):0.6);
+tree STATE_2000 = ((1:0.95,2:0.95):1.05,(3:1.45,4:1.45):0.55);
+tree STATE_3000 = ((1:1.05,2:1.05):0.95,(3:1.55,4:1.55):0.45);
+tree STATE_4000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_5000 = ((1:0.98,2:0.98):1.02,(3:1.48,4:1.48):0.52);
+tree STATE_6000 = ((1:1.02,2:1.02):0.98,(3:1.52,4:1.52):0.48);
+tree STATE_7000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_8000 = ((1:0.97,2:0.97):1.03,(3:1.47,4:1.47):0.53);
+tree STATE_9000 = ((1:1.03,2:1.03):0.97,(3:1.53,4:1.53):0.47);
+End;
\ No newline at end of file
diff --git a/tools/beast2/test-data/trees2.trees b/tools/beast2/test-data/trees2.trees
new file mode 100644
index 00000000000..a945b4a0029
--- /dev/null
+++ b/tools/beast2/test-data/trees2.trees
@@ -0,0 +1,19 @@
+#NEXUS
+Begin trees;
+ Translate
+ 1 taxon_A,
+ 2 taxon_B,
+ 3 taxon_C,
+ 4 taxon_D
+ ;
+tree STATE_0 = ((1:1.1,2:1.1):0.9,(3:1.6,4:1.6):0.4);
+tree STATE_1000 = ((1:0.85,2:0.85):1.15,(3:1.35,4:1.35):0.65);
+tree STATE_2000 = ((1:0.92,2:0.92):1.08,(3:1.42,4:1.42):0.58);
+tree STATE_3000 = ((1:1.08,2:1.08):0.92,(3:1.58,4:1.58):0.42);
+tree STATE_4000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_5000 = ((1:0.96,2:0.96):1.04,(3:1.46,4:1.46):0.54);
+tree STATE_6000 = ((1:1.04,2:1.04):0.96,(3:1.54,4:1.54):0.46);
+tree STATE_7000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_8000 = ((1:0.95,2:0.95):1.05,(3:1.45,4:1.45):0.55);
+tree STATE_9000 = ((1:1.05,2:1.05):0.95,(3:1.55,4:1.55):0.45);
+End;
\ No newline at end of file
diff --git a/tools/beast2/test-data/trees3.trees b/tools/beast2/test-data/trees3.trees
new file mode 100644
index 00000000000..37a9b1834d3
--- /dev/null
+++ b/tools/beast2/test-data/trees3.trees
@@ -0,0 +1,19 @@
+#NEXUS
+Begin trees;
+ Translate
+ 1 taxon_A,
+ 2 taxon_B,
+ 3 taxon_C,
+ 4 taxon_D
+ ;
+tree STATE_0 = ((1:1.2,2:1.2):0.8,(3:1.7,4:1.7):0.3);
+tree STATE_1000 = ((1:0.88,2:0.88):1.12,(3:1.38,4:1.38):0.62);
+tree STATE_2000 = ((1:0.94,2:0.94):1.06,(3:1.44,4:1.44):0.56);
+tree STATE_3000 = ((1:1.06,2:1.06):0.94,(3:1.56,4:1.56):0.44);
+tree STATE_4000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_5000 = ((1:0.99,2:0.99):1.01,(3:1.49,4:1.49):0.51);
+tree STATE_6000 = ((1:1.01,2:1.01):0.99,(3:1.51,4:1.51):0.49);
+tree STATE_7000 = ((1:1.0,2:1.0):1.0,(3:1.5,4:1.5):0.5);
+tree STATE_8000 = ((1:0.98,2:0.98):1.02,(3:1.48,4:1.48):0.52);
+tree STATE_9000 = ((1:1.02,2:1.02):0.98,(3:1.52,4:1.52):0.48);
+End;
\ No newline at end of file
diff --git a/tools/beast2/treeannotator.xml b/tools/beast2/treeannotator.xml
new file mode 100644
index 00000000000..5cea8f074cb
--- /dev/null
+++ b/tools/beast2/treeannotator.xml
@@ -0,0 +1,157 @@
+
+ Summarize a sample of trees with annotations
+
+ macros.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file