Index: src/Fragmentation/Histogram/Histogram.cpp
===================================================================
--- src/Fragmentation/Histogram/Histogram.cpp	(revision 45f4f96ff7e9477af0058a9389d13649b876c2e8)
+++ src/Fragmentation/Histogram/Histogram.cpp	(revision 22c4f5731d6c6dc832d7e06a1815fe17d0e1ad46)
@@ -140,6 +140,71 @@
 }
 
+void Histogram::superposeOtherHistogram(const Histogram &other, const double prefactor)
+{
+  // check that other histogram lays within this one
+  ASSERT( getLowerEndBin(other.bins.begin()->first) != bins.end(),
+      "Histogram::superposeOtherHistogram() - other histogram's bins start sooner.");
+  ASSERT( getHigherEndBin((--other.bins.end())->first) != bins.end(),
+      "Histogram::superposeOtherHistogram() - other histogram's bins end later.");
+  // go through each of the other histogram's bins
+  Bins_t::const_iterator enditer = --other.bins.end(); // (except internal last one)
+  for (Bins_t::const_iterator biniter = other.bins.begin();
+      biniter != enditer; /* we advance ourselves in loop */) {
+    const Bin_t &bin = *biniter;
+    ++biniter;
+    const Bin_t &nextbin = *biniter;
+
+    LOG(2, "DEBUG: Current bin is " << bin << ", next bin is " << nextbin << ".");
+    // The bin will in general not fit into one bin in this histogram, but overlap.
+    // Hence, we determine the contribution of the bin to each bin in this histogram
+    // its overlaps into and add this weight to the bin.
+    Bins_t::const_iterator loweriter = getLowerEndBin(bin.first);
+    Bins_t::const_iterator upperiter = getHigherEndBin(nextbin.first);
+    ASSERT( loweriter != bins.end(),
+        "Histogram::superposeOtherHistogram() - lower end is invalid.");
+    ASSERT( upperiter != bins.end(),
+        "Histogram::superposeOtherHistogram() - higher end is invalid.");
+    ASSERT( loweriter->first < upperiter->first,
+        "Histogram::superposeOtherHistogram() - the bin range is invalid.");
+    LOG(2, "DEBUG: bin range here is ["
+        << loweriter->first << ","  << upperiter->first << ").");
+
+    // Next, we create a vector of offsets
+    typedef std::vector< BinLowerEnd > offsets_t;
+    offsets_t offsets;
+    {
+      offsets.push_back(bin.first);
+      Bins_t::const_iterator iter = loweriter;
+      for (++iter; iter != upperiter; ++iter)
+        if (offsets.back() != iter->first)
+          offsets.push_back(iter->first);
+      if (offsets.back() != nextbin.first)
+        offsets.push_back(nextbin.first);
+      LOG(2, "DEBUG: Offsets are " << offsets << ".");
+    }
+
+    // then, we go through the offsets but the last one and add the respective area
+    {
+      offsets_t::const_iterator iter = offsets.begin();
+      offsets_t::const_iterator nextiter = ++offsets.begin();
+      for (; iter != --offsets.end(); ++iter, ++nextiter) {
+        const double length = *nextiter - *iter;
+        const double weight = bin.second * (length/binwidth);
+        Bins_t::iterator filliter = getLowerEndBin(*iter);
+        filliter->second += prefactor * weight;
+      }
+    }
+
+    {
+      std::stringstream output;
+      std::for_each( bins.begin(), bins.end(), PrintPair<Bin_t>(output));
+      LOG(2, "DEBUG: Bins are after summation " << output.str() << ".");
+    }
+  }
+}
+
 Histogram& Histogram::operator+=(const Histogram &other)
 {
+  superposeOtherHistogram(other, +1.);
   return *this;
 }
@@ -147,4 +212,5 @@
 Histogram& Histogram::operator-=(const Histogram &other)
 {
+  superposeOtherHistogram(other, -1.);
   return *this;
 }
Index: src/Fragmentation/Histogram/Histogram.hpp
===================================================================
--- src/Fragmentation/Histogram/Histogram.hpp	(revision 45f4f96ff7e9477af0058a9389d13649b876c2e8)
+++ src/Fragmentation/Histogram/Histogram.hpp	(revision 22c4f5731d6c6dc832d7e06a1815fe17d0e1ad46)
@@ -100,4 +100,14 @@
    */
   Bins_t::iterator getHigherEndBin(const double _value);
+ 
+  /** Helper function that contains all the logic of how to superpose two
+   * histograms.
+   *
+   * Is called by Histogram::operator+=() and Histogram::operator-=()
+   *
+   * @param other other histogram
+   * @param prefactor +1. is then addition, -1. is subtraction.
+   */
+  void superposeOtherHistogram(const Histogram &other, const double prefactor);
 
   /** Helper function to print BinLowerEnd and BinWeight to a string for every bin.
Index: src/Fragmentation/Histogram/unittests/HistogramUnitTest.cpp
===================================================================
--- src/Fragmentation/Histogram/unittests/HistogramUnitTest.cpp	(revision 45f4f96ff7e9477af0058a9389d13649b876c2e8)
+++ src/Fragmentation/Histogram/unittests/HistogramUnitTest.cpp	(revision 22c4f5731d6c6dc832d7e06a1815fe17d0e1ad46)
@@ -43,5 +43,10 @@
 #include "HistogramUnitTest.hpp"
 
+#include <cmath>
+#include <limits>
+
 #include <boost/assign.hpp>
+
+#include "CodePatterns/Assert.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -59,4 +64,7 @@
 void HistogramTest::setUp()
 {
+  // failing asserts should be thrown
+  ASSERT_DO(Assert::Throw);
+
   histogram = NULL;
 }
@@ -194,8 +202,54 @@
 }
 
-/** UnitTest for operator+=(), operator-=()
- */
-void HistogramTest::operator_Test()
-{
-}
-
+/** UnitTest for superposeOtherHistogram()
+ */
+void HistogramTest::superposeOtherHistogram_Test()
+{
+  // create two histograms, one is larger
+  Histogram::samples_t sampled_values;
+  sampled_values += 1.,2.,3.,4.;
+  histogram = new Histogram(sampled_values, 4);
+  Histogram::samples_t more_values;
+  more_values += 1.75,2.5,3.;
+  Histogram otherhistogram(more_values, 3);
+#ifndef NDEBUG
+  CPPUNIT_ASSERT_THROW ( otherhistogram += *histogram, Assert::AssertionFailure );
+#endif
+}
+
+/** UnitTest for operator+=()
+ */
+void HistogramTest::operatorPlusEqual_Test()
+{
+  // create non-empty histograms and sum them
+  Histogram::samples_t sampled_values;
+  sampled_values += 1.,2.,3.,4.;
+  histogram = new Histogram(sampled_values, 4);
+  Histogram::samples_t more_values;
+  more_values += 1.75,2.5,3.;
+  Histogram otherhistogram(more_values, 3);
+  const double sums = histogram->area() + otherhistogram.area();
+
+  // check that sum is now sum of both
+  *histogram += otherhistogram;
+  CPPUNIT_ASSERT( fabs(sums - histogram->area()) < std::numeric_limits<double>::epsilon()*1e+1 );
+}
+
+/** UnitTest for operator-=()
+ */
+void HistogramTest::operatorMinusEqual_Test()
+{
+  // create non-empty histograms and sum them
+  Histogram::samples_t sampled_values;
+  sampled_values += 1.,2.,3.,4.;
+  histogram = new Histogram(sampled_values, 4);
+  Histogram::samples_t more_values;
+  more_values += 1.75,2.5,3.;
+  Histogram otherhistogram(more_values, 3);
+  const double difference = histogram->area() - otherhistogram.area();
+
+  // check that sum is now difference of both
+  *histogram -= otherhistogram;
+  CPPUNIT_ASSERT( fabs(difference - histogram->area()) < std::numeric_limits<double>::epsilon()*1e+1 );
+}
+
Index: src/Fragmentation/Histogram/unittests/HistogramUnitTest.hpp
===================================================================
--- src/Fragmentation/Histogram/unittests/HistogramUnitTest.hpp	(revision 45f4f96ff7e9477af0058a9389d13649b876c2e8)
+++ src/Fragmentation/Histogram/unittests/HistogramUnitTest.hpp	(revision 22c4f5731d6c6dc832d7e06a1815fe17d0e1ad46)
@@ -28,6 +28,8 @@
     CPPUNIT_TEST ( getHigherEndBin_Test );
     CPPUNIT_TEST ( isEmpty_Test );
-    CPPUNIT_TEST ( operator_Test );
     CPPUNIT_TEST ( areaTest );
+    CPPUNIT_TEST ( superposeOtherHistogram_Test );
+    CPPUNIT_TEST ( operatorPlusEqual_Test );
+    CPPUNIT_TEST ( operatorMinusEqual_Test );
     CPPUNIT_TEST_SUITE_END();
 
@@ -39,6 +41,8 @@
       void getHigherEndBin_Test();
       void isEmpty_Test();
-      void operator_Test();
       void areaTest();
+      void superposeOtherHistogram_Test();
+      void operatorPlusEqual_Test();
+      void operatorMinusEqual_Test();
 
 private:
