diff --git a/tests/unit/util/rtt-estimator.t.cpp b/tests/unit/util/rtt-estimator.t.cpp
index 10c2c74..b819c9b 100644
--- a/tests/unit/util/rtt-estimator.t.cpp
+++ b/tests/unit/util/rtt-estimator.t.cpp
@@ -34,9 +34,109 @@
 BOOST_AUTO_TEST_SUITE(Util)
 BOOST_AUTO_TEST_SUITE(TestRttEstimator)
 
-BOOST_AUTO_TEST_CASE(MinAvgMaxRtt)
+BOOST_AUTO_TEST_CASE(CopyAssign)
 {
-  RttEstimator rttEstimator;
+  RttEstimator est1;
+  RttEstimator est2;
+
+  est1.addMeasurement(100_ms);
+  est1.addMeasurement(150_ms);
+  est2.addMeasurement(75_ms);
+  est2.addMeasurement(70_ms);
+
+  BOOST_CHECK_NE(est1.getEstimatedRto(), est2.getEstimatedRto());
+  BOOST_CHECK_NE(est1.getRttVariation(), est2.getRttVariation());
+  BOOST_CHECK_NE(est1.getSmoothedRtt(), est2.getSmoothedRtt());
+
+  est1 = est2;
+
+  BOOST_CHECK_EQUAL(est1.getEstimatedRto(), est2.getEstimatedRto());
+  BOOST_CHECK_EQUAL(est1.getRttVariation(), est2.getRttVariation());
+  BOOST_CHECK_EQUAL(est1.getSmoothedRtt(), est2.getSmoothedRtt());
+}
+
+BOOST_AUTO_TEST_CASE(EstimatedRto)
+{
+  auto opts = make_shared<RttEstimator::Options>();
+  opts->initialRto = 400_ms;
+  opts->maxRto = 2_s;
+  RttEstimator rttEstimator(opts);
+
+  // check initial values
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), false);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), -1_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), -1_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts->initialRto);
+
+  // first measurement
+  rttEstimator.addMeasurement(200_ms);
+
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), true);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 200_ms);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100_ms);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 600_ms);
+
+  rttEstimator.addMeasurement(100_ms, 1);
+
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), true);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 187500_us);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100000_us);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 587500_us);
+
+  // expected samples larger than 1
+  rttEstimator.addMeasurement(50_ms, 5);
+
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), true);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 184062500_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 101875000_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 591562500_ns);
+
+  // check if minRto works
+  for (int i = 0; i < 20; i++) {
+    rttEstimator.addMeasurement(10_ms);
+  }
+
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 22046646_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts->minRto);
+
+  // check if maxRto works
+  for (int i = 0; i < 10; i++) {
+    rttEstimator.addMeasurement(1_s);
+    rttEstimator.addMeasurement(10_ms);
+  }
+
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 440859284_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts->maxRto);
+}
+
+BOOST_AUTO_TEST_CASE(BackoffRto)
+{
+  auto opts = make_shared<RttEstimator::Options>();
+  opts->initialRto = 500_ms;
+  opts->maxRto = 4_s;
+  RttEstimator rttEstimator(opts);
+
+  rttEstimator.backoffRto();
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 1_s);
+
+  // check if minRto works
+  for (int i = 0; i < 10; i++) {
+    rttEstimator.addMeasurement(5_ms);
+  }
+  rttEstimator.backoffRto();
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 400_ms);
+
+  // check if maxRto works
+  for (int i = 0; i < 10; i++) {
+    rttEstimator.addMeasurement(5_s);
+  }
+  rttEstimator.backoffRto();
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 4_s);
+}
+
+BOOST_AUTO_TEST_CASE(Stats)
+{
+  RttEstimatorWithStats rttEstimator;
 
   // check initial values
   BOOST_CHECK_EQUAL(rttEstimator.getMinRtt().count(), std::numeric_limits<time::nanoseconds::rep>::max());
@@ -44,9 +144,9 @@
   BOOST_CHECK_EQUAL(rttEstimator.getMaxRtt().count(), std::numeric_limits<time::nanoseconds::rep>::min());
 
   // start with three samples
-  rttEstimator.addMeasurement(100_ms, 1);
-  rttEstimator.addMeasurement(400_ms, 1);
-  rttEstimator.addMeasurement(250_ms, 1);
+  rttEstimator.addMeasurement(100_ms);
+  rttEstimator.addMeasurement(400_ms);
+  rttEstimator.addMeasurement(250_ms);
 
   BOOST_CHECK_EQUAL(rttEstimator.getMinRtt(), 100_ms);
   BOOST_CHECK_EQUAL(rttEstimator.getAvgRtt(), 250_ms);
@@ -65,109 +165,6 @@
   BOOST_CHECK_EQUAL(rttEstimator.getMaxRtt(), 700_ms);
 }
 
-BOOST_AUTO_TEST_CASE(EstimatedRto)
-{
-  RttEstimator::Options opts;
-  opts.initialRto = 400_ms;
-  opts.maxRto = 2_s;
-  RttEstimator rttEstimator(opts);
-
-  // check initial values
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 0_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 0_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts.initialRto);
-
-  // first measurement
-  rttEstimator.addMeasurement(200_ms, 1);
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 200_ms);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100_ms);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 600_ms);
-
-  rttEstimator.addMeasurement(100_ms, 1);
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 187500_us);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100000_us);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 587500_us);
-
-  // expected samples larger than 1
-  rttEstimator.addMeasurement(50_ms, 5);
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 184062500_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 101875000_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 591562500_ns);
-
-  // check if minRto works
-  for (int i = 0; i < 20; i++) {
-    rttEstimator.addMeasurement(10_ms, 1);
-  }
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 22046646_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts.minRto);
-
-  // check if maxRto works
-  for (int i = 0; i < 10; i++) {
-    rttEstimator.addMeasurement(1_s, 1);
-    rttEstimator.addMeasurement(10_ms, 1);
-  }
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 440859284_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts.maxRto);
-}
-
-BOOST_AUTO_TEST_CASE(BackoffRto)
-{
-  RttEstimator::Options opts;
-  opts.initialRto = 500_ms;
-  opts.maxRto = 4_s;
-  RttEstimator rttEstimator(opts);
-
-  rttEstimator.backoffRto();
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 1_s);
-
-  // check if minRto works
-  for (int i = 0; i < 10; i++) {
-    rttEstimator.addMeasurement(5_ms, 1);
-  }
-  rttEstimator.backoffRto();
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 400_ms);
-
-  // check if maxRto works
-  for (int i = 0; i < 10; i++) {
-    rttEstimator.addMeasurement(5_s, 1);
-  }
-  rttEstimator.backoffRto();
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 4_s);
-}
-
-BOOST_AUTO_TEST_CASE(AfterMeasurement)
-{
-  RttEstimator rttEstimator;
-
-  int nHandlerInvocations = 0;
-  rttEstimator.afterMeasurement.connectSingleShot([&nHandlerInvocations] (const auto& sample) {
-    ++nHandlerInvocations;
-    BOOST_CHECK_EQUAL(sample.rtt, 80_ms);
-    BOOST_CHECK_EQUAL(sample.sRtt, 80_ms);
-    BOOST_CHECK_EQUAL(sample.rttVar, 40_ms);
-    BOOST_CHECK_EQUAL(sample.rto, 240_ms);
-    BOOST_CHECK(!sample.segNum.has_value());
-  });
-  rttEstimator.addMeasurement(80_ms, 1);
-  BOOST_CHECK_EQUAL(nHandlerInvocations, 1);
-
-  rttEstimator.afterMeasurement.connectSingleShot([&nHandlerInvocations] (const auto& sample) {
-    ++nHandlerInvocations;
-    BOOST_CHECK_EQUAL(sample.rtt, 40_ms);
-    BOOST_CHECK_EQUAL(sample.sRtt, 75_ms);
-    BOOST_CHECK_EQUAL(sample.rttVar, 40_ms);
-    BOOST_CHECK_EQUAL(sample.rto, 235_ms);
-    BOOST_CHECK(sample.segNum == 42U);
-  });
-  rttEstimator.addMeasurement(40_ms, 1, 42);
-  BOOST_CHECK_EQUAL(nHandlerInvocations, 2);
-}
-
 BOOST_AUTO_TEST_SUITE_END() // TestRttEstimator
 BOOST_AUTO_TEST_SUITE_END() // Util
 
