diff --git a/MatrixElement/BlobMEBase.cc b/MatrixElement/BlobMEBase.cc
new file mode 100644
--- /dev/null
+++ b/MatrixElement/BlobMEBase.cc
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the BlobMEBase class.
+//
+
+#include "BlobMEBase.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/EventRecord/Particle.h"
+#include "ThePEG/Repository/UseRandom.h"
+#include "ThePEG/Repository/EventGenerator.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+
+using namespace ThePEG;
+
+BlobMEBase::BlobMEBase() {}
+
+BlobMEBase::~BlobMEBase() {}
+
+
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/MatrixElement/BlobDiagram.h"
+
+void BlobMEBase::getDiagrams() const {
+  map<tcPDPair,tcPDVector> proc = processes();
+  int id = 1;
+  for ( auto it = proc.begin(); it != proc.end(); ++it, ++id ) {
+    BlobDiagram diag(id,it->first.first,it->first.second);
+    for ( auto pit = it->second.begin(); pit != it->second.end(); ++pit )
+      diag.operator,(*pit);
+    add(new_ptr(diag));
+  }
+}
+
+Selector<MEBase::DiagramIndex>
+BlobMEBase::diagrams(const DiagramVector & diags) const {
+  assert(diags.size()==1);
+  Selector<DiagramIndex> sel;
+  sel.insert(1.0, 0);
+  return sel;
+}
+
+Selector<const ColourLines *>
+BlobMEBase::colourGeometries(tcDiagPtr) const {
+  map<size_t,size_t> connections =
+    colourConnections();
+  ostringstream clines;
+  for ( auto it = connections.begin(); it != connections.end(); ++it ) {
+    int cid = it->first+1; int acid = -(it->second+1);
+    if ( it->first < 2 ) cid = -cid;
+    if ( it->second < 2 ) acid = -acid;
+    clines << cid << " " << acid;
+    auto nit = it; ++nit;
+    if ( nit != connections.end() )
+      clines << ",";
+  }
+  theColourLines.reset(clines.str());
+  Selector<const ColourLines *> sel;
+  sel.insert(1.0,&theColourLines);
+  return sel;
+}
+
+CrossSection BlobMEBase::dSigHatDR() const {
+  if ( !lastXCombPtr()->willPassCuts() )
+    return ZERO;
+  return
+    (sqr(hbarc)/(2.*lastSHat())) *
+    jacobian() * me2();
+}
+
+AbstractNoPIOClassDescription<BlobMEBase> BlobMEBase::initBlobMEBase;
+
+void BlobMEBase::Init() {
+
+  static ClassDocumentation<BlobMEBase> documentation
+    ("BlobMEBase is the base class for matrix elements producing blobs.");
+
+}
+
diff --git a/MatrixElement/BlobMEBase.h b/MatrixElement/BlobMEBase.h
new file mode 100644
--- /dev/null
+++ b/MatrixElement/BlobMEBase.h
@@ -0,0 +1,153 @@
+// -*- C++ -*-
+#ifndef ThePEG_BlobMEBase_H
+#define ThePEG_BlobMEBase_H
+//
+// This is the declaration of the BlobMEBase class.
+//
+
+#include "ThePEG/MatrixElement/MEBase.h"
+
+namespace ThePEG {
+
+/**
+ * Here is the documentation of the BlobMEBase class.
+ *
+ * @see \ref BlobMEBaseInterfaces "The interfaces"
+ * defined for BlobMEBase.
+ */
+class BlobMEBase: public MEBase {
+
+public:
+
+  /** @name Standard constructors and destructors. */
+  //@{
+  /**
+   * The default constructor.
+   */
+  BlobMEBase();
+
+  /**
+   * The destructor.
+   */
+  virtual ~BlobMEBase();
+  //@}
+
+public:
+
+  /** @name Virtual functions required by the MEBase class. */
+  //@{
+  /**
+   * Add all possible diagrams with the add() function.
+   */
+  virtual void getDiagrams() const;
+
+  /**
+   * Get diagram selector. With the information previously supplied with the
+   * setKinematics method, a derived class may optionally
+   * override this method to weight the given diagrams with their
+   * (although certainly not physical) relative probabilities.
+   * @param dv the diagrams to be weighted.
+   * @return a Selector relating the given diagrams to their weights.
+   */
+  virtual Selector<DiagramIndex> diagrams(const DiagramVector & dv) const;
+
+  /**
+   * Return a Selector with possible colour geometries for the selected
+   * diagram weighted by their relative probabilities.
+   * @param diag the diagram chosen.
+   * @return the possible colour geometries weighted by their
+   * relative probabilities.
+   */
+  virtual Selector<const ColourLines *>
+  colourGeometries(tcDiagPtr diag) const;
+
+  /**
+   * Return the matrix element squared differential in the variables
+   * given by the last call to generateKinematics().
+   */
+  virtual CrossSection dSigHatDR() const;
+  //@}
+
+  /**
+   * Return the possible processes this matrix element will be able to handle,
+   * as a map incoming to outgoing; it is assumed that the number of outgoing
+   * partons does not vary.
+   */
+  virtual map<tcPDPair,tcPDVector> processes() const = 0;
+
+  /**
+   * Return the colour connections for the process as pairs of id's of
+   * external legs connecting colour to anticolour; id's of incoming partons
+   * (0 and 1) have the meaning of colour and anti-colour eversed (crossed to
+   * the final state).
+   */
+  virtual map<size_t,size_t> colourConnections() const = 0;
+
+public:
+
+  /**
+   * Describe an abstract base class without persistent data.
+   */
+  static AbstractNoPIOClassDescription<BlobMEBase> initBlobMEBase;
+
+  /**
+   * The standard Init function used to initialize the interfaces.
+   * Called exactly once for each class by the class description system
+   * before the main function starts or
+   * when this class is dynamically loaded.
+   */
+  static void Init();
+
+
+// If needed, insert declarations of virtual function defined in the
+// InterfacedBase class here (using ThePEG-interfaced-decl in Emacs).
+
+
+private:
+
+  /**
+   * The assignment operator is private and must never be called.
+   * In fact, it should not even be implemented.
+   */
+  BlobMEBase & operator=(const BlobMEBase &);
+
+  /**
+   * The colour lines object used as a proxy to connect colours in
+   * BlobDiagram::construct
+   */
+  mutable ColourLines theColourLines;
+
+};
+
+}
+
+namespace ThePEG {
+
+/** @cond TRAITSPECIALIZATIONS */
+
+/**
+ * This template specialization informs ThePEG about the base class of
+ * BlobMEBase.
+ */
+template <>
+struct BaseClassTrait<BlobMEBase,1>: public ClassTraitsType {
+  /** Typedef of the base class of BlobMEBase. */
+  typedef MEBase NthBase;
+};
+
+/**
+ * This template specialization informs ThePEG about the name of the
+ * BlobMEBase class.
+ */
+template <>
+struct ClassTraits<BlobMEBase>: public ClassTraitsBase<BlobMEBase> {
+  /** Return the class name. */
+  static string className() { return "ThePEG::BlobMEBase"; }
+};
+
+/** @endcond */
+
+}
+
+
+#endif /* ThePEG_BlobMEBase_H */
diff --git a/MatrixElement/Makefile.am b/MatrixElement/Makefile.am
--- a/MatrixElement/Makefile.am
+++ b/MatrixElement/Makefile.am
@@ -1,48 +1,48 @@
 mySOURCES = Amplitude.cc ColourLines.cc DiagramBase.cc Tree2toNDiagram.cc BlobDiagram.cc \
-            MEBase.cc MEGroup.cc ReweightBase.cc ME2to2Base.cc ME2to2QCD.cc
+            MEBase.cc BlobMEBase.cc MEGroup.cc ReweightBase.cc ME2to2Base.cc ME2to2QCD.cc
 
 myQCDSOURCES = 
 
 DOCFILES = Amplitude.h ColourLines.h DiagramBase.h Tree2toNDiagram.h BlobDiagram.h MEBase.h \
-           MEGroup.h ReweightBase.h ME2to2Base.h ME2to2QCD.h
+           BlobMEBase.h MEGroup.h ReweightBase.h ME2to2Base.h ME2to2QCD.h
 
 INCLUDEFILES = $(DOCFILES) ColourLines.xh \
                DiagramBase.xh DiagramBase.fh \
                Tree2toNDiagram.xh MEBase.fh MEGroup.fh
 
 noinst_LTLIBRARIES = libThePEGME.la
 pkglib_LTLIBRARIES = MEQCD.la MEee2gZ2qq.la MENCDIS.la \
                      ReweightConstant.la ReweightMinPT.la
 
 libThePEGME_la_SOURCES = $(mySOURCES) $(INCLUDEFILES)
 
 # Version info should be updated if any interface or persistent I/O
 # function is changed
 MEQCD_la_LDFLAGS = $(AM_LDFLAGS) -module $(LIBTOOLVERSIONINFO)
 MEQCD_la_SOURCES = MEGG2GG.cc MEQG2QG.cc MEQQ2QQ3.cc MEQq2Qq4.cc MEGG2QQ.cc \
                    MEQQ2GG.cc MEQQ2qq2.cc MEqq2qq1.cc MEGG2GG.h MEQG2QG.h \
                    MEQQ2QQ3.h MEQq2Qq4.h MEGG2QQ.h MEQQ2GG.h MEQQ2qq2.h \
                    MEqq2qq1.h
 
 # Version info should be updated if any interface or persistent I/O
 # function is changed
 MEee2gZ2qq_la_LDFLAGS = $(AM_LDFLAGS) -module $(LIBTOOLVERSIONINFO)
 MEee2gZ2qq_la_SOURCES = MEee2gZ2qq.cc MEee2gZ2qq.h
 
 # Version info should be updated if any interface or persistent I/O
 # function is changed
 ReweightConstant_la_LDFLAGS = $(AM_LDFLAGS) -module $(LIBTOOLVERSIONINFO)
 ReweightConstant_la_SOURCES = ReweightConstant.cc ReweightConstant.h
 
 # Version info should be updated if any interface or persistent I/O
 # function is changed
 ReweightMinPT_la_LDFLAGS = $(AM_LDFLAGS) -module $(LIBTOOLVERSIONINFO)
 ReweightMinPT_la_SOURCES = ReweightMinPT.cc ReweightMinPT.h
 
 # Version info should be updated if any interface or persistent I/O
 # function is changed
 MENCDIS_la_LDFLAGS = $(AM_LDFLAGS) -module $(LIBTOOLVERSIONINFO)
 MENCDIS_la_SOURCES = MENCDIS.cc MENCDIS.h
 
 include $(top_srcdir)/Config/Makefile.aminclude