diff --git a/debian/changelog b/debian/changelog
index 7506b8a..4f52a73 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+mash (2.2+git20190731.59933a4-1) UNRELEASED; urgency=medium
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Wed, 28 Aug 2019 06:50:57 +0000
+
 mash (2.2+dfsg-1) unstable; urgency=medium
 
   * New upstream release.
diff --git a/debian/patches/drop_memcpy_wrapper.patch b/debian/patches/drop_memcpy_wrapper.patch
index d2232af..25305cb 100644
--- a/debian/patches/drop_memcpy_wrapper.patch
+++ b/debian/patches/drop_memcpy_wrapper.patch
@@ -1,9 +1,11 @@
 Description: drop memcpy wrapper
  Not needed here, as our binaries needn't be portable across glib versions.
 Author: Sascha Steinbiss <satta@debian.org>
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -5,9 +5,6 @@
+Index: mash/Makefile.in
+===================================================================
+--- mash.orig/Makefile.in
++++ mash/Makefile.in
+@@ -5,9 +5,6 @@ UNAME_S=$(shell uname -s)
  
  ifeq ($(UNAME_S),Darwin)
  	CXXFLAGS += -mmacosx-version-min=10.7 -stdlib=libc++
@@ -13,7 +15,7 @@ Author: Sascha Steinbiss <satta@debian.org>
  endif
  
  SOURCES=\
-@@ -36,8 +33,8 @@
+@@ -36,8 +33,8 @@ OBJECTS=$(SOURCES:.cpp=.o) src/mash/capn
  
  all : mash libmash.a
  
@@ -24,7 +26,7 @@ Author: Sascha Steinbiss <satta@debian.org>
  
  libmash.a : $(OBJECTS)
  	ar -cr libmash.a $(OBJECTS)
-@@ -51,9 +48,6 @@
+@@ -51,9 +48,6 @@ libmash.a : $(OBJECTS)
  %.o : %.c++
  	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
  
diff --git a/debian/patches/hardening.patch b/debian/patches/hardening.patch
index 8cc51dd..01f49cc 100644
--- a/debian/patches/hardening.patch
+++ b/debian/patches/hardening.patch
@@ -1,9 +1,11 @@
 Description: add hardening support
  This patch adds the missing LDFLAGS for hardening support.
 Author: Sascha Steinbiss <satta@debian.org>
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -37,7 +37,7 @@
+Index: mash/Makefile.in
+===================================================================
+--- mash.orig/Makefile.in
++++ mash/Makefile.in
+@@ -37,7 +37,7 @@ OBJECTS=$(SOURCES:.cpp=.o) src/mash/capn
  all : mash libmash.a
  
  mash : libmash.a src/mash/memcpyWrap.o
diff --git a/debian/patches/link_dynamically_against_capnp.patch b/debian/patches/link_dynamically_against_capnp.patch
index 7cee1dd..e199ba9 100644
--- a/debian/patches/link_dynamically_against_capnp.patch
+++ b/debian/patches/link_dynamically_against_capnp.patch
@@ -1,8 +1,10 @@
 Description: link dynamically against libcapnp and friends
 Author: Sascha Steinbiss <satta@debian.org>
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -33,8 +33,8 @@
+Index: mash/Makefile.in
+===================================================================
+--- mash.orig/Makefile.in
++++ mash/Makefile.in
+@@ -33,8 +33,8 @@ OBJECTS=$(SOURCES:.cpp=.o) src/mash/capn
  
  all : mash libmash.a
  
diff --git a/debian/patches/parallel.patch b/debian/patches/parallel.patch
index bebbe4c..c8f80a7 100644
--- a/debian/patches/parallel.patch
+++ b/debian/patches/parallel.patch
@@ -5,9 +5,11 @@ Description: Fix parallel build failures
  Fix the Makefile to only run "capnp compile" once.
 Author: Adrian Bunk <bunk@debian.org>
 
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -48,7 +48,9 @@
+Index: mash/Makefile.in
+===================================================================
+--- mash.orig/Makefile.in
++++ mash/Makefile.in
+@@ -48,7 +48,9 @@ libmash.a : $(OBJECTS)
  %.o : %.c++
  	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
  
diff --git a/debian/patches/use_debian_mathjax.patch b/debian/patches/use_debian_mathjax.patch
index 49cfeb4..618ab2d 100644
--- a/debian/patches/use_debian_mathjax.patch
+++ b/debian/patches/use_debian_mathjax.patch
@@ -1,8 +1,10 @@
 Description: use Debian's Mathjax
 Author: Sascha Steinbiss <satta@debian.org>
---- a/doc/sphinx/conf.py
-+++ b/doc/sphinx/conf.py
-@@ -256,3 +256,5 @@
+Index: mash/doc/sphinx/conf.py
+===================================================================
+--- mash.orig/doc/sphinx/conf.py
++++ mash/doc/sphinx/conf.py
+@@ -256,3 +256,5 @@ texinfo_documents = [
  
  # If true, do not generate a @detailmenu in the "Top" node's menu.
  #texinfo_no_detailmenu = False
diff --git a/debian/patches/use_debian_packaged_libmurmurhash.patch b/debian/patches/use_debian_packaged_libmurmurhash.patch
index dfa006d..93f9301 100644
--- a/debian/patches/use_debian_packaged_libmurmurhash.patch
+++ b/debian/patches/use_debian_packaged_libmurmurhash.patch
@@ -2,8 +2,10 @@ Author: Andreas Tille <tille@debian.org>
 Last-Update: Tue, 05 Feb 2019 15:58:23 +0100
 Description: use debian packaged libmurmurhash
 
---- a/Makefile.in
-+++ b/Makefile.in
+Index: mash/Makefile.in
+===================================================================
+--- mash.orig/Makefile.in
++++ mash/Makefile.in
 @@ -24,7 +24,6 @@ SOURCES=\
  	src/mash/HashPriorityQueue.cpp \
  	src/mash/HashSet.cpp \
@@ -21,8 +23,10 @@ Description: use debian packaged libmurmurhash
  
  libmash.a : $(OBJECTS)
  	ar -cr libmash.a $(OBJECTS)
---- a/src/mash/Sketch.cpp
-+++ b/src/mash/Sketch.cpp
+Index: mash/src/mash/Sketch.cpp
+===================================================================
+--- mash.orig/src/mash/Sketch.cpp
++++ mash/src/mash/Sketch.cpp
 @@ -12,7 +12,7 @@
  #include <fcntl.h>
  #include <map>
@@ -32,8 +36,10 @@ Description: use debian packaged libmurmurhash
  #include <assert.h>
  #include <queue>
  #include <deque>
---- a/src/mash/hash.cpp
-+++ b/src/mash/hash.cpp
+Index: mash/src/mash/hash.cpp
+===================================================================
+--- mash.orig/src/mash/hash.cpp
++++ mash/src/mash/hash.cpp
 @@ -5,7 +5,7 @@
  // See the LICENSE.txt file included with this software for license information.
  
diff --git a/src/mash/CommandTriangle.cpp b/src/mash/CommandTriangle.cpp
index f2481a2..94f24c3 100644
--- a/src/mash/CommandTriangle.cpp
+++ b/src/mash/CommandTriangle.cpp
@@ -71,7 +71,7 @@ int CommandTriangle::run() const
     	return 1;
     }
     
-    if ( arguments.size() == 1 )
+    if ( arguments.size() == 1 && !list )
     {
     	parameters.concatenated = false;
     }
diff --git a/src/mash/MurmurHash3.cpp b/src/mash/MurmurHash3.cpp
new file mode 100644
index 0000000..8da5dec
--- /dev/null
+++ b/src/mash/MurmurHash3.cpp
@@ -0,0 +1,335 @@
+//-----------------------------------------------------------------------------
+// MurmurHash3 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+
+// Note - The x86 and x64 versions do _not_ produce the same results, as the
+// algorithms are optimized for their respective platforms. You can still
+// compile and run any of them on any platform, but your performance with the
+// non-native version will be less than optimal.
+
+#include "MurmurHash3.h"
+
+//-----------------------------------------------------------------------------
+// Platform-specific functions and macros
+
+// Microsoft Visual Studio
+
+#if defined(_MSC_VER)
+
+#define FORCE_INLINE    __forceinline
+
+#include <stdlib.h>
+
+#define ROTL32(x,y)    _rotl(x,y)
+#define ROTL64(x,y)    _rotl64(x,y)
+
+#define BIG_CONSTANT(x) (x)
+
+// Other compilers
+
+#else    // defined(_MSC_VER)
+
+#define    FORCE_INLINE inline __attribute__((always_inline))
+
+inline uint32_t rotl32 ( uint32_t x, int8_t r )
+{
+  return (x << r) | (x >> (32 - r));
+}
+
+inline uint64_t rotl64 ( uint64_t x, int8_t r )
+{
+  return (x << r) | (x >> (64 - r));
+}
+
+#define    ROTL32(x,y)    rotl32(x,y)
+#define ROTL64(x,y)    rotl64(x,y)
+
+#define BIG_CONSTANT(x) (x##LLU)
+
+#endif // !defined(_MSC_VER)
+
+//-----------------------------------------------------------------------------
+// Block read - if your platform needs to do endian-swapping or can only
+// handle aligned reads, do the conversion here
+
+FORCE_INLINE uint32_t getblock32 ( const uint32_t * p, int i )
+{
+  return p[i];
+}
+
+FORCE_INLINE uint64_t getblock64 ( const uint64_t * p, int i )
+{
+  return p[i];
+}
+
+//-----------------------------------------------------------------------------
+// Finalization mix - force all bits of a hash block to avalanche
+
+FORCE_INLINE uint32_t fmix32 ( uint32_t h )
+{
+  h ^= h >> 16;
+  h *= 0x85ebca6b;
+  h ^= h >> 13;
+  h *= 0xc2b2ae35;
+  h ^= h >> 16;
+
+  return h;
+}
+
+//----------
+
+FORCE_INLINE uint64_t fmix64 ( uint64_t k )
+{
+  k ^= k >> 33;
+  k *= BIG_CONSTANT(0xff51afd7ed558ccd);
+  k ^= k >> 33;
+  k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53);
+  k ^= k >> 33;
+
+  return k;
+}
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_32 ( const void * key, int len,
+                          uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 4;
+
+  uint32_t h1 = seed;
+
+  const uint32_t c1 = 0xcc9e2d51;
+  const uint32_t c2 = 0x1b873593;
+
+  //----------
+  // body
+
+  const uint32_t * blocks = (const uint32_t *)(data + nblocks*4);
+
+  for(int i = -nblocks; i; i++)
+  {
+    uint32_t k1 = getblock32(blocks,i);
+
+    k1 *= c1;
+    k1 = ROTL32(k1,15);
+    k1 *= c2;
+    
+    h1 ^= k1;
+    h1 = ROTL32(h1,13); 
+    h1 = h1*5+0xe6546b64;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*4);
+
+  uint32_t k1 = 0;
+
+  switch(len & 3)
+  {
+  case 3: k1 ^= tail[2] << 16;
+  case 2: k1 ^= tail[1] << 8;
+  case 1: k1 ^= tail[0];
+          k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len;
+
+  h1 = fmix32(h1);
+
+  *(uint32_t*)out = h1;
+} 
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_128 ( const void * key, const int len,
+                           uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 16;
+
+  uint32_t h1 = seed;
+  uint32_t h2 = seed;
+  uint32_t h3 = seed;
+  uint32_t h4 = seed;
+
+  const uint32_t c1 = 0x239b961b; 
+  const uint32_t c2 = 0xab0e9789;
+  const uint32_t c3 = 0x38b34ae5; 
+  const uint32_t c4 = 0xa1e38b93;
+
+  //----------
+  // body
+
+  const uint32_t * blocks = (const uint32_t *)(data + nblocks*16);
+
+  for(int i = -nblocks; i; i++)
+  {
+    uint32_t k1 = getblock32(blocks,i*4+0);
+    uint32_t k2 = getblock32(blocks,i*4+1);
+    uint32_t k3 = getblock32(blocks,i*4+2);
+    uint32_t k4 = getblock32(blocks,i*4+3);
+
+    k1 *= c1; k1  = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+
+    h1 = ROTL32(h1,19); h1 += h2; h1 = h1*5+0x561ccd1b;
+
+    k2 *= c2; k2  = ROTL32(k2,16); k2 *= c3; h2 ^= k2;
+
+    h2 = ROTL32(h2,17); h2 += h3; h2 = h2*5+0x0bcaa747;
+
+    k3 *= c3; k3  = ROTL32(k3,17); k3 *= c4; h3 ^= k3;
+
+    h3 = ROTL32(h3,15); h3 += h4; h3 = h3*5+0x96cd1c35;
+
+    k4 *= c4; k4  = ROTL32(k4,18); k4 *= c1; h4 ^= k4;
+
+    h4 = ROTL32(h4,13); h4 += h1; h4 = h4*5+0x32ac3b17;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*16);
+
+  uint32_t k1 = 0;
+  uint32_t k2 = 0;
+  uint32_t k3 = 0;
+  uint32_t k4 = 0;
+
+  switch(len & 15)
+  {
+  case 15: k4 ^= tail[14] << 16;
+  case 14: k4 ^= tail[13] << 8;
+  case 13: k4 ^= tail[12] << 0;
+           k4 *= c4; k4  = ROTL32(k4,18); k4 *= c1; h4 ^= k4;
+
+  case 12: k3 ^= tail[11] << 24;
+  case 11: k3 ^= tail[10] << 16;
+  case 10: k3 ^= tail[ 9] << 8;
+  case  9: k3 ^= tail[ 8] << 0;
+           k3 *= c3; k3  = ROTL32(k3,17); k3 *= c4; h3 ^= k3;
+
+  case  8: k2 ^= tail[ 7] << 24;
+  case  7: k2 ^= tail[ 6] << 16;
+  case  6: k2 ^= tail[ 5] << 8;
+  case  5: k2 ^= tail[ 4] << 0;
+           k2 *= c2; k2  = ROTL32(k2,16); k2 *= c3; h2 ^= k2;
+
+  case  4: k1 ^= tail[ 3] << 24;
+  case  3: k1 ^= tail[ 2] << 16;
+  case  2: k1 ^= tail[ 1] << 8;
+  case  1: k1 ^= tail[ 0] << 0;
+           k1 *= c1; k1  = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len;
+
+  h1 += h2; h1 += h3; h1 += h4;
+  h2 += h1; h3 += h1; h4 += h1;
+
+  h1 = fmix32(h1);
+  h2 = fmix32(h2);
+  h3 = fmix32(h3);
+  h4 = fmix32(h4);
+
+  h1 += h2; h1 += h3; h1 += h4;
+  h2 += h1; h3 += h1; h4 += h1;
+
+  ((uint32_t*)out)[0] = h1;
+  ((uint32_t*)out)[1] = h2;
+  ((uint32_t*)out)[2] = h3;
+  ((uint32_t*)out)[3] = h4;
+}
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x64_128 ( const void * key, const int len,
+                           const uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 16;
+
+  uint64_t h1 = seed;
+  uint64_t h2 = seed;
+
+  const uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5);
+  const uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f);
+
+  //----------
+  // body
+
+  const uint64_t * blocks = (const uint64_t *)(data);
+
+  for(int i = 0; i < nblocks; i++)
+  {
+    uint64_t k1 = getblock64(blocks,i*2+0);
+    uint64_t k2 = getblock64(blocks,i*2+1);
+
+    k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
+
+    h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729;
+
+    k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
+
+    h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*16);
+
+  uint64_t k1 = 0;
+  uint64_t k2 = 0;
+
+  switch(len & 15)
+  {
+  case 15: k2 ^= ((uint64_t)tail[14]) << 48;
+  case 14: k2 ^= ((uint64_t)tail[13]) << 40;
+  case 13: k2 ^= ((uint64_t)tail[12]) << 32;
+  case 12: k2 ^= ((uint64_t)tail[11]) << 24;
+  case 11: k2 ^= ((uint64_t)tail[10]) << 16;
+  case 10: k2 ^= ((uint64_t)tail[ 9]) << 8;
+  case  9: k2 ^= ((uint64_t)tail[ 8]) << 0;
+           k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
+
+  case  8: k1 ^= ((uint64_t)tail[ 7]) << 56;
+  case  7: k1 ^= ((uint64_t)tail[ 6]) << 48;
+  case  6: k1 ^= ((uint64_t)tail[ 5]) << 40;
+  case  5: k1 ^= ((uint64_t)tail[ 4]) << 32;
+  case  4: k1 ^= ((uint64_t)tail[ 3]) << 24;
+  case  3: k1 ^= ((uint64_t)tail[ 2]) << 16;
+  case  2: k1 ^= ((uint64_t)tail[ 1]) << 8;
+  case  1: k1 ^= ((uint64_t)tail[ 0]) << 0;
+           k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len; h2 ^= len;
+
+  h1 += h2;
+  h2 += h1;
+
+  h1 = fmix64(h1);
+  h2 = fmix64(h2);
+
+  h1 += h2;
+  h2 += h1;
+
+  ((uint64_t*)out)[0] = h1;
+  ((uint64_t*)out)[1] = h2;
+}
+
+//-----------------------------------------------------------------------------
+
diff --git a/src/mash/MurmurHash3.h b/src/mash/MurmurHash3.h
new file mode 100644
index 0000000..5809260
--- /dev/null
+++ b/src/mash/MurmurHash3.h
@@ -0,0 +1,37 @@
+//-----------------------------------------------------------------------------
+// MurmurHash3 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+
+#ifndef _MURMURHASH3_H_
+#define _MURMURHASH3_H_
+
+//-----------------------------------------------------------------------------
+// Platform-specific functions and macros
+
+// Microsoft Visual Studio
+
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+typedef unsigned __int64 uint64_t;
+
+// Other compilers
+
+#else    // defined(_MSC_VER)
+
+#include <stdint.h>
+
+#endif // !defined(_MSC_VER)
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_32  ( const void * key, int len, uint32_t seed, void * out );
+
+void MurmurHash3_x86_128 ( const void * key, int len, uint32_t seed, void * out );
+
+void MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );
+
+//-----------------------------------------------------------------------------
+
+#endif // _MURMURHASH3_H_