Merge "veyron/services/mgmt/binary/impl: provide useful GetACL default"
diff --git a/lib/modules/core/mounttable.go b/lib/modules/core/mounttable.go
index 00acb04..9ea0084 100644
--- a/lib/modules/core/mounttable.go
+++ b/lib/modules/core/mounttable.go
@@ -1,6 +1,7 @@
 package core
 
 import (
+	"flag"
 	"fmt"
 	"io"
 	"os"
@@ -13,7 +14,11 @@
 	mounttable "v.io/core/veyron/services/mounttable/lib"
 )
 
+var details *bool
+
 func init() {
+	details = flag.CommandLine.Bool("l", false, "use a long listing format for ls")
+
 	modules.RegisterChild(RootMTCommand, "", rootMountTable)
 	modules.RegisterChild(MTCommand, `<mount point>
 	reads NAMESPACE_ROOT from its environment and mounts a new mount table at <mount point>`, mountTable)
@@ -46,9 +51,9 @@
 		}
 		mp = args[0]
 	}
-	mt, err := mounttable.NewMountTable("")
+	mt, err := mounttable.NewMountTableDispatcher("")
 	if err != nil {
-		return fmt.Errorf("mounttable.NewMountTable failed: %s", err)
+		return fmt.Errorf("mounttable.NewMountTableDispatcher failed: %s", err)
 	}
 	eps, err := server.Listen(lspec)
 	if err != nil {
@@ -69,11 +74,6 @@
 	ctx, shutdown := veyron2.Init()
 	defer shutdown()
 
-	details := false
-	if len(args) > 0 && args[0] == "-l" {
-		details = true
-		args = args[1:]
-	}
 	ns := veyron2.GetNamespace(ctx)
 	entry := 0
 	output := ""
@@ -83,7 +83,7 @@
 			return err
 		}
 		for n := range ch {
-			if details {
+			if *details {
 				output += fmt.Sprintf("R%d=%s[", entry, n.Name)
 				t := ""
 				for _, s := range n.Servers {
diff --git a/lib/netconfig/ipaux_linux.go b/lib/netconfig/ipaux_linux.go
index b2a14ca..9afc7dd 100644
--- a/lib/netconfig/ipaux_linux.go
+++ b/lib/netconfig/ipaux_linux.go
@@ -385,16 +385,16 @@
 // IPRoutes returns all kernel known routes.  If defaultOnly is set, only default routes
 // are returned.
 func GetIPRoutes(defaultOnly bool) []*IPRoute {
-	var x []*IPRoute
+	var iproutes []*IPRoute
 	rib, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC)
 	if err != nil {
 		vlog.Infof("Couldn't read: %s", err)
-		return x
+		return iproutes
 	}
 	msgs, err := syscall.ParseNetlinkMessage(rib)
 	if err != nil {
 		vlog.Infof("Couldn't parse: %s", err)
-		return x
+		return iproutes
 	}
 L:
 	for _, m := range msgs {
@@ -406,7 +406,6 @@
 			continue
 		}
 		r := new(IPRoute)
-		r.Net.IP = net.IPv4zero
 		for _, a := range attrs {
 			switch a.Attr.Type {
 			case syscall.RTA_DST:
@@ -425,19 +424,34 @@
 				}
 			}
 		}
+
+		// There is no RTA_DST attribute if destination is a default gateway.
+		// Set the destination IP with zero IP, if not set yet.
+		if r.Net.IP == nil {
+			if r.Gateway == nil {
+				continue
+			}
+			if r.Gateway.To4() != nil {
+				r.Net.IP = net.IPv4zero
+			} else {
+				r.Net.IP = net.IPv6zero
+			}
+		}
+
+		addrLen := 128
+		if r.Net.IP.To4() != nil {
+			addrLen = 32
+		}
+
 		b := m.Data[:syscall.SizeofRtMsg]
 		a := (*syscall.RtMsg)(unsafe.Pointer(&b[0]))
-		len := 128
-		if r.Net.IP.To4() != nil {
-			len = 32
-		}
-		if int(a.Dst_len) > len {
+		if int(a.Dst_len) > addrLen {
 			continue
 		}
-		r.Net.Mask = net.CIDRMask(int(a.Dst_len), len)
+		r.Net.Mask = net.CIDRMask(int(a.Dst_len), addrLen)
 		if !defaultOnly || IsDefaultIPRoute(r) {
-			x = append(x, r)
+			iproutes = append(iproutes, r)
 		}
 	}
-	return x
+	return iproutes
 }
diff --git a/lib/netstate/netstate.go b/lib/netstate/netstate.go
index 2cbb35b..e13a62f 100644
--- a/lib/netstate/netstate.go
+++ b/lib/netstate/netstate.go
@@ -221,8 +221,10 @@
 // IsIPProtocol returns true if its parameter is one of the allowed
 // network/protocol values for IP.
 func IsIPProtocol(n string) bool {
+	// Removed the training IP version number.
+	n = strings.TrimRightFunc(n, func(r rune) bool { return r == '4' || r == '6' })
 	switch n {
-	case "ip+net", "ip", "tcp", "tcp4", "tcp6", "udp", "wsh":
+	case "ip+net", "ip", "tcp", "udp", "ws", "wsh":
 		return true
 	default:
 		return false
diff --git a/lib/testutil/integration/testdata/integration_test.go b/lib/testutil/integration/testdata/integration_test.go
index 97308d7..5d11ed6 100644
--- a/lib/testutil/integration/testdata/integration_test.go
+++ b/lib/testutil/integration/testdata/integration_test.go
@@ -1,6 +1,8 @@
 package testdata
 
 import (
+	"bufio"
+	"bytes"
 	"testing"
 
 	"v.io/core/veyron/lib/modules"
@@ -21,8 +23,10 @@
 		t.Fatalf("unexpected output, want %s, got %s", want, got)
 	}
 
-	// TODO(sjr): revive this once stderr handling is fixed.
-	// if want, got := "hello world\n", bash.Start("-c", "echo hello world 1>&2").ErrorOutput(); want != got {
-	//	t.Fatalf("unexpected output, want %s, got %s", want, got)
-	// }
+	inv := bash.Start("-c", "echo hello world 1>&2")
+	var buf bytes.Buffer
+	inv.WaitOrDie(nil, bufio.NewWriter(&buf))
+	if want, got := "hello world\n", string(buf.Bytes()); want != got {
+		t.Fatalf("unexpected output, want %s, got %s", want, got)
+	}
 }
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 8f5b314..0511b15 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -126,19 +126,25 @@
 	WithEnv(env []string) TestBinary
 }
 
+// Invocation represents a single invocation of a TestBinary.
+//
+// Any bytes written by the invocation to its standard error may be recovered
+// using the Wait or WaitOrDie functions.
+//
+// For example:
+//   bin := env.BinaryFromPath("/bin/bash")
+//   inv := bin.Start("-c", "echo hello world 1>&2")
+//   var buf bytes.Buffer
+//   inv.WaitOrDie(nil, bufio.NewWriter(&buf))
+//   // buf.Bytes() now contains 'hello world\n'
 type Invocation interface {
 	Stdin() io.Writer
 	Stdout() io.Reader
-	Stderr() io.Reader
 
 	// Output reads the invocation's stdout until EOF and then returns what
 	// was read as a string.
 	Output() string
 
-	// ErrorOutput reads the invocation's stderr until EOF and then returns
-	// what was read as a string.
-	ErrorOutput() string
-
 	// Sends the given signal to this invocation. It is up to the test
 	// author to decide whether failure to deliver the signal is fatal to
 	// the test.
@@ -232,14 +238,6 @@
 	return readerToString(i.env.t, i.Stdout())
 }
 
-func (i *integrationTestBinaryInvocation) Stderr() io.Reader {
-	return (*i.handle).Stderr()
-}
-
-func (i *integrationTestBinaryInvocation) ErrorOutput() string {
-	return readerToString(i.env.t, i.Stderr())
-}
-
 func (i *integrationTestBinaryInvocation) Wait(stdout, stderr io.Writer) error {
 	return (*i.handle).Shutdown(stdout, stderr)
 }
diff --git a/profiles/internal/util.go b/profiles/internal/util.go
index ac8a062..4c03b6e 100644
--- a/profiles/internal/util.go
+++ b/profiles/internal/util.go
@@ -3,6 +3,7 @@
 import (
 	"fmt"
 	"os"
+	"strings"
 
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/vlog"
@@ -48,8 +49,14 @@
 	accessible := netstate.AddrList(addrs)
 
 	// Try and find an address on a interface with a default route.
-	predicates := []netstate.AddressPredicate{netstate.IsPublicUnicastIPv4,
-		netstate.IsUnicastIPv4, netstate.IsPublicUnicastIPv6}
+	// We give preference to IPv4 over IPv6 for compatibility for now.
+	var predicates []netstate.AddressPredicate
+	if !strings.HasSuffix(network, "6") {
+		predicates = append(predicates, netstate.IsPublicUnicastIPv4, netstate.IsUnicastIPv4)
+	}
+	if !strings.HasSuffix(network, "4") {
+		predicates = append(predicates, netstate.IsPublicUnicastIPv6, netstate.IsUnicastIPv6)
+	}
 	for _, predicate := range predicates {
 		if addrs := accessible.Filter(predicate); len(addrs) > 0 {
 			onDefaultRoutes := addrs.Filter(netstate.IsOnDefaultRoute)
diff --git a/runtimes/google/ipc/benchmark/RESULTS.txt b/runtimes/google/ipc/benchmark/RESULTS.txt
index 95a44bf..eec067a 100644
--- a/runtimes/google/ipc/benchmark/RESULTS.txt
+++ b/runtimes/google/ipc/benchmark/RESULTS.txt
@@ -8,95 +8,92 @@
   continuously in the same process.
 
 ================================================================================
-Date: 02/02/2015
+Date: 02/03/2015
 Platform: Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz,  66114888KB Memory
 
-Benchmark____1B	    5000	   1941933 ns/op	   0.00 MB/s
+Benchmark____1B	    5000	   1911937 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 4  Avg: 1.35
+	Count: 5000  Min: 1  Max: 4  Avg: 1.33
 	------------------------------------------------------------
-	[  1,   2)  3792   75.8%   75.8%  ########
-	[  2,   3)   734   14.7%   90.5%  #
-	[  3,   4)   397    7.9%   98.5%  #
-	[  4, inf)    77    1.5%  100.0%  
-Benchmark____1B-2	    5000	   1744191 ns/op	   0.00 MB/s
+	[  1,   2)  3837   76.7%   76.7%  ########
+	[  2,   3)   720   14.4%   91.1%  #
+	[  3,   4)   386    7.7%   98.9%  #
+	[  4, inf)    57    1.1%  100.0%  
+Benchmark____1B-2	    5000	   1735328 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 3  Avg: 1.17
+	Count: 5000  Min: 1  Max: 4  Avg: 1.16
 	------------------------------------------------------------
 	[  1,   2)  4518   90.4%   90.4%  #########
-	[  2,   3)    91    1.8%   92.2%  
-	[  3, inf)   391    7.8%  100.0%  #
-Benchmark___10B	    5000	   2015671 ns/op	   0.01 MB/s
+	[  2,   3)   149    3.0%   93.3%  
+	[  3,   4)   332    6.6%  100.0%  #
+	[  4, inf)     1    0.0%  100.0%  
+Benchmark___10B	    5000	   1976083 ns/op	   0.01 MB/s
 --- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 9  Avg: 1.39
+	Count: 5000  Min: 1  Max: 8  Avg: 1.37
 	------------------------------------------------------------
 	[  1,   2)  4554   91.1%   91.1%  #########
-	[  2,   3)    17    0.3%   91.4%  
+	[  2,   3)    19    0.4%   91.5%  
 	[  3,   4)   102    2.0%   93.5%  
-	[  4,   5)    21    0.4%   93.9%  
-	[  5,   6)    60    1.2%   95.1%  
-	[  6,   8)   180    3.6%   98.7%  
-	[  8,  10)    66    1.3%  100.0%  
+	[  4,   5)    23    0.5%   94.0%  
+	[  5,   6)    74    1.5%   95.4%  
+	[  6,   7)   136    2.7%   98.2%  
+	[  7,   9)    92    1.8%  100.0%  
+	[  9, inf)     0    0.0%  100.0%  
+Benchmark___10B-2	    5000	   1764546 ns/op	   0.01 MB/s
+--- Histogram (unit: ms)
+	Count: 5000  Min: 1  Max: 6  Avg: 1.17
+	------------------------------------------------------------
+	[  1,   2)  4752   95.0%   95.0%  ##########
+	[  2,   3)     0    0.0%   95.0%  
+	[  3,   4)     0    0.0%   95.0%  
+	[  4,   5)   123    2.5%   97.5%  
+	[  5,   6)   123    2.5%  100.0%  
+	[  6, inf)     2    0.0%  100.0%  
+Benchmark__100B	    5000	   2065635 ns/op	   0.10 MB/s
+--- Histogram (unit: ms)
+	Count: 5000  Min: 1  Max: 14  Avg: 1.44
+	------------------------------------------------------------
+	[  1,   2)  4711   94.2%   94.2%  #########
+	[  2,   3)     6    0.1%   94.3%  
+	[  3,   4)    11    0.2%   94.6%  
+	[  4,   5)    41    0.8%   95.4%  
+	[  5,   6)    29    0.6%   96.0%  
+	[  6,   8)     1    0.0%   96.0%  
+	[  8,  10)    64    1.3%   97.3%  
+	[ 10,  13)   111    2.2%   99.5%  
+	[ 13,  16)    26    0.5%  100.0%  
+	[ 16,  20)     0    0.0%  100.0%  
+	[ 20,  25)     0    0.0%  100.0%  
+	[ 25,  31)     0    0.0%  100.0%  
+	[ 31,  38)     0    0.0%  100.0%  
+	[ 38, inf)     0    0.0%  100.0%  
+Benchmark__100B-2	    5000	   1800099 ns/op	   0.11 MB/s
+--- Histogram (unit: ms)
+	Count: 5000  Min: 1  Max: 9  Avg: 1.19
+	------------------------------------------------------------
+	[  1,   2)  4834   96.7%   96.7%  ##########
+	[  2,   3)     1    0.0%   96.7%  
+	[  3,   4)     0    0.0%   96.7%  
+	[  4,   5)     0    0.0%   96.7%  
+	[  5,   6)     0    0.0%   96.7%  
+	[  6,   8)   157    3.1%   99.8%  
+	[  8,  10)     8    0.2%  100.0%  
 	[ 10,  12)     0    0.0%  100.0%  
 	[ 12, inf)     0    0.0%  100.0%  
-Benchmark___10B-2	    5000	   1830436 ns/op	   0.01 MB/s
+Benchmark___1KB	    3000	   2160307 ns/op	   0.93 MB/s
 --- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 6  Avg: 1.20
+	Count: 3000  Min: 1  Max: 19  Avg: 1.50
 	------------------------------------------------------------
-	[  1,   2)  4731   94.6%   94.6%  #########
-	[  2,   3)    21    0.4%   95.0%  
-	[  3,   4)     0    0.0%   95.0%  
-	[  4,   5)    47    0.9%   96.0%  
-	[  5,   6)   161    3.2%   99.2%  
-	[  6, inf)    40    0.8%  100.0%  
-Benchmark__100B	    3000	   2140626 ns/op	   0.09 MB/s
---- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 15  Avg: 1.47
-	------------------------------------------------------------
-	[  1,   2)  2811   93.7%   93.7%  #########
-	[  2,   3)     6    0.2%   93.9%  
-	[  3,   4)     5    0.2%   94.1%  
-	[  4,   5)    17    0.6%   94.6%  
-	[  5,   7)    36    1.2%   95.8%  
-	[  7,   9)    19    0.6%   96.5%  
-	[  9,  11)    38    1.3%   97.7%  
-	[ 11,  14)    62    2.1%   99.8%  
-	[ 14,  18)     6    0.2%  100.0%  
-	[ 18,  22)     0    0.0%  100.0%  
-	[ 22,  27)     0    0.0%  100.0%  
-	[ 27,  33)     0    0.0%  100.0%  
-	[ 33,  41)     0    0.0%  100.0%  
-	[ 41,  50)     0    0.0%  100.0%  
-	[ 50, inf)     0    0.0%  100.0%  
-Benchmark__100B-2	    5000	   1852904 ns/op	   0.11 MB/s
---- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 11  Avg: 1.21
-	------------------------------------------------------------
-	[  1,   2)  4803   96.1%   96.1%  ##########
-	[  2,   3)    20    0.4%   96.5%  
-	[  3,   4)     0    0.0%   96.5%  
-	[  4,   5)     0    0.0%   96.5%  
-	[  5,   6)     0    0.0%   96.5%  
-	[  6,   8)   160    3.2%   99.7%  
-	[  8,  10)     9    0.2%   99.8%  
-	[ 10,  12)     8    0.2%  100.0%  
-	[ 12,  15)     0    0.0%  100.0%  
-	[ 15,  18)     0    0.0%  100.0%  
-	[ 18, inf)     0    0.0%  100.0%  
-Benchmark___1KB	    3000	   2231959 ns/op	   0.90 MB/s
---- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 19  Avg: 1.53
-	------------------------------------------------------------
-	[  1,   2)  2875   95.8%   95.8%  ##########
-	[  2,   3)     1    0.0%   95.9%  
-	[  3,   4)     0    0.0%   95.9%  
-	[  4,   5)     0    0.0%   95.9%  
-	[  5,   7)     8    0.3%   96.1%  
-	[  7,   9)    21    0.7%   96.8%  
-	[  9,  12)     0    0.0%   96.8%  
-	[ 12,  15)    29    1.0%   97.8%  
-	[ 15,  19)    56    1.9%   99.7%  
-	[ 19,  24)    10    0.3%  100.0%  
+	[  1,   2)  2883   96.1%   96.1%  ##########
+	[  2,   3)     0    0.0%   96.1%  
+	[  3,   4)     0    0.0%   96.1%  
+	[  4,   5)     0    0.0%   96.1%  
+	[  5,   7)     8    0.3%   96.4%  
+	[  7,   9)    20    0.7%   97.0%  
+	[  9,  12)     0    0.0%   97.0%  
+	[ 12,  15)    28    0.9%   98.0%  
+	[ 15,  19)    53    1.8%   99.7%  
+	[ 19,  24)     8    0.3%  100.0%  
 	[ 24,  30)     0    0.0%  100.0%  
 	[ 30,  38)     0    0.0%  100.0%  
 	[ 38,  48)     0    0.0%  100.0%  
@@ -104,36 +101,34 @@
 	[ 60,  74)     0    0.0%  100.0%  
 	[ 74,  91)     0    0.0%  100.0%  
 	[ 91, inf)     0    0.0%  100.0%  
-Benchmark___1KB-2	    3000	   2078680 ns/op	   0.96 MB/s
+Benchmark___1KB-2	    5000	   1845717 ns/op	   1.08 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 12  Avg: 1.35
+	Count: 5000  Min: 1  Max: 10  Avg: 1.22
 	------------------------------------------------------------
-	[  1,   2)  2699   90.0%   90.0%  #########
-	[  2,   3)   213    7.1%   97.1%  #
-	[  3,   4)     0    0.0%   97.1%  
-	[  4,   5)     0    0.0%   97.1%  
-	[  5,   6)     0    0.0%   97.1%  
-	[  6,   8)     0    0.0%   97.1%  
-	[  8,  10)    20    0.7%   97.7%  
-	[ 10,  13)    68    2.3%  100.0%  
-	[ 13,  16)     0    0.0%  100.0%  
-	[ 16,  20)     0    0.0%  100.0%  
-	[ 20,  24)     0    0.0%  100.0%  
-	[ 24, inf)     0    0.0%  100.0%  
-Benchmark__10KB	    3000	   2548055 ns/op	   7.85 MB/s
+	[  1,   2)  4857   97.1%   97.1%  ##########
+	[  2,   3)     7    0.1%   97.3%  
+	[  3,   4)     0    0.0%   97.3%  
+	[  4,   5)     0    0.0%   97.3%  
+	[  5,   6)     0    0.0%   97.3%  
+	[  6,   8)     0    0.0%   97.3%  
+	[  8,  10)   123    2.5%   99.7%  
+	[ 10,  12)    13    0.3%  100.0%  
+	[ 12,  15)     0    0.0%  100.0%  
+	[ 15, inf)     0    0.0%  100.0%  
+Benchmark__10KB	    3000	   2461125 ns/op	   8.13 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 24  Avg: 1.73
+	Count: 3000  Min: 1  Max: 24  Avg: 1.65
 	------------------------------------------------------------
-	[  1,   2)  2665   88.8%   88.8%  #########
-	[  2,   3)   196    6.5%   95.4%  #
-	[  3,   4)     0    0.0%   95.4%  
-	[  4,   5)     0    0.0%   95.4%  
-	[  5,   7)     0    0.0%   95.4%  
-	[  7,   9)    42    1.4%   96.8%  
-	[  9,  12)     0    0.0%   96.8%  
-	[ 12,  16)    30    1.0%   97.8%  
-	[ 16,  21)    19    0.6%   98.4%  
-	[ 21,  27)    48    1.6%  100.0%  
+	[  1,   2)  2865   95.5%   95.5%  ##########
+	[  2,   3)    19    0.6%   96.1%  
+	[  3,   4)     0    0.0%   96.1%  
+	[  4,   5)     0    0.0%   96.1%  
+	[  5,   7)     0    0.0%   96.1%  
+	[  7,   9)    27    0.9%   97.0%  
+	[  9,  12)     1    0.0%   97.1%  
+	[ 12,  16)     0    0.0%   97.1%  
+	[ 16,  21)    28    0.9%   98.0%  
+	[ 21,  27)    60    2.0%  100.0%  
 	[ 27,  35)     0    0.0%  100.0%  
 	[ 35,  44)     0    0.0%  100.0%  
 	[ 44,  56)     0    0.0%  100.0%  
@@ -141,240 +136,171 @@
 	[ 71,  89)     0    0.0%  100.0%  
 	[ 89, 111)     0    0.0%  100.0%  
 	[111, inf)     0    0.0%  100.0%  
-Benchmark__10KB-2	    3000	   2242089 ns/op	   8.92 MB/s
+Benchmark__10KB-2	    5000	   2002215 ns/op	   9.99 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 14  Avg: 1.53
+	Count: 5000  Min: 1  Max: 12  Avg: 1.32
 	------------------------------------------------------------
-	[  1,   2)  2328   77.6%   77.6%  ########
-	[  2,   3)   581   19.4%   97.0%  ##
-	[  3,   4)     0    0.0%   97.0%  
-	[  4,   5)     0    0.0%   97.0%  
-	[  5,   6)     0    0.0%   97.0%  
-	[  6,   8)     0    0.0%   97.0%  
-	[  8,  10)     0    0.0%   97.0%  
-	[ 10,  13)    45    1.5%   98.5%  
-	[ 13,  16)    46    1.5%  100.0%  
+	[  1,   2)  4634   92.7%   92.7%  #########
+	[  2,   3)   230    4.6%   97.3%  
+	[  3,   4)     0    0.0%   97.3%  
+	[  4,   5)     0    0.0%   97.3%  
+	[  5,   6)     0    0.0%   97.3%  
+	[  6,   8)     0    0.0%   97.3%  
+	[  8,  10)     0    0.0%   97.3%  
+	[ 10,  13)   136    2.7%  100.0%  
+	[ 13,  16)     0    0.0%  100.0%  
 	[ 16,  20)     0    0.0%  100.0%  
-	[ 20,  25)     0    0.0%  100.0%  
-	[ 25,  31)     0    0.0%  100.0%  
-	[ 31,  38)     0    0.0%  100.0%  
-	[ 38, inf)     0    0.0%  100.0%  
-Benchmark_100KB	    2000	   5112233 ns/op	  39.12 MB/s
+	[ 20,  24)     0    0.0%  100.0%  
+	[ 24, inf)     0    0.0%  100.0%  
+Benchmark_100KB	    2000	   4987528 ns/op	  40.10 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 3  Max: 26  Avg: 4.49
+	Count: 2000  Min: 3  Max: 28  Avg: 4.44
 	------------------------------------------------------------
-	[  3,   4)  1819   91.0%   91.0%  #########
-	[  4,   5)     0    0.0%   91.0%  
-	[  5,   6)     0    0.0%   91.0%  
-	[  6,   7)     0    0.0%   91.0%  
-	[  7,   9)    44    2.2%   93.2%  
-	[  9,  11)     1    0.1%   93.2%  
-	[ 11,  14)     0    0.0%   93.2%  
-	[ 14,  18)     0    0.0%   93.2%  
-	[ 18,  23)    45    2.2%   95.5%  
-	[ 23,  29)    91    4.5%  100.0%  
+	[  3,   4)  1846   92.3%   92.3%  #########
+	[  4,   5)     3    0.2%   92.5%  
+	[  5,   6)     0    0.0%   92.5%  
+	[  6,   7)     0    0.0%   92.5%  
+	[  7,   9)    28    1.4%   93.9%  
+	[  9,  11)     1    0.1%   93.9%  
+	[ 11,  14)     0    0.0%   93.9%  
+	[ 14,  18)     0    0.0%   93.9%  
+	[ 18,  23)    29    1.5%   95.4%  
+	[ 23,  29)    93    4.7%  100.0%  
 	[ 29,  37)     0    0.0%  100.0%  
-	[ 37,  46)     0    0.0%  100.0%  
-	[ 46,  58)     0    0.0%  100.0%  
-	[ 58,  73)     0    0.0%  100.0%  
-	[ 73,  91)     0    0.0%  100.0%  
-	[ 91, 113)     0    0.0%  100.0%  
-	[113, inf)     0    0.0%  100.0%  
-Benchmark_100KB-2	    2000	   3661880 ns/op	  54.62 MB/s
+	[ 37,  47)     0    0.0%  100.0%  
+	[ 47,  60)     0    0.0%  100.0%  
+	[ 60,  76)     0    0.0%  100.0%  
+	[ 76,  96)     0    0.0%  100.0%  
+	[ 96, 120)     0    0.0%  100.0%  
+	[120, inf)     0    0.0%  100.0%  
+Benchmark_100KB-2	    2000	   3358703 ns/op	  59.55 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 2  Max: 19  Avg: 3.00
+	Count: 2000  Min: 2  Max: 15  Avg: 2.78
 	------------------------------------------------------------
-	[  2,   3)  1657   82.9%   82.9%  ########
-	[  3,   4)   143    7.2%   90.0%  #
-	[  4,   5)    67    3.4%   93.4%  
-	[  5,   6)     1    0.1%   93.4%  
-	[  6,   8)     0    0.0%   93.4%  
-	[  8,  10)     0    0.0%   93.4%  
-	[ 10,  13)    13    0.7%   94.1%  
-	[ 13,  16)    48    2.4%   96.5%  
-	[ 16,  20)    71    3.6%  100.0%  
-	[ 20,  25)     0    0.0%  100.0%  
-	[ 25,  31)     0    0.0%  100.0%  
-	[ 31,  38)     0    0.0%  100.0%  
-	[ 38,  47)     0    0.0%  100.0%  
-	[ 47,  58)     0    0.0%  100.0%  
-	[ 58,  72)     0    0.0%  100.0%  
-	[ 72,  89)     0    0.0%  100.0%  
-	[ 89, inf)     0    0.0%  100.0%  
+	[  2,   3)  1755   87.8%   87.8%  #########
+	[  3,   4)    74    3.7%   91.5%  
+	[  4,   5)    53    2.7%   94.1%  
+	[  5,   6)     0    0.0%   94.1%  
+	[  6,   7)     0    0.0%   94.1%  
+	[  7,   9)     0    0.0%   94.1%  
+	[  9,  11)     0    0.0%   94.1%  
+	[ 11,  14)    36    1.8%   95.9%  
+	[ 14,  17)    82    4.1%  100.0%  
+	[ 17,  21)     0    0.0%  100.0%  
+	[ 21,  26)     0    0.0%  100.0%  
+	[ 26,  32)     0    0.0%  100.0%  
+	[ 32,  39)     0    0.0%  100.0%  
+	[ 39, inf)     0    0.0%  100.0%  
 
-Benchmark____1_chunk_____1B	    3000	   2154678 ns/op	   0.00 MB/s
+Benchmark____1_chunk_____1B	    3000	   2147302 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 4  Avg: 1.42
+	Count: 3000  Min: 1  Max: 4  Avg: 1.43
 	------------------------------------------------------------
-	[  1,   2)  2069   69.0%   69.0%  #######
-	[  2,   3)   599   20.0%   88.9%  ##
-	[  3,   4)   331   11.0%  100.0%  #
+	[  1,   2)  2049   68.3%   68.3%  #######
+	[  2,   3)   628   20.9%   89.2%  ##
+	[  3,   4)   321   10.7%   99.9%  #
+	[  4, inf)     2    0.1%  100.0%  
+Benchmark____1_chunk_____1B-2	    5000	   1892882 ns/op	   0.00 MB/s
+--- Histogram (unit: ms)
+	Count: 5000  Min: 1  Max: 4  Avg: 1.20
+	------------------------------------------------------------
+	[  1,   2)  4363   87.3%   87.3%  #########
+	[  2,   3)   286    5.7%   93.0%  #
+	[  3,   4)   350    7.0%  100.0%  #
 	[  4, inf)     1    0.0%  100.0%  
-Benchmark____1_chunk_____1B-2	    5000	   1907902 ns/op	   0.00 MB/s
---- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 4  Avg: 1.21
-	------------------------------------------------------------
-	[  1,   2)  4345   86.9%   86.9%  #########
-	[  2,   3)   275    5.5%   92.4%  #
-	[  3,   4)   377    7.5%   99.9%  #
-	[  4, inf)     3    0.1%  100.0%  
-Benchmark____1_chunk____10B	    3000	   2234222 ns/op	   0.01 MB/s
+Benchmark____1_chunk____10B	    3000	   2225520 ns/op	   0.01 MB/s
 --- Histogram (unit: ms)
 	Count: 3000  Min: 1  Max: 7  Avg: 1.44
 	------------------------------------------------------------
-	[  1,   2)  2603   86.8%   86.8%  #########
-	[  2,   3)    65    2.2%   88.9%  
-	[  3,   4)    77    2.6%   91.5%  
-	[  4,   5)    50    1.7%   93.2%  
-	[  5,   6)    87    2.9%   96.1%  
-	[  6,   7)   117    3.9%  100.0%  
-	[  7, inf)     1    0.0%  100.0%  
-Benchmark____1_chunk____10B-2	    5000	   1920770 ns/op	   0.01 MB/s
+	[  1,   2)  2609   87.0%   87.0%  #########
+	[  2,   3)    62    2.1%   89.0%  
+	[  3,   4)    75    2.5%   91.5%  
+	[  4,   5)    46    1.5%   93.1%  
+	[  5,   6)    90    3.0%   96.1%  
+	[  6,   7)   112    3.7%   99.8%  
+	[  7, inf)     6    0.2%  100.0%  
+Benchmark____1_chunk____10B-2	    5000	   1921505 ns/op	   0.01 MB/s
 --- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 5  Avg: 1.21
+	Count: 5000  Min: 1  Max: 6  Avg: 1.21
 	------------------------------------------------------------
-	[  1,   2)  4571   91.4%   91.4%  #########
-	[  2,   3)   106    2.1%   93.5%  
-	[  3,   4)    23    0.5%   94.0%  
-	[  4,   5)   284    5.7%   99.7%  #
-	[  5, inf)    16    0.3%  100.0%  
-Benchmark____1_chunk___100B	    3000	   2296619 ns/op	   0.09 MB/s
+	[  1,   2)  4576   91.5%   91.5%  #########
+	[  2,   3)   100    2.0%   93.5%  
+	[  3,   4)    27    0.5%   94.1%  
+	[  4,   5)   279    5.6%   99.6%  #
+	[  5,   6)    17    0.3%  100.0%  
+	[  6, inf)     1    0.0%  100.0%  
+Benchmark____1_chunk___100B	    3000	   2282133 ns/op	   0.09 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 12  Avg: 1.49
+	Count: 3000  Min: 1  Max: 11  Avg: 1.47
 	------------------------------------------------------------
-	[  1,   2)  2680   89.3%   89.3%  #########
-	[  2,   3)    98    3.3%   92.6%  
-	[  3,   4)    10    0.3%   92.9%  
-	[  4,   5)    53    1.8%   94.7%  
-	[  5,   6)     2    0.1%   94.8%  
-	[  6,   8)    57    1.9%   96.7%  
-	[  8,  10)    55    1.8%   98.5%  
-	[ 10,  13)    45    1.5%  100.0%  
-	[ 13,  16)     0    0.0%  100.0%  
-	[ 16,  20)     0    0.0%  100.0%  
-	[ 20,  24)     0    0.0%  100.0%  
-	[ 24, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk___100B-2	    5000	   1971568 ns/op	   0.10 MB/s
+	[  1,   2)  2705   90.2%   90.2%  #########
+	[  2,   3)    66    2.2%   92.4%  
+	[  3,   4)    13    0.4%   92.8%  
+	[  4,   5)    59    2.0%   94.8%  
+	[  5,   6)     0    0.0%   94.8%  
+	[  6,   8)    68    2.3%   97.0%  
+	[  8,  10)    51    1.7%   98.7%  
+	[ 10,  12)    38    1.3%  100.0%  
+	[ 12,  15)     0    0.0%  100.0%  
+	[ 15,  18)     0    0.0%  100.0%  
+	[ 18, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk___100B-2	    5000	   1953792 ns/op	   0.10 MB/s
 --- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 7  Avg: 1.26
+	Count: 5000  Min: 1  Max: 6  Avg: 1.25
 	------------------------------------------------------------
-	[  1,   2)  4521   90.4%   90.4%  #########
-	[  2,   3)   257    5.1%   95.6%  #
-	[  3,   4)     0    0.0%   95.6%  
-	[  4,   5)     0    0.0%   95.6%  
-	[  5,   6)    66    1.3%   96.9%  
-	[  6,   7)   155    3.1%  100.0%  
-	[  7, inf)     1    0.0%  100.0%  
-Benchmark____1_chunk____1KB	    3000	   2399265 ns/op	   0.83 MB/s
+	[  1,   2)  4543   90.9%   90.9%  #########
+	[  2,   3)   234    4.7%   95.5%  
+	[  3,   4)     0    0.0%   95.5%  
+	[  4,   5)     0    0.0%   95.5%  
+	[  5,   6)    91    1.8%   97.4%  
+	[  6, inf)   132    2.6%  100.0%  
+Benchmark____1_chunk____1KB	    3000	   2417281 ns/op	   0.83 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 17  Avg: 1.56
+	Count: 3000  Min: 1  Max: 19  Avg: 1.63
 	------------------------------------------------------------
-	[  1,   2)  2695   89.8%   89.8%  #########
-	[  2,   3)   146    4.9%   94.7%  
-	[  3,   4)     3    0.1%   94.8%  
-	[  4,   5)     1    0.0%   94.8%  
-	[  5,   7)    42    1.4%   96.2%  
-	[  7,   9)     0    0.0%   96.2%  
-	[  9,  12)    43    1.4%   97.7%  
-	[ 12,  15)    42    1.4%   99.1%  
-	[ 15,  19)    28    0.9%  100.0%  
-	[ 19,  24)     0    0.0%  100.0%  
+	[  1,   2)  2522   84.1%   84.1%  ########
+	[  2,   3)   331   11.0%   95.1%  #
+	[  3,   4)     1    0.0%   95.1%  
+	[  4,   5)     1    0.0%   95.2%  
+	[  5,   7)    30    1.0%   96.2%  
+	[  7,   9)     2    0.1%   96.2%  
+	[  9,  12)    30    1.0%   97.2%  
+	[ 12,  15)    49    1.6%   98.9%  
+	[ 15,  19)    33    1.1%  100.0%  
+	[ 19,  24)     1    0.0%  100.0%  
 	[ 24,  30)     0    0.0%  100.0%  
-	[ 30,  37)     0    0.0%  100.0%  
-	[ 37,  46)     0    0.0%  100.0%  
-	[ 46,  57)     0    0.0%  100.0%  
-	[ 57,  70)     0    0.0%  100.0%  
-	[ 70,  86)     0    0.0%  100.0%  
-	[ 86, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk____1KB-2	    5000	   2143186 ns/op	   0.93 MB/s
+	[ 30,  38)     0    0.0%  100.0%  
+	[ 38,  48)     0    0.0%  100.0%  
+	[ 48,  60)     0    0.0%  100.0%  
+	[ 60,  74)     0    0.0%  100.0%  
+	[ 74,  91)     0    0.0%  100.0%  
+	[ 91, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk____1KB-2	    5000	   2015100 ns/op	   0.99 MB/s
 --- Histogram (unit: ms)
-	Count: 5000  Min: 1  Max: 12  Avg: 1.47
+	Count: 5000  Min: 1  Max: 8  Avg: 1.30
 	------------------------------------------------------------
-	[  1,   2)  3732   74.6%   74.6%  #######
-	[  2,   3)  1100   22.0%   96.6%  ##
+	[  1,   2)  4453   89.1%   89.1%  #########
+	[  2,   3)   379    7.6%   96.6%  #
 	[  3,   4)     0    0.0%   96.6%  
 	[  4,   5)     0    0.0%   96.6%  
 	[  5,   6)     0    0.0%   96.6%  
-	[  6,   8)    52    1.0%   97.7%  
-	[  8,  10)    62    1.2%   98.9%  
-	[ 10,  13)    54    1.1%  100.0%  
-	[ 13,  16)     0    0.0%  100.0%  
-	[ 16,  20)     0    0.0%  100.0%  
-	[ 20,  24)     0    0.0%  100.0%  
-	[ 24, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk___10KB	    3000	   2829279 ns/op	   7.07 MB/s
+	[  6,   7)     0    0.0%   96.6%  
+	[  7,   9)   168    3.4%  100.0%  
+	[  9, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk___10KB	    3000	   2703920 ns/op	   7.40 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 26  Avg: 2.72
+	Count: 3000  Min: 2  Max: 20  Avg: 2.61
 	------------------------------------------------------------
-	[  1,   2)     2    0.1%    0.1%  
-	[  2,   3)  2859   95.3%   95.4%  ##########
-	[  3,   4)     0    0.0%   95.4%  
-	[  4,   5)     0    0.0%   95.4%  
-	[  5,   7)     0    0.0%   95.4%  
-	[  7,   9)    27    0.9%   96.3%  
-	[  9,  12)     5    0.2%   96.4%  
-	[ 12,  16)     5    0.2%   96.6%  
-	[ 16,  21)    37    1.2%   97.8%  
-	[ 21,  27)    65    2.2%  100.0%  
-	[ 27,  35)     0    0.0%  100.0%  
-	[ 35,  45)     0    0.0%  100.0%  
-	[ 45,  58)     0    0.0%  100.0%  
-	[ 58,  74)     0    0.0%  100.0%  
-	[ 74,  94)     0    0.0%  100.0%  
-	[ 94, 118)     0    0.0%  100.0%  
-	[118, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk___10KB-2	    3000	   2402468 ns/op	   8.32 MB/s
---- Histogram (unit: ms)
-	Count: 3000  Min: 1  Max: 13  Avg: 2.00
-	------------------------------------------------------------
-	[  1,   2)   879   29.3%   29.3%  ###
-	[  2,   3)  2021   67.4%   96.7%  #######
-	[  3,   4)     0    0.0%   96.7%  
-	[  4,   5)     0    0.0%   96.7%  
-	[  5,   6)     0    0.0%   96.7%  
-	[  6,   8)     0    0.0%   96.7%  
-	[  8,  10)    24    0.8%   97.5%  
-	[ 10,  13)    49    1.6%   99.1%  
-	[ 13,  16)    27    0.9%  100.0%  
-	[ 16,  20)     0    0.0%  100.0%  
-	[ 20,  25)     0    0.0%  100.0%  
-	[ 25,  31)     0    0.0%  100.0%  
-	[ 31, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk__100KB	    2000	   5417885 ns/op	  36.91 MB/s
---- Histogram (unit: ms)
-	Count: 2000  Min: 3  Max: 29  Avg: 4.65
-	------------------------------------------------------------
-	[  3,   4)  1730   86.5%   86.5%  #########
-	[  4,   5)    54    2.7%   89.2%  
-	[  5,   6)     0    0.0%   89.2%  
-	[  6,   7)     0    0.0%   89.2%  
-	[  7,   9)    27    1.4%   90.6%  
-	[  9,  11)    45    2.2%   92.8%  
-	[ 11,  14)     0    0.0%   92.8%  
-	[ 14,  18)     0    0.0%   92.8%  
-	[ 18,  23)    69    3.5%   96.2%  
-	[ 23,  30)    75    3.8%  100.0%  
-	[ 30,  38)     0    0.0%  100.0%  
-	[ 38,  48)     0    0.0%  100.0%  
-	[ 48,  61)     0    0.0%  100.0%  
-	[ 61,  77)     0    0.0%  100.0%  
-	[ 77,  97)     0    0.0%  100.0%  
-	[ 97, 122)     0    0.0%  100.0%  
-	[122, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk__100KB-2	    2000	   3784105 ns/op	  52.85 MB/s
---- Histogram (unit: ms)
-	Count: 2000  Min: 2  Max: 20  Avg: 3.10
-	------------------------------------------------------------
-	[  2,   3)  1356   67.8%   67.8%  #######
-	[  3,   4)   448   22.4%   90.2%  ##
-	[  4,   5)    57    2.9%   93.1%  
-	[  5,   6)     0    0.0%   93.1%  
-	[  6,   8)     0    0.0%   93.1%  
-	[  8,  10)     0    0.0%   93.1%  
-	[ 10,  13)    55    2.8%   95.8%  
-	[ 13,  16)    59    3.0%   98.8%  
-	[ 16,  20)    24    1.2%  100.0%  
-	[ 20,  25)     1    0.1%  100.0%  
+	[  2,   3)  2858   95.3%   95.3%  ##########
+	[  3,   4)     0    0.0%   95.3%  
+	[  4,   5)     0    0.0%   95.3%  
+	[  5,   6)     0    0.0%   95.3%  
+	[  6,   8)    34    1.1%   96.4%  
+	[  8,  10)     1    0.0%   96.4%  
+	[ 10,  13)     0    0.0%   96.4%  
+	[ 13,  16)    34    1.1%   97.6%  
+	[ 16,  20)    49    1.6%   99.2%  
+	[ 20,  25)    24    0.8%  100.0%  
 	[ 25,  31)     0    0.0%  100.0%  
 	[ 31,  39)     0    0.0%  100.0%  
 	[ 39,  49)     0    0.0%  100.0%  
@@ -382,204 +308,216 @@
 	[ 61,  75)     0    0.0%  100.0%  
 	[ 75,  92)     0    0.0%  100.0%  
 	[ 92, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk_____1B	    2000	   3738398 ns/op	   0.01 MB/s
+Benchmark____1_chunk___10KB-2	    3000	   2201032 ns/op	   9.09 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 2  Max: 30  Avg: 3.18
+	Count: 3000  Min: 1  Max: 11  Avg: 1.48
 	------------------------------------------------------------
-	[  2,   3)  1091   54.6%   54.6%  #####
-	[  3,   4)   828   41.4%   96.0%  ####
+	[  1,   2)  2307   76.9%   76.9%  ########
+	[  2,   3)   593   19.8%   96.7%  ##
+	[  3,   4)     0    0.0%   96.7%  
+	[  4,   5)     0    0.0%   96.7%  
+	[  5,   6)     0    0.0%   96.7%  
+	[  6,   8)     0    0.0%   96.7%  
+	[  8,  10)    50    1.7%   98.3%  
+	[ 10,  12)    50    1.7%  100.0%  
+	[ 12,  15)     0    0.0%  100.0%  
+	[ 15,  18)     0    0.0%  100.0%  
+	[ 18, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk__100KB	    2000	   5233249 ns/op	  38.22 MB/s
+--- Histogram (unit: ms)
+	Count: 2000  Min: 3  Max: 27  Avg: 4.53
+	------------------------------------------------------------
+	[  3,   4)  1654   82.7%   82.7%  ########
+	[  4,   5)   130    6.5%   89.2%  #
+	[  5,   6)     0    0.0%   89.2%  
+	[  6,   7)     0    0.0%   89.2%  
+	[  7,   9)    70    3.5%   92.7%  
+	[  9,  11)     2    0.1%   92.8%  
+	[ 11,  14)     0    0.0%   92.8%  
+	[ 14,  18)     0    0.0%   92.8%  
+	[ 18,  23)    87    4.4%   97.2%  
+	[ 23,  29)    57    2.9%  100.0%  
+	[ 29,  37)     0    0.0%  100.0%  
+	[ 37,  47)     0    0.0%  100.0%  
+	[ 47,  59)     0    0.0%  100.0%  
+	[ 59,  74)     0    0.0%  100.0%  
+	[ 74,  93)     0    0.0%  100.0%  
+	[ 93, 117)     0    0.0%  100.0%  
+	[117, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk__100KB-2	    2000	   3569385 ns/op	  56.03 MB/s
+--- Histogram (unit: ms)
+	Count: 2000  Min: 2  Max: 13  Avg: 2.82
+	------------------------------------------------------------
+	[  2,   3)  1669   83.5%   83.5%  ########
+	[  3,   4)   163    8.2%   91.6%  #
+	[  4,   5)    29    1.5%   93.1%  
+	[  5,   6)     0    0.0%   93.1%  
+	[  6,   7)     0    0.0%   93.1%  
+	[  7,   9)     0    0.0%   93.1%  
+	[  9,  11)     0    0.0%   93.1%  
+	[ 11,  14)   139    7.0%  100.0%  #
+	[ 14,  17)     0    0.0%  100.0%  
+	[ 17,  21)     0    0.0%  100.0%  
+	[ 21,  25)     0    0.0%  100.0%  
+	[ 25, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk_____1B	    2000	   3741137 ns/op	   0.01 MB/s
+--- Histogram (unit: ms)
+	Count: 2000  Min: 2  Max: 29  Avg: 3.15
+	------------------------------------------------------------
+	[  2,   3)  1180   59.0%   59.0%  ######
+	[  3,   4)   739   37.0%   96.0%  ####
 	[  4,   5)     0    0.0%   96.0%  
 	[  5,   6)     0    0.0%   96.0%  
-	[  6,   8)     1    0.1%   96.0%  
-	[  8,  11)     0    0.0%   96.0%  
-	[ 11,  14)    19    1.0%   97.0%  
+	[  6,   8)     0    0.0%   96.0%  
+	[  8,  11)     3    0.2%   96.1%  
+	[ 11,  14)    17    0.9%   97.0%  
 	[ 14,  18)     0    0.0%   97.0%  
-	[ 18,  23)    19    1.0%   97.9%  
+	[ 18,  23)    20    1.0%   98.0%  
 	[ 23,  30)    41    2.1%  100.0%  
-	[ 30,  39)     1    0.1%  100.0%  
+	[ 30,  39)     0    0.0%  100.0%  
 	[ 39,  50)     0    0.0%  100.0%  
-	[ 50,  64)     0    0.0%  100.0%  
-	[ 64,  81)     0    0.0%  100.0%  
-	[ 81, 103)     0    0.0%  100.0%  
-	[103, 130)     0    0.0%  100.0%  
-	[130, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk_____1B-2	    3000	   2838899 ns/op	   0.01 MB/s
+	[ 50,  63)     0    0.0%  100.0%  
+	[ 63,  80)     0    0.0%  100.0%  
+	[ 80, 101)     0    0.0%  100.0%  
+	[101, 128)     0    0.0%  100.0%  
+	[128, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk_____1B-2	    3000	   2846887 ns/op	   0.01 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 2  Max: 17  Avg: 2.42
+	Count: 3000  Min: 2  Max: 18  Avg: 2.43
 	------------------------------------------------------------
-	[  2,   3)  2705   90.2%   90.2%  #########
-	[  3,   4)   206    6.9%   97.0%  #
+	[  2,   3)  2700   90.0%   90.0%  #########
+	[  3,   4)   211    7.0%   97.0%  #
 	[  4,   5)     1    0.0%   97.1%  
 	[  5,   6)     0    0.0%   97.1%  
 	[  6,   8)     0    0.0%   97.1%  
 	[  8,  10)     0    0.0%   97.1%  
-	[ 10,  12)     4    0.1%   97.2%  
-	[ 12,  15)    43    1.4%   98.6%  
-	[ 15,  19)    41    1.4%  100.0%  
-	[ 19,  24)     0    0.0%  100.0%  
-	[ 24,  30)     0    0.0%  100.0%  
-	[ 30,  37)     0    0.0%  100.0%  
-	[ 37,  45)     0    0.0%  100.0%  
-	[ 45,  55)     0    0.0%  100.0%  
-	[ 55,  67)     0    0.0%  100.0%  
-	[ 67, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk____10B	    2000	   3750396 ns/op	   0.05 MB/s
+	[ 10,  13)    25    0.8%   97.9%  
+	[ 13,  16)    31    1.0%   98.9%  
+	[ 16,  20)    32    1.1%  100.0%  
+	[ 20,  25)     0    0.0%  100.0%  
+	[ 25,  31)     0    0.0%  100.0%  
+	[ 31,  38)     0    0.0%  100.0%  
+	[ 38,  47)     0    0.0%  100.0%  
+	[ 47,  58)     0    0.0%  100.0%  
+	[ 58,  71)     0    0.0%  100.0%  
+	[ 71,  87)     0    0.0%  100.0%  
+	[ 87, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk____10B	    2000	   3793093 ns/op	   0.05 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 2  Max: 31  Avg: 3.15
+	Count: 2000  Min: 2  Max: 33  Avg: 3.19
 	------------------------------------------------------------
-	[  2,   3)  1179   59.0%   59.0%  ######
-	[  3,   4)   747   37.4%   96.3%  ####
-	[  4,   5)     0    0.0%   96.3%  
-	[  5,   6)     0    0.0%   96.3%  
-	[  6,   8)     0    0.0%   96.3%  
-	[  8,  11)     0    0.0%   96.3%  
-	[ 11,  14)    18    0.9%   97.2%  
+	[  2,   3)  1187   59.4%   59.4%  ######
+	[  3,   4)   737   36.9%   96.2%  ####
+	[  4,   5)     0    0.0%   96.2%  
+	[  5,   6)     0    0.0%   96.2%  
+	[  6,   8)     0    0.0%   96.2%  
+	[  8,  11)     0    0.0%   96.2%  
+	[ 11,  14)    20    1.0%   97.2%  
 	[ 14,  18)     0    0.0%   97.2%  
-	[ 18,  24)    19    1.0%   98.2%  
-	[ 24,  31)    32    1.6%   99.8%  
-	[ 31,  40)     5    0.2%  100.0%  
-	[ 40,  51)     0    0.0%  100.0%  
-	[ 51,  65)     0    0.0%  100.0%  
-	[ 65,  83)     0    0.0%  100.0%  
-	[ 83, 106)     0    0.0%  100.0%  
-	[106, 134)     0    0.0%  100.0%  
-	[134, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk____10B-2	    3000	   2669872 ns/op	   0.07 MB/s
+	[ 18,  24)    20    1.0%   98.2%  
+	[ 24,  31)     2    0.1%   98.3%  
+	[ 31,  40)    34    1.7%  100.0%  
+	[ 40,  52)     0    0.0%  100.0%  
+	[ 52,  67)     0    0.0%  100.0%  
+	[ 67,  86)     0    0.0%  100.0%  
+	[ 86, 110)     0    0.0%  100.0%  
+	[110, 140)     0    0.0%  100.0%  
+	[140, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk____10B-2	    3000	   2683120 ns/op	   0.07 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 2  Max: 14  Avg: 2.37
+	Count: 3000  Min: 2  Max: 15  Avg: 2.39
 	------------------------------------------------------------
-	[  2,   3)  2712   90.4%   90.4%  #########
-	[  3,   4)   208    6.9%   97.3%  #
+	[  2,   3)  2713   90.4%   90.4%  #########
+	[  3,   4)   207    6.9%   97.3%  #
 	[  4,   5)     0    0.0%   97.3%  
 	[  5,   6)     0    0.0%   97.3%  
 	[  6,   7)     0    0.0%   97.3%  
 	[  7,   9)     0    0.0%   97.3%  
 	[  9,  11)     0    0.0%   97.3%  
-	[ 11,  14)    52    1.7%   99.1%  
-	[ 14,  17)    28    0.9%  100.0%  
+	[ 11,  14)     7    0.2%   97.6%  
+	[ 14,  17)    73    2.4%  100.0%  
 	[ 17,  21)     0    0.0%  100.0%  
 	[ 21,  26)     0    0.0%  100.0%  
 	[ 26,  32)     0    0.0%  100.0%  
-	[ 32, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk___100B	    2000	   3830903 ns/op	   0.52 MB/s
+	[ 32,  39)     0    0.0%  100.0%  
+	[ 39, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk___100B	    2000	   3847823 ns/op	   0.52 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 2  Max: 43  Avg: 3.34
+	Count: 2000  Min: 2  Max: 38  Avg: 3.35
 	------------------------------------------------------------
-	[  2,   3)   880   44.0%   44.0%  ####
-	[  3,   4)  1052   52.6%   96.6%  #####
-	[  4,   5)     3    0.2%   96.8%  
+	[  2,   3)   902   45.1%   45.1%  #####
+	[  3,   4)  1034   51.7%   96.8%  #####
+	[  4,   5)     0    0.0%   96.8%  
 	[  5,   7)     0    0.0%   96.8%  
 	[  7,   9)     0    0.0%   96.8%  
 	[  9,  12)     0    0.0%   96.8%  
-	[ 12,  16)    17    0.9%   97.6%  
+	[ 12,  16)    16    0.8%   97.6%  
 	[ 16,  21)     0    0.0%   97.6%  
-	[ 21,  28)    17    0.9%   98.5%  
-	[ 28,  37)    27    1.4%   99.8%  
-	[ 37,  48)     4    0.2%  100.0%  
-	[ 48,  63)     0    0.0%  100.0%  
-	[ 63,  82)     0    0.0%  100.0%  
-	[ 82, 106)     0    0.0%  100.0%  
-	[106, 138)     0    0.0%  100.0%  
-	[138, 178)     0    0.0%  100.0%  
-	[178, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk___100B-2	    3000	   2793961 ns/op	   0.72 MB/s
+	[ 21,  27)    16    0.8%   98.4%  
+	[ 27,  35)     0    0.0%   98.4%  
+	[ 35,  45)    32    1.6%  100.0%  
+	[ 45,  58)     0    0.0%  100.0%  
+	[ 58,  75)     0    0.0%  100.0%  
+	[ 75,  97)     0    0.0%  100.0%  
+	[ 97, 125)     0    0.0%  100.0%  
+	[125, 161)     0    0.0%  100.0%  
+	[161, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk___100B-2	    3000	   2917670 ns/op	   0.69 MB/s
 --- Histogram (unit: ms)
-	Count: 3000  Min: 2  Max: 21  Avg: 2.41
+	Count: 3000  Min: 2  Max: 23  Avg: 2.47
 	------------------------------------------------------------
-	[  2,   3)  2717   90.6%   90.6%  #########
-	[  3,   4)   211    7.0%   97.6%  #
-	[  4,   5)     0    0.0%   97.6%  
+	[  2,   3)  2687   89.6%   89.6%  #########
+	[  3,   4)   227    7.6%   97.1%  #
+	[  4,   5)    14    0.5%   97.6%  
 	[  5,   6)     0    0.0%   97.6%  
 	[  6,   8)     0    0.0%   97.6%  
 	[  8,  10)     0    0.0%   97.6%  
 	[ 10,  13)     0    0.0%   97.6%  
-	[ 13,  16)    48    1.6%   99.2%  
-	[ 16,  20)    11    0.4%   99.6%  
-	[ 20,  25)    13    0.4%  100.0%  
-	[ 25,  32)     0    0.0%  100.0%  
-	[ 32,  40)     0    0.0%  100.0%  
-	[ 40,  50)     0    0.0%  100.0%  
-	[ 50,  62)     0    0.0%  100.0%  
-	[ 62,  77)     0    0.0%  100.0%  
-	[ 77,  95)     0    0.0%  100.0%  
-	[ 95, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk____1KB	    2000	   4349817 ns/op	   4.60 MB/s
+	[ 13,  17)    30    1.0%   98.6%  
+	[ 17,  22)    37    1.2%   99.8%  
+	[ 22,  28)     5    0.2%  100.0%  
+	[ 28,  35)     0    0.0%  100.0%  
+	[ 35,  44)     0    0.0%  100.0%  
+	[ 44,  55)     0    0.0%  100.0%  
+	[ 55,  68)     0    0.0%  100.0%  
+	[ 68,  85)     0    0.0%  100.0%  
+	[ 85, 105)     0    0.0%  100.0%  
+	[105, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk____1KB	    2000	   4485605 ns/op	   4.46 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 3  Max: 48  Avg: 4.07
+	Count: 2000  Min: 3  Max: 53  Avg: 4.14
 	------------------------------------------------------------
-	[  3,   4)  1907   95.4%   95.4%  ##########
-	[  4,   5)    11    0.6%   95.9%  
-	[  5,   6)    12    0.6%   96.5%  
-	[  6,   8)     0    0.0%   96.5%  
+	[  3,   4)  1903   95.2%   95.2%  ##########
+	[  4,   5)     3    0.2%   95.3%  
+	[  5,   6)    11    0.6%   95.9%  
+	[  6,   8)    12    0.6%   96.5%  
 	[  8,  10)     0    0.0%   96.5%  
 	[ 10,  13)     0    0.0%   96.5%  
 	[ 13,  17)     0    0.0%   96.5%  
-	[ 17,  22)    21    1.1%   97.6%  
-	[ 22,  29)     0    0.0%   97.6%  
-	[ 29,  38)    21    1.1%   98.6%  
-	[ 38,  50)    28    1.4%  100.0%  
-	[ 50,  66)     0    0.0%  100.0%  
-	[ 66,  87)     0    0.0%  100.0%  
-	[ 87, 114)     0    0.0%  100.0%  
-	[114, 148)     0    0.0%  100.0%  
-	[148, 192)     0    0.0%  100.0%  
-	[192, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk____1KB-2	    2000	   3167146 ns/op	   6.31 MB/s
+	[ 17,  23)    22    1.1%   97.6%  
+	[ 23,  31)     0    0.0%   97.6%  
+	[ 31,  41)    22    1.1%   98.7%  
+	[ 41,  54)    27    1.4%  100.0%  
+	[ 54,  71)     0    0.0%  100.0%  
+	[ 71,  93)     0    0.0%  100.0%  
+	[ 93, 122)     0    0.0%  100.0%  
+	[122, 160)     0    0.0%  100.0%  
+	[160, 210)     0    0.0%  100.0%  
+	[210, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk____1KB-2	    2000	   3174383 ns/op	   6.30 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 2  Max: 22  Avg: 2.53
+	Count: 2000  Min: 2  Max: 24  Avg: 2.56
 	------------------------------------------------------------
-	[  2,   3)  1734   86.7%   86.7%  #########
-	[  3,   4)   210   10.5%   97.2%  #
-	[  4,   5)     7    0.4%   97.6%  
+	[  2,   3)  1733   86.7%   86.7%  #########
+	[  3,   4)   198    9.9%   96.6%  #
+	[  4,   5)    20    1.0%   97.6%  
 	[  5,   6)     0    0.0%   97.6%  
 	[  6,   8)     0    0.0%   97.6%  
 	[  8,  10)     0    0.0%   97.6%  
 	[ 10,  13)     0    0.0%   97.6%  
-	[ 13,  17)    13    0.7%   98.2%  
-	[ 17,  21)    17    0.9%   99.1%  
-	[ 21,  27)    19    1.0%  100.0%  
-	[ 27,  34)     0    0.0%  100.0%  
-	[ 34,  42)     0    0.0%  100.0%  
-	[ 42,  52)     0    0.0%  100.0%  
-	[ 52,  65)     0    0.0%  100.0%  
-	[ 65,  81)     0    0.0%  100.0%  
-	[ 81, 100)     0    0.0%  100.0%  
-	[100, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk___10KB	    1000	   6486765 ns/op	  30.83 MB/s
---- Histogram (unit: ms)
-	Count: 1000  Min: 4  Max: 50  Avg: 5.74
-	------------------------------------------------------------
-	[  4,   5)   821   82.1%   82.1%  ########
-	[  5,   6)   128   12.8%   94.9%  #
-	[  6,   7)     3    0.3%   95.2%  
-	[  7,   9)     1    0.1%   95.3%  
-	[  9,  11)     0    0.0%   95.3%  
-	[ 11,  14)     0    0.0%   95.3%  
-	[ 14,  18)     8    0.8%   96.1%  
-	[ 18,  23)     0    0.0%   96.1%  
-	[ 23,  30)     3    0.3%   96.4%  
-	[ 30,  39)     5    0.5%   96.9%  
-	[ 39,  51)    31    3.1%  100.0%  
-	[ 51,  67)     0    0.0%  100.0%  
-	[ 67,  88)     0    0.0%  100.0%  
-	[ 88, 115)     0    0.0%  100.0%  
-	[115, 150)     0    0.0%  100.0%  
-	[150, 195)     0    0.0%  100.0%  
-	[195, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk___10KB-2	    2000	   4310677 ns/op	  46.40 MB/s
---- Histogram (unit: ms)
-	Count: 2000  Min: 2  Max: 24  Avg: 3.84
-	------------------------------------------------------------
-	[  2,   3)     3    0.2%    0.2%  
-	[  3,   4)  1762   88.1%   88.2%  #########
-	[  4,   5)    33    1.7%   89.9%  
-	[  5,   6)   124    6.2%   96.1%  #
-	[  6,   8)     0    0.0%   96.1%  
-	[  8,  10)     0    0.0%   96.1%  
-	[ 10,  13)     0    0.0%   96.1%  
-	[ 13,  17)     0    0.0%   96.1%  
-	[ 17,  22)    33    1.7%   97.8%  
-	[ 22,  28)    45    2.2%  100.0%  
+	[ 13,  17)     1    0.1%   97.6%  
+	[ 17,  22)    27    1.4%   99.0%  
+	[ 22,  28)    21    1.1%  100.0%  
 	[ 28,  35)     0    0.0%  100.0%  
 	[ 35,  44)     0    0.0%  100.0%  
 	[ 44,  55)     0    0.0%  100.0%  
@@ -587,564 +525,633 @@
 	[ 69,  86)     0    0.0%  100.0%  
 	[ 86, 107)     0    0.0%  100.0%  
 	[107, inf)     0    0.0%  100.0%  
-Benchmark___10_chunk__100KB	     300	  29183306 ns/op	  68.53 MB/s
+Benchmark___10_chunk___10KB	    1000	   6269496 ns/op	  31.90 MB/s
 --- Histogram (unit: ms)
-	Count: 300  Min: 21  Max: 71  Avg: 28.66
+	Count: 1000  Min: 4  Max: 46  Avg: 5.53
 	------------------------------------------------------------
-	[ 21,  22)  186   62.0%   62.0%  ######
-	[ 22,  23)   31   10.3%   72.3%  #
-	[ 23,  24)    5    1.7%   74.0%  
-	[ 24,  26)    1    0.3%   74.3%  
-	[ 26,  28)    0    0.0%   74.3%  
-	[ 28,  31)   23    7.7%   82.0%  #
-	[ 31,  35)    1    0.3%   82.3%  
-	[ 35,  41)    0    0.0%   82.3%  
-	[ 41,  49)    0    0.0%   82.3%  
-	[ 49,  59)   25    8.3%   90.7%  #
-	[ 59,  72)   28    9.3%  100.0%  #
-	[ 72,  89)    0    0.0%  100.0%  
-	[ 89, 111)    0    0.0%  100.0%  
-	[111, 140)    0    0.0%  100.0%  
-	[140, 178)    0    0.0%  100.0%  
-	[178, 228)    0    0.0%  100.0%  
-	[228, inf)    0    0.0%  100.0%  
-Benchmark___10_chunk__100KB-2	     500	  16030525 ns/op	 124.76 MB/s
+	[  4,   5)   884   88.4%   88.4%  #########
+	[  5,   6)    70    7.0%   95.4%  #
+	[  6,   7)     0    0.0%   95.4%  
+	[  7,   9)     0    0.0%   95.4%  
+	[  9,  11)     0    0.0%   95.4%  
+	[ 11,  14)     0    0.0%   95.4%  
+	[ 14,  18)     7    0.7%   96.1%  
+	[ 18,  23)     0    0.0%   96.1%  
+	[ 23,  30)     0    0.0%   96.1%  
+	[ 30,  39)     7    0.7%   96.8%  
+	[ 39,  51)    32    3.2%  100.0%  
+	[ 51,  66)     0    0.0%  100.0%  
+	[ 66,  85)     0    0.0%  100.0%  
+	[ 85, 110)     0    0.0%  100.0%  
+	[110, 142)     0    0.0%  100.0%  
+	[142, 184)     0    0.0%  100.0%  
+	[184, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk___10KB-2	    2000	   4354054 ns/op	  45.93 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 11  Max: 38  Avg: 15.56
+	Count: 2000  Min: 2  Max: 26  Avg: 3.88
 	------------------------------------------------------------
-	[ 11,  12)   88   17.6%   17.6%  ##
-	[ 12,  13)  295   59.0%   76.6%  ######
-	[ 13,  14)   14    2.8%   79.4%  
-	[ 14,  15)    1    0.2%   79.6%  
-	[ 15,  17)    6    1.2%   80.8%  
-	[ 17,  20)    9    1.8%   82.6%  
-	[ 20,  23)    0    0.0%   82.6%  
-	[ 23,  27)    0    0.0%   82.6%  
-	[ 27,  32)   37    7.4%   90.0%  #
-	[ 32,  39)   50   10.0%  100.0%  #
-	[ 39,  48)    0    0.0%  100.0%  
-	[ 48,  59)    0    0.0%  100.0%  
-	[ 59,  72)    0    0.0%  100.0%  
-	[ 72,  89)    0    0.0%  100.0%  
-	[ 89, 110)    0    0.0%  100.0%  
-	[110, 137)    0    0.0%  100.0%  
-	[137, inf)    0    0.0%  100.0%  
+	[  2,   3)     3    0.2%    0.2%  
+	[  3,   4)  1758   87.9%   88.1%  #########
+	[  4,   5)    40    2.0%   90.1%  
+	[  5,   6)   120    6.0%   96.1%  #
+	[  6,   8)     1    0.1%   96.1%  
+	[  8,  10)     0    0.0%   96.1%  
+	[ 10,  13)     0    0.0%   96.1%  
+	[ 13,  17)     0    0.0%   96.1%  
+	[ 17,  22)    30    1.5%   97.6%  
+	[ 22,  28)    48    2.4%  100.0%  
+	[ 28,  36)     0    0.0%  100.0%  
+	[ 36,  46)     0    0.0%  100.0%  
+	[ 46,  58)     0    0.0%  100.0%  
+	[ 58,  73)     0    0.0%  100.0%  
+	[ 73,  92)     0    0.0%  100.0%  
+	[ 92, 116)     0    0.0%  100.0%  
+	[116, inf)     0    0.0%  100.0%  
+Benchmark___10_chunk__100KB	     300	  27690944 ns/op	  72.23 MB/s
+--- Histogram (unit: ms)
+	Count: 300  Min: 21  Max: 58  Avg: 27.25
+	------------------------------------------------------------
+	[ 21,  22)  209   69.7%   69.7%  #######
+	[ 22,  23)   15    5.0%   74.7%  #
+	[ 23,  24)    1    0.3%   75.0%  
+	[ 24,  26)    0    0.0%   75.0%  
+	[ 26,  28)    0    0.0%   75.0%  
+	[ 28,  31)   22    7.3%   82.3%  #
+	[ 31,  35)    0    0.0%   82.3%  
+	[ 35,  40)    0    0.0%   82.3%  
+	[ 40,  46)    0    0.0%   82.3%  
+	[ 46,  54)   23    7.7%   90.0%  #
+	[ 54,  65)   30   10.0%  100.0%  #
+	[ 65,  79)    0    0.0%  100.0%  
+	[ 79,  96)    0    0.0%  100.0%  
+	[ 96, 118)    0    0.0%  100.0%  
+	[118, 147)    0    0.0%  100.0%  
+	[147, 183)    0    0.0%  100.0%  
+	[183, inf)    0    0.0%  100.0%  
+Benchmark___10_chunk__100KB-2	     500	  15686136 ns/op	 127.50 MB/s
+--- Histogram (unit: ms)
+	Count: 500  Min: 11  Max: 37  Avg: 15.20
+	------------------------------------------------------------
+	[ 11,  12)  147   29.4%   29.4%  ###
+	[ 12,  13)  237   47.4%   76.8%  #####
+	[ 13,  14)   11    2.2%   79.0%  
+	[ 14,  15)    2    0.4%   79.4%  
+	[ 15,  17)   14    2.8%   82.2%  
+	[ 17,  19)    2    0.4%   82.6%  
+	[ 19,  22)    0    0.0%   82.6%  
+	[ 22,  26)    0    0.0%   82.6%  
+	[ 26,  31)   49    9.8%   92.4%  #
+	[ 31,  38)   38    7.6%  100.0%  #
+	[ 38,  46)    0    0.0%  100.0%  
+	[ 46,  56)    0    0.0%  100.0%  
+	[ 56,  69)    0    0.0%  100.0%  
+	[ 69,  85)    0    0.0%  100.0%  
+	[ 85, 105)    0    0.0%  100.0%  
+	[105, 130)    0    0.0%  100.0%  
+	[130, inf)    0    0.0%  100.0%  
 
-Benchmark__100_chunk_____1B	     500	  14799281 ns/op	   0.01 MB/s
+Benchmark__100_chunk_____1B	     500	  15105687 ns/op	   0.01 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 14  Max: 16  Avg: 14.23
+	Count: 500  Min: 14  Max: 16  Avg: 14.60
 	------------------------------------------------------------
-	[ 14,  15)  386   77.2%   77.2%  ########
-	[ 15,  16)  113   22.6%   99.8%  ##
-	[ 16, inf)    1    0.2%  100.0%  
-Benchmark__100_chunk_____1B-2	    1000	  10135511 ns/op	   0.02 MB/s
+	[ 14,  15)  222   44.4%   44.4%  ####
+	[ 15,  16)  258   51.6%   96.0%  #####
+	[ 16, inf)   20    4.0%  100.0%  
+Benchmark__100_chunk_____1B-2	    1000	  10873485 ns/op	   0.02 MB/s
 --- Histogram (unit: ms)
-	Count: 1000  Min: 8  Max: 11  Avg: 9.63
+	Count: 1000  Min: 8  Max: 13  Avg: 10.38
 	------------------------------------------------------------
-	[  8,   9)    11    1.1%    1.1%  
-	[  9,  10)   432   43.2%   44.3%  ####
-	[ 10,  11)   477   47.7%   92.0%  #####
-	[ 11, inf)    80    8.0%  100.0%  #
-Benchmark__100_chunk____10B	     500	  15137229 ns/op	   0.13 MB/s
+	[  8,   9)     5    0.5%    0.5%  
+	[  9,  10)   119   11.9%   12.4%  #
+	[ 10,  11)   465   46.5%   58.9%  #####
+	[ 11,  12)   316   31.6%   90.5%  ###
+	[ 12,  13)    93    9.3%   99.8%  #
+	[ 13, inf)     2    0.2%  100.0%  
+Benchmark__100_chunk____10B	     500	  15092213 ns/op	   0.13 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 14  Max: 18  Avg: 14.73
+	Count: 500  Min: 13  Max: 17  Avg: 14.67
 	------------------------------------------------------------
-	[ 14,  15)  148   29.6%   29.6%  ###
-	[ 15,  16)  339   67.8%   97.4%  #######
-	[ 16,  17)   12    2.4%   99.8%  
-	[ 17,  18)    0    0.0%   99.8%  
-	[ 18, inf)    1    0.2%  100.0%  
-Benchmark__100_chunk____10B-2	    1000	  10731944 ns/op	   0.19 MB/s
---- Histogram (unit: ms)
-	Count: 1000  Min: 8  Max: 12  Avg: 10.26
-	------------------------------------------------------------
-	[  8,   9)    12    1.2%    1.2%  
-	[  9,  10)   159   15.9%   17.1%  ##
-	[ 10,  11)   421   42.1%   59.2%  ####
-	[ 11,  12)   375   37.5%   96.7%  ####
-	[ 12, inf)    33    3.3%  100.0%  
-Benchmark__100_chunk___100B	     500	  15355974 ns/op	   1.30 MB/s
---- Histogram (unit: ms)
-	Count: 500  Min: 14  Max: 17  Avg: 14.83
-	------------------------------------------------------------
-	[ 14,  15)  128   25.6%   25.6%  ###
-	[ 15,  16)  330   66.0%   91.6%  #######
-	[ 16,  17)   41    8.2%   99.8%  #
+	[ 13,  14)    1    0.2%    0.2%  
+	[ 14,  15)  174   34.8%   35.0%  ###
+	[ 15,  16)  317   63.4%   98.4%  ######
+	[ 16,  17)    7    1.4%   99.8%  
 	[ 17, inf)    1    0.2%  100.0%  
-Benchmark__100_chunk___100B-2	    1000	  10757797 ns/op	   1.86 MB/s
+Benchmark__100_chunk____10B-2	    1000	  10896191 ns/op	   0.18 MB/s
 --- Histogram (unit: ms)
-	Count: 1000  Min: 8  Max: 13  Avg: 10.25
+	Count: 1000  Min: 8  Max: 13  Avg: 10.39
 	------------------------------------------------------------
-	[  8,   9)    32    3.2%    3.2%  
-	[  9,  10)   217   21.7%   24.9%  ##
-	[ 10,  11)   363   36.3%   61.2%  ####
-	[ 11,  12)   253   25.3%   86.5%  ###
-	[ 12,  13)   127   12.7%   99.2%  #
-	[ 13, inf)     8    0.8%  100.0%  
-Benchmark__100_chunk____1KB	     500	  17505005 ns/op	  11.43 MB/s
+	[  8,   9)    10    1.0%    1.0%  
+	[  9,  10)   113   11.3%   12.3%  #
+	[ 10,  11)   387   38.7%   51.0%  ####
+	[ 11,  12)   458   45.8%   96.8%  #####
+	[ 12,  13)    31    3.1%   99.9%  
+	[ 13, inf)     1    0.1%  100.0%  
+Benchmark__100_chunk___100B	     500	  15641654 ns/op	   1.28 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 15  Max: 19  Avg: 17.03
+	Count: 500  Min: 13  Max: 17  Avg: 15.17
 	------------------------------------------------------------
-	[ 15,  16)   51   10.2%   10.2%  #
-	[ 16,  17)  112   22.4%   32.6%  ##
-	[ 17,  18)  115   23.0%   55.6%  ##
-	[ 18,  19)  216   43.2%   98.8%  ####
-	[ 19, inf)    6    1.2%  100.0%  
-Benchmark__100_chunk____1KB-2	    1000	  11660590 ns/op	  17.15 MB/s
+	[ 13,  14)    1    0.2%    0.2%  
+	[ 14,  15)  106   21.2%   21.4%  ##
+	[ 15,  16)  208   41.6%   63.0%  ####
+	[ 16,  17)  177   35.4%   98.4%  ####
+	[ 17, inf)    8    1.6%  100.0%  
+Benchmark__100_chunk___100B-2	    1000	  11037083 ns/op	   1.81 MB/s
 --- Histogram (unit: ms)
-	Count: 1000  Min: 8  Max: 14  Avg: 11.15
+	Count: 1000  Min: 8  Max: 13  Avg: 10.53
 	------------------------------------------------------------
-	[  8,   9)    11    1.1%    1.1%  
-	[  9,  10)   158   15.8%   16.9%  ##
-	[ 10,  11)   183   18.3%   35.2%  ##
-	[ 11,  12)   270   27.0%   62.2%  ###
-	[ 12,  13)   123   12.3%   74.5%  #
-	[ 13,  14)   206   20.6%   95.1%  ##
-	[ 14, inf)    49    4.9%  100.0%  
-Benchmark__100_chunk___10KB	     200	  37914384 ns/op	  52.75 MB/s
+	[  8,   9)    21    2.1%    2.1%  
+	[  9,  10)   175   17.5%   19.6%  ##
+	[ 10,  11)   285   28.5%   48.1%  ###
+	[ 11,  12)   298   29.8%   77.9%  ###
+	[ 12,  13)   211   21.1%   99.0%  ##
+	[ 13, inf)    10    1.0%  100.0%  
+Benchmark__100_chunk____1KB	     500	  17686556 ns/op	  11.31 MB/s
 --- Histogram (unit: ms)
-	Count: 200  Min: 35  Max: 42  Avg: 37.35
+	Count: 500  Min: 15  Max: 21  Avg: 17.16
 	------------------------------------------------------------
-	[ 35,  36)    9    4.5%    4.5%  
-	[ 36,  37)    4    2.0%    6.5%  
-	[ 37,  38)  120   60.0%   66.5%  ######
-	[ 38,  39)   52   26.0%   92.5%  ###
-	[ 39,  40)    8    4.0%   96.5%  
-	[ 40,  41)    5    2.5%   99.0%  
-	[ 41,  43)    2    1.0%  100.0%  
-	[ 43, inf)    0    0.0%  100.0%  
-Benchmark__100_chunk___10KB-2	     300	  20888999 ns/op	  95.74 MB/s
+	[ 15,  16)   30    6.0%    6.0%  #
+	[ 16,  17)  125   25.0%   31.0%  ###
+	[ 17,  18)  122   24.4%   55.4%  ##
+	[ 18,  19)  191   38.2%   93.6%  ####
+	[ 19,  20)   26    5.2%   98.8%  #
+	[ 20,  21)    4    0.8%   99.6%  
+	[ 21, inf)    2    0.4%  100.0%  
+Benchmark__100_chunk____1KB-2	    1000	  11974933 ns/op	  16.70 MB/s
 --- Histogram (unit: ms)
-	Count: 300  Min: 18  Max: 23  Avg: 20.38
+	Count: 1000  Min: 8  Max: 16  Avg: 11.48
 	------------------------------------------------------------
-	[ 18,  19)   15    5.0%    5.0%  #
-	[ 19,  20)   11    3.7%    8.7%  
-	[ 20,  21)  135   45.0%   53.7%  #####
-	[ 21,  22)  125   41.7%   95.3%  ####
-	[ 22,  23)   13    4.3%   99.7%  
-	[ 23, inf)    1    0.3%  100.0%  
-Benchmark__100_chunk__100KB	      30	 215706680 ns/op	  92.72 MB/s
+	[  8,   9)     6    0.6%    0.6%  
+	[  9,  10)    87    8.7%    9.3%  #
+	[ 10,  11)   202   20.2%   29.5%  ##
+	[ 11,  12)   246   24.6%   54.1%  ##
+	[ 12,  13)   125   12.5%   66.6%  #
+	[ 13,  15)   332   33.2%   99.8%  ###
+	[ 15,  17)     2    0.2%  100.0%  
+	[ 17,  19)     0    0.0%  100.0%  
+	[ 19, inf)     0    0.0%  100.0%  
+Benchmark__100_chunk___10KB	     200	  38603079 ns/op	  51.81 MB/s
 --- Histogram (unit: ms)
-	Count: 30  Min: 210  Max: 220  Avg: 215.20
+	Count: 200  Min: 35  Max: 41  Avg: 38.10
 	------------------------------------------------------------
-	[210, 211)   1    3.3%    3.3%  
-	[211, 212)   2    6.7%   10.0%  #
-	[212, 213)   0    0.0%   10.0%  
-	[213, 214)   9   30.0%   40.0%  ###
-	[214, 215)   4   13.3%   53.3%  #
-	[215, 217)   4   13.3%   66.7%  #
-	[217, 219)   1    3.3%   70.0%  
-	[219, 221)   9   30.0%  100.0%  ###
-	[221, 224)   0    0.0%  100.0%  
-	[224, 227)   0    0.0%  100.0%  
-	[227, inf)   0    0.0%  100.0%  
-Benchmark__100_chunk__100KB-2	     100	 113221561 ns/op	 176.64 MB/s
+	[ 35,  36)    5    2.5%    2.5%  
+	[ 36,  37)    4    2.0%    4.5%  
+	[ 37,  38)   21   10.5%   15.0%  #
+	[ 38,  39)  123   61.5%   76.5%  ######
+	[ 39,  40)   31   15.5%   92.0%  ##
+	[ 40,  41)   15    7.5%   99.5%  #
+	[ 41, inf)    1    0.5%  100.0%  
+Benchmark__100_chunk___10KB-2	     300	  21864340 ns/op	  91.47 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 108  Max: 120  Avg: 112.75
+	Count: 300  Min: 18  Max: 24  Avg: 21.35
 	------------------------------------------------------------
-	[108, 109)    2    2.0%    2.0%  
-	[109, 110)    7    7.0%    9.0%  #
-	[110, 111)    3    3.0%   12.0%  
-	[111, 112)   16   16.0%   28.0%  ##
-	[112, 113)   20   20.0%   48.0%  ##
-	[113, 115)   29   29.0%   77.0%  ###
-	[115, 117)   20   20.0%   97.0%  ##
-	[117, 120)    2    2.0%   99.0%  
-	[120, 123)    1    1.0%  100.0%  
-	[123, 127)    0    0.0%  100.0%  
-	[127, 132)    0    0.0%  100.0%  
-	[132, 138)    0    0.0%  100.0%  
-	[138, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunk_____1B	      50	 127031961 ns/op	   0.02 MB/s
+	[ 18,  19)    6    2.0%    2.0%  
+	[ 19,  20)   12    4.0%    6.0%  
+	[ 20,  21)   36   12.0%   18.0%  #
+	[ 21,  22)   94   31.3%   49.3%  ###
+	[ 22,  23)  124   41.3%   90.7%  ####
+	[ 23,  24)   24    8.0%   98.7%  #
+	[ 24, inf)    4    1.3%  100.0%  
+Benchmark__100_chunk__100KB	      30	 218748547 ns/op	  91.43 MB/s
 --- Histogram (unit: ms)
-	Count: 50  Min: 123  Max: 131  Avg: 126.56
+	Count: 30  Min: 214  Max: 225  Avg: 218.23
+	------------------------------------------------------------
+	[214, 215)   4   13.3%   13.3%  #
+	[215, 216)   4   13.3%   26.7%  #
+	[216, 217)   3   10.0%   36.7%  #
+	[217, 218)   3   10.0%   46.7%  #
+	[218, 219)   3   10.0%   56.7%  #
+	[219, 221)   5   16.7%   73.3%  ##
+	[221, 223)   4   13.3%   86.7%  #
+	[223, 226)   4   13.3%  100.0%  #
+	[226, 229)   0    0.0%  100.0%  
+	[229, 233)   0    0.0%  100.0%  
+	[233, 237)   0    0.0%  100.0%  
+	[237, inf)   0    0.0%  100.0%  
+Benchmark__100_chunk__100KB-2	      50	 113819574 ns/op	 175.72 MB/s
+--- Histogram (unit: ms)
+	Count: 50  Min: 108  Max: 118  Avg: 113.30
+	------------------------------------------------------------
+	[108, 109)   1    2.0%    2.0%  
+	[109, 110)   2    4.0%    6.0%  
+	[110, 111)   1    2.0%    8.0%  
+	[111, 112)   9   18.0%   26.0%  ##
+	[112, 113)   8   16.0%   42.0%  ##
+	[113, 115)  10   20.0%   62.0%  ##
+	[115, 117)  16   32.0%   94.0%  ###
+	[117, 119)   3    6.0%  100.0%  #
+	[119, 122)   0    0.0%  100.0%  
+	[122, 125)   0    0.0%  100.0%  
+	[125, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunk_____1B	      50	 129084503 ns/op	   0.02 MB/s
+--- Histogram (unit: ms)
+	Count: 50  Min: 123  Max: 135  Avg: 128.56
 	------------------------------------------------------------
 	[123, 124)   1    2.0%    2.0%  
-	[124, 125)   1    2.0%    4.0%  
-	[125, 126)  11   22.0%   26.0%  ##
-	[126, 127)  19   38.0%   64.0%  ####
-	[127, 128)   6   12.0%   76.0%  #
-	[128, 130)   8   16.0%   92.0%  ##
-	[130, 132)   4    8.0%  100.0%  #
-	[132, 134)   0    0.0%  100.0%  
-	[134, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunk_____1B-2	     100	  82251965 ns/op	   0.02 MB/s
+	[124, 125)   0    0.0%    2.0%  
+	[125, 126)   1    2.0%    4.0%  
+	[126, 127)   0    0.0%    4.0%  
+	[127, 128)   9   18.0%   22.0%  ##
+	[128, 130)  29   58.0%   80.0%  ######
+	[130, 132)   6   12.0%   92.0%  #
+	[132, 135)   3    6.0%   98.0%  #
+	[135, 138)   1    2.0%  100.0%  
+	[138, 142)   0    0.0%  100.0%  
+	[142, 147)   0    0.0%  100.0%  
+	[147, 153)   0    0.0%  100.0%  
+	[153, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunk_____1B-2	     100	  85455855 ns/op	   0.02 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 75  Max: 93  Avg: 81.77
+	Count: 100  Min: 78  Max: 99  Avg: 84.98
 	------------------------------------------------------------
-	[ 75,  76)    3    3.0%    3.0%  
-	[ 76,  77)   10   10.0%   13.0%  #
-	[ 77,  78)    6    6.0%   19.0%  #
-	[ 78,  79)    5    5.0%   24.0%  #
-	[ 79,  81)   17   17.0%   41.0%  ##
-	[ 81,  83)   17   17.0%   58.0%  ##
-	[ 83,  86)   27   27.0%   85.0%  ###
-	[ 86,  89)    6    6.0%   91.0%  #
-	[ 89,  93)    8    8.0%   99.0%  #
-	[ 93,  98)    1    1.0%  100.0%  
-	[ 98, 104)    0    0.0%  100.0%  
-	[104, 112)    0    0.0%  100.0%  
-	[112, 122)    0    0.0%  100.0%  
-	[122, 134)    0    0.0%  100.0%  
-	[134, 148)    0    0.0%  100.0%  
-	[148, 165)    0    0.0%  100.0%  
-	[165, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunk____10B	      50	 126841430 ns/op	   0.16 MB/s
+	[ 78,  79)    5    5.0%    5.0%  #
+	[ 79,  80)    3    3.0%    8.0%  
+	[ 80,  81)    8    8.0%   16.0%  #
+	[ 81,  82)   10   10.0%   26.0%  #
+	[ 82,  84)   12   12.0%   38.0%  #
+	[ 84,  86)   19   19.0%   57.0%  ##
+	[ 86,  89)   19   19.0%   76.0%  ##
+	[ 89,  93)   21   21.0%   97.0%  ##
+	[ 93,  98)    1    1.0%   98.0%  
+	[ 98, 104)    2    2.0%  100.0%  
+	[104, 111)    0    0.0%  100.0%  
+	[111, 120)    0    0.0%  100.0%  
+	[120, 131)    0    0.0%  100.0%  
+	[131, 144)    0    0.0%  100.0%  
+	[144, 161)    0    0.0%  100.0%  
+	[161, 181)    0    0.0%  100.0%  
+	[181, inf)    0    0.0%  100.0%  
+Benchmark___1K_chunk____10B	      50	 132496755 ns/op	   0.15 MB/s
 --- Histogram (unit: ms)
-	Count: 50  Min: 121  Max: 130  Avg: 126.34
+	Count: 50  Min: 126  Max: 141  Avg: 131.96
 	------------------------------------------------------------
-	[121, 122)   1    2.0%    2.0%  
-	[122, 123)   0    0.0%    2.0%  
-	[123, 124)   1    2.0%    4.0%  
-	[124, 125)   0    0.0%    4.0%  
-	[125, 126)   7   14.0%   18.0%  #
-	[126, 128)  31   62.0%   80.0%  ######
-	[128, 130)   9   18.0%   98.0%  ##
-	[130, 132)   1    2.0%  100.0%  
-	[132, 135)   0    0.0%  100.0%  
-	[135, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunk____10B-2	     100	  80662645 ns/op	   0.25 MB/s
---- Histogram (unit: ms)
-	Count: 100  Min: 73  Max: 93  Avg: 80.11
-	------------------------------------------------------------
-	[ 73,  74)    2    2.0%    2.0%  
-	[ 74,  75)    3    3.0%    5.0%  
-	[ 75,  76)   10   10.0%   15.0%  #
-	[ 76,  77)   12   12.0%   27.0%  #
-	[ 77,  79)   19   19.0%   46.0%  ##
-	[ 79,  81)   13   13.0%   59.0%  #
-	[ 81,  84)   20   20.0%   79.0%  ##
-	[ 84,  88)   12   12.0%   91.0%  #
-	[ 88,  92)    6    6.0%   97.0%  #
-	[ 92,  98)    3    3.0%  100.0%  
-	[ 98, 105)    0    0.0%  100.0%  
-	[105, 113)    0    0.0%  100.0%  
-	[113, 123)    0    0.0%  100.0%  
-	[123, 136)    0    0.0%  100.0%  
-	[136, 152)    0    0.0%  100.0%  
-	[152, 171)    0    0.0%  100.0%  
-	[171, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunk___100B	      50	 130500666 ns/op	   1.53 MB/s
---- Histogram (unit: ms)
-	Count: 50  Min: 125  Max: 141  Avg: 129.98
-	------------------------------------------------------------
-	[125, 126)   1    2.0%    2.0%  
-	[126, 127)   1    2.0%    4.0%  
-	[127, 128)   1    2.0%    6.0%  
-	[128, 129)   6   12.0%   18.0%  #
-	[129, 131)  27   54.0%   72.0%  #####
-	[131, 133)   8   16.0%   88.0%  ##
-	[133, 136)   4    8.0%   96.0%  #
-	[136, 139)   1    2.0%   98.0%  
-	[139, 143)   1    2.0%  100.0%  
+	[126, 127)   1    2.0%    2.0%  
+	[127, 128)   0    0.0%    2.0%  
+	[128, 129)   1    2.0%    4.0%  
+	[129, 130)   3    6.0%   10.0%  #
+	[130, 132)  21   42.0%   52.0%  ####
+	[132, 134)  13   26.0%   78.0%  ###
+	[134, 136)   5   10.0%   88.0%  #
+	[136, 139)   3    6.0%   94.0%  #
+	[139, 143)   3    6.0%  100.0%  #
 	[143, 148)   0    0.0%  100.0%  
 	[148, 154)   0    0.0%  100.0%  
 	[154, 161)   0    0.0%  100.0%  
-	[161, 170)   0    0.0%  100.0%  
-	[170, 181)   0    0.0%  100.0%  
-	[181, 194)   0    0.0%  100.0%  
-	[194, 210)   0    0.0%  100.0%  
-	[210, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunk___100B-2	     100	  82993437 ns/op	   2.41 MB/s
+	[161, 169)   0    0.0%  100.0%  
+	[169, 179)   0    0.0%  100.0%  
+	[179, 191)   0    0.0%  100.0%  
+	[191, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunk____10B-2	     100	  84457521 ns/op	   0.24 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 72  Max: 93  Avg: 82.49
+	Count: 100  Min: 76  Max: 99  Avg: 83.95
 	------------------------------------------------------------
-	[ 72,  73)    1    1.0%    1.0%  
-	[ 73,  74)    0    0.0%    1.0%  
-	[ 74,  75)    0    0.0%    1.0%  
-	[ 75,  76)    1    1.0%    2.0%  
-	[ 76,  78)   10   10.0%   12.0%  #
-	[ 78,  80)   14   14.0%   26.0%  #
-	[ 80,  83)   15   15.0%   41.0%  ##
-	[ 83,  87)   48   48.0%   89.0%  #####
-	[ 87,  92)    7    7.0%   96.0%  #
-	[ 92,  98)    4    4.0%  100.0%  
-	[ 98, 105)    0    0.0%  100.0%  
-	[105, 114)    0    0.0%  100.0%  
-	[114, 125)    0    0.0%  100.0%  
-	[125, 138)    0    0.0%  100.0%  
-	[138, 155)    0    0.0%  100.0%  
-	[155, 175)    0    0.0%  100.0%  
-	[175, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunk____1KB	      50	 152120390 ns/op	  13.15 MB/s
+	[ 76,  77)    1    1.0%    1.0%  
+	[ 77,  78)    3    3.0%    4.0%  
+	[ 78,  79)    6    6.0%   10.0%  #
+	[ 79,  80)    6    6.0%   16.0%  #
+	[ 80,  82)   11   11.0%   27.0%  #
+	[ 82,  84)   23   23.0%   50.0%  ##
+	[ 84,  87)   28   28.0%   78.0%  ###
+	[ 87,  91)   13   13.0%   91.0%  #
+	[ 91,  96)    8    8.0%   99.0%  #
+	[ 96, 102)    1    1.0%  100.0%  
+	[102, 110)    0    0.0%  100.0%  
+	[110, 119)    0    0.0%  100.0%  
+	[119, 131)    0    0.0%  100.0%  
+	[131, 146)    0    0.0%  100.0%  
+	[146, 164)    0    0.0%  100.0%  
+	[164, 186)    0    0.0%  100.0%  
+	[186, inf)    0    0.0%  100.0%  
+Benchmark___1K_chunk___100B	      50	 134022599 ns/op	   1.49 MB/s
 --- Histogram (unit: ms)
-	Count: 50  Min: 145  Max: 161  Avg: 151.72
+	Count: 50  Min: 127  Max: 138  Avg: 133.44
 	------------------------------------------------------------
-	[145, 146)   1    2.0%    2.0%  
-	[146, 147)   1    2.0%    4.0%  
-	[147, 148)   1    2.0%    6.0%  
-	[148, 149)   2    4.0%   10.0%  
-	[149, 151)  17   34.0%   44.0%  ###
-	[151, 153)   8   16.0%   60.0%  ##
-	[153, 156)  16   32.0%   92.0%  ###
-	[156, 159)   2    4.0%   96.0%  
-	[159, 163)   2    4.0%  100.0%  
-	[163, 168)   0    0.0%  100.0%  
-	[168, 174)   0    0.0%  100.0%  
-	[174, 181)   0    0.0%  100.0%  
-	[181, 190)   0    0.0%  100.0%  
-	[190, 201)   0    0.0%  100.0%  
-	[201, 214)   0    0.0%  100.0%  
-	[214, 230)   0    0.0%  100.0%  
-	[230, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunk____1KB-2	     100	  91860277 ns/op	  21.77 MB/s
+	[127, 128)   1    2.0%    2.0%  
+	[128, 129)   0    0.0%    2.0%  
+	[129, 130)   0    0.0%    2.0%  
+	[130, 131)   1    2.0%    4.0%  
+	[131, 132)   3    6.0%   10.0%  #
+	[132, 134)  27   54.0%   64.0%  #####
+	[134, 136)  11   22.0%   86.0%  ##
+	[136, 139)   7   14.0%  100.0%  #
+	[139, 142)   0    0.0%  100.0%  
+	[142, 146)   0    0.0%  100.0%  
+	[146, 150)   0    0.0%  100.0%  
+	[150, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunk___100B-2	     100	  85330166 ns/op	   2.34 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 80  Max: 106  Avg: 91.33
+	Count: 100  Min: 76  Max: 96  Avg: 84.86
 	------------------------------------------------------------
-	[ 80,  81)    2    2.0%    2.0%  
-	[ 81,  82)    2    2.0%    4.0%  
-	[ 82,  83)    3    3.0%    7.0%  
-	[ 83,  84)    4    4.0%   11.0%  
-	[ 84,  86)   10   10.0%   21.0%  #
-	[ 86,  88)   11   11.0%   32.0%  #
-	[ 88,  91)   14   14.0%   46.0%  #
-	[ 91,  95)   19   19.0%   65.0%  ##
-	[ 95, 100)   26   26.0%   91.0%  ###
-	[100, 107)    9    9.0%  100.0%  #
+	[ 76,  77)    1    1.0%    1.0%  
+	[ 77,  78)    2    2.0%    3.0%  
+	[ 78,  79)    9    9.0%   12.0%  #
+	[ 79,  80)    5    5.0%   17.0%  #
+	[ 80,  82)    8    8.0%   25.0%  #
+	[ 82,  84)   10   10.0%   35.0%  #
+	[ 84,  87)   29   29.0%   64.0%  ###
+	[ 87,  91)   25   25.0%   89.0%  ###
+	[ 91,  95)    9    9.0%   98.0%  #
+	[ 95, 101)    2    2.0%  100.0%  
+	[101, 108)    0    0.0%  100.0%  
+	[108, 116)    0    0.0%  100.0%  
+	[116, 126)    0    0.0%  100.0%  
+	[126, 139)    0    0.0%  100.0%  
+	[139, 155)    0    0.0%  100.0%  
+	[155, 174)    0    0.0%  100.0%  
+	[174, inf)    0    0.0%  100.0%  
+Benchmark___1K_chunk____1KB	      50	 155794224 ns/op	  12.84 MB/s
+--- Histogram (unit: ms)
+	Count: 50  Min: 148  Max: 164  Avg: 155.34
+	------------------------------------------------------------
+	[148, 149)   1    2.0%    2.0%  
+	[149, 150)   0    0.0%    2.0%  
+	[150, 151)   0    0.0%    2.0%  
+	[151, 152)   3    6.0%    8.0%  #
+	[152, 154)   4    8.0%   16.0%  #
+	[154, 156)  20   40.0%   56.0%  ####
+	[156, 159)  17   34.0%   90.0%  ###
+	[159, 162)   3    6.0%   96.0%  #
+	[162, 166)   2    4.0%  100.0%  
+	[166, 171)   0    0.0%  100.0%  
+	[171, 177)   0    0.0%  100.0%  
+	[177, 184)   0    0.0%  100.0%  
+	[184, 193)   0    0.0%  100.0%  
+	[193, 204)   0    0.0%  100.0%  
+	[204, 217)   0    0.0%  100.0%  
+	[217, 233)   0    0.0%  100.0%  
+	[233, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunk____1KB-2	     100	  95134335 ns/op	  21.02 MB/s
+--- Histogram (unit: ms)
+	Count: 100  Min: 81  Max: 105  Avg: 94.59
+	------------------------------------------------------------
+	[ 81,  82)    1    1.0%    1.0%  
+	[ 82,  83)    1    1.0%    2.0%  
+	[ 83,  84)    0    0.0%    2.0%  
+	[ 84,  85)    1    1.0%    3.0%  
+	[ 85,  87)    3    3.0%    6.0%  
+	[ 87,  89)   10   10.0%   16.0%  #
+	[ 89,  92)    6    6.0%   22.0%  #
+	[ 92,  96)   31   31.0%   53.0%  ###
+	[ 96, 101)   39   39.0%   92.0%  ####
+	[101, 107)    8    8.0%  100.0%  #
 	[107, 115)    0    0.0%  100.0%  
 	[115, 125)    0    0.0%  100.0%  
-	[125, 138)    0    0.0%  100.0%  
-	[138, 154)    0    0.0%  100.0%  
-	[154, 174)    0    0.0%  100.0%  
-	[174, 199)    0    0.0%  100.0%  
-	[199, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunk___10KB	      20	 337020835 ns/op	  59.34 MB/s
+	[125, 137)    0    0.0%  100.0%  
+	[137, 152)    0    0.0%  100.0%  
+	[152, 171)    0    0.0%  100.0%  
+	[171, 195)    0    0.0%  100.0%  
+	[195, inf)    0    0.0%  100.0%  
+Benchmark___1K_chunk___10KB	      20	 340093645 ns/op	  58.81 MB/s
 --- Histogram (unit: ms)
-	Count: 20  Min: 331  Max: 342  Avg: 336.50
+	Count: 20  Min: 331  Max: 352  Avg: 339.65
 	------------------------------------------------------------
 	[331, 332)   1    5.0%    5.0%  #
 	[332, 333)   2   10.0%   15.0%  #
-	[333, 334)   1    5.0%   20.0%  #
-	[334, 335)   3   15.0%   35.0%  ##
-	[335, 336)   2   10.0%   45.0%  #
-	[336, 338)   2   10.0%   55.0%  #
-	[338, 340)   5   25.0%   80.0%  ###
-	[340, 343)   4   20.0%  100.0%  ##
-	[343, 346)   0    0.0%  100.0%  
-	[346, 350)   0    0.0%  100.0%  
-	[350, 354)   0    0.0%  100.0%  
-	[354, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunk___10KB-2	      50	 177497001 ns/op	 112.68 MB/s
+	[333, 334)   0    0.0%   15.0%  
+	[334, 335)   0    0.0%   15.0%  
+	[335, 337)   2   10.0%   25.0%  #
+	[337, 339)   4   20.0%   45.0%  ##
+	[339, 342)   5   25.0%   70.0%  ###
+	[342, 346)   3   15.0%   85.0%  ##
+	[346, 351)   2   10.0%   95.0%  #
+	[351, 357)   1    5.0%  100.0%  #
+	[357, 364)   0    0.0%  100.0%  
+	[364, 373)   0    0.0%  100.0%  
+	[373, 384)   0    0.0%  100.0%  
+	[384, 397)   0    0.0%  100.0%  
+	[397, 414)   0    0.0%  100.0%  
+	[414, 434)   0    0.0%  100.0%  
+	[434, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunk___10KB-2	      50	 180545176 ns/op	 110.78 MB/s
 --- Histogram (unit: ms)
-	Count: 50  Min: 172  Max: 183  Avg: 176.96
+	Count: 50  Min: 171  Max: 190  Avg: 180.06
 	------------------------------------------------------------
-	[172, 173)   4    8.0%    8.0%  #
-	[173, 174)   2    4.0%   12.0%  
-	[174, 175)   8   16.0%   28.0%  ##
-	[175, 176)   4    8.0%   36.0%  #
-	[176, 177)   2    4.0%   40.0%  
-	[177, 179)   9   18.0%   58.0%  ##
-	[179, 181)  18   36.0%   94.0%  ####
-	[181, 184)   3    6.0%  100.0%  #
-	[184, 187)   0    0.0%  100.0%  
-	[187, 191)   0    0.0%  100.0%  
-	[191, 195)   0    0.0%  100.0%  
-	[195, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunk__100KB	       3	2185333858 ns/op	  91.52 MB/s
+	[171, 172)   1    2.0%    2.0%  
+	[172, 173)   0    0.0%    2.0%  
+	[173, 174)   1    2.0%    4.0%  
+	[174, 175)   0    0.0%    4.0%  
+	[175, 177)   7   14.0%   18.0%  #
+	[177, 179)   8   16.0%   34.0%  ##
+	[179, 182)  14   28.0%   62.0%  ###
+	[182, 185)  16   32.0%   94.0%  ###
+	[185, 189)   2    4.0%   98.0%  
+	[189, 194)   1    2.0%  100.0%  
+	[194, 201)   0    0.0%  100.0%  
+	[201, 209)   0    0.0%  100.0%  
+	[209, 219)   0    0.0%  100.0%  
+	[219, 231)   0    0.0%  100.0%  
+	[231, 246)   0    0.0%  100.0%  
+	[246, 264)   0    0.0%  100.0%  
+	[264, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunk__100KB	       3	2241353636 ns/op	  89.23 MB/s
 --- Histogram (unit: s)
 	Count: 3  Min: 2  Max: 2  Avg: 2.00
 	------------------------------------------------------------
 	[  2, inf)  3  100.0%  100.0%  ##########
-Benchmark___1K_chunk__100KB-2	       5	1140505127 ns/op	 175.36 MB/s
+Benchmark___1K_chunk__100KB-2	       5	1152111781 ns/op	 173.59 MB/s
 --- Histogram (unit: s)
 	Count: 5  Min: 1  Max: 1  Avg: 1.00
 	------------------------------------------------------------
 	[  1, inf)  5  100.0%  100.0%  ##########
 
-Benchmark__per_chunk____1B	   50000	    127847 ns/op	   0.02 MB/s
-Benchmark__per_chunk____1B-2	  100000	     81496 ns/op	   0.02 MB/s
-Benchmark__per_chunk___10B	   50000	    125213 ns/op	   0.16 MB/s
-Benchmark__per_chunk___10B-2	  100000	     79532 ns/op	   0.25 MB/s
-Benchmark__per_chunk__100B	   50000	    126242 ns/op	   1.58 MB/s
-Benchmark__per_chunk__100B-2	  100000	     77971 ns/op	   2.57 MB/s
-Benchmark__per_chunk___1KB	   50000	    148314 ns/op	  13.48 MB/s
-Benchmark__per_chunk___1KB-2	  100000	     87787 ns/op	  22.78 MB/s
-Benchmark__per_chunk__10KB	   20000	    323521 ns/op	  61.82 MB/s
-Benchmark__per_chunk__10KB-2	   50000	    172500 ns/op	 115.94 MB/s
-Benchmark__per_chunk_100KB	    3000	   2065561 ns/op	  96.83 MB/s
-Benchmark__per_chunk_100KB-2	   10000	   1062338 ns/op	 188.26 MB/s
+Benchmark__per_chunk____1B	   50000	    124707 ns/op	   0.02 MB/s
+Benchmark__per_chunk____1B-2	  100000	     78017 ns/op	   0.03 MB/s
+Benchmark__per_chunk___10B	   50000	    122584 ns/op	   0.16 MB/s
+Benchmark__per_chunk___10B-2	  100000	     75094 ns/op	   0.27 MB/s
+Benchmark__per_chunk__100B	   50000	    124183 ns/op	   1.61 MB/s
+Benchmark__per_chunk__100B-2	  100000	     74955 ns/op	   2.67 MB/s
+Benchmark__per_chunk___1KB	   50000	    144432 ns/op	  13.85 MB/s
+Benchmark__per_chunk___1KB-2	  100000	     79305 ns/op	  25.22 MB/s
+Benchmark__per_chunk__10KB	   20000	    314733 ns/op	  63.55 MB/s
+Benchmark__per_chunk__10KB-2	   50000	    163532 ns/op	 122.30 MB/s
+Benchmark__per_chunk_100KB	    3000	   2015176 ns/op	  99.25 MB/s
+Benchmark__per_chunk_100KB-2	   10000	   1048505 ns/op	 190.75 MB/s
 
-Benchmark___10B_mux__100_chunks___10B	     500	  16428840 ns/op	   0.00 MB/s
+Benchmark___10B_mux__100_chunks___10B	     500	  16408021 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 8  Max: 18  Avg: 16.03
+	Count: 500  Min: 7  Max: 18  Avg: 15.99
 	------------------------------------------------------------
-	[  8,   9)    4    0.8%    0.8%  
-	[  9,  10)    0    0.0%    0.8%  
-	[ 10,  11)    0    0.0%    0.8%  
-	[ 11,  12)    1    0.2%    1.0%  
-	[ 12,  13)    3    0.6%    1.6%  
-	[ 13,  15)    5    1.0%    2.6%  
-	[ 15,  17)  403   80.6%   83.2%  ########
-	[ 17,  19)   84   16.8%  100.0%  ##
+	[  7,   8)    1    0.2%    0.2%  
+	[  8,   9)    2    0.4%    0.6%  
+	[  9,  10)    2    0.4%    1.0%  
+	[ 10,  11)    0    0.0%    1.0%  
+	[ 11,  12)    1    0.2%    1.2%  
+	[ 12,  14)    8    1.6%    2.8%  
+	[ 14,  16)   34    6.8%    9.6%  #
+	[ 16,  19)  452   90.4%  100.0%  #########
 	[ 19,  22)    0    0.0%  100.0%  
-	[ 22,  25)    0    0.0%  100.0%  
-	[ 25, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks___10B-2	    2000	   4039798 ns/op	   0.00 MB/s
+	[ 22,  26)    0    0.0%  100.0%  
+	[ 26,  30)    0    0.0%  100.0%  
+	[ 30, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks___10B-2	    2000	   3878477 ns/op	   0.01 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 10  Avg: 3.55
+	Count: 2000  Min: 1  Max: 9  Avg: 3.39
 	------------------------------------------------------------
-	[  1,   2)   104    5.2%    5.2%  #
-	[  2,   3)   588   29.4%   34.6%  ###
-	[  3,   4)   397   19.9%   54.5%  ##
-	[  4,   5)   375   18.8%   73.2%  ##
-	[  5,   6)   278   13.9%   87.1%  #
-	[  6,   8)   208   10.4%   97.5%  #
-	[  8,  10)    48    2.4%   99.9%  
-	[ 10,  12)     2    0.1%  100.0%  
-	[ 12,  15)     0    0.0%  100.0%  
-	[ 15, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks__100B	     500	  16959639 ns/op	   0.00 MB/s
+	[  1,   2)   122    6.1%    6.1%  #
+	[  2,   3)   599   30.0%   36.1%  ###
+	[  3,   4)   439   22.0%   58.0%  ##
+	[  4,   5)   389   19.5%   77.5%  ##
+	[  5,   6)   235   11.8%   89.2%  #
+	[  6,   8)   194    9.7%   98.9%  #
+	[  8,  10)    22    1.1%  100.0%  
+	[ 10,  12)     0    0.0%  100.0%  
+	[ 12, inf)     0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks__100B	     500	  17052264 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 10  Max: 19  Avg: 16.44
+	Count: 500  Min: 7  Max: 21  Avg: 16.57
 	------------------------------------------------------------
-	[ 10,  11)    3    0.6%    0.6%  
-	[ 11,  12)    0    0.0%    0.6%  
-	[ 12,  13)    3    0.6%    1.2%  
-	[ 13,  14)    1    0.2%    1.4%  
-	[ 14,  15)   77   15.4%   16.8%  ##
-	[ 15,  17)  122   24.4%   41.2%  ##
-	[ 17,  19)  286   57.2%   98.4%  ######
-	[ 19,  21)    8    1.6%  100.0%  
-	[ 21,  24)    0    0.0%  100.0%  
-	[ 24, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks__100B-2	    2000	   4129118 ns/op	   0.00 MB/s
+	[  7,   8)    1    0.2%    0.2%  
+	[  8,   9)    0    0.0%    0.2%  
+	[  9,  10)    0    0.0%    0.2%  
+	[ 10,  11)    1    0.2%    0.4%  
+	[ 11,  13)    1    0.2%    0.6%  
+	[ 13,  15)   53   10.6%   11.2%  #
+	[ 15,  17)  152   30.4%   41.6%  ###
+	[ 17,  20)  281   56.2%   97.8%  ######
+	[ 20,  24)   11    2.2%  100.0%  
+	[ 24,  28)    0    0.0%  100.0%  
+	[ 28,  33)    0    0.0%  100.0%  
+	[ 33,  39)    0    0.0%  100.0%  
+	[ 39,  47)    0    0.0%  100.0%  
+	[ 47,  56)    0    0.0%  100.0%  
+	[ 56, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks__100B-2	    2000	   4022209 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 12  Avg: 3.64
+	Count: 2000  Min: 1  Max: 12  Avg: 3.53
 	------------------------------------------------------------
-	[  1,   2)    77    3.9%    3.9%  
-	[  2,   3)   693   34.6%   38.5%  ###
-	[  3,   4)   407   20.4%   58.9%  ##
-	[  4,   5)   308   15.4%   74.2%  ##
-	[  5,   6)   182    9.1%   83.4%  #
-	[  6,   8)   213   10.7%   94.0%  #
-	[  8,  10)    91    4.5%   98.6%  
-	[ 10,  13)    29    1.5%  100.0%  
+	[  1,   2)    99    5.0%    5.0%  
+	[  2,   3)   733   36.6%   41.6%  ####
+	[  3,   4)   384   19.2%   60.8%  ##
+	[  4,   5)   296   14.8%   75.6%  #
+	[  5,   6)   169    8.5%   84.1%  #
+	[  6,   8)   207   10.4%   94.4%  #
+	[  8,  10)    94    4.7%   99.1%  
+	[ 10,  13)    18    0.9%  100.0%  
 	[ 13,  16)     0    0.0%  100.0%  
 	[ 16,  20)     0    0.0%  100.0%  
 	[ 20,  24)     0    0.0%  100.0%  
 	[ 24, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks___1KB	     500	  19240324 ns/op	   0.00 MB/s
+Benchmark___10B_mux__100_chunks___1KB	     500	  19001451 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 13  Max: 24  Avg: 18.60
+	Count: 500  Min: 7  Max: 23  Avg: 18.44
 	------------------------------------------------------------
-	[ 13,  14)    1    0.2%    0.2%  
-	[ 14,  15)    0    0.0%    0.2%  
-	[ 15,  16)    0    0.0%    0.2%  
-	[ 16,  17)  152   30.4%   30.6%  ###
-	[ 17,  18)   75   15.0%   45.6%  ##
-	[ 18,  20)   58   11.6%   57.2%  #
-	[ 20,  22)  179   35.8%   93.0%  ####
-	[ 22,  25)   35    7.0%  100.0%  #
-	[ 25,  28)    0    0.0%  100.0%  
-	[ 28,  32)    0    0.0%  100.0%  
-	[ 32,  36)    0    0.0%  100.0%  
-	[ 36, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks___1KB-2	    2000	   4765628 ns/op	   0.00 MB/s
+	[  7,   8)    1    0.2%    0.2%  
+	[  8,   9)    0    0.0%    0.2%  
+	[  9,  10)    0    0.0%    0.2%  
+	[ 10,  11)    0    0.0%    0.2%  
+	[ 11,  13)    2    0.4%    0.6%  
+	[ 13,  15)    3    0.6%    1.2%  
+	[ 15,  18)  244   48.8%   50.0%  #####
+	[ 18,  21)   64   12.8%   62.8%  #
+	[ 21,  25)  186   37.2%  100.0%  ####
+	[ 25,  30)    0    0.0%  100.0%  
+	[ 30,  36)    0    0.0%  100.0%  
+	[ 36,  43)    0    0.0%  100.0%  
+	[ 43,  52)    0    0.0%  100.0%  
+	[ 52,  63)    0    0.0%  100.0%  
+	[ 63,  76)    0    0.0%  100.0%  
+	[ 76,  92)    0    0.0%  100.0%  
+	[ 92, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks___1KB-2	    2000	   4690985 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 15  Avg: 4.29
+	Count: 2000  Min: 1  Max: 14  Avg: 4.20
 	------------------------------------------------------------
-	[  1,   2)    49    2.5%    2.5%  
-	[  2,   3)   573   28.7%   31.1%  ###
-	[  3,   4)   411   20.6%   51.7%  ##
-	[  4,   5)   262   13.1%   64.8%  #
-	[  5,   7)   369   18.4%   83.2%  ##
-	[  7,   9)   150    7.5%   90.7%  #
-	[  9,  11)    87    4.4%   95.1%  
-	[ 11,  14)    90    4.5%   99.6%  
-	[ 14,  18)     9    0.5%  100.0%  
-	[ 18,  22)     0    0.0%  100.0%  
-	[ 22,  27)     0    0.0%  100.0%  
-	[ 27,  33)     0    0.0%  100.0%  
-	[ 33,  41)     0    0.0%  100.0%  
-	[ 41,  50)     0    0.0%  100.0%  
-	[ 50, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks__10KB	     200	  38595003 ns/op	   0.00 MB/s
+	[  1,   2)    66    3.3%    3.3%  
+	[  2,   3)   547   27.4%   30.7%  ###
+	[  3,   4)   441   22.1%   52.7%  ##
+	[  4,   5)   267   13.4%   66.0%  #
+	[  5,   6)   228   11.4%   77.5%  #
+	[  6,   8)   213   10.7%   88.1%  #
+	[  8,  10)   118    5.9%   94.0%  #
+	[ 10,  13)    95    4.8%   98.8%  
+	[ 13,  16)    25    1.2%  100.0%  
+	[ 16,  20)     0    0.0%  100.0%  
+	[ 20,  25)     0    0.0%  100.0%  
+	[ 25,  31)     0    0.0%  100.0%  
+	[ 31,  38)     0    0.0%  100.0%  
+	[ 38, inf)     0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks__10KB	     200	  39337476 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 200  Min: 8  Max: 43  Avg: 38.09
+	Count: 200  Min: 31  Max: 43  Avg: 38.81
 	------------------------------------------------------------
-	[  8,   9)    2    1.0%    1.0%  
-	[  9,  10)    0    0.0%    1.0%  
-	[ 10,  11)    0    0.0%    1.0%  
-	[ 11,  13)    0    0.0%    1.0%  
-	[ 13,  15)    0    0.0%    1.0%  
-	[ 15,  18)    0    0.0%    1.0%  
-	[ 18,  22)    0    0.0%    1.0%  
-	[ 22,  27)    0    0.0%    1.0%  
-	[ 27,  33)    2    1.0%    2.0%  
-	[ 33,  41)  125   62.5%   64.5%  ######
-	[ 41,  51)   71   35.5%  100.0%  ####
-	[ 51,  64)    0    0.0%  100.0%  
-	[ 64,  81)    0    0.0%  100.0%  
-	[ 81, 102)    0    0.0%  100.0%  
-	[102, 129)    0    0.0%  100.0%  
-	[129, 163)    0    0.0%  100.0%  
-	[163, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks__10KB-2	     500	  13282699 ns/op	   0.00 MB/s
+	[ 31,  32)    1    0.5%    0.5%  
+	[ 32,  33)    0    0.0%    0.5%  
+	[ 33,  34)    0    0.0%    0.5%  
+	[ 34,  35)   28   14.0%   14.5%  #
+	[ 35,  36)   18    9.0%   23.5%  #
+	[ 36,  38)   43   21.5%   45.0%  ##
+	[ 38,  40)    1    0.5%   45.5%  
+	[ 40,  43)   77   38.5%   84.0%  ####
+	[ 43,  46)   32   16.0%  100.0%  ##
+	[ 46,  50)    0    0.0%  100.0%  
+	[ 50,  55)    0    0.0%  100.0%  
+	[ 55,  61)    0    0.0%  100.0%  
+	[ 61, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks__10KB-2	     500	  12546220 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 1  Max: 27  Avg: 12.81
+	Count: 500  Min: 1  Max: 26  Avg: 12.06
 	------------------------------------------------------------
 	[  1,   2)   12    2.4%    2.4%  
-	[  2,   3)   87   17.4%   19.8%  ##
-	[  3,   4)   19    3.8%   23.6%  
-	[  4,   5)   19    3.8%   27.4%  
-	[  5,   7)   23    4.6%   32.0%  
-	[  7,   9)   25    5.0%   37.0%  #
-	[  9,  12)   31    6.2%   43.2%  #
-	[ 12,  16)   45    9.0%   52.2%  #
-	[ 16,  21)  130   26.0%   78.2%  ###
-	[ 21,  28)  109   21.8%  100.0%  ##
-	[ 28,  36)    0    0.0%  100.0%  
-	[ 36,  46)    0    0.0%  100.0%  
-	[ 46,  59)    0    0.0%  100.0%  
-	[ 59,  75)    0    0.0%  100.0%  
-	[ 75,  95)    0    0.0%  100.0%  
-	[ 95, 120)    0    0.0%  100.0%  
-	[120, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___10B	     100	  89458344 ns/op	   0.00 MB/s
+	[  2,   3)   72   14.4%   16.8%  #
+	[  3,   4)   32    6.4%   23.2%  #
+	[  4,   5)   22    4.4%   27.6%  
+	[  5,   7)   32    6.4%   34.0%  #
+	[  7,   9)   26    5.2%   39.2%  #
+	[  9,  12)   39    7.8%   47.0%  #
+	[ 12,  16)   61   12.2%   59.2%  #
+	[ 16,  21)  105   21.0%   80.2%  ##
+	[ 21,  27)   99   19.8%  100.0%  ##
+	[ 27,  35)    0    0.0%  100.0%  
+	[ 35,  45)    0    0.0%  100.0%  
+	[ 45,  58)    0    0.0%  100.0%  
+	[ 58,  74)    0    0.0%  100.0%  
+	[ 74,  94)    0    0.0%  100.0%  
+	[ 94, 118)    0    0.0%  100.0%  
+	[118, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___10B	     100	  90698047 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 21  Max: 141  Avg: 88.95
+	Count: 100  Min: 3  Max: 146  Avg: 90.14
 	------------------------------------------------------------
-	[ 21,  22)    1    1.0%    1.0%  
-	[ 22,  23)    0    0.0%    1.0%  
-	[ 23,  24)    0    0.0%    1.0%  
-	[ 24,  26)    0    0.0%    1.0%  
-	[ 26,  29)    2    2.0%    3.0%  
-	[ 29,  33)    1    1.0%    4.0%  
-	[ 33,  39)    1    1.0%    5.0%  
-	[ 39,  48)    5    5.0%   10.0%  #
-	[ 48,  60)   12   12.0%   22.0%  #
-	[ 60,  77)   18   18.0%   40.0%  ##
-	[ 77, 101)   21   21.0%   61.0%  ##
-	[101, 134)   33   33.0%   94.0%  ###
-	[134, 180)    6    6.0%  100.0%  #
-	[180, 243)    0    0.0%  100.0%  
-	[243, 330)    0    0.0%  100.0%  
-	[330, 449)    0    0.0%  100.0%  
-	[449, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___10B-2	    2000	   5537208 ns/op	   0.00 MB/s
+	[  3,   4)    1    1.0%    1.0%  
+	[  4,   5)    0    0.0%    1.0%  
+	[  5,   6)    3    3.0%    4.0%  
+	[  6,   8)    1    1.0%    5.0%  
+	[  8,  11)    0    0.0%    5.0%  
+	[ 11,  16)    0    0.0%    5.0%  
+	[ 16,  23)    2    2.0%    7.0%  
+	[ 23,  33)    0    0.0%    7.0%  
+	[ 33,  47)    4    4.0%   11.0%  
+	[ 47,  66)   16   16.0%   27.0%  ##
+	[ 66,  93)   28   28.0%   55.0%  ###
+	[ 93, 131)   30   30.0%   85.0%  ###
+	[131, 183)   15   15.0%  100.0%  ##
+	[183, 256)    0    0.0%  100.0%  
+	[256, 358)    0    0.0%  100.0%  
+	[358, 501)    0    0.0%  100.0%  
+	[501, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___10B-2	    2000	   5197620 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 46  Avg: 5.05
+	Count: 2000  Min: 1  Max: 44  Avg: 4.71
 	------------------------------------------------------------
-	[  1,   2)    36    1.8%    1.8%  
-	[  2,   3)   785   39.2%   41.1%  ####
-	[  3,   4)   580   29.0%   70.0%  ###
-	[  4,   6)   266   13.3%   83.4%  #
-	[  6,   8)    59    3.0%   86.3%  
-	[  8,  11)    48    2.4%   88.7%  
-	[ 11,  15)    76    3.8%   92.5%  
-	[ 15,  20)    37    1.9%   94.4%  
-	[ 20,  27)    54    2.7%   97.1%  
-	[ 27,  36)    36    1.8%   98.9%  
-	[ 36,  48)    23    1.2%  100.0%  
-	[ 48,  64)     0    0.0%  100.0%  
-	[ 64,  85)     0    0.0%  100.0%  
-	[ 85, 112)     0    0.0%  100.0%  
-	[112, 146)     0    0.0%  100.0%  
-	[146, 190)     0    0.0%  100.0%  
-	[190, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks__100B	     100	  95560922 ns/op	   0.00 MB/s
+	[  1,   2)    42    2.1%    2.1%  
+	[  2,   3)   914   45.7%   47.8%  #####
+	[  3,   4)   548   27.4%   75.2%  ###
+	[  4,   6)   191    9.6%   84.8%  #
+	[  6,   8)    48    2.4%   87.2%  
+	[  8,  11)    50    2.5%   89.7%  
+	[ 11,  15)    76    3.8%   93.5%  
+	[ 15,  20)    30    1.5%   95.0%  
+	[ 20,  27)    46    2.3%   97.2%  
+	[ 27,  36)    40    2.0%   99.2%  
+	[ 36,  48)    15    0.8%  100.0%  
+	[ 48,  63)     0    0.0%  100.0%  
+	[ 63,  83)     0    0.0%  100.0%  
+	[ 83, 109)     0    0.0%  100.0%  
+	[109, 142)     0    0.0%  100.0%  
+	[142, 185)     0    0.0%  100.0%  
+	[185, inf)     0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks__100B	     100	  94502013 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 4  Max: 154  Avg: 95.10
+	Count: 100  Min: 4  Max: 157  Avg: 93.97
 	------------------------------------------------------------
 	[  4,   5)    1    1.0%    1.0%  
 	[  5,   6)    0    0.0%    1.0%  
@@ -1152,455 +1159,455 @@
 	[  7,   9)    1    1.0%    2.0%  
 	[  9,  12)    0    0.0%    2.0%  
 	[ 12,  17)    0    0.0%    2.0%  
-	[ 17,  24)    2    2.0%    4.0%  
-	[ 24,  34)    0    0.0%    4.0%  
-	[ 34,  48)    2    2.0%    6.0%  
-	[ 48,  68)   18   18.0%   24.0%  ##
-	[ 68,  96)   25   25.0%   49.0%  ###
-	[ 96, 135)   35   35.0%   84.0%  ####
-	[135, 190)   16   16.0%  100.0%  ##
-	[190, 266)    0    0.0%  100.0%  
-	[266, 373)    0    0.0%  100.0%  
-	[373, 522)    0    0.0%  100.0%  
-	[522, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks__100B-2	    2000	   5772039 ns/op	   0.00 MB/s
+	[ 17,  24)    0    0.0%    2.0%  
+	[ 24,  34)    1    1.0%    3.0%  
+	[ 34,  48)    3    3.0%    6.0%  
+	[ 48,  68)   19   19.0%   25.0%  ##
+	[ 68,  96)   27   27.0%   52.0%  ###
+	[ 96, 136)   39   39.0%   91.0%  ####
+	[136, 191)    9    9.0%  100.0%  #
+	[191, 269)    0    0.0%  100.0%  
+	[269, 378)    0    0.0%  100.0%  
+	[378, 531)    0    0.0%  100.0%  
+	[531, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks__100B-2	    2000	   5453937 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 48  Avg: 5.29
+	Count: 2000  Min: 1  Max: 44  Avg: 4.96
 	------------------------------------------------------------
-	[  1,   2)    19    1.0%    1.0%  
-	[  2,   3)   754   37.7%   38.7%  ####
-	[  3,   4)   569   28.5%   67.1%  ###
-	[  4,   6)   329   16.4%   83.6%  ##
-	[  6,   8)    56    2.8%   86.4%  
-	[  8,  11)    45    2.2%   88.6%  
-	[ 11,  15)    34    1.7%   90.3%  
-	[ 15,  21)    75    3.8%   94.1%  
-	[ 21,  28)    75    3.8%   97.8%  
-	[ 28,  38)    24    1.2%   99.0%  
-	[ 38,  51)    20    1.0%  100.0%  
-	[ 51,  67)     0    0.0%  100.0%  
-	[ 67,  88)     0    0.0%  100.0%  
-	[ 88, 116)     0    0.0%  100.0%  
-	[116, 152)     0    0.0%  100.0%  
-	[152, 198)     0    0.0%  100.0%  
-	[198, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___1KB	     100	 104839465 ns/op	   0.00 MB/s
+	[  1,   2)    28    1.4%    1.4%  
+	[  2,   3)   870   43.5%   44.9%  ####
+	[  3,   4)   565   28.2%   73.2%  ###
+	[  4,   6)   245   12.2%   85.4%  #
+	[  6,   8)    41    2.1%   87.5%  
+	[  8,  11)    42    2.1%   89.6%  
+	[ 11,  15)    24    1.2%   90.8%  
+	[ 15,  20)    73    3.7%   94.4%  
+	[ 20,  27)    53    2.7%   97.1%  
+	[ 27,  36)    37    1.9%   98.9%  
+	[ 36,  48)    22    1.1%  100.0%  
+	[ 48,  63)     0    0.0%  100.0%  
+	[ 63,  83)     0    0.0%  100.0%  
+	[ 83, 109)     0    0.0%  100.0%  
+	[109, 142)     0    0.0%  100.0%  
+	[142, 185)     0    0.0%  100.0%  
+	[185, inf)     0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___1KB	     100	 107052234 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 9  Max: 179  Avg: 104.38
+	Count: 100  Min: 9  Max: 169  Avg: 106.52
 	------------------------------------------------------------
-	[  9,  10)    3    3.0%    3.0%  
-	[ 10,  11)    0    0.0%    3.0%  
-	[ 11,  12)    1    1.0%    4.0%  
-	[ 12,  14)    1    1.0%    5.0%  
-	[ 14,  17)    0    0.0%    5.0%  
-	[ 17,  22)    0    0.0%    5.0%  
-	[ 22,  29)    0    0.0%    5.0%  
-	[ 29,  39)    3    3.0%    8.0%  
-	[ 39,  54)    3    3.0%   11.0%  
-	[ 54,  75)    9    9.0%   20.0%  #
-	[ 75, 105)   35   35.0%   55.0%  ####
-	[105, 148)   20   20.0%   75.0%  ##
-	[148, 208)   25   25.0%  100.0%  ###
-	[208, 293)    0    0.0%  100.0%  
-	[293, 413)    0    0.0%  100.0%  
-	[413, 583)    0    0.0%  100.0%  
-	[583, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___1KB-2	    1000	   7235554 ns/op	   0.00 MB/s
---- Histogram (unit: ms)
-	Count: 1000  Min: 1  Max: 55  Avg: 6.74
-	------------------------------------------------------------
-	[  1,   2)    10    1.0%    1.0%  
-	[  2,   3)   240   24.0%   25.0%  ##
-	[  3,   4)   272   27.2%   52.2%  ###
-	[  4,   6)   265   26.5%   78.7%  ###
-	[  6,   8)    44    4.4%   83.1%  
-	[  8,  11)    30    3.0%   86.1%  
-	[ 11,  15)    22    2.2%   88.3%  
-	[ 15,  21)    38    3.8%   92.1%  
-	[ 21,  29)    20    2.0%   94.1%  
-	[ 29,  39)    32    3.2%   97.3%  
-	[ 39,  53)    25    2.5%   99.8%  
-	[ 53,  71)     2    0.2%  100.0%  
-	[ 71,  95)     0    0.0%  100.0%  
-	[ 95, 126)     0    0.0%  100.0%  
-	[126, 167)     0    0.0%  100.0%  
-	[167, 221)     0    0.0%  100.0%  
-	[221, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks__10KB	     100	  72299884 ns/op	   0.00 MB/s
---- Histogram (unit: ms)
-	Count: 100  Min: 8  Max: 122  Avg: 71.77
-	------------------------------------------------------------
-	[  8,   9)    1    1.0%    1.0%  
-	[  9,  10)    0    0.0%    1.0%  
+	[  9,  10)    1    1.0%    1.0%  
 	[ 10,  11)    0    0.0%    1.0%  
-	[ 11,  13)    0    0.0%    1.0%  
-	[ 13,  16)    0    0.0%    1.0%  
-	[ 16,  20)    4    4.0%    5.0%  
-	[ 20,  26)    0    0.0%    5.0%  
-	[ 26,  35)    4    4.0%    9.0%  
-	[ 35,  47)   11   11.0%   20.0%  #
-	[ 47,  64)   12   12.0%   32.0%  #
-	[ 64,  87)   42   42.0%   74.0%  ####
-	[ 87, 119)   24   24.0%   98.0%  ##
-	[119, 163)    2    2.0%  100.0%  
-	[163, 223)    0    0.0%  100.0%  
-	[223, 306)    0    0.0%  100.0%  
-	[306, 420)    0    0.0%  100.0%  
-	[420, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks__10KB-2	     200	  36957063 ns/op	   0.00 MB/s
+	[ 11,  12)    0    0.0%    1.0%  
+	[ 12,  14)    0    0.0%    1.0%  
+	[ 14,  17)    2    2.0%    3.0%  
+	[ 17,  22)    0    0.0%    3.0%  
+	[ 22,  29)    0    0.0%    3.0%  
+	[ 29,  39)    1    1.0%    4.0%  
+	[ 39,  53)    2    2.0%    6.0%  
+	[ 53,  74)   14   14.0%   20.0%  #
+	[ 74, 103)   38   38.0%   58.0%  ####
+	[103, 144)   11   11.0%   69.0%  #
+	[144, 201)   31   31.0%  100.0%  ###
+	[201, 282)    0    0.0%  100.0%  
+	[282, 396)    0    0.0%  100.0%  
+	[396, 555)    0    0.0%  100.0%  
+	[555, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___1KB-2	    2000	   6698998 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 200  Min: 2  Max: 72  Avg: 36.49
+	Count: 2000  Min: 1  Max: 54  Avg: 6.20
 	------------------------------------------------------------
-	[  2,   3)    8    4.0%    4.0%  
-	[  3,   4)    5    2.5%    6.5%  
-	[  4,   5)    6    3.0%    9.5%  
-	[  5,   7)    3    1.5%   11.0%  
-	[  7,  10)    6    3.0%   14.0%  
-	[ 10,  14)    6    3.0%   17.0%  
-	[ 14,  19)    8    4.0%   21.0%  
-	[ 19,  26)   12    6.0%   27.0%  #
-	[ 26,  35)   31   15.5%   42.5%  ##
-	[ 35,  47)   48   24.0%   66.5%  ##
-	[ 47,  63)   52   26.0%   92.5%  ###
-	[ 63,  85)   15    7.5%  100.0%  #
-	[ 85, 114)    0    0.0%  100.0%  
-	[114, 153)    0    0.0%  100.0%  
-	[153, 205)    0    0.0%  100.0%  
-	[205, 274)    0    0.0%  100.0%  
-	[274, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks___10B	     500	  17595461 ns/op	   0.11 MB/s
+	[  1,   2)     7    0.4%    0.4%  
+	[  2,   3)   554   27.7%   28.1%  ###
+	[  3,   4)   655   32.8%   60.8%  ###
+	[  4,   6)   433   21.7%   82.5%  ##
+	[  6,   8)    59    3.0%   85.4%  
+	[  8,  11)    38    1.9%   87.3%  
+	[ 11,  15)    41    2.1%   89.4%  
+	[ 15,  21)    63    3.2%   92.5%  
+	[ 21,  29)    45    2.2%   94.8%  
+	[ 29,  39)    61    3.1%   97.8%  
+	[ 39,  53)    40    2.0%   99.8%  
+	[ 53,  71)     4    0.2%  100.0%  
+	[ 71,  94)     0    0.0%  100.0%  
+	[ 94, 125)     0    0.0%  100.0%  
+	[125, 165)     0    0.0%  100.0%  
+	[165, 218)     0    0.0%  100.0%  
+	[218, inf)     0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks__10KB	     100	  72865483 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 7  Max: 35  Avg: 17.11
+	Count: 100  Min: 17  Max: 119  Avg: 72.31
 	------------------------------------------------------------
-	[  7,   8)    1    0.2%    0.2%  
-	[  8,   9)    1    0.2%    0.4%  
-	[  9,  10)    0    0.0%    0.4%  
-	[ 10,  11)    0    0.0%    0.4%  
-	[ 11,  13)    4    0.8%    1.2%  
-	[ 13,  16)  380   76.0%   77.2%  ########
-	[ 16,  19)   43    8.6%   85.8%  #
-	[ 19,  23)    2    0.4%   86.2%  
-	[ 23,  28)   14    2.8%   89.0%  
-	[ 28,  35)   54   10.8%   99.8%  #
-	[ 35,  44)    1    0.2%  100.0%  
-	[ 44,  55)    0    0.0%  100.0%  
-	[ 55,  69)    0    0.0%  100.0%  
-	[ 69,  86)    0    0.0%  100.0%  
-	[ 86, 108)    0    0.0%  100.0%  
-	[108, 135)    0    0.0%  100.0%  
-	[135, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks___10B-2	    2000	   4157817 ns/op	   0.48 MB/s
+	[ 17,  18)    4    4.0%    4.0%  
+	[ 18,  19)    2    2.0%    6.0%  
+	[ 19,  20)    0    0.0%    6.0%  
+	[ 20,  22)    1    1.0%    7.0%  
+	[ 22,  25)    1    1.0%    8.0%  
+	[ 25,  29)    0    0.0%    8.0%  
+	[ 29,  35)    1    1.0%    9.0%  
+	[ 35,  43)    8    8.0%   17.0%  #
+	[ 43,  54)    7    7.0%   24.0%  #
+	[ 54,  70)   17   17.0%   41.0%  ##
+	[ 70,  91)   33   33.0%   74.0%  ###
+	[ 91, 120)   26   26.0%  100.0%  ###
+	[120, 160)    0    0.0%  100.0%  
+	[160, 215)    0    0.0%  100.0%  
+	[215, 289)    0    0.0%  100.0%  
+	[289, 391)    0    0.0%  100.0%  
+	[391, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks__10KB-2	     200	  36049367 ns/op	   0.00 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 22  Avg: 3.67
+	Count: 200  Min: 2  Max: 77  Avg: 35.57
 	------------------------------------------------------------
-	[  1,   2)    29    1.5%    1.5%  
-	[  2,   3)   804   40.2%   41.7%  ####
-	[  3,   4)   550   27.5%   69.2%  ###
-	[  4,   5)   289   14.5%   83.6%  #
-	[  5,   7)   160    8.0%   91.6%  #
-	[  7,   9)    31    1.6%   93.2%  
-	[  9,  12)    63    3.2%   96.3%  
-	[ 12,  16)    32    1.6%   97.9%  
-	[ 16,  21)    36    1.8%   99.7%  
-	[ 21,  27)     6    0.3%  100.0%  
-	[ 27,  34)     0    0.0%  100.0%  
-	[ 34,  43)     0    0.0%  100.0%  
-	[ 43,  54)     0    0.0%  100.0%  
-	[ 54,  67)     0    0.0%  100.0%  
-	[ 67,  84)     0    0.0%  100.0%  
-	[ 84, 104)     0    0.0%  100.0%  
-	[104, inf)     0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks__100B	     500	  18203976 ns/op	   0.11 MB/s
+	[  2,   3)    9    4.5%    4.5%  
+	[  3,   4)    7    3.5%    8.0%  
+	[  4,   5)    3    1.5%    9.5%  
+	[  5,   7)    6    3.0%   12.5%  
+	[  7,  10)    6    3.0%   15.5%  
+	[ 10,  14)    6    3.0%   18.5%  
+	[ 14,  19)    9    4.5%   23.0%  
+	[ 19,  26)   17    8.5%   31.5%  #
+	[ 26,  36)   29   14.5%   46.0%  #
+	[ 36,  49)   46   23.0%   69.0%  ##
+	[ 49,  66)   54   27.0%   96.0%  ###
+	[ 66,  89)    8    4.0%  100.0%  
+	[ 89, 120)    0    0.0%  100.0%  
+	[120, 162)    0    0.0%  100.0%  
+	[162, 218)    0    0.0%  100.0%  
+	[218, 292)    0    0.0%  100.0%  
+	[292, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux__100_chunks___10B	     500	  17557482 ns/op	   0.11 MB/s
 --- Histogram (unit: ms)
-	Count: 500  Min: 8  Max: 39  Avg: 17.78
+	Count: 500  Min: 11  Max: 35  Avg: 17.08
+	------------------------------------------------------------
+	[ 11,  12)    4    0.8%    0.8%  
+	[ 12,  13)    3    0.6%    1.4%  
+	[ 13,  14)    0    0.0%    1.4%  
+	[ 14,  15)   98   19.6%   21.0%  ##
+	[ 15,  17)  317   63.4%   84.4%  ######
+	[ 17,  19)   11    2.2%   86.6%  
+	[ 19,  22)    2    0.4%   87.0%  
+	[ 22,  26)    4    0.8%   87.8%  
+	[ 26,  31)    6    1.2%   89.0%  
+	[ 31,  37)   55   11.0%  100.0%  #
+	[ 37,  45)    0    0.0%  100.0%  
+	[ 45,  55)    0    0.0%  100.0%  
+	[ 55,  67)    0    0.0%  100.0%  
+	[ 67,  82)    0    0.0%  100.0%  
+	[ 82, 101)    0    0.0%  100.0%  
+	[101, 125)    0    0.0%  100.0%  
+	[125, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux__100_chunks___10B-2	    2000	   4004379 ns/op	   0.50 MB/s
+--- Histogram (unit: ms)
+	Count: 2000  Min: 1  Max: 21  Avg: 3.51
+	------------------------------------------------------------
+	[  1,   2)    40    2.0%    2.0%  
+	[  2,   3)   894   44.7%   46.7%  ####
+	[  3,   4)   504   25.2%   71.9%  ###
+	[  4,   5)   259   13.0%   84.9%  #
+	[  5,   7)   124    6.2%   91.1%  #
+	[  7,   9)    35    1.8%   92.8%  
+	[  9,  12)    88    4.4%   97.2%  
+	[ 12,  16)    32    1.6%   98.8%  
+	[ 16,  20)    16    0.8%   99.6%  
+	[ 20,  26)     8    0.4%  100.0%  
+	[ 26,  33)     0    0.0%  100.0%  
+	[ 33,  41)     0    0.0%  100.0%  
+	[ 41,  51)     0    0.0%  100.0%  
+	[ 51,  64)     0    0.0%  100.0%  
+	[ 64,  80)     0    0.0%  100.0%  
+	[ 80,  99)     0    0.0%  100.0%  
+	[ 99, inf)     0    0.0%  100.0%  
+Benchmark___1KB_mux__100_chunks__100B	     500	  18342199 ns/op	   0.11 MB/s
+--- Histogram (unit: ms)
+	Count: 500  Min: 8  Max: 39  Avg: 17.82
 	------------------------------------------------------------
 	[  8,   9)    1    0.2%    0.2%  
 	[  9,  10)    0    0.0%    0.2%  
 	[ 10,  11)    0    0.0%    0.2%  
 	[ 11,  12)    0    0.0%    0.2%  
-	[ 12,  14)    5    1.0%    1.2%  
-	[ 14,  17)  405   81.0%   82.2%  ########
-	[ 17,  20)   21    4.2%   86.4%  
-	[ 20,  24)    1    0.2%   86.6%  
-	[ 24,  30)    8    1.6%   88.2%  
-	[ 30,  37)   54   10.8%   99.0%  #
-	[ 37,  46)    5    1.0%  100.0%  
+	[ 12,  14)    4    0.8%    1.0%  
+	[ 14,  17)  411   82.2%   83.2%  ########
+	[ 17,  20)   15    3.0%   86.2%  
+	[ 20,  24)    3    0.6%   86.8%  
+	[ 24,  30)    7    1.4%   88.2%  
+	[ 30,  37)   41    8.2%   96.4%  #
+	[ 37,  46)   18    3.6%  100.0%  
 	[ 46,  58)    0    0.0%  100.0%  
 	[ 58,  73)    0    0.0%  100.0%  
 	[ 73,  92)    0    0.0%  100.0%  
 	[ 92, 116)    0    0.0%  100.0%  
 	[116, 146)    0    0.0%  100.0%  
 	[146, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks__100B-2	    2000	   4271254 ns/op	   0.47 MB/s
+Benchmark___1KB_mux__100_chunks__100B-2	    2000	   4158739 ns/op	   0.48 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 26  Avg: 3.79
+	Count: 2000  Min: 1  Max: 24  Avg: 3.66
 	------------------------------------------------------------
-	[  1,   2)    31    1.6%    1.6%  
-	[  2,   3)   761   38.1%   39.6%  ####
-	[  3,   4)   550   27.5%   67.1%  ###
-	[  4,   5)   316   15.8%   82.9%  ##
-	[  5,   7)   166    8.3%   91.2%  #
-	[  7,   9)    25    1.2%   92.5%  
-	[  9,  12)    65    3.2%   95.7%  
-	[ 12,  16)    48    2.4%   98.1%  
-	[ 16,  21)    22    1.1%   99.2%  
-	[ 21,  27)    16    0.8%  100.0%  
+	[  1,   2)    27    1.4%    1.4%  
+	[  2,   3)   875   43.8%   45.1%  ####
+	[  3,   4)   522   26.1%   71.2%  ###
+	[  4,   5)   257   12.9%   84.1%  #
+	[  5,   7)   153    7.7%   91.7%  #
+	[  7,   9)    19    1.0%   92.7%  
+	[  9,  12)    51    2.6%   95.2%  
+	[ 12,  16)    58    2.9%   98.1%  
+	[ 16,  21)    20    1.0%   99.1%  
+	[ 21,  27)    18    0.9%  100.0%  
 	[ 27,  35)     0    0.0%  100.0%  
-	[ 35,  45)     0    0.0%  100.0%  
-	[ 45,  58)     0    0.0%  100.0%  
-	[ 58,  74)     0    0.0%  100.0%  
-	[ 74,  94)     0    0.0%  100.0%  
-	[ 94, 118)     0    0.0%  100.0%  
-	[118, inf)     0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks___1KB	     300	  20682669 ns/op	   0.10 MB/s
+	[ 35,  44)     0    0.0%  100.0%  
+	[ 44,  56)     0    0.0%  100.0%  
+	[ 56,  71)     0    0.0%  100.0%  
+	[ 71,  89)     0    0.0%  100.0%  
+	[ 89, 111)     0    0.0%  100.0%  
+	[111, inf)     0    0.0%  100.0%  
+Benchmark___1KB_mux__100_chunks___1KB	     300	  20721971 ns/op	   0.10 MB/s
 --- Histogram (unit: ms)
-	Count: 300  Min: 13  Max: 41  Avg: 20.18
+	Count: 300  Min: 13  Max: 42  Avg: 20.25
 	------------------------------------------------------------
 	[ 13,  14)    1    0.3%    0.3%  
-	[ 14,  15)    2    0.7%    1.0%  
-	[ 15,  16)    0    0.0%    1.0%  
-	[ 16,  17)    0    0.0%    1.0%  
-	[ 17,  19)  245   81.7%   82.7%  ########
-	[ 19,  22)    8    2.7%   85.3%  
-	[ 22,  25)    5    1.7%   87.0%  
-	[ 25,  29)    0    0.0%   87.0%  
-	[ 29,  34)    1    0.3%   87.3%  
-	[ 34,  41)   28    9.3%   96.7%  #
-	[ 41,  50)   10    3.3%  100.0%  
-	[ 50,  61)    0    0.0%  100.0%  
-	[ 61,  75)    0    0.0%  100.0%  
-	[ 75,  92)    0    0.0%  100.0%  
-	[ 92, 114)    0    0.0%  100.0%  
-	[114, 141)    0    0.0%  100.0%  
-	[141, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks___1KB-2	    2000	   4950276 ns/op	   0.40 MB/s
+	[ 14,  15)    0    0.0%    0.3%  
+	[ 15,  16)    0    0.0%    0.3%  
+	[ 16,  17)   21    7.0%    7.3%  #
+	[ 17,  19)  213   71.0%   78.3%  #######
+	[ 19,  22)   15    5.0%   83.3%  #
+	[ 22,  25)    3    1.0%   84.3%  
+	[ 25,  29)    7    2.3%   86.7%  
+	[ 29,  35)    8    2.7%   89.3%  
+	[ 35,  42)   31   10.3%   99.7%  #
+	[ 42,  51)    1    0.3%  100.0%  
+	[ 51,  62)    0    0.0%  100.0%  
+	[ 62,  76)    0    0.0%  100.0%  
+	[ 76,  94)    0    0.0%  100.0%  
+	[ 94, 117)    0    0.0%  100.0%  
+	[117, 145)    0    0.0%  100.0%  
+	[145, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux__100_chunks___1KB-2	    2000	   4859684 ns/op	   0.41 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 26  Avg: 4.46
+	Count: 2000  Min: 1  Max: 27  Avg: 4.37
 	------------------------------------------------------------
-	[  1,   2)    12    0.6%    0.6%  
-	[  2,   3)   546   27.3%   27.9%  ###
-	[  3,   4)   517   25.9%   53.8%  ###
-	[  4,   5)   354   17.7%   71.5%  ##
-	[  5,   7)   341   17.1%   88.5%  ##
-	[  7,   9)    60    3.0%   91.5%  
-	[  9,  12)    37    1.9%   93.4%  
-	[ 12,  16)    76    3.8%   97.2%  
-	[ 16,  21)    20    1.0%   98.2%  
-	[ 21,  27)    37    1.9%  100.0%  
-	[ 27,  35)     0    0.0%  100.0%  
-	[ 35,  45)     0    0.0%  100.0%  
-	[ 45,  58)     0    0.0%  100.0%  
-	[ 58,  74)     0    0.0%  100.0%  
-	[ 74,  94)     0    0.0%  100.0%  
-	[ 94, 118)     0    0.0%  100.0%  
-	[118, inf)     0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks__10KB	     200	  39416624 ns/op	   0.05 MB/s
+	[  1,   2)    16    0.8%    0.8%  
+	[  2,   3)   597   29.9%   30.7%  ###
+	[  3,   4)   522   26.1%   56.8%  ###
+	[  4,   5)   321   16.1%   72.8%  ##
+	[  5,   7)   331   16.6%   89.4%  ##
+	[  7,   9)    57    2.9%   92.2%  
+	[  9,  12)    30    1.5%   93.7%  
+	[ 12,  16)    65    3.2%   97.0%  
+	[ 16,  21)    25    1.2%   98.2%  
+	[ 21,  28)    36    1.8%  100.0%  
+	[ 28,  36)     0    0.0%  100.0%  
+	[ 36,  46)     0    0.0%  100.0%  
+	[ 46,  59)     0    0.0%  100.0%  
+	[ 59,  75)     0    0.0%  100.0%  
+	[ 75,  95)     0    0.0%  100.0%  
+	[ 95, 120)     0    0.0%  100.0%  
+	[120, inf)     0    0.0%  100.0%  
+Benchmark___1KB_mux__100_chunks__10KB	     200	  41306487 ns/op	   0.05 MB/s
 --- Histogram (unit: ms)
-	Count: 200  Min: 14  Max: 57  Avg: 38.98
+	Count: 200  Min: 14  Max: 62  Avg: 40.84
 	------------------------------------------------------------
-	[ 14,  15)    2    1.0%    1.0%  
-	[ 15,  16)    0    0.0%    1.0%  
-	[ 16,  17)    0    0.0%    1.0%  
-	[ 17,  19)    2    1.0%    2.0%  
-	[ 19,  21)    0    0.0%    2.0%  
-	[ 21,  24)    0    0.0%    2.0%  
-	[ 24,  28)    0    0.0%    2.0%  
-	[ 28,  33)    4    2.0%    4.0%  
-	[ 33,  40)  130   65.0%   69.0%  #######
-	[ 40,  49)   16    8.0%   77.0%  #
-	[ 49,  61)   46   23.0%  100.0%  ##
-	[ 61,  76)    0    0.0%  100.0%  
-	[ 76,  96)    0    0.0%  100.0%  
-	[ 96, 122)    0    0.0%  100.0%  
-	[122, 155)    0    0.0%  100.0%  
-	[155, 198)    0    0.0%  100.0%  
-	[198, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux__100_chunks__10KB-2	     500	  13370112 ns/op	   0.15 MB/s
+	[ 14,  15)    1    0.5%    0.5%  
+	[ 15,  16)    0    0.0%    0.5%  
+	[ 16,  17)    1    0.5%    1.0%  
+	[ 17,  19)    0    0.0%    1.0%  
+	[ 19,  21)    0    0.0%    1.0%  
+	[ 21,  24)    1    0.5%    1.5%  
+	[ 24,  28)    0    0.0%    1.5%  
+	[ 28,  34)    7    3.5%    5.0%  
+	[ 34,  41)  123   61.5%   66.5%  ######
+	[ 41,  51)   20   10.0%   76.5%  #
+	[ 51,  64)   47   23.5%  100.0%  ##
+	[ 64,  81)    0    0.0%  100.0%  
+	[ 81, 103)    0    0.0%  100.0%  
+	[103, 131)    0    0.0%  100.0%  
+	[131, 168)    0    0.0%  100.0%  
+	[168, 215)    0    0.0%  100.0%  
+	[215, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux__100_chunks__10KB-2	     500	  13333632 ns/op	   0.15 MB/s
 --- Histogram (unit: ms)
 	Count: 500  Min: 1  Max: 35  Avg: 12.88
 	------------------------------------------------------------
 	[  1,   2)    6    1.2%    1.2%  
-	[  2,   3)   94   18.8%   20.0%  ##
-	[  3,   4)   29    5.8%   25.8%  #
-	[  4,   6)   22    4.4%   30.2%  
-	[  6,   8)   15    3.0%   33.2%  
-	[  8,  11)   55   11.0%   44.2%  #
-	[ 11,  15)   31    6.2%   50.4%  #
-	[ 15,  20)  174   34.8%   85.2%  ###
-	[ 20,  26)   14    2.8%   88.0%  
-	[ 26,  34)   54   10.8%   98.8%  #
-	[ 34,  44)    6    1.2%  100.0%  
+	[  2,   3)   85   17.0%   18.2%  ##
+	[  3,   4)   28    5.6%   23.8%  #
+	[  4,   6)   21    4.2%   28.0%  
+	[  6,   8)   24    4.8%   32.8%  
+	[  8,  11)   58   11.6%   44.4%  #
+	[ 11,  15)   41    8.2%   52.6%  #
+	[ 15,  20)  164   32.8%   85.4%  ###
+	[ 20,  26)   11    2.2%   87.6%  
+	[ 26,  34)   59   11.8%   99.4%  #
+	[ 34,  44)    3    0.6%  100.0%  
 	[ 44,  57)    0    0.0%  100.0%  
 	[ 57,  73)    0    0.0%  100.0%  
 	[ 73,  94)    0    0.0%  100.0%  
 	[ 94, 120)    0    0.0%  100.0%  
 	[120, 153)    0    0.0%  100.0%  
 	[153, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks___10B	     100	  95315574 ns/op	   0.02 MB/s
+Benchmark___1KB_mux___1K_chunks___10B	     100	  95489036 ns/op	   0.02 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 23  Max: 150  Avg: 94.81
+	Count: 100  Min: 6  Max: 149  Avg: 95.00
 	------------------------------------------------------------
-	[ 23,  24)    1    1.0%    1.0%  
-	[ 24,  25)    0    0.0%    1.0%  
-	[ 25,  26)    0    0.0%    1.0%  
-	[ 26,  28)    1    1.0%    2.0%  
-	[ 28,  31)    0    0.0%    2.0%  
-	[ 31,  36)    1    1.0%    3.0%  
-	[ 36,  42)    2    2.0%    5.0%  
-	[ 42,  51)    5    5.0%   10.0%  #
-	[ 51,  64)    7    7.0%   17.0%  #
-	[ 64,  82)   17   17.0%   34.0%  ##
-	[ 82, 107)   24   24.0%   58.0%  ##
-	[107, 141)   38   38.0%   96.0%  ####
-	[141, 189)    4    4.0%  100.0%  
-	[189, 255)    0    0.0%  100.0%  
-	[255, 346)    0    0.0%  100.0%  
-	[346, 472)    0    0.0%  100.0%  
-	[472, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks___10B-2	    2000	   5107260 ns/op	   0.39 MB/s
+	[  6,   7)    1    1.0%    1.0%  
+	[  7,   8)    0    0.0%    1.0%  
+	[  8,   9)    0    0.0%    1.0%  
+	[  9,  11)    1    1.0%    2.0%  
+	[ 11,  14)    0    0.0%    2.0%  
+	[ 14,  19)    0    0.0%    2.0%  
+	[ 19,  26)    0    0.0%    2.0%  
+	[ 26,  36)    3    3.0%    5.0%  
+	[ 36,  50)    8    8.0%   13.0%  #
+	[ 50,  69)   10   10.0%   23.0%  #
+	[ 69,  96)   21   21.0%   44.0%  ##
+	[ 96, 134)   38   38.0%   82.0%  ####
+	[134, 186)   18   18.0%  100.0%  ##
+	[186, 259)    0    0.0%  100.0%  
+	[259, 361)    0    0.0%  100.0%  
+	[361, 504)    0    0.0%  100.0%  
+	[504, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux___1K_chunks___10B-2	    2000	   5187056 ns/op	   0.39 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 46  Avg: 4.61
+	Count: 2000  Min: 1  Max: 49  Avg: 4.70
 	------------------------------------------------------------
-	[  1,   2)    15    0.8%    0.8%  
-	[  2,   3)   792   39.6%   40.4%  ####
-	[  3,   4)   669   33.5%   73.8%  ###
-	[  4,   6)   289   14.5%   88.2%  #
-	[  6,   8)    28    1.4%   89.7%  
-	[  8,  11)    23    1.2%   90.8%  
-	[ 11,  15)    34    1.7%   92.5%  
-	[ 15,  20)    36    1.8%   94.3%  
-	[ 20,  27)    71    3.6%   97.9%  
-	[ 27,  36)    37    1.9%   99.7%  
-	[ 36,  48)     6    0.3%  100.0%  
-	[ 48,  64)     0    0.0%  100.0%  
-	[ 64,  85)     0    0.0%  100.0%  
-	[ 85, 112)     0    0.0%  100.0%  
-	[112, 146)     0    0.0%  100.0%  
-	[146, 190)     0    0.0%  100.0%  
-	[190, inf)     0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks__100B	     100	  94447578 ns/op	   0.02 MB/s
+	[  1,   2)    19    1.0%    1.0%  
+	[  2,   3)   848   42.4%   43.4%  ####
+	[  3,   4)   637   31.9%   75.2%  ###
+	[  4,   6)   247   12.4%   87.6%  #
+	[  6,   8)    26    1.3%   88.9%  
+	[  8,  11)    19    1.0%   89.8%  
+	[ 11,  15)    44    2.2%   92.0%  
+	[ 15,  21)    40    2.0%   94.0%  
+	[ 21,  28)    93    4.7%   98.7%  
+	[ 28,  38)    24    1.2%   99.9%  
+	[ 38,  51)     3    0.2%  100.0%  
+	[ 51,  68)     0    0.0%  100.0%  
+	[ 68,  90)     0    0.0%  100.0%  
+	[ 90, 118)     0    0.0%  100.0%  
+	[118, 155)     0    0.0%  100.0%  
+	[155, 202)     0    0.0%  100.0%  
+	[202, inf)     0    0.0%  100.0%  
+Benchmark___1KB_mux___1K_chunks__100B	     100	  96851485 ns/op	   0.02 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 2  Max: 149  Avg: 93.96
+	Count: 100  Min: 16  Max: 168  Avg: 96.35
 	------------------------------------------------------------
-	[  2,   3)    1    1.0%    1.0%  
-	[  3,   4)    0    0.0%    1.0%  
-	[  4,   5)    0    0.0%    1.0%  
-	[  5,   7)    0    0.0%    1.0%  
-	[  7,  10)    2    2.0%    3.0%  
-	[ 10,  15)    0    0.0%    3.0%  
-	[ 15,  22)    1    1.0%    4.0%  
-	[ 22,  32)    2    2.0%    6.0%  
-	[ 32,  46)    7    7.0%   13.0%  #
-	[ 46,  65)    9    9.0%   22.0%  #
-	[ 65,  92)   20   20.0%   42.0%  ##
-	[ 92, 130)   40   40.0%   82.0%  ####
-	[130, 184)   18   18.0%  100.0%  ##
-	[184, 259)    0    0.0%  100.0%  
-	[259, 364)    0    0.0%  100.0%  
-	[364, 511)    0    0.0%  100.0%  
-	[511, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks__100B-2	    2000	   5333802 ns/op	   0.37 MB/s
+	[ 16,  17)    1    1.0%    1.0%  
+	[ 17,  18)    1    1.0%    2.0%  
+	[ 18,  19)    0    0.0%    2.0%  
+	[ 19,  21)    0    0.0%    2.0%  
+	[ 21,  24)    0    0.0%    2.0%  
+	[ 24,  29)    2    2.0%    4.0%  
+	[ 29,  36)    2    2.0%    6.0%  
+	[ 36,  46)    2    2.0%    8.0%  
+	[ 46,  60)    7    7.0%   15.0%  #
+	[ 60,  80)   16   16.0%   31.0%  ##
+	[ 80, 108)   29   29.0%   60.0%  ###
+	[108, 147)   36   36.0%   96.0%  ####
+	[147, 202)    4    4.0%  100.0%  
+	[202, 279)    0    0.0%  100.0%  
+	[279, 387)    0    0.0%  100.0%  
+	[387, 538)    0    0.0%  100.0%  
+	[538, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux___1K_chunks__100B-2	    2000	   5385397 ns/op	   0.37 MB/s
 --- Histogram (unit: ms)
-	Count: 2000  Min: 1  Max: 55  Avg: 4.84
+	Count: 2000  Min: 1  Max: 56  Avg: 4.88
 	------------------------------------------------------------
-	[  1,   2)    16    0.8%    0.8%  
-	[  2,   3)   766   38.3%   39.1%  ####
-	[  3,   4)   670   33.5%   72.6%  ###
-	[  4,   6)   318   15.9%   88.5%  ##
-	[  6,   8)    36    1.8%   90.3%  
-	[  8,  11)    12    0.6%   90.9%  
-	[ 11,  15)    26    1.3%   92.2%  
-	[ 15,  21)    46    2.3%   94.5%  
-	[ 21,  29)    65    3.2%   97.8%  
-	[ 29,  39)    34    1.7%   99.5%  
-	[ 39,  53)     7    0.4%   99.8%  
-	[ 53,  71)     4    0.2%  100.0%  
-	[ 71,  95)     0    0.0%  100.0%  
-	[ 95, 126)     0    0.0%  100.0%  
-	[126, 167)     0    0.0%  100.0%  
-	[167, 221)     0    0.0%  100.0%  
-	[221, inf)     0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks___1KB	     100	 106144273 ns/op	   0.02 MB/s
+	[  1,   2)    22    1.1%    1.1%  
+	[  2,   3)   822   41.1%   42.2%  ####
+	[  3,   4)   657   32.9%   75.0%  ###
+	[  4,   6)   262   13.1%   88.2%  #
+	[  6,   8)    33    1.7%   89.8%  
+	[  8,  11)    15    0.8%   90.6%  
+	[ 11,  15)    16    0.8%   91.4%  
+	[ 15,  21)    40    2.0%   93.4%  
+	[ 21,  29)    93    4.7%   98.0%  
+	[ 29,  40)    29    1.5%   99.5%  
+	[ 40,  54)    10    0.5%  100.0%  
+	[ 54,  72)     1    0.1%  100.0%  
+	[ 72,  96)     0    0.0%  100.0%  
+	[ 96, 128)     0    0.0%  100.0%  
+	[128, 170)     0    0.0%  100.0%  
+	[170, 225)     0    0.0%  100.0%  
+	[225, inf)     0    0.0%  100.0%  
+Benchmark___1KB_mux___1K_chunks___1KB	     100	 110514593 ns/op	   0.02 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 6  Max: 173  Avg: 105.63
+	Count: 100  Min: 6  Max: 174  Avg: 110.01
 	------------------------------------------------------------
 	[  6,   7)    1    1.0%    1.0%  
 	[  7,   8)    0    0.0%    1.0%  
 	[  8,   9)    0    0.0%    1.0%  
 	[  9,  11)    0    0.0%    1.0%  
 	[ 11,  14)    1    1.0%    2.0%  
-	[ 14,  19)    3    3.0%    5.0%  
-	[ 19,  26)    1    1.0%    6.0%  
-	[ 26,  36)    4    4.0%   10.0%  
-	[ 36,  51)    4    4.0%   14.0%  
-	[ 51,  72)    8    8.0%   22.0%  #
-	[ 72, 102)   24   24.0%   46.0%  ##
-	[102, 144)   26   26.0%   72.0%  ###
-	[144, 204)   28   28.0%  100.0%  ###
+	[ 14,  19)    1    1.0%    3.0%  
+	[ 19,  26)    1    1.0%    4.0%  
+	[ 26,  36)    3    3.0%    7.0%  
+	[ 36,  51)    3    3.0%   10.0%  
+	[ 51,  72)   13   13.0%   23.0%  #
+	[ 72, 102)   23   23.0%   46.0%  ##
+	[102, 144)   19   19.0%   65.0%  ##
+	[144, 204)   35   35.0%  100.0%  ####
 	[204, 288)    0    0.0%  100.0%  
-	[288, 406)    0    0.0%  100.0%  
-	[406, 573)    0    0.0%  100.0%  
-	[573, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks___1KB-2	    1000	   7132495 ns/op	   0.28 MB/s
+	[288, 407)    0    0.0%  100.0%  
+	[407, 575)    0    0.0%  100.0%  
+	[575, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux___1K_chunks___1KB-2	    1000	   7283778 ns/op	   0.27 MB/s
 --- Histogram (unit: ms)
-	Count: 1000  Min: 1  Max: 43  Avg: 6.64
+	Count: 1000  Min: 1  Max: 44  Avg: 6.78
 	------------------------------------------------------------
-	[  1,   2)    24    2.4%    2.4%  
-	[  2,   3)   286   28.6%   31.0%  ###
-	[  3,   4)   272   27.2%   58.2%  ###
-	[  4,   6)   217   21.7%   79.9%  ##
-	[  6,   8)    44    4.4%   84.3%  
-	[  8,  11)    15    1.5%   85.8%  
-	[ 11,  15)    11    1.1%   86.9%  
-	[ 15,  20)    19    1.9%   88.8%  
-	[ 20,  27)    14    1.4%   90.2%  
-	[ 27,  36)    87    8.7%   98.9%  #
-	[ 36,  48)    11    1.1%  100.0%  
+	[  1,   2)    23    2.3%    2.3%  
+	[  2,   3)   268   26.8%   29.1%  ###
+	[  3,   4)   295   29.5%   58.6%  ###
+	[  4,   6)   204   20.4%   79.0%  ##
+	[  6,   8)    51    5.1%   84.1%  #
+	[  8,  11)    13    1.3%   85.4%  
+	[ 11,  15)     9    0.9%   86.3%  
+	[ 15,  20)    29    2.9%   89.2%  
+	[ 20,  27)    12    1.2%   90.4%  
+	[ 27,  36)    80    8.0%   98.4%  #
+	[ 36,  48)    16    1.6%  100.0%  
 	[ 48,  63)     0    0.0%  100.0%  
-	[ 63,  82)     0    0.0%  100.0%  
-	[ 82, 107)     0    0.0%  100.0%  
-	[107, 139)     0    0.0%  100.0%  
-	[139, 181)     0    0.0%  100.0%  
-	[181, inf)     0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks__10KB	     100	  75825411 ns/op	   0.03 MB/s
+	[ 63,  83)     0    0.0%  100.0%  
+	[ 83, 109)     0    0.0%  100.0%  
+	[109, 142)     0    0.0%  100.0%  
+	[142, 185)     0    0.0%  100.0%  
+	[185, inf)     0    0.0%  100.0%  
+Benchmark___1KB_mux___1K_chunks__10KB	     100	  76530881 ns/op	   0.03 MB/s
 --- Histogram (unit: ms)
-	Count: 100  Min: 3  Max: 130  Avg: 75.35
+	Count: 100  Min: 17  Max: 137  Avg: 75.99
 	------------------------------------------------------------
-	[  3,   4)    1    1.0%    1.0%  
-	[  4,   5)    0    0.0%    1.0%  
-	[  5,   6)    0    0.0%    1.0%  
-	[  6,   8)    0    0.0%    1.0%  
-	[  8,  11)    0    0.0%    1.0%  
-	[ 11,  16)    0    0.0%    1.0%  
-	[ 16,  22)    4    4.0%    5.0%  
-	[ 22,  31)    0    0.0%    5.0%  
-	[ 31,  44)    7    7.0%   12.0%  #
-	[ 44,  62)   14   14.0%   26.0%  #
-	[ 62,  87)   38   38.0%   64.0%  ####
-	[ 87, 121)   29   29.0%   93.0%  ###
-	[121, 169)    7    7.0%  100.0%  #
-	[169, 235)    0    0.0%  100.0%  
-	[235, 326)    0    0.0%  100.0%  
-	[326, 452)    0    0.0%  100.0%  
-	[452, inf)    0    0.0%  100.0%  
-Benchmark___1KB_mux___1K_chunks__10KB-2	     200	  38383294 ns/op	   0.05 MB/s
+	[ 17,  18)    6    6.0%    6.0%  #
+	[ 18,  19)    0    0.0%    6.0%  
+	[ 19,  20)    1    1.0%    7.0%  
+	[ 20,  22)    2    2.0%    9.0%  
+	[ 22,  25)    0    0.0%    9.0%  
+	[ 25,  29)    0    0.0%    9.0%  
+	[ 29,  35)    0    0.0%    9.0%  
+	[ 35,  44)    5    5.0%   14.0%  #
+	[ 44,  56)   10   10.0%   24.0%  #
+	[ 56,  73)   20   20.0%   44.0%  ##
+	[ 73,  97)   27   27.0%   71.0%  ###
+	[ 97, 130)   28   28.0%   99.0%  ###
+	[130, 176)    1    1.0%  100.0%  
+	[176, 239)    0    0.0%  100.0%  
+	[239, 326)    0    0.0%  100.0%  
+	[326, 445)    0    0.0%  100.0%  
+	[445, inf)    0    0.0%  100.0%  
+Benchmark___1KB_mux___1K_chunks__10KB-2	     200	  38503258 ns/op	   0.05 MB/s
 --- Histogram (unit: ms)
-	Count: 200  Min: 1  Max: 81  Avg: 37.88
+	Count: 200  Min: 2  Max: 80  Avg: 38.01
 	------------------------------------------------------------
-	[  1,   2)    1    0.5%    0.5%  
-	[  2,   3)   10    5.0%    5.5%  #
-	[  3,   4)    4    2.0%    7.5%  
-	[  4,   6)    3    1.5%    9.0%  
-	[  6,   9)    9    4.5%   13.5%  
-	[  9,  13)    3    1.5%   15.0%  
-	[ 13,  18)   12    6.0%   21.0%  #
-	[ 18,  25)    7    3.5%   24.5%  
-	[ 25,  35)   37   18.5%   43.0%  ##
-	[ 35,  48)   46   23.0%   66.0%  ##
-	[ 48,  66)   48   24.0%   90.0%  ##
-	[ 66,  90)   20   10.0%  100.0%  #
-	[ 90, 123)    0    0.0%  100.0%  
-	[123, 167)    0    0.0%  100.0%  
-	[167, 226)    0    0.0%  100.0%  
-	[226, 305)    0    0.0%  100.0%  
-	[305, inf)    0    0.0%  100.0%  
+	[  2,   3)   10    5.0%    5.0%  #
+	[  3,   4)    1    0.5%    5.5%  
+	[  4,   5)    2    1.0%    6.5%  
+	[  5,   7)    4    2.0%    8.5%  
+	[  7,  10)    5    2.5%   11.0%  
+	[ 10,  14)   12    6.0%   17.0%  #
+	[ 14,  19)    4    2.0%   19.0%  
+	[ 19,  26)   12    6.0%   25.0%  #
+	[ 26,  36)   36   18.0%   43.0%  ##
+	[ 36,  49)   54   27.0%   70.0%  ###
+	[ 49,  67)   47   23.5%   93.5%  ##
+	[ 67,  91)   13    6.5%  100.0%  #
+	[ 91, 123)    0    0.0%  100.0%  
+	[123, 166)    0    0.0%  100.0%  
+	[166, 224)    0    0.0%  100.0%  
+	[224, 302)    0    0.0%  100.0%  
+	[302, inf)    0    0.0%  100.0%  
diff --git a/runtimes/google/ipc/benchmark/client.go b/runtimes/google/ipc/benchmark/client.go
index 2ecdae8..c29f942 100644
--- a/runtimes/google/ipc/benchmark/client.go
+++ b/runtimes/google/ipc/benchmark/client.go
@@ -107,7 +107,7 @@
 					}
 				}
 				if i != chunkCnt {
-					rDone <- fmt.Errorf("EchoStream returned %d chunks, but expected %d", n, chunkCnt)
+					rDone <- fmt.Errorf("EchoStream returned %d chunks, but expected %d", i, chunkCnt)
 					return
 				}
 				rDone <- rStream.Err()
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index a534864..15c86de 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -112,7 +112,6 @@
 }
 
 var _ ipc.Client = (*client)(nil)
-var _ ipc.BindOpt = (*client)(nil)
 
 type vcInfo struct {
 	vc       stream.VC
@@ -686,11 +685,6 @@
 	c.vcMapMu.Unlock()
 }
 
-// IPCBindOpt makes client implement BindOpt.
-func (c *client) IPCBindOpt() {
-	//nologcall
-}
-
 // flowClient implements the RPC client-side protocol for a single RPC, over a
 // flow that's already connected to the server.
 type flowClient struct {
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 3e85647..da0d385 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -69,16 +69,6 @@
 	c.Unlock()
 }
 
-type fakeTimeCaveat int
-
-func (c fakeTimeCaveat) Validate(security.Context) error {
-	now := clock.Now()
-	if now > int(c) {
-		return fmt.Errorf("fakeTimeCaveat expired: now=%d > then=%d", now, c)
-	}
-	return nil
-}
-
 // We need a special way to create contexts for tests.  We
 // can't create a real runtime in the runtime implementation
 // so we use a fake one that panics if used.  The runtime
@@ -195,15 +185,26 @@
 type dischargeServer struct{}
 
 func (*dischargeServer) Discharge(ctx ipc.ServerCall, cav vdl.AnyRep, _ security.DischargeImpetus) (vdl.AnyRep, error) {
-	c, ok := cav.(security.ThirdPartyCaveat)
-	if !ok {
-		return nil, fmt.Errorf("discharger: unknown caveat(%T)", cav)
+	// TODO(ashankar): During refactoring, this "if" statement must remain.
+	// After security.Caveat.ValidatorVOM is removed, the "else" part can go away.
+	var tpc security.ThirdPartyCaveat
+	if c, ok := cav.(security.Caveat); ok {
+		tpc = c.ThirdPartyDetails()
+	} else {
+		tpc, _ = cav.(security.ThirdPartyCaveat)
 	}
-	if err := c.Dischargeable(ctx); err != nil {
-		return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", c, err)
+	if tpc == nil {
+		return nil, fmt.Errorf("discharger: %T does not represent a third-party caveat", cav)
+	}
+	if err := tpc.Dischargeable(ctx); err != nil {
+		return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
 	}
 	// Add a fakeTimeCaveat to be able to control discharge expiration via 'clock'.
-	return ctx.LocalPrincipal().MintDischarge(c, newCaveat(fakeTimeCaveat(clock.Now())))
+	expiry, err := security.NewCaveat(fakeTimeCaveat, clock.Now())
+	if err != nil {
+		return nil, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
+	}
+	return ctx.LocalPrincipal().MintDischarge(cav, expiry)
 }
 
 func startServer(t *testing.T, principal security.Principal, sm stream.Manager, ns naming.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
@@ -751,7 +752,7 @@
 	if err != nil {
 		panic(err)
 	}
-	return newCaveat(tpc)
+	return tpc
 }
 
 // dischargeTestServer implements the discharge service. Always fails to
@@ -784,14 +785,10 @@
 
 		mkClient = func(req security.ThirdPartyRequirements) vc.LocalPrincipal {
 			// Setup the client so that it shares a blessing with a third-party caveat with the server.
-			tpc, err := security.NewPublicKeyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", req, security.UnconstrainedUse())
+			cav, err := security.NewPublicKeyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", req, security.UnconstrainedUse())
 			if err != nil {
 				t.Fatalf("Failed to create ThirdPartyCaveat(%+v): %v", req, err)
 			}
-			cav, err := security.NewCaveat(tpc)
-			if err != nil {
-				t.Fatal(err)
-			}
 			b, err := pclient.BlessSelf("client_for_server", cav)
 			if err != nil {
 				t.Fatalf("BlessSelf failed: %v", err)
@@ -1632,7 +1629,7 @@
 	if err != nil {
 		t.Error(err)
 	}
-	dc.PrepareDischarges(testContext(), []security.ThirdPartyCaveat{tpcav2}, security.DischargeImpetus{})
+	dc.PrepareDischarges(testContext(), []security.ThirdPartyCaveat{tpcav2.ThirdPartyDetails()}, security.DischargeImpetus{})
 
 	// Ensure that discharger1 was not called and discharger2 was called.
 	if discharger1.called {
@@ -1745,11 +1742,18 @@
 	clientB.Close()
 }
 
-func init() {
-	vdl.Register(fakeTimeCaveat(0))
+var fakeTimeCaveat = security.CaveatDescriptor{
+	Id:        uniqueid.Id{0x18, 0xba, 0x6f, 0x84, 0xd5, 0xec, 0xdb, 0x9b, 0xf2, 0x32, 0x19, 0x5b, 0x53, 0x92, 0x80, 0x0},
+	ParamType: vdl.TypeOf(int64(0)),
 }
 
 func TestMain(m *testing.M) {
 	testutil.Init()
+	security.RegisterCaveatValidator(fakeTimeCaveat, func(_ security.Context, t int64) error {
+		if now := clock.Now(); now > int(t) {
+			return fmt.Errorf("fakeTimeCaveat expired: now=%d > then=%d", now, t)
+		}
+		return nil
+	})
 	os.Exit(m.Run())
 }
diff --git a/runtimes/google/ipc/stream/vc/vc_test.go b/runtimes/google/ipc/stream/vc/vc_test.go
index 05f4edd..81c1ece 100644
--- a/runtimes/google/ipc/stream/vc/vc_test.go
+++ b/runtimes/google/ipc/stream/vc/vc_test.go
@@ -180,13 +180,6 @@
 var _ vc.DischargeClient = (mockDischargeClient)(nil)
 
 func TestHandshakeWithDischargesTLS(t *testing.T) {
-	newCaveat := func(validator security.CaveatValidator) security.Caveat {
-		cav, err := security.NewCaveat(validator)
-		if err != nil {
-			t.Fatal(err)
-		}
-		return cav
-	}
 	var (
 		discharger = tsecurity.NewPrincipal("discharger")
 		client     = tsecurity.NewPrincipal()
@@ -204,10 +197,10 @@
 
 	// Setup 'client' and 'server' so that they use a blessing from 'root' with a third-party caveat
 	// during VC handshake.
-	if err := root.Bless(client, "client", newCaveat(tpcav)); err != nil {
+	if err := root.Bless(client, "client", tpcav); err != nil {
 		t.Fatal(err)
 	}
-	if err := root.Bless(server, "server", newCaveat(tpcav)); err != nil {
+	if err := root.Bless(server, "server", tpcav); err != nil {
 		t.Fatal(err)
 	}
 
diff --git a/runtimes/google/ipc/testutil_test.go b/runtimes/google/ipc/testutil_test.go
index 01f9444..7eb79eb 100644
--- a/runtimes/google/ipc/testutil_test.go
+++ b/runtimes/google/ipc/testutil_test.go
@@ -50,14 +50,6 @@
 	}
 }
 
-func newCaveat(v security.CaveatValidator) security.Caveat {
-	cav, err := security.NewCaveat(v)
-	if err != nil {
-		panic(err)
-	}
-	return cav
-}
-
 func mkCaveat(cav security.Caveat, err error) security.Caveat {
 	if err != nil {
 		panic(err)
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index 170cfac..f57b00c 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -167,11 +167,11 @@
 }
 
 func runMT(t *testing.T, ctx *context.T, mountPoint string) *serverEntry {
-	mt, err := service.NewMountTable("")
+	mtd, err := service.NewMountTableDispatcher("")
 	if err != nil {
-		boom(t, "NewMountTable returned error: %v", err)
+		boom(t, "NewMountTableDispatcher returned error: %v", err)
 	}
-	return run(t, ctx, mt, mountPoint, true)
+	return run(t, ctx, mtd, mountPoint, true)
 }
 
 func run(t *testing.T, ctx *context.T, disp ipc.Dispatcher, mountPoint string, mt bool) *serverEntry {
diff --git a/runtimes/google/naming/namespace/glob.go b/runtimes/google/naming/namespace/glob.go
index 0b85a21..d79f099 100644
--- a/runtimes/google/naming/namespace/glob.go
+++ b/runtimes/google/naming/namespace/glob.go
@@ -1,7 +1,6 @@
 package namespace
 
 import (
-	"container/list"
 	"io"
 	"strings"
 
@@ -16,106 +15,197 @@
 	"v.io/core/veyron2/vlog"
 )
 
-const mountTableGlobReplyStreamLength = 100
-
-type queuedEntry struct {
-	me    *naming.MountEntry
-	depth int // number of mount tables traversed recursively
+// task is a sub-glob that has to be performed against a mount table.  Tasks are
+// done in parrallel to speed up the glob.
+type task struct {
+	pattern *glob.Glob         // pattern to match
+	me      *naming.MountEntry // server to match at
+	depth   int                // number of mount tables traversed recursively
 }
 
-// globAtServer performs a Glob at a single server and adds any results to the list.  Paramters are:
-//   server    the server to perform the glob at.  This may include multiple names for different
-//             instances of the same server.
-//   pelems    the pattern to match relative to the mounted subtree.
-//   l         the list to add results to.
-//   recursive true to continue below the matched pattern
-func (ns *namespace) globAtServer(ctx *context.T, qe *queuedEntry, pattern *glob.Glob, l *list.List) error {
-	server := qe.me
+// globAtServer performs a Glob on the servers at a mount point.  It cycles through the set of
+// servers until it finds one that replies.
+func (ns *namespace) globAtServer(ctx *context.T, t *task, replies chan *task) {
+	defer func() {
+		if t.me.Error == nil {
+			replies <- nil
+		} else {
+			replies <- t
+		}
+	}()
 	client := veyron2.GetClient(ctx)
-	pstr := pattern.String()
-	vlog.VI(2).Infof("globAtServer(%v, %v)", *server, pstr)
+	pstr := t.pattern.String()
+	vlog.VI(2).Infof("globAtServer(%v, %v)", *t.me, pstr)
 
+	// We collect errors trying to connect to servers so that we have something to
+	// return if we go through them all and noone answers.
 	var lastErr error
+
 	// Trying each instance till we get one that works.
-	for _, s := range server.Servers {
-		// If the pattern is finished (so we're only querying about the root on the
-		// remote server) and the server is not another MT, then we needn't send the
-		// query on since we know the server will not supply a new address for the
-		// current name.
-		if pattern.Finished() {
-			if !server.ServesMountTable() {
-				return nil
-			}
-		}
-
-		// If this is restricted recursive and not a mount table, don't
-		// descend into it.
-		if pattern.Restricted() && !server.ServesMountTable() && pattern.Len() == 0 {
-			return nil
-		}
-
+	for _, s := range t.me.Servers {
 		// Don't further resolve s.Server.
 		callCtx, _ := context.WithTimeout(ctx, callTimeout)
-		// Make sure that we turn the s.Server address or name into a rooted name.
-		serverName := naming.JoinAddressName(s.Server, "")
-		call, err := client.StartCall(callCtx, serverName, ipc.GlobMethod, []interface{}{pstr}, options.NoResolve{})
+		call, err := client.StartCall(callCtx, naming.JoinAddressName(s.Server, ""), ipc.GlobMethod, []interface{}{pstr}, options.NoResolve{})
 		if err != nil {
 			lastErr = err
 			continue // try another instance
 		}
 
-		// At this point we're commited to a server since it answered tha call.
+		// At this point we're commited to a server since it answered the call.   Cycle
+		// through all replies from that server.
 		for {
+			// If the mount table returns an error, we're done.  Send the task to the channel
+			// including the error.  This terminates the task.
 			var e naming.VDLMountEntry
 			err := call.Recv(&e)
 			if err == io.EOF {
 				break
 			}
 			if err != nil {
-				return err
+				t.me.Error = err
+				return
 			}
 
-			// Prefix the results with the path of the mount point.
-			e.Name = naming.Join(server.Name, e.Name)
-
 			// Convert to the ever so slightly different name.MountTable version of a MountEntry
 			// and add it to the list.
-			x := &queuedEntry{
+			x := &task{
 				me: &naming.MountEntry{
-					Name:    e.Name,
+					Name:    naming.Join(t.me.Name, e.Name),
 					Servers: convertServers(e.Servers),
 				},
-				depth: qe.depth,
+				depth: t.depth + 1,
 			}
 			x.me.SetServesMountTable(e.MT)
-			// x.depth is the number of severs we've walked through since we've gone
-			// recursive (i.e. with pattern length of 0).
-			if pattern.Len() == 0 {
-				if x.depth++; x.depth > ns.maxRecursiveGlobDepth {
+
+			// x.depth is the number of servers we've walked through since we've gone
+			// recursive (i.e. with pattern length of 0).  Limit the depth of globs.
+			// TODO(p): return an error?
+			if t.pattern.Len() == 0 {
+				if x.depth > ns.maxRecursiveGlobDepth {
 					continue
 				}
 			}
-			l.PushBack(x)
+			replies <- x
 		}
 
 		var globerr error
 		if err := call.Finish(&globerr); err != nil {
-			return err
+			globerr = err
 		}
-		return globerr
+		t.me.Error = globerr
+		return
 	}
 
-	return lastErr
+	// Just soak up the last error (if any).
+	t.me.Error = lastErr
+}
+
+// depth returns the directory depth of a given name.  It is used to pick off the unsatisfied part of the pattern.
+func depth(name string) int {
+	name = strings.Trim(naming.Clean(name), "/")
+	if name == "" {
+		return 0
+	}
+	return strings.Count(name, "/") + 1
+}
+
+// globLoop fires off a go routine for each server and read backs replies.
+func (ns *namespace) globLoop(ctx *context.T, e *naming.MountEntry, prefix string, pattern *glob.Glob, reply chan naming.MountEntry) {
+	defer close(reply)
+
+	// Provide enough buffers to avoid too much switching between the readers and the writers.
+	// This size is just a guess.
+	replies := make(chan *task, 100)
+	defer close(replies)
+
+	// Push the first task into the channel to start the ball rolling.  This task has the
+	// root of the search and the full pattern.  It will be the first task fired off in the for
+	// loop that follows.
+	replies <- &task{me: e, pattern: pattern}
+	inFlight := 0
+
+	// Perform a parallel search of the name graph.  Each task will send what it learns
+	// on the replies channel.  If the reply is a mount point and the pattern is not completely
+	// fulfilled, a new task will be fired off to handle it.
+	for {
+		select {
+		case t := <-replies:
+			// A nil reply represents a successfully terminated task.
+			// If no tasks are running, return.
+			if t == nil {
+				if inFlight--; inFlight <= 0 {
+					return
+				}
+				continue
+			}
+
+			// We want to output this entry if there was a real error other than
+			// "not a mount table".
+			// TODO(p): return errors on a different reply channel?
+			//
+			// An error reply is also a terminated task.
+			// If no tasks are running, return.
+			if t.me.Error != nil {
+				if !notAnMT(t.me.Error) {
+					t.me.Name = naming.Join(prefix, t.me.Name)
+					reply <- *t.me
+				}
+				if inFlight--; inFlight <= 0 {
+					return
+				}
+				continue
+			}
+
+			// Get the pattern elements below the current path.
+			suffix := pattern.Split(depth(t.me.Name))
+
+			// If we've satisfied the request and this isn't the root,
+			// reply to the caller.
+			if suffix.Len() == 0 && t.depth != 0 {
+				x := *t.me
+				x.Name = naming.Join(prefix, x.Name)
+				reply <- x
+			}
+
+			// If the pattern is finished (so we're only querying about the root on the
+			// remote server) and the server is not another MT, then we needn't send the
+			// query on since we know the server will not supply a new address for the
+			// current name.
+			if suffix.Finished() {
+				if !t.me.ServesMountTable() {
+					continue
+				}
+			}
+
+			// If this is restricted recursive and not a mount table, don't descend into it.
+			if suffix.Restricted() && suffix.Len() == 0 && !t.me.ServesMountTable() {
+				continue
+			}
+
+			// Perform a glob at the next server.
+			inFlight++
+			t.pattern = suffix
+			go ns.globAtServer(ctx, t, replies)
+		}
+	}
 }
 
 // Glob implements naming.MountTable.Glob.
 func (ns *namespace) Glob(ctx *context.T, pattern string) (chan naming.MountEntry, error) {
 	defer vlog.LogCall()()
+
+	// Root the pattern.  If we have no servers to query, give up.
 	e, patternWasRooted := ns.rootMountEntry(pattern)
 	if len(e.Servers) == 0 {
 		return nil, verror.Make(naming.ErrNoMountTable, ctx)
 	}
 
+	// If the name doesn't parse, give up.
+	g, err := glob.Parse(e.Name)
+	if err != nil {
+		return nil, err
+	}
+
 	// If pattern was already rooted, make sure we tack that root
 	// onto all returned names.  Otherwise, just return the relative
 	// name.
@@ -123,62 +213,8 @@
 	if patternWasRooted {
 		prefix = e.Servers[0].Server
 	}
-	g, err := glob.Parse(e.Name)
-	if err != nil {
-		return nil, err
-	}
 	e.Name = ""
 	reply := make(chan naming.MountEntry, 100)
 	go ns.globLoop(ctx, e, prefix, g, reply)
 	return reply, nil
 }
-
-// depth returns the directory depth of a given name.
-func depth(name string) int {
-	name = strings.Trim(naming.Clean(name), "/")
-	if name == "" {
-		return 0
-	}
-	return strings.Count(name, "/") + 1
-}
-
-func (ns *namespace) globLoop(ctx *context.T, e *naming.MountEntry, prefix string, pattern *glob.Glob, reply chan naming.MountEntry) {
-	defer close(reply)
-
-	// As we encounter new mount tables while traversing the Glob, we add them to the list 'l'.  The loop below
-	// traverses this list removing a mount table each time and calling globAtServer to perform a glob at that
-	// server.  globAtServer will send on 'reply' any terminal entries that match the glob and add any new mount
-	// tables to be traversed to the list 'l'.
-	l := list.New()
-	l.PushBack(&queuedEntry{me: e})
-	atRoot := true
-
-	// Perform a breadth first search of the name graph.
-	for le := l.Front(); le != nil; le = l.Front() {
-		l.Remove(le)
-		e := le.Value.(*queuedEntry)
-
-		// Get the pattern elements below the current path.
-		suffix := pattern.Split(depth(e.me.Name))
-
-		// Perform a glob at the server.
-		err := ns.globAtServer(ctx, e, suffix, l)
-
-		// We want to output this entry if:
-		// 1. There was a real error, we return whatever name gave us the error.
-		if err != nil && !notAnMT(err) {
-			x := *e.me
-			x.Name = naming.Join(prefix, x.Name)
-			x.Error = err
-			reply <- x
-		}
-
-		// 2. The current name fullfills the pattern.
-		if suffix.Len() == 0 && !atRoot {
-			x := *e.me
-			x.Name = naming.Join(prefix, x.Name)
-			reply <- x
-		}
-		atRoot = false
-	}
-}
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index 3d72538..95a95c1 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -59,14 +59,6 @@
 	return ret
 }
 
-func newCaveat(v security.CaveatValidator) security.Caveat {
-	cav, err := security.NewCaveat(v)
-	if err != nil {
-		panic(err)
-	}
-	return cav
-}
-
 func mkCaveat(cav security.Caveat, err error) security.Caveat {
 	if err != nil {
 		panic(err)
@@ -89,7 +81,7 @@
 	if err != nil {
 		panic(err)
 	}
-	return newCaveat(tpc)
+	return tpc
 }
 
 func startServer(ctx *context.T, s interface{}) (ipc.Server, string, error) {
diff --git a/runtimes/google/rt/security.go b/runtimes/google/rt/security.go
index e3cc484..fd3226a 100644
--- a/runtimes/google/rt/security.go
+++ b/runtimes/google/rt/security.go
@@ -81,8 +81,8 @@
 		return -1, nil
 	}
 	ifd, err := strconv.Atoi(fd)
-	if err == nil && handle != nil {
-		// If we're using a handle, children can't inherit the agent.
+	if err == nil {
+		// Don't let children accidentally inherit the agent connection.
 		syscall.CloseOnExec(ifd)
 	}
 	return ifd, err
diff --git a/runtimes/google/testing/mocks/ipc/simple_client.go b/runtimes/google/testing/mocks/ipc/simple_client.go
index e9ce243..7ce530b 100644
--- a/runtimes/google/testing/mocks/ipc/simple_client.go
+++ b/runtimes/google/testing/mocks/ipc/simple_client.go
@@ -13,18 +13,23 @@
 	"v.io/core/veyron2/vom"
 )
 
+type ClientWithTimesCalled interface {
+	ipc.Client
+	TimesCalled(method string) int
+}
+
 // NewSimpleClient creates a new mocked ipc client where the given map of method name
 // to outputs is used for evaluating the method calls.
 // It also adds some testing features such as counters for number of times a method is called
-func NewSimpleClient(methodsResults map[string][]interface{}) *SimpleMockClient {
-	return &SimpleMockClient{
+func NewSimpleClient(methodsResults map[string][]interface{}) ClientWithTimesCalled {
+	return &simpleMockClient{
 		results:     methodsResults,
 		timesCalled: make(map[string]int),
 	}
 }
 
-// SimpleMockClient implements ipc.Client
-type SimpleMockClient struct {
+// simpleMockClient implements ipc.Client
+type simpleMockClient struct {
 	// Protects timesCalled
 	sync.Mutex
 
@@ -35,17 +40,12 @@
 }
 
 // TimesCalled returns number of times the given method has been called.
-func (c *SimpleMockClient) TimesCalled(method string) int {
+func (c *simpleMockClient) TimesCalled(method string) int {
 	return c.timesCalled[method]
 }
 
-// IPCBindOpt Implements ipc.Client
-func (c *SimpleMockClient) IPCBindOpt() {
-	//nologcall
-}
-
 // StartCall Implements ipc.Client
-func (c *SimpleMockClient) StartCall(ctx *context.T, name, method string, args []interface{}, opts ...ipc.CallOpt) (ipc.Call, error) {
+func (c *simpleMockClient) StartCall(ctx *context.T, name, method string, args []interface{}, opts ...ipc.CallOpt) (ipc.Call, error) {
 	defer vlog.LogCall()()
 	results, ok := c.results[method]
 	if !ok {
@@ -77,7 +77,7 @@
 }
 
 // Close implements ipc.Client
-func (*SimpleMockClient) Close() {
+func (*simpleMockClient) Close() {
 	defer vlog.LogCall()()
 }
 
diff --git a/security/agent/agent_test.go b/security/agent/agent_test.go
index a6593f6..0c9005e 100644
--- a/security/agent/agent_test.go
+++ b/security/agent/agent_test.go
@@ -167,7 +167,7 @@
 	return
 }
 
-func (p *mockPrincipal) MintDischarge(security.ThirdPartyCaveat, security.Caveat, ...security.Caveat) (security.Discharge, error) {
+func (p *mockPrincipal) MintDischarge(interface{}, security.Caveat, ...security.Caveat) (security.Discharge, error) {
 	defer p.reset()
 	d, _ := p.NextResult.(security.Discharge)
 	return d, p.NextError
@@ -311,7 +311,7 @@
 	return b
 }
 
-func newThirdPartyCaveatAndDischarge(t *testing.T) (security.ThirdPartyCaveat, security.Discharge) {
+func newThirdPartyCaveatAndDischarge(t *testing.T) (security.Caveat, security.Discharge) {
 	p := newPrincipal(t)
 	c, err := security.NewPublicKeyCaveat(p.PublicKey(), "location", security.ThirdPartyRequirements{}, newCaveat(security.MethodCaveat("method")))
 	if err != nil {
diff --git a/security/agent/client.go b/security/agent/client.go
index 77c6dde..99854c5 100644
--- a/security/agent/client.go
+++ b/security/agent/client.go
@@ -120,10 +120,9 @@
 	return
 }
 
-func (c *client) MintDischarge(tp security.ThirdPartyCaveat, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
+func (c *client) MintDischarge(tp interface{}, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
 	var discharge security.Discharge
-	err := c.caller.call("MintDischarge", results(&discharge), vdl.AnyRep(tp), caveat, additionalCaveats)
-	if err != nil {
+	if err := c.caller.call("MintDischarge", results(&discharge), vdl.AnyRep(tp), caveat, additionalCaveats); err != nil {
 		return nil, err
 	}
 	return discharge, nil
diff --git a/security/agent/server/server.go b/security/agent/server/server.go
index 7175a57..a274c53 100644
--- a/security/agent/server/server.go
+++ b/security/agent/server/server.go
@@ -7,7 +7,6 @@
 	"crypto/sha512"
 	"crypto/x509"
 	"encoding/base64"
-	"fmt"
 	"io"
 	"net"
 	"os"
@@ -254,11 +253,7 @@
 }
 
 func (a agentd) MintDischarge(_ ipc.ServerContext, tp vdl.AnyRep, caveat security.Caveat, additionalCaveats []security.Caveat) (vdl.AnyRep, error) {
-	tpCaveat, ok := tp.(security.ThirdPartyCaveat)
-	if !ok {
-		return nil, fmt.Errorf("provided caveat of type %T does not implement security.ThirdPartyCaveat", tp)
-	}
-	return a.principal.MintDischarge(tpCaveat, caveat, additionalCaveats...)
+	return a.principal.MintDischarge(tp, caveat, additionalCaveats...)
 }
 
 func (a keymgr) newKey(in_memory bool) (id []byte, p security.Principal, err error) {
diff --git a/security/audit/principal.go b/security/audit/principal.go
index b7f9347..879d8f6 100644
--- a/security/audit/principal.go
+++ b/security/audit/principal.go
@@ -46,7 +46,7 @@
 	return sig, nil
 }
 
-func (p *auditingPrincipal) MintDischarge(tp security.ThirdPartyCaveat, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
+func (p *auditingPrincipal) MintDischarge(tp interface{}, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
 	d, err := p.principal.MintDischarge(tp, caveat, additionalCaveats...)
 	// No need to log the discharge
 	if err = p.audit(err, "MintDischarge", addCaveats(args{tp, caveat}, additionalCaveats...), nil); err != nil {
diff --git a/security/audit/principal_test.go b/security/audit/principal_test.go
index 4b0d977..f080af7 100644
--- a/security/audit/principal_test.go
+++ b/security/audit/principal_test.go
@@ -156,7 +156,7 @@
 	return
 }
 
-func (p *mockPrincipal) MintDischarge(security.ThirdPartyCaveat, security.Caveat, ...security.Caveat) (security.Discharge, error) {
+func (p *mockPrincipal) MintDischarge(interface{}, security.Caveat, ...security.Caveat) (security.Discharge, error) {
 	defer p.reset()
 	d, _ := p.NextResult.(security.Discharge)
 	return d, p.NextError
@@ -249,7 +249,7 @@
 	return b
 }
 
-func newThirdPartyCaveatAndDischarge(t *testing.T) (security.ThirdPartyCaveat, security.Discharge) {
+func newThirdPartyCaveatAndDischarge(t *testing.T) (security.Caveat, security.Discharge) {
 	p := newPrincipal(t)
 	c, err := security.NewPublicKeyCaveat(p.PublicKey(), "location", security.ThirdPartyRequirements{}, newCaveat(security.MethodCaveat("method")))
 	if err != nil {
diff --git a/services/identity/auditor/blessing_auditor.go b/services/identity/auditor/blessing_auditor.go
index cd540e9..d6858ae 100644
--- a/services/identity/auditor/blessing_auditor.go
+++ b/services/identity/auditor/blessing_auditor.go
@@ -78,7 +78,18 @@
 	if !ok {
 		return d, fmt.Errorf("failed to extract extension")
 	}
-	d.email = strings.Split(extension, "/")[0]
+	// Find the first email component
+	for _, n := range strings.Split(extension, security.ChainSeparator) {
+		// HACK ALERT: An email is the first entry to end up with
+		// a single "@" in it
+		if strings.Count(n, "@") == 1 {
+			d.email = n
+			break
+		}
+	}
+	if len(d.email) == 0 {
+		return d, fmt.Errorf("failed to extract email address from extension %q", extension)
+	}
 	var caveats []security.Caveat
 	for _, arg := range entry.Arguments[3:] {
 		if cav, ok := arg.(security.Caveat); !ok {
diff --git a/services/identity/auditor/blessing_auditor_test.go b/services/identity/auditor/blessing_auditor_test.go
index c592699..ab0dadc 100644
--- a/services/identity/auditor/blessing_auditor_test.go
+++ b/services/identity/auditor/blessing_auditor_test.go
@@ -28,24 +28,24 @@
 		Blessings          security.Blessings
 	}{
 		{
-			Extension:          "email/nocaveats",
-			Email:              "email",
+			Extension:          "foo@bar.com/nocaveats/bar@baz.com",
+			Email:              "foo@bar.com",
 			RevocationCaveatID: "",
-			Blessings:          newBlessing(t, p, "test/email/nocaveats"),
+			Blessings:          newBlessing(t, p, "test/foo@bar.com/nocaveats/bar@baz.com"),
 		},
 		{
-			Extension:          "email/caveat",
-			Email:              "email",
+			Extension:          "users/foo@bar.com/caveat",
+			Email:              "foo@bar.com",
 			Caveats:            []security.Caveat{expiryCaveat},
 			RevocationCaveatID: "",
-			Blessings:          newBlessing(t, p, "test/email/caveat"),
+			Blessings:          newBlessing(t, p, "test/foo@bar.com/caveat"),
 		},
 		{
-			Extension:          "email/caveatAndRevocation",
-			Email:              "email",
-			Caveats:            []security.Caveat{expiryCaveat, newCaveat(security.NewCaveat(revocationCaveat))},
-			RevocationCaveatID: revocationCaveat.ID(),
-			Blessings:          newBlessing(t, p, "test/email/caveatAndRevocation"),
+			Extension:          "special/guests/foo@bar.com/caveatAndRevocation",
+			Email:              "foo@bar.com",
+			Caveats:            []security.Caveat{expiryCaveat, revocationCaveat},
+			RevocationCaveatID: revocationCaveat.ThirdPartyDetails().ID(),
+			Blessings:          newBlessing(t, p, "test/foo@bar.com/caveatAndRevocation"),
 		},
 	}
 
@@ -86,7 +86,7 @@
 	}
 }
 
-func newThirdPartyCaveat(t *testing.T, p security.Principal) security.ThirdPartyCaveat {
+func newThirdPartyCaveat(t *testing.T, p security.Principal) security.Caveat {
 	tp, err := security.NewPublicKeyCaveat(p.PublicKey(), "location", security.ThirdPartyRequirements{}, newCaveat(security.MethodCaveat("method")))
 	if err != nil {
 		t.Fatal(err)
diff --git a/services/identity/revocation/caveat.vdl b/services/identity/revocation/caveat.vdl
new file mode 100644
index 0000000..673e29f
--- /dev/null
+++ b/services/identity/revocation/caveat.vdl
@@ -0,0 +1,17 @@
+package revocation
+
+import (
+	"v.io/core/veyron2/uniqueid"
+	"v.io/core/veyron2/security"
+)
+
+// NotRevokedCaveat is used to implement revocation.
+// It validates iff the parameter is not included in a list of blacklisted
+// values.
+//
+// The third-party discharging service checks this revocation caveat against a
+// database of blacklisted (revoked) keys before issuing a discharge.
+const NotRevokedCaveat = security.CaveatDescriptor{
+    Id:        uniqueid.Id{0x4b, 0x46, 0x5c, 0x56, 0x37, 0x79, 0xd1, 0x3b, 0x7b, 0xa3, 0xa7, 0xd6, 0xa5, 0x34, 0x80, 0x0},
+    ParamType: typeobject([]byte),
+}
diff --git a/services/identity/revocation/caveat.vdl.go b/services/identity/revocation/caveat.vdl.go
new file mode 100644
index 0000000..2990f95
--- /dev/null
+++ b/services/identity/revocation/caveat.vdl.go
@@ -0,0 +1,41 @@
+// This file was auto-generated by the veyron vdl tool.
+// Source: caveat.vdl
+
+package revocation
+
+import (
+	"v.io/core/veyron2/security"
+
+	"v.io/core/veyron2/uniqueid"
+
+	// The non-user imports are prefixed with "__" to prevent collisions.
+	__vdl "v.io/core/veyron2/vdl"
+)
+
+// NotRevokedCaveat is used to implement revocation.
+// It validates iff the parameter is not included in a list of blacklisted
+// values.
+//
+// The third-party discharging service checks this revocation caveat against a
+// database of blacklisted (revoked) keys before issuing a discharge.
+var NotRevokedCaveat = security.CaveatDescriptor{
+	Id: uniqueid.Id{
+		75,
+		70,
+		92,
+		86,
+		55,
+		121,
+		209,
+		59,
+		123,
+		163,
+		167,
+		214,
+		165,
+		52,
+		128,
+		0,
+	},
+	ParamType: __vdl.TypeOf([]byte("")),
+}
diff --git a/services/identity/revocation/revocation_manager.go b/services/identity/revocation/revocation_manager.go
index 235b88f..ed685ff 100644
--- a/services/identity/revocation/revocation_manager.go
+++ b/services/identity/revocation/revocation_manager.go
@@ -10,6 +10,7 @@
 
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/vdl"
+	"v.io/core/veyron2/vom"
 )
 
 // RevocationManager persists information for revocation caveats to provided discharges and allow for future revocations.
@@ -50,18 +51,22 @@
 	if _, err := rand.Read(revocation[:]); err != nil {
 		return empty, err
 	}
-	restriction, err := security.NewCaveat(revocationCaveat(revocation))
+	restriction, err := security.NewCaveat(NotRevokedCaveat, revocation[:])
 	if err != nil {
 		return empty, err
 	}
+	// TODO(ashankar): Remove when removing ValidatorVOM
+	if restriction.ValidatorVOM, err = vom.Encode(revocationCaveat(revocation)); err != nil {
+		return empty, err
+	}
 	cav, err := security.NewPublicKeyCaveat(discharger, dischargerLocation, security.ThirdPartyRequirements{}, restriction)
 	if err != nil {
 		return empty, err
 	}
-	if err = revocationDB.InsertCaveat(cav.ID(), revocation[:]); err != nil {
+	if err = revocationDB.InsertCaveat(cav.ThirdPartyDetails().ID(), revocation[:]); err != nil {
 		return empty, err
 	}
-	return security.NewCaveat(cav)
+	return cav, nil
 }
 
 // Revoke disables discharges from being issued for the provided third-party caveat.
@@ -79,22 +84,29 @@
 	return timestamp
 }
 
-type revocationCaveat [16]byte
-
-func (cav revocationCaveat) Validate(security.Context) error {
+func isRevoked(_ security.Context, key []byte) error {
 	revocationLock.RLock()
 	if revocationDB == nil {
 		revocationLock.RUnlock()
 		return fmt.Errorf("missing call to NewRevocationManager")
 	}
 	revocationLock.RUnlock()
-	revoked, err := revocationDB.IsRevoked(cav[:])
+	revoked, err := revocationDB.IsRevoked(key)
 	if revoked {
 		return fmt.Errorf("revoked")
 	}
 	return err
 }
 
+// TODO(ashankar): Remove when removing security.Caveat.ValidatorVOM.
+type revocationCaveat [16]byte
+
+func (cav revocationCaveat) Validate(ctx security.Context) error {
+	return isRevoked(ctx, cav[:])
+}
+
 func init() {
+	// TODO(ashankar): Remove when removing security.Caveat.ValidatorVOM
 	vdl.Register(revocationCaveat{})
+	security.RegisterCaveatValidator(NotRevokedCaveat, isRevoked)
 }
diff --git a/services/identity/server/identityd.go b/services/identity/server/identityd.go
index b415f20..3416ef8 100644
--- a/services/identity/server/identityd.go
+++ b/services/identity/server/identityd.go
@@ -43,7 +43,7 @@
 	dischargerService   = "discharger"
 )
 
-type identityd struct {
+type IdentityServer struct {
 	oauthProvider      oauth.OAuthProvider
 	auditor            audit.Auditor
 	blessingLogReader  auditor.BlessingLogReader
@@ -58,8 +58,8 @@
 // - auditor and blessingLogReader to audit the root principal and read audit logs
 // - revocationManager to store revocation data and grant discharges
 // - oauthBlesserParams to configure the identity.OAuthBlesser service
-func NewIdentityServer(oauthProvider oauth.OAuthProvider, auditor audit.Auditor, blessingLogReader auditor.BlessingLogReader, revocationManager revocation.RevocationManager, oauthBlesserParams blesser.OAuthBlesserParams, caveatSelector caveats.CaveatSelector, emailClassifier *util.EmailClassifier) *identityd {
-	return &identityd{
+func NewIdentityServer(oauthProvider oauth.OAuthProvider, auditor audit.Auditor, blessingLogReader auditor.BlessingLogReader, revocationManager revocation.RevocationManager, oauthBlesserParams blesser.OAuthBlesserParams, caveatSelector caveats.CaveatSelector, emailClassifier *util.EmailClassifier) *IdentityServer {
+	return &IdentityServer{
 		oauthProvider,
 		auditor,
 		blessingLogReader,
@@ -70,7 +70,7 @@
 	}
 }
 
-func (s *identityd) Serve(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) {
+func (s *IdentityServer) Serve(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) {
 	ctx, err := veyron2.SetPrincipal(ctx, audit.NewPrincipal(
 		veyron2.GetPrincipal(ctx), s.auditor))
 	if err != nil {
@@ -80,7 +80,7 @@
 	<-signals.ShutdownOnSignals(ctx)
 }
 
-func (s *identityd) Listen(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) (ipc.Server, []string, string) {
+func (s *IdentityServer) Listen(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) (ipc.Server, []string, string) {
 	// Setup handlers
 
 	// json-encoded public key and blessing names of this server
@@ -153,7 +153,7 @@
 }
 
 // Starts the blessing services and the discharging service on the same port.
-func (s *identityd) setupServices(ctx *context.T, listenSpec *ipc.ListenSpec, macaroonKey []byte) (ipc.Server, []string, error) {
+func (s *IdentityServer) setupServices(ctx *context.T, listenSpec *ipc.ListenSpec, macaroonKey []byte) (ipc.Server, []string, error) {
 	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
diff --git a/services/mgmt/application/impl/dispatcher.go b/services/mgmt/application/impl/dispatcher.go
index 6b13186..b08cddd 100644
--- a/services/mgmt/application/impl/dispatcher.go
+++ b/services/mgmt/application/impl/dispatcher.go
@@ -3,6 +3,7 @@
 import (
 	"path/filepath"
 
+	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/services/security/access"
@@ -22,7 +23,7 @@
 
 // NewDispatcher is the dispatcher factory. storeDir is a path to a directory in which to
 // serialize the applicationd state.
-func NewDispatcher(storeDir string) (*dispatcher, error) {
+func NewDispatcher(storeDir string) (ipc.Dispatcher, error) {
 	store, err := fs.NewMemstore(filepath.Join(storeDir, "applicationdstate.db"))
 	if err != nil {
 		return nil, err
diff --git a/services/mgmt/application/impl/service.go b/services/mgmt/application/impl/service.go
index 8ad14cd..fa6dfc5 100644
--- a/services/mgmt/application/impl/service.go
+++ b/services/mgmt/application/impl/service.go
@@ -5,6 +5,7 @@
 
 	"v.io/core/veyron/services/mgmt/lib/acls"
 	"v.io/core/veyron/services/mgmt/lib/fs"
+	"v.io/core/veyron/services/mgmt/repository"
 
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
@@ -37,7 +38,7 @@
 )
 
 // NewApplicationService returns a new Application service implementation.
-func NewApplicationService(store *fs.Memstore, storeRoot, suffix string) *appRepoService {
+func NewApplicationService(store *fs.Memstore, storeRoot, suffix string) repository.ApplicationServerMethods {
 	return &appRepoService{store: store, storeRoot: storeRoot, suffix: suffix}
 }
 
diff --git a/services/mgmt/binary/impl/dispatcher.go b/services/mgmt/binary/impl/dispatcher.go
index a8538d3..df9fc64 100644
--- a/services/mgmt/binary/impl/dispatcher.go
+++ b/services/mgmt/binary/impl/dispatcher.go
@@ -5,6 +5,7 @@
 	"os"
 	"path/filepath"
 
+	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/services/mgmt/repository"
 	"v.io/core/veyron2/services/security/access"
@@ -26,7 +27,7 @@
 }
 
 // NewDispatcher is the dispatcher factory.
-func NewDispatcher(principal security.Principal, state *state) (*dispatcher, error) {
+func NewDispatcher(principal security.Principal, state *state) (ipc.Dispatcher, error) {
 	return &dispatcher{
 		state:     state,
 		locks:     acls.NewLocks(),
diff --git a/services/mgmt/build/impl/service.go b/services/mgmt/build/impl/service.go
index e5569b4..6e2395b 100644
--- a/services/mgmt/build/impl/service.go
+++ b/services/mgmt/build/impl/service.go
@@ -30,7 +30,7 @@
 }
 
 // NewBuilderService returns a new Build service implementation.
-func NewBuilderService(gobin, goroot string) *builderService {
+func NewBuilderService(gobin, goroot string) build.BuilderServerMethods {
 	return &builderService{
 		gobin:  gobin,
 		goroot: goroot,
diff --git a/services/mgmt/debug/dispatcher.go b/services/mgmt/debug/dispatcher.go
index 02d10bb..205ae58 100644
--- a/services/mgmt/debug/dispatcher.go
+++ b/services/mgmt/debug/dispatcher.go
@@ -21,7 +21,7 @@
 
 var _ ipc.Dispatcher = (*dispatcher)(nil)
 
-func NewDispatcher(logsDir string, authorizer security.Authorizer) *dispatcher {
+func NewDispatcher(logsDir string, authorizer security.Authorizer) ipc.Dispatcher {
 	return &dispatcher{logsDir, authorizer}
 }
 
diff --git a/services/mgmt/device/impl/impl_test.go b/services/mgmt/device/impl/impl_test.go
index 72402e9..9660a1b 100644
--- a/services/mgmt/device/impl/impl_test.go
+++ b/services/mgmt/device/impl/impl_test.go
@@ -504,13 +504,7 @@
 	}
 }
 
-func verifyAppWorkspace(t *testing.T, root, appID, instanceID string) {
-	// HACK ALERT: for now, we peek inside the device manager's directory
-	// structure (which ought to be opaque) to check for what the app has
-	// written to its local root.
-	//
-	// TODO(caprita): add support to device manager to browse logs/app local
-	// root.
+func instanceDirForApp(root, appID, instanceID string) string {
 	applicationDirName := func(title string) string {
 		h := md5.New()
 		h.Write([]byte(title))
@@ -519,8 +513,17 @@
 	}
 	components := strings.Split(appID, "/")
 	appTitle, installationID := components[0], components[1]
-	instanceDir := filepath.Join(root, applicationDirName(appTitle), "installation-"+installationID, "instances", "instance-"+instanceID)
-	rootDir := filepath.Join(instanceDir, "root")
+	return filepath.Join(root, applicationDirName(appTitle), "installation-"+installationID, "instances", "instance-"+instanceID)
+}
+
+func verifyAppWorkspace(t *testing.T, root, appID, instanceID string) {
+	// HACK ALERT: for now, we peek inside the device manager's directory
+	// structure (which ought to be opaque) to check for what the app has
+	// written to its local root.
+	//
+	// TODO(caprita): add support to device manager to browse logs/app local
+	// root.
+	rootDir := filepath.Join(instanceDirForApp(root, appID, instanceID), "root")
 	testFile := filepath.Join(rootDir, "testfile")
 	if read, err := ioutil.ReadFile(testFile); err != nil {
 		t.Fatalf("Failed to read %v: %v", testFile, err)
@@ -530,6 +533,16 @@
 	// END HACK
 }
 
+func verifyAppState(t *testing.T, root, appID, instanceID, state string) {
+	// Same hack alert as verifyAppWorkspace
+	testFile := filepath.Join(instanceDirForApp(root, appID, instanceID), state)
+	if read, err := ioutil.ReadFile(testFile); err != nil {
+		t.Fatalf("Failed to read %v: %v", testFile, err)
+	} else if want, got := "status", string(read); want != got {
+		t.Fatalf("Expected to read %v, got %v instead", want, got)
+	}
+}
+
 func verifyPingArgs(t *testing.T, pingCh <-chan pingArgs, username, flagValue, envValue string) {
 	var args pingArgs
 	select {
@@ -622,6 +635,7 @@
 
 	// Wait until the app pings us that it's ready.
 	verifyPingArgs(t, pingCh, userName(t), "flag-val-install", "env-val-envelope")
+	verifyAppState(t, root, appID, instance1ID, "started")
 
 	v1EP1 := resolve(t, ctx, "appV1", 1)[0]
 
diff --git a/services/mgmt/profile/impl/dispatcher.go b/services/mgmt/profile/impl/dispatcher.go
index 40f04e8..35396a1 100644
--- a/services/mgmt/profile/impl/dispatcher.go
+++ b/services/mgmt/profile/impl/dispatcher.go
@@ -3,11 +3,11 @@
 import (
 	"path/filepath"
 
-	"v.io/core/veyron/services/mgmt/repository"
-
-	"v.io/core/veyron/services/mgmt/lib/fs"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/security"
+
+	"v.io/core/veyron/services/mgmt/lib/fs"
+	"v.io/core/veyron/services/mgmt/repository"
 )
 
 // dispatcher holds the state of the profile repository dispatcher.
@@ -21,7 +21,7 @@
 
 // NewDispatcher is the dispatcher factory. storeDir is a path to a
 // directory in which the profile state is persisted.
-func NewDispatcher(storeDir string, authorizer security.Authorizer) (*dispatcher, error) {
+func NewDispatcher(storeDir string, authorizer security.Authorizer) (ipc.Dispatcher, error) {
 	store, err := fs.NewMemstore(filepath.Join(storeDir, "profilestate.db"))
 	if err != nil {
 		return nil, err
diff --git a/services/mgmt/profile/impl/service.go b/services/mgmt/profile/impl/service.go
index 329672b..f528d5a 100644
--- a/services/mgmt/profile/impl/service.go
+++ b/services/mgmt/profile/impl/service.go
@@ -5,6 +5,7 @@
 
 	"v.io/core/veyron/services/mgmt/lib/fs"
 	"v.io/core/veyron/services/mgmt/profile"
+	"v.io/core/veyron/services/mgmt/repository"
 
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
@@ -27,7 +28,7 @@
 )
 
 // NewProfileService returns a new Profile service implementation.
-func NewProfileService(store *fs.Memstore, storeRoot, suffix string) *profileService {
+func NewProfileService(store *fs.Memstore, storeRoot, suffix string) repository.ProfileServerMethods {
 	return &profileService{store: store, storeRoot: storeRoot, suffix: suffix}
 }
 
diff --git a/services/mounttable/lib/mounttable.go b/services/mounttable/lib/mounttable.go
index 9280527..93f0926 100644
--- a/services/mounttable/lib/mounttable.go
+++ b/services/mounttable/lib/mounttable.go
@@ -69,13 +69,13 @@
 
 const templateVar = "%%"
 
-// NewMountTable creates a new server that uses the ACLs specified in
+// NewMountTableDispatcher creates a new server that uses the ACLs specified in
 // aclfile for authorization.
 //
 // aclfile is a JSON-encoded mapping from paths in the mounttable to the
 // access.TaggedACLMap for that path. The tags used in the map are the typical
 // access tags (the Tag type defined in veyron2/services/security/access).
-func NewMountTable(aclfile string) (*mountTable, error) {
+func NewMountTableDispatcher(aclfile string) (ipc.Dispatcher, error) {
 	mt := &mountTable{
 		root: new(node),
 	}
@@ -413,11 +413,23 @@
 
 // Mount a server onto the name in the receiver.
 func (ms *mountContext) Mount(ctx ipc.ServerContext, server string, ttlsecs uint32, flags naming.MountFlag) error {
+	return ms.MountX(ctx, server, nil, ttlsecs, flags)
+}
+
+func (ms *mountContext) MountX(ctx ipc.ServerContext, server string, patterns []security.BlessingPattern, ttlsecs uint32, flags naming.MountFlag) error {
+	if len(patterns) == 0 {
+		// No patterns provided in the request, take the conservative
+		// approach and assume that the server being mounted will
+		// present the same blessings as the client calling Mount.
+		for _, b := range ctx.RemoteBlessings().ForContext(ctx) {
+			patterns = append(patterns, security.BlessingPattern(b))
+		}
+	}
 	mt := ms.mt
 	if ttlsecs == 0 {
 		ttlsecs = 10 * 365 * 24 * 60 * 60 // a really long time
 	}
-	vlog.VI(2).Infof("*********************Mount %q -> %s", ms.name, server)
+	vlog.VI(2).Infof("*********************Mount %q -> %v%s", ms.name, patterns, server)
 
 	// Make sure the server address is reasonable.
 	epString := server
@@ -445,13 +457,13 @@
 	}
 	wantMT := hasMTFlag(flags)
 	if n.mount == nil {
-		n.mount = &mount{servers: NewServerList(), mt: wantMT}
+		n.mount = &mount{servers: newServerList(), mt: wantMT}
 	} else {
 		if wantMT != n.mount.mt {
 			return fmt.Errorf("MT doesn't match")
 		}
 	}
-	n.mount.servers.add(server, time.Duration(ttlsecs)*time.Second)
+	n.mount.servers.add(server, patterns, time.Duration(ttlsecs)*time.Second)
 	return nil
 }
 
diff --git a/services/mounttable/lib/mounttable_test.go b/services/mounttable/lib/mounttable_test.go
index a1404d9..7ac6586 100644
--- a/services/mounttable/lib/mounttable_test.go
+++ b/services/mounttable/lib/mounttable_test.go
@@ -2,7 +2,6 @@
 
 import (
 	"errors"
-	"fmt"
 	"io"
 	"reflect"
 	"runtime/debug"
@@ -33,10 +32,10 @@
 	t.Fatal(string(debug.Stack()))
 }
 
-func doMount(t *testing.T, ctx *context.T, ep, suffix, service string, shouldSucceed bool) {
+func doMount(t *testing.T, ctx *context.T, ep, suffix, service string, blessingPatterns []security.BlessingPattern, shouldSucceed bool) {
 	name := naming.JoinAddressName(ep, suffix)
 	client := veyron2.GetClient(ctx)
-	call, err := client.StartCall(ctx, name, "Mount", []interface{}{service, uint32(ttlSecs), 0}, options.NoResolve{})
+	call, err := client.StartCall(ctx, name, "MountX", []interface{}{service, blessingPatterns, uint32(ttlSecs), 0}, options.NoResolve{})
 	if err != nil {
 		if !shouldSucceed {
 			return
@@ -179,22 +178,33 @@
 	}
 }
 
-// resolve assumes that the mount contains 0 or 1 servers.
-func resolve(ctx *context.T, name string) (string, error) {
+func mountentry2names(e *naming.VDLMountEntry) []string {
+	names := make([]string, len(e.Servers))
+	for idx, s := range e.Servers {
+		names[idx] = naming.JoinAddressName(s.Server, e.Name)
+	}
+	return names
+}
+
+func strslice(strs ...string) []string {
+	return strs
+}
+
+func resolve(ctx *context.T, name string) (*naming.VDLMountEntry, error) {
 	// Resolve the name one level.
 	client := veyron2.GetClient(ctx)
 	call, err := client.StartCall(ctx, name, "ResolveStep", nil, options.NoResolve{})
 	if err != nil {
-		return "", err
+		return nil, err
 	}
 	var entry naming.VDLMountEntry
 	if ierr := call.Finish(&entry, &err); ierr != nil {
-		return "", ierr
+		return nil, ierr
 	}
 	if len(entry.Servers) < 1 {
-		return "", errors.New("resolve returned no servers")
+		return nil, errors.New("resolve returned no servers")
 	}
-	return naming.JoinAddressName(entry.Servers[0].Server, entry.Name), nil
+	return &entry, nil
 }
 
 func export(t *testing.T, ctx *context.T, name, contents string) {
@@ -205,7 +215,7 @@
 	}
 	// Export the value.
 	client := veyron2.GetClient(ctx)
-	call, err := client.StartCall(ctx, resolved, "Export", []interface{}{contents, true}, options.NoResolve{})
+	call, err := client.StartCall(ctx, mountentry2names(resolved)[0], "Export", []interface{}{contents, true}, options.NoResolve{})
 	if err != nil {
 		boom(t, "Failed to Export.StartCall %s to %s: %s", name, contents, err)
 	}
@@ -228,7 +238,7 @@
 	}
 	// Look up the value.
 	client := veyron2.GetClient(ctx)
-	call, err := client.StartCall(ctx, resolved, "Lookup", nil, options.NoResolve{})
+	call, err := client.StartCall(ctx, mountentry2names(resolved)[0], "Lookup", nil, options.NoResolve{})
 	if err != nil {
 		if shouldSucceed {
 			boom(t, "Failed Lookup.StartCall %s: %s", name, err)
@@ -259,9 +269,9 @@
 		boom(t, "r.NewServer: %s", err)
 	}
 	// Add mount table service.
-	mt, err := NewMountTable(acl)
+	mt, err := NewMountTableDispatcher(acl)
 	if err != nil {
-		boom(t, "NewMountTable: %v", err)
+		boom(t, "NewMountTableDispatcher: %v", err)
 	}
 	// Start serving on a loopback address.
 	eps, err := server.Listen(veyron2.GetListenSpec(rootCtx))
@@ -310,7 +320,7 @@
 
 	// Mount the collection server into the mount table.
 	vlog.Infof("Mount the collection server into the mount table.")
-	doMount(t, rootCtx, mtAddr, "stuff", collectionName, true)
+	doMount(t, rootCtx, mtAddr, "stuff", collectionName, nil, true)
 
 	// Create a few objects and make sure we can read them.
 	vlog.Infof("Create a few objects.")
@@ -328,9 +338,9 @@
 
 	// Test multiple mounts.
 	vlog.Infof("Multiple mounts.")
-	doMount(t, rootCtx, mtAddr, "a/b", collectionName, true)
-	doMount(t, rootCtx, mtAddr, "x/y", collectionName, true)
-	doMount(t, rootCtx, mtAddr, "alpha//beta", collectionName, true)
+	doMount(t, rootCtx, mtAddr, "a/b", collectionName, nil, true)
+	doMount(t, rootCtx, mtAddr, "x/y", collectionName, nil, true)
+	doMount(t, rootCtx, mtAddr, "alpha//beta", collectionName, nil, true)
 	vlog.Infof("Make sure we can read them.")
 	checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "stuff/falls"), "falls mainly on the plain", true)
 	checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "a/b/falls"), "falls mainly on the plain", true)
@@ -360,7 +370,7 @@
 
 	// Test specific unmount.
 	vlog.Info("Test specific unmount.")
-	doMount(t, rootCtx, mtAddr, "a/b", collectionName, true)
+	doMount(t, rootCtx, mtAddr, "a/b", collectionName, nil, true)
 	doUnmount(t, rootCtx, mtAddr, "a/b", collectionName, true)
 	checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "a/b/falls"), "falls mainly on the plain", false)
 
@@ -368,15 +378,15 @@
 	vlog.Info("Try timing out a mount.")
 	ft := NewFakeTimeClock()
 	setServerListClock(ft)
-	doMount(t, rootCtx, mtAddr, "stuffWithTTL", collectionName, true)
+	doMount(t, rootCtx, mtAddr, "stuffWithTTL", collectionName, nil, true)
 	checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "stuffWithTTL/the/rain"), "the rain", true)
 	ft.advance(time.Duration(ttlSecs+4) * time.Second)
 	checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "stuffWithTTL/the/rain"), "the rain", false)
 
 	// Test unauthorized mount.
 	vlog.Info("Test unauthorized mount.")
-	doMount(t, bobCtx, mtAddr, "/a/b", collectionName, false)
-	doMount(t, aliceCtx, mtAddr, "/a/b", collectionName, false)
+	doMount(t, bobCtx, mtAddr, "/a/b", collectionName, nil, false)
+	doMount(t, aliceCtx, mtAddr, "/a/b", collectionName, nil, false)
 
 	doUnmount(t, bobCtx, mtAddr, "x/y", collectionName, false)
 }
@@ -456,9 +466,9 @@
 
 	// set up a mount space
 	fakeServer := naming.JoinAddressName(estr, "quux")
-	doMount(t, rootCtx, estr, "one/bright/day", fakeServer, true)
-	doMount(t, rootCtx, estr, "in/the/middle", fakeServer, true)
-	doMount(t, rootCtx, estr, "of/the/night", fakeServer, true)
+	doMount(t, rootCtx, estr, "one/bright/day", fakeServer, nil, true)
+	doMount(t, rootCtx, estr, "in/the/middle", fakeServer, nil, true)
+	doMount(t, rootCtx, estr, "of/the/night", fakeServer, nil, true)
 
 	// Try various globs.
 	tests := []struct {
@@ -503,14 +513,14 @@
 	fakeServer := naming.JoinAddressName(estr, "quux")
 
 	// Noone should be able to mount on someone else's names.
-	doMount(t, aliceCtx, estr, "users/ted", fakeServer, false)
-	doMount(t, bobCtx, estr, "users/carol", fakeServer, false)
-	doMount(t, rootCtx, estr, "users/george", fakeServer, false)
+	doMount(t, aliceCtx, estr, "users/ted", fakeServer, nil, false)
+	doMount(t, bobCtx, estr, "users/carol", fakeServer, nil, false)
+	doMount(t, rootCtx, estr, "users/george", fakeServer, nil, false)
 
 	// Anyone should be able to mount on their own names.
-	doMount(t, aliceCtx, estr, "users/alice", fakeServer, true)
-	doMount(t, bobCtx, estr, "users/bob", fakeServer, true)
-	doMount(t, rootCtx, estr, "users/root", fakeServer, true)
+	doMount(t, aliceCtx, estr, "users/alice", fakeServer, nil, true)
+	doMount(t, bobCtx, estr, "users/bob", fakeServer, nil, true)
+	doMount(t, rootCtx, estr, "users/root", fakeServer, nil, true)
 }
 
 func TestGlobACLs(t *testing.T) {
@@ -522,9 +532,9 @@
 
 	// set up a mount space
 	fakeServer := naming.JoinAddressName(estr, "quux")
-	doMount(t, aliceCtx, estr, "one/bright/day", fakeServer, false) // Fails because alice can't mount there.
-	doMount(t, bobCtx, estr, "one/bright/day", fakeServer, true)
-	doMount(t, rootCtx, estr, "a/b/c", fakeServer, true)
+	doMount(t, aliceCtx, estr, "one/bright/day", fakeServer, nil, false) // Fails because alice can't mount there.
+	doMount(t, bobCtx, estr, "one/bright/day", fakeServer, nil, true)
+	doMount(t, rootCtx, estr, "a/b/c", fakeServer, nil, true)
 
 	// Try various globs.
 	tests := []struct {
@@ -555,7 +565,7 @@
 
 	// Set up one mount.
 	fakeServer := naming.JoinAddressName(estr, "quux")
-	doMount(t, rootCtx, estr, "one/bright/day", fakeServer, true)
+	doMount(t, rootCtx, estr, "one/bright/day", fakeServer, nil, true)
 	checkMatch(t, []string{"one", "one/bright", "one/bright/day"}, doGlob(t, rootCtx, estr, "", "*/..."))
 
 	// After the unmount nothing should be left
@@ -563,7 +573,7 @@
 	checkMatch(t, nil, doGlob(t, rootCtx, estr, "", "*/..."))
 
 	// Set up a mount, then set the ACL.
-	doMount(t, rootCtx, estr, "one/bright/day", fakeServer, true)
+	doMount(t, rootCtx, estr, "one/bright/day", fakeServer, nil, true)
 	checkMatch(t, []string{"one", "one/bright", "one/bright/day"}, doGlob(t, rootCtx, estr, "", "*/..."))
 	acl := access.TaggedACLMap{"Read": access.ACL{In: []security.BlessingPattern{security.BlessingPattern("...")}}}
 	doSetACL(t, rootCtx, estr, "one/bright", acl, "", true)
@@ -582,8 +592,8 @@
 
 	// set up a mount space
 	fakeServer := naming.JoinAddressName(estr, "quux")
-	doMount(t, bobCtx, estr, "one/bright/day", fakeServer, true)
-	doMount(t, rootCtx, estr, "a/b/c", fakeServer, true)
+	doMount(t, bobCtx, estr, "one/bright/day", fakeServer, nil, true)
+	doMount(t, rootCtx, estr, "a/b/c", fakeServer, nil, true)
 
 	// It shouldn't be possible to delete anything with children unless explicitly requested.
 	doDeleteNode(t, rootCtx, estr, "a/b", false)
@@ -607,12 +617,12 @@
 	server, estr := newMT(t, "", rootCtx)
 	defer server.Stop()
 
-	doMount(t, rootCtx, estr, "endpoint", naming.JoinAddressName(estr, "life/on/the/mississippi"), true)
-	doMount(t, rootCtx, estr, "hostport", "/atrampabroad:8000", true)
-	doMount(t, rootCtx, estr, "hostport-endpoint-platypus", "/@atrampabroad:8000@@", true)
-	doMount(t, rootCtx, estr, "invalid/not/rooted", "atrampabroad:8000", false)
-	doMount(t, rootCtx, estr, "invalid/no/port", "/atrampabroad", false)
-	doMount(t, rootCtx, estr, "invalid/endpoint", "/@following the equator:8000@@@", false)
+	doMount(t, rootCtx, estr, "endpoint", naming.JoinAddressName(estr, "life/on/the/mississippi"), nil, true)
+	doMount(t, rootCtx, estr, "hostport", "/atrampabroad:8000", nil, true)
+	doMount(t, rootCtx, estr, "hostport-endpoint-platypus", "/@atrampabroad:8000@@", nil, true)
+	doMount(t, rootCtx, estr, "invalid/not/rooted", "atrampabroad:8000", nil, false)
+	doMount(t, rootCtx, estr, "invalid/no/port", "/atrampabroad", nil, false)
+	doMount(t, rootCtx, estr, "invalid/endpoint", "/@following the equator:8000@@@", nil, false)
 }
 
 func TestExpiry(t *testing.T) {
@@ -628,10 +638,10 @@
 
 	ft := NewFakeTimeClock()
 	setServerListClock(ft)
-	doMount(t, rootCtx, estr, "a1/b1", collectionName, true)
-	doMount(t, rootCtx, estr, "a1/b2", collectionName, true)
-	doMount(t, rootCtx, estr, "a2/b1", collectionName, true)
-	doMount(t, rootCtx, estr, "a2/b2/c", collectionName, true)
+	doMount(t, rootCtx, estr, "a1/b1", collectionName, nil, true)
+	doMount(t, rootCtx, estr, "a1/b2", collectionName, nil, true)
+	doMount(t, rootCtx, estr, "a2/b1", collectionName, nil, true)
+	doMount(t, rootCtx, estr, "a2/b2/c", collectionName, nil, true)
 
 	checkMatch(t, []string{"a1/b1", "a2/b1"}, doGlob(t, rootCtx, estr, "", "*/b1/..."))
 	ft.advance(time.Duration(ttlSecs/2) * time.Second)
@@ -639,27 +649,66 @@
 	checkMatch(t, []string{"c"}, doGlob(t, rootCtx, estr, "a2/b2", "*"))
 	// Refresh only a1/b1.  All the other mounts will expire upon the next
 	// ft advance.
-	doMount(t, rootCtx, estr, "a1/b1", collectionName, true)
+	doMount(t, rootCtx, estr, "a1/b1", collectionName, nil, true)
 	ft.advance(time.Duration(ttlSecs/2+4) * time.Second)
 	checkMatch(t, []string{"a1", "a1/b1"}, doGlob(t, rootCtx, estr, "", "*/..."))
 	checkMatch(t, []string{"a1/b1"}, doGlob(t, rootCtx, estr, "", "*/b1/..."))
 }
 
 func TestBadACLs(t *testing.T) {
-	_, err := NewMountTable("testdata/invalid.acl")
+	_, err := NewMountTableDispatcher("testdata/invalid.acl")
 	if err == nil {
 		boom(t, "Expected json parse error in acl file")
 	}
-	_, err = NewMountTable("testdata/doesntexist.acl")
+	_, err = NewMountTableDispatcher("testdata/doesntexist.acl")
 	if err == nil {
 		boom(t, "Expected error from missing acl file")
 	}
 }
 
+func TestBlessingPatterns(t *testing.T) {
+	// TODO(ashankar): Change this test to use a variant of checkContents
+	// that will ensure that the client call to the resolved name fails if
+	// the blessing patterns in the mount entry is not consistent with the
+	// blessings presented by the end server (once the namespace library
+	// changes to respect VDLMountedServer.BlessingPatterns is in place).
+	rootCtx, aliceCtx, bobCtx, shutdown := initTest()
+	defer shutdown()
+
+	mt, mtAddr := newMT(t, "testdata/test.acl", rootCtx)
+	defer mt.Stop()
+
+	// collection server run by alice
+	collection, collectionAddr := newCollection(t, "testdata/test.acl", aliceCtx)
+	defer collection.Stop()
+	suffix := "users/bob"
+
+	// But mounted by bob, and since bob didn't specify an explicit set of
+	// blessing patterns, it will be thought of as bob's server.
+	doMount(t, bobCtx, mtAddr, suffix, collectionAddr, nil, true)
+	if e, err := resolve(aliceCtx, naming.JoinAddressName(mtAddr, suffix)); err != nil {
+		t.Error(err)
+	} else if len(e.Servers) != 1 {
+		t.Errorf("Got %v, want exactly 1 server", e.Servers)
+	} else if got, want := e.Servers[0].BlessingPatterns, strslice("bob"); !reflect.DeepEqual(got, want) {
+		t.Errorf("Got blessing patterns %v, want %v", got, want)
+	}
+	doUnmount(t, bobCtx, mtAddr, suffix, "", true)
+
+	// However, if bob explicitly says alice is running the server, then so be it.
+	doMount(t, bobCtx, mtAddr, suffix, collectionAddr, []security.BlessingPattern{"alice", "somebody"}, true)
+	if e, err := resolve(aliceCtx, naming.JoinAddressName(mtAddr, suffix)); err != nil {
+		t.Error(err)
+	} else if len(e.Servers) != 1 {
+		t.Errorf("Got %v, want exactly 1 server", e.Servers)
+	} else if got, want := e.Servers[0].BlessingPatterns, strslice("alice", "somebody"); !reflect.DeepEqual(got, want) {
+		t.Errorf("Got blessing patterns %v, want %v", got, want)
+	}
+}
+
 func initTest() (rootCtx *context.T, aliceCtx *context.T, bobCtx *context.T, shutdown veyron2.Shutdown) {
 	testutil.Init()
 	ctx, shutdown := testutil.InitForTest()
-
 	var err error
 	if rootCtx, err = veyron2.SetPrincipal(ctx, tsecurity.NewPrincipal("root")); err != nil {
 		panic("failed to set root principal")
@@ -670,38 +719,19 @@
 	if bobCtx, err = veyron2.SetPrincipal(ctx, tsecurity.NewPrincipal("bob")); err != nil {
 		panic("failed to set bob principal")
 	}
-
-	// A hack to set the namespace roots to a value that won't work.
 	for _, r := range []*context.T{rootCtx, aliceCtx, bobCtx} {
+		// A hack to set the namespace roots to a value that won't work.
 		veyron2.GetNamespace(r).SetRoots()
-	}
-
-	// And setup their blessings so that they present "root", "alice" and "bob"
-	// and these blessings are recognized by the others.
-	principals := map[string]security.Principal{
-		"root":  veyron2.GetPrincipal(rootCtx),
-		"alice": veyron2.GetPrincipal(aliceCtx),
-		"bob":   veyron2.GetPrincipal(bobCtx),
-	}
-	for name, p := range principals {
-		blessing, err := p.BlessSelf(name)
-		if err != nil {
-			panic(fmt.Sprintf("BlessSelf(%q) failed: %v", name, err))
-		}
-		// Share this blessing with all servers and use it when serving clients.
-		if err = p.BlessingStore().SetDefault(blessing); err != nil {
-			panic(fmt.Sprintf("%v: %v", blessing, err))
-		}
-		if _, err = p.BlessingStore().Set(blessing, security.AllPrincipals); err != nil {
-			panic(fmt.Sprintf("%v: %v", blessing, err))
-		}
-		// Have all principals trust the root of this blessing.
-		for _, other := range principals {
-			if err := other.AddToRoots(blessing); err != nil {
+		// And have all principals recognize each others blessings.
+		p1 := veyron2.GetPrincipal(r)
+		for _, other := range []*context.T{rootCtx, aliceCtx, bobCtx} {
+			// tsecurity.NewPrincipal has already setup each
+			// principal to use the same blessing for both server
+			// and client activities.
+			if err := p1.AddToRoots(veyron2.GetPrincipal(other).BlessingStore().Default()); err != nil {
 				panic(err)
 			}
 		}
 	}
-
 	return rootCtx, aliceCtx, bobCtx, shutdown
 }
diff --git a/services/mounttable/lib/neighborhood.go b/services/mounttable/lib/neighborhood.go
index f915124..259aec2 100644
--- a/services/mounttable/lib/neighborhood.go
+++ b/services/mounttable/lib/neighborhood.go
@@ -65,7 +65,7 @@
 	return uint16(port)
 }
 
-func newNeighborhoodServer(host string, addresses []string, loopback bool) (*neighborhood, error) {
+func newNeighborhood(host string, addresses []string, loopback bool) (*neighborhood, error) {
 	// Create the TXT contents with addresses to announce. Also pick up a port number.
 	var txt []string
 	var port uint16
@@ -115,14 +115,16 @@
 	return nh, nil
 }
 
-// NewLoopbackNeighborhoodServer creates a new instance of a neighborhood server on loopback interfaces for testing.
-func NewLoopbackNeighborhoodServer(host string, addresses ...string) (*neighborhood, error) {
-	return newNeighborhoodServer(host, addresses, true)
+// NewLoopbackNeighborhoodDispatcher creates a new instance of a dispatcher for
+// a neighborhood service provider on loopback interfaces (meant for testing).
+func NewLoopbackNeighborhoodDispatcher(host string, addresses ...string) (ipc.Dispatcher, error) {
+	return newNeighborhood(host, addresses, true)
 }
 
-// NewNeighborhoodServer creates a new instance of a neighborhood server.
-func NewNeighborhoodServer(host string, addresses ...string) (*neighborhood, error) {
-	return newNeighborhoodServer(host, addresses, false)
+// NewNeighborhoodDispatcher creates a new instance of a dispatcher for a
+// neighborhood service provider.
+func NewNeighborhoodDispatcher(host string, addresses ...string) (ipc.Dispatcher, error) {
+	return newNeighborhood(host, addresses, false)
 }
 
 // Lookup implements ipc.Dispatcher.Lookup.
@@ -173,7 +175,7 @@
 		}
 	}
 	for addr, ttl := range addrMap {
-		reply = append(reply, naming.VDLMountedServer{addr, ttl})
+		reply = append(reply, naming.VDLMountedServer{addr, nil, ttl})
 	}
 
 	if reply != nil {
@@ -189,7 +191,7 @@
 		for _, ip := range ips {
 			addr := net.JoinHostPort(ip.String(), strconv.Itoa(int(rr.Port)))
 			ep := naming.FormatEndpoint("tcp", addr)
-			reply = append(reply, naming.VDLMountedServer{naming.JoinAddressName(ep, ""), ttl})
+			reply = append(reply, naming.VDLMountedServer{naming.JoinAddressName(ep, ""), nil, ttl})
 		}
 	}
 	return reply
@@ -237,7 +239,10 @@
 }
 
 // Mount not implemented.
-func (*neighborhoodService) Mount(_ ipc.ServerContext, server string, ttlsecs uint32, opts naming.MountFlag) error {
+func (ns *neighborhoodService) Mount(ctx ipc.ServerContext, server string, ttlsecs uint32, opts naming.MountFlag) error {
+	return ns.MountX(ctx, server, nil, ttlsecs, opts)
+}
+func (ns *neighborhoodService) MountX(_ ipc.ServerContext, _ string, _ []security.BlessingPattern, _ uint32, _ naming.MountFlag) error {
 	return errors.New("this server does not implement Mount")
 }
 
diff --git a/services/mounttable/lib/neighborhood_test.go b/services/mounttable/lib/neighborhood_test.go
index 9d673a9..c9b8293 100644
--- a/services/mounttable/lib/neighborhood_test.go
+++ b/services/mounttable/lib/neighborhood_test.go
@@ -53,11 +53,11 @@
 	serverName := fmt.Sprintf("nhtest%d", os.Getpid())
 
 	// Add neighborhood server.
-	nhd, err := NewLoopbackNeighborhoodServer(serverName, addresses...)
+	nhd, err := NewLoopbackNeighborhoodDispatcher(serverName, addresses...)
 	if err != nil {
 		boom(t, "Failed to create neighborhood server: %s\n", err)
 	}
-	defer nhd.Stop()
+	defer nhd.(*neighborhood).Stop()
 	if err := server.ServeDispatcher("", nhd); err != nil {
 		boom(t, "Failed to register neighborhood server: %s", err)
 	}
diff --git a/services/mounttable/lib/serverlist.go b/services/mounttable/lib/serverlist.go
index 02c7308..f74752f 100644
--- a/services/mounttable/lib/serverlist.go
+++ b/services/mounttable/lib/serverlist.go
@@ -6,6 +6,7 @@
 	"time"
 
 	"v.io/core/veyron2/naming"
+	"v.io/core/veyron2/security"
 )
 
 type serverListClock interface {
@@ -24,8 +25,9 @@
 // server maintains the state of a single server.  Unless expires is refreshed before the
 // time is reached, the entry will be removed.
 type server struct {
-	expires time.Time
-	oa      string // object address of server
+	expires  time.Time
+	oa       string   // object address of server
+	patterns []string // patterns that match the blessings presented by the server.
 }
 
 // serverList represents an ordered list of servers.
@@ -34,8 +36,8 @@
 	l *list.List // contains entries of type *server
 }
 
-// NewServerList creates a synchronized list of servers.
-func NewServerList() *serverList {
+// newServerList creates a synchronized list of servers.
+func newServerList() *serverList {
 	return &serverList{l: list.New()}
 }
 
@@ -59,8 +61,12 @@
 // add to the front of the list if not already in the list, otherwise,
 // update the expiration time and move to the front of the list.  That
 // way the most recently refreshed is always first.
-func (sl *serverList) add(oa string, ttl time.Duration) {
+func (sl *serverList) add(oa string, patterns []security.BlessingPattern, ttl time.Duration) {
 	expires := slc.now().Add(ttl)
+	strpats := make([]string, len(patterns))
+	for idx, pat := range patterns {
+		strpats[idx] = string(pat)
+	}
 	sl.Lock()
 	defer sl.Unlock()
 	for e := sl.l.Front(); e != nil; e = e.Next() {
@@ -72,8 +78,9 @@
 		}
 	}
 	s := &server{
-		oa:      oa,
-		expires: expires,
+		oa:       oa,
+		expires:  expires,
+		patterns: strpats,
 	}
 	sl.l.PushFront(s) // innocent until proven guilty
 }
@@ -118,7 +125,7 @@
 	for e := sl.l.Front(); e != nil; e = e.Next() {
 		s := e.Value.(*server)
 		ttl := uint32(s.expires.Sub(now).Seconds())
-		ms := naming.VDLMountedServer{Server: s.oa, TTL: ttl}
+		ms := naming.VDLMountedServer{Server: s.oa, BlessingPatterns: s.patterns, TTL: ttl}
 		slice = append(slice, ms)
 	}
 	return slice
diff --git a/services/mounttable/lib/serverlist_test.go b/services/mounttable/lib/serverlist_test.go
index 66e31a4..7c1c135 100644
--- a/services/mounttable/lib/serverlist_test.go
+++ b/services/mounttable/lib/serverlist_test.go
@@ -1,8 +1,13 @@
 package mounttable
 
 import (
+	"fmt"
+	"reflect"
 	"testing"
 	"time"
+
+	"v.io/core/veyron2/naming"
+	"v.io/core/veyron2/security"
 )
 
 type fakeTime struct {
@@ -30,9 +35,10 @@
 	// Test adding entries.
 	ft := NewFakeTimeClock()
 	setServerListClock(ft)
-	sl := NewServerList()
+	sl := newServerList()
 	for i, ep := range eps {
-		sl.add(ep, time.Duration(5*i)*time.Second)
+		bp := security.BlessingPattern(fmt.Sprintf("ep%d", i))
+		sl.add(ep, []security.BlessingPattern{bp}, time.Duration(5*i)*time.Second)
 	}
 	if sl.len() != len(eps) {
 		t.Fatalf("got %d, want %d", sl.len(), len(eps))
@@ -49,4 +55,15 @@
 	if sl.len() != len(eps)-3 {
 		t.Fatalf("got %d, want %d", sl.len(), len(eps)-3)
 	}
+
+	// Test copyToSlice.
+	if got, want := sl.copyToSlice(), []naming.VDLMountedServer{
+		{
+			Server:           "endpoint:dfgsfdg@@",
+			TTL:              9,
+			BlessingPatterns: []string{"ep3"},
+		},
+	}; !reflect.DeepEqual(got, want) {
+		t.Errorf("Got %v, want %v", got, want)
+	}
 }
diff --git a/services/mounttable/mounttabled/mounttable.go b/services/mounttable/mounttabled/mounttable.go
index b6d60b9..c1d97bd 100644
--- a/services/mounttable/mounttabled/mounttable.go
+++ b/services/mounttable/mounttabled/mounttable.go
@@ -32,9 +32,9 @@
 		os.Exit(1)
 	}
 	defer mtServer.Stop()
-	mt, err := mounttable.NewMountTable(*aclFile)
+	mtd, err := mounttable.NewMountTableDispatcher(*aclFile)
 	if err != nil {
-		vlog.Errorf("r.NewMountTable failed: %v", err)
+		vlog.Errorf("r.NewMountTableDispatcher failed: %v", err)
 		os.Exit(1)
 	}
 	listenSpec := veyron2.GetListenSpec(ctx)
@@ -45,7 +45,7 @@
 	}
 	mtEndpoint := mtEndpoints[0]
 	name := *mountName
-	if err := mtServer.ServeDispatcher(name, mt); err != nil {
+	if err := mtServer.ServeDispatcher(name, mtd); err != nil {
 		vlog.Errorf("ServeDispatcher(%v) failed: %v", name, err)
 		os.Exit(1)
 	}
@@ -72,12 +72,12 @@
 
 		myObjectName := mtEndpoint.Name()
 
-		nh, err := mounttable.NewNeighborhoodServer(*nhName, myObjectName)
+		nhd, err := mounttable.NewNeighborhoodDispatcher(*nhName, myObjectName)
 		if err != nil {
 			vlog.Errorf("NewNeighborhoodServer failed: %v", err)
 			os.Exit(1)
 		}
-		if err := nhServer.ServeDispatcher(naming.JoinAddressName(myObjectName, "nh"), nh); err != nil {
+		if err := nhServer.ServeDispatcher(naming.JoinAddressName(myObjectName, "nh"), nhd); err != nil {
 			vlog.Errorf("nhServer.ServeDispatcher failed to register neighborhood: %v", err)
 			os.Exit(1)
 		}
diff --git a/services/security/discharger.vdl b/services/security/discharger.vdl
index d43ed74..c1747cc 100644
--- a/services/security/discharger.vdl
+++ b/services/security/discharger.vdl
@@ -10,7 +10,7 @@
   //
   // Caveat and Discharge are of type ThirdPartyCaveat and Discharge
   // respectively. (not enforced here because vdl does not know these types)
-  // TODO(ataly,ashankar): Figure out a VDL representation for ThirdPartyCaveat
-  // and Discharge and use those here?
+  // TODO(ataly,ashankar): The type of Caveat should become security.Caveat and
+  // we have to figure out an alternative to any for the return Discharge.
   Discharge(Caveat any, Impetus security.DischargeImpetus) (Discharge any | error)
 }
diff --git a/services/security/discharger.vdl.go b/services/security/discharger.vdl.go
index 771c5f1..f086448 100644
--- a/services/security/discharger.vdl.go
+++ b/services/security/discharger.vdl.go
@@ -24,8 +24,8 @@
 	//
 	// Caveat and Discharge are of type ThirdPartyCaveat and Discharge
 	// respectively. (not enforced here because vdl does not know these types)
-	// TODO(ataly,ashankar): Figure out a VDL representation for ThirdPartyCaveat
-	// and Discharge and use those here?
+	// TODO(ataly,ashankar): The type of Caveat should become security.Caveat and
+	// we have to figure out an alternative to any for the return Discharge.
 	Discharge(ctx *__context.T, Caveat __vdl.AnyRep, Impetus security.DischargeImpetus, opts ...__ipc.CallOpt) (Discharge __vdl.AnyRep, err error)
 }
 
@@ -80,8 +80,8 @@
 	//
 	// Caveat and Discharge are of type ThirdPartyCaveat and Discharge
 	// respectively. (not enforced here because vdl does not know these types)
-	// TODO(ataly,ashankar): Figure out a VDL representation for ThirdPartyCaveat
-	// and Discharge and use those here?
+	// TODO(ataly,ashankar): The type of Caveat should become security.Caveat and
+	// we have to figure out an alternative to any for the return Discharge.
 	Discharge(ctx __ipc.ServerContext, Caveat __vdl.AnyRep, Impetus security.DischargeImpetus) (Discharge __vdl.AnyRep, err error)
 }
 
@@ -143,7 +143,7 @@
 	Methods: []__ipc.MethodDesc{
 		{
 			Name: "Discharge",
-			Doc:  "// Discharge is called by a principal that holds a blessing with a third\n// party caveat and seeks to get a discharge that proves the fulfillment of\n// this caveat.\n//\n// Caveat and Discharge are of type ThirdPartyCaveat and Discharge\n// respectively. (not enforced here because vdl does not know these types)\n// TODO(ataly,ashankar): Figure out a VDL representation for ThirdPartyCaveat\n// and Discharge and use those here?",
+			Doc:  "// Discharge is called by a principal that holds a blessing with a third\n// party caveat and seeks to get a discharge that proves the fulfillment of\n// this caveat.\n//\n// Caveat and Discharge are of type ThirdPartyCaveat and Discharge\n// respectively. (not enforced here because vdl does not know these types)\n// TODO(ataly,ashankar): The type of Caveat should become security.Caveat and\n// we have to figure out an alternative to any for the return Discharge.",
 			InArgs: []__ipc.ArgDesc{
 				{"Caveat", ``},  // __vdl.AnyRep
 				{"Impetus", ``}, // security.DischargeImpetus
diff --git a/tools/application/impl_test.go b/tools/application/impl_test.go
index 7b20e9f..e688c62 100644
--- a/tools/application/impl_test.go
+++ b/tools/application/impl_test.go
@@ -82,7 +82,7 @@
 type dispatcher struct {
 }
 
-func NewDispatcher() *dispatcher {
+func NewDispatcher() ipc.Dispatcher {
 	return &dispatcher{}
 }
 
diff --git a/tools/binary/impl_test.go b/tools/binary/impl_test.go
index 0bfe953..d0b1788 100644
--- a/tools/binary/impl_test.go
+++ b/tools/binary/impl_test.go
@@ -86,7 +86,7 @@
 type dispatcher struct {
 }
 
-func NewDispatcher() *dispatcher {
+func NewDispatcher() ipc.Dispatcher {
 	return &dispatcher{}
 }
 
diff --git a/tools/build/doc.go b/tools/build/doc.go
index d58afb3..40cd568 100644
--- a/tools/build/doc.go
+++ b/tools/build/doc.go
@@ -69,9 +69,9 @@
 against all packages with that prefix.
 
 The build build flags are:
- -arch=amd64
+ -arch=$GOARCH
    Target architecture.
- -os=darwin
+ -os=$GOOS
    Target operating system.
 
 Build Help
diff --git a/tools/build/impl.go b/tools/build/impl.go
index b8e0b90..4b7e4af 100644
--- a/tools/build/impl.go
+++ b/tools/build/impl.go
@@ -6,7 +6,7 @@
 	"io/ioutil"
 	"os"
 	"path/filepath"
-	goruntime "runtime"
+	"runtime"
 	"strings"
 	"time"
 
@@ -15,14 +15,30 @@
 	"v.io/lib/cmdline"
 )
 
+const (
+	defaultArch = "$GOARCH"
+	defaultOS   = "$GOOS"
+)
+
 var (
 	flagArch string
 	flagOS   string
 )
 
 func init() {
-	cmdBuild.Flags.StringVar(&flagArch, "arch", goruntime.GOARCH, "Target architecture.")
-	cmdBuild.Flags.StringVar(&flagOS, "os", goruntime.GOOS, "Target operating system.")
+	cmdBuild.Flags.StringVar(&flagArch, "arch", defaultArch, "Target architecture.")
+	cmdBuild.Flags.StringVar(&flagOS, "os", defaultOS, "Target operating system.")
+}
+
+// substituteVarsInFlags substitutes environment variables in default
+// values of relevant flags.
+func substituteVarsInFlags() {
+	if flagArch == defaultArch {
+		flagArch = runtime.GOARCH
+	}
+	if flagOS == defaultOS {
+		flagOS = runtime.GOOS
+	}
 }
 
 var cmdRoot = &cmdline.Command{
diff --git a/tools/build/main.go b/tools/build/main.go
index 65f7187..50b3224 100644
--- a/tools/build/main.go
+++ b/tools/build/main.go
@@ -17,6 +17,7 @@
 func main() {
 	var shutdown veyron2.Shutdown
 	gctx, shutdown = veyron2.Init()
+	substituteVarsInFlags()
 	exitCode := root().Main()
 	shutdown()
 	os.Exit(exitCode)
diff --git a/tools/mgmt/device/impl/devicemanager_mock_test.go b/tools/mgmt/device/impl/devicemanager_mock_test.go
index 523c5e2..d0da827 100644
--- a/tools/mgmt/device/impl/devicemanager_mock_test.go
+++ b/tools/mgmt/device/impl/devicemanager_mock_test.go
@@ -200,7 +200,7 @@
 	t    *testing.T
 }
 
-func NewDispatcher(t *testing.T, tape *Tape) *dispatcher {
+func NewDispatcher(t *testing.T, tape *Tape) ipc.Dispatcher {
 	return &dispatcher{tape: tape, t: t}
 }
 
diff --git a/tools/mounttable/impl_test.go b/tools/mounttable/impl_test.go
index 43c650e..71de1c8 100644
--- a/tools/mounttable/impl_test.go
+++ b/tools/mounttable/impl_test.go
@@ -25,8 +25,8 @@
 func (s *server) Glob__(ctx ipc.ServerContext, pattern string) (<-chan naming.VDLMountEntry, error) {
 	vlog.VI(2).Infof("Glob() was called. suffix=%v pattern=%q", s.suffix, pattern)
 	ch := make(chan naming.VDLMountEntry, 2)
-	ch <- naming.VDLMountEntry{"name1", []naming.VDLMountedServer{{"server1", 123}}, false}
-	ch <- naming.VDLMountEntry{"name2", []naming.VDLMountedServer{{"server2", 456}, {"server3", 789}}, false}
+	ch <- naming.VDLMountEntry{"name1", []naming.VDLMountedServer{{"server1", nil, 123}}, false}
+	ch <- naming.VDLMountEntry{"name2", []naming.VDLMountedServer{{"server2", nil, 456}, {"server3", nil, 789}}, false}
 	close(ch)
 	return ch, nil
 }
@@ -36,6 +36,11 @@
 	return nil
 }
 
+func (s *server) MountX(_ ipc.ServerContext, server string, patterns []security.BlessingPattern, ttl uint32, flags naming.MountFlag) error {
+	vlog.VI(2).Infof("MountX() was called. suffix=%v servers=%q patterns=%v ttl=%d", s.suffix, server, patterns, ttl)
+	return nil
+}
+
 func (s *server) Unmount(_ ipc.ServerContext, server string) error {
 	vlog.VI(2).Infof("Unmount() was called. suffix=%v server=%q", s.suffix, server)
 	return nil
@@ -43,14 +48,14 @@
 
 func (s *server) ResolveStep(ipc.ServerContext) (entry naming.VDLMountEntry, err error) {
 	vlog.VI(2).Infof("ResolveStep() was called. suffix=%v", s.suffix)
-	entry.Servers = []naming.VDLMountedServer{{"server1", 123}}
+	entry.Servers = []naming.VDLMountedServer{{"server1", nil, 123}}
 	entry.Name = s.suffix
 	return
 }
 
 func (s *server) ResolveStepX(ipc.ServerContext) (entry naming.VDLMountEntry, err error) {
 	vlog.VI(2).Infof("ResolveStepX() was called. suffix=%v", s.suffix)
-	entry.Servers = []naming.VDLMountedServer{{"server1", 123}}
+	entry.Servers = []naming.VDLMountedServer{{"server1", nil, 123}}
 	entry.Name = s.suffix
 	return
 }
@@ -148,7 +153,7 @@
 	if err := cmd.Execute([]string{"resolvestep", naming.JoinAddressName(endpoint.String(), "name")}); err != nil {
 		t.Fatalf("%v", err)
 	}
-	if expected, got := `Servers: [{server1 123}] Suffix: "name" MT: false`, strings.TrimSpace(stdout.String()); got != expected {
+	if expected, got := `Servers: [{server1 [] 123}] Suffix: "name" MT: false`, strings.TrimSpace(stdout.String()); got != expected {
 		t.Errorf("Got %q, expected %q", got, expected)
 	}
 	stdout.Reset()
diff --git a/tools/naming/simulator/shell_functions.go b/tools/naming/simulator/shell_functions.go
index 5a8f899..ecbe56d 100644
--- a/tools/naming/simulator/shell_functions.go
+++ b/tools/naming/simulator/shell_functions.go
@@ -75,7 +75,7 @@
 		return err
 	}
 	disable := true
-	switch args[1] {
+	switch args[0] {
 	case "on":
 		disable = false
 	case "off":
@@ -116,5 +116,5 @@
 }
 
 func setNamespaceRoots(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
-	return veyron2.GetNamespace(ctx).SetRoots(args[1:]...)
+	return veyron2.GetNamespace(ctx).SetRoots(args...)
 }
diff --git a/tools/naming/simulator/testdata/ambiguity.scr b/tools/naming/simulator/testdata/ambiguity.scr
index afa2c0a..a647015 100644
--- a/tools/naming/simulator/testdata/ambiguity.scr
+++ b/tools/naming/simulator/testdata/ambiguity.scr
@@ -21,19 +21,19 @@
 
 set localaddr="--veyron.tcp.address=127.0.0.1:0"
 
-root -- $localaddr
+root $localaddr
 set r=$_
 read $r
 eval $r
 set s1=$MT_NAME
 
-root  -- $localaddr
+root $localaddr
 set r=$_
 read $r
 eval $r
 set s2=$MT_NAME
 
-root -- $localaddr
+root $localaddr
 set r=$_
 read $r
 eval $r
@@ -45,7 +45,7 @@
 mount $s2/b $s3/c 1h
 wait $_
 
-echoServer  -- $localaddr "Echo" $s3/c
+echoServer $localaddr "Echo" $s3/c
 set es_h=$_
 
 # Returns the root and three mounts at s1/a.
diff --git a/tools/naming/simulator/testdata/echo.scr b/tools/naming/simulator/testdata/echo.scr
index fe4f59b..4ca7435 100644
--- a/tools/naming/simulator/testdata/echo.scr
+++ b/tools/naming/simulator/testdata/echo.scr
@@ -7,7 +7,7 @@
 setRoots
 
 # A 'stand-alone' server
-echoServer -- $localaddr $ws $localaddr "text" ""
+echoServer $localaddr $ws $localaddr "text" ""
 set es=$_
 read $es
 eval $es
@@ -22,14 +22,14 @@
 wait $ec
 
 # now use a nameserver.
-root -- $localaddr
+root $localaddr
 set r=$_
 read $r
 eval $r
 set root=$MT_NAME
 
 set NAMESPACE_ROOT=$root
-echoServer -- $localaddr $ws $localaddr "text2" "a/b"
+echoServer $localaddr $ws $localaddr "text2" "a/b"
 set es=$_
 read $es
 eval $es
diff --git a/tools/naming/simulator/testdata/integration_test.go b/tools/naming/simulator/testdata/integration_test.go
index 9cee3bf..be038a7 100644
--- a/tools/naming/simulator/testdata/integration_test.go
+++ b/tools/naming/simulator/testdata/integration_test.go
@@ -1,6 +1,8 @@
 package testdata
 
 import (
+	"bufio"
+	"bytes"
 	"fmt"
 	"io/ioutil"
 	"os"
@@ -34,8 +36,10 @@
 	}
 	for _, script := range scripts {
 		invocation := binary.Start("--file", script)
-		output, errorOutput := invocation.Output(), invocation.ErrorOutput()
-		if err := invocation.Wait(nil, nil); err != nil {
+		output := invocation.Output()
+		var buf bytes.Buffer
+		if err := invocation.Wait(nil, bufio.NewWriter(&buf)); err != nil {
+			errorOutput := string(buf.Bytes())
 			fmt.Fprintf(os.Stderr, "Script %v failed\n", script)
 			fmt.Fprintln(os.Stderr, output)
 			fmt.Fprintln(os.Stderr, errorOutput)
diff --git a/tools/naming/simulator/testdata/json_example.scr b/tools/naming/simulator/testdata/json_example.scr
index e882725..d399a30 100644
--- a/tools/naming/simulator/testdata/json_example.scr
+++ b/tools/naming/simulator/testdata/json_example.scr
@@ -3,7 +3,7 @@
 
 set localaddr=--veyron.tcp.address=127.0.0.1:0
 
-root -- $localaddr
+root $localaddr
 set root=$_
 eval $root
 set ROOT_PID=$PID
@@ -12,7 +12,7 @@
 json_set ROOT_NAME ROOT_PID
 
 set PROXY_MOUNTPOINT=$ROOT_NAME/proxy/mp
-proxyd -- $localaddr $PROXY_MOUNTPOINT
+proxyd $localaddr $PROXY_MOUNTPOINT
 set proxyd=$_
 read $proxyd
 eval $proxyd
diff --git a/tools/naming/simulator/testdata/mt_complex.scr b/tools/naming/simulator/testdata/mt_complex.scr
index 620dbc1..e7761d3 100644
--- a/tools/naming/simulator/testdata/mt_complex.scr
+++ b/tools/naming/simulator/testdata/mt_complex.scr
@@ -7,21 +7,21 @@
 
 cache off
 
-root -- $localaddr
+root $localaddr
 set root_h=$_
 read $root_h
 eval $root_h
 set root=$MT_NAME
 
 set NAMESPACE_ROOT=$root
-mt -- $localaddr tl/a
+mt $localaddr tl/a
 set m=$_
 set mt_a_h=$m
 read $m
 eval $m
 set mt_a_name=$MT_NAME
 
-mt  -- $localaddr tl/b
+mt $localaddr tl/b
 set m=$_
 set mt_b_h=$m
 eval $m
@@ -73,7 +73,7 @@
 #
 
 # run an echo server on tl.
-echoServer  -- $localaddr "E1" tl
+echoServer  $localaddr "E1" tl
 set es_E1=$_
 read $es_E1
 eval $es_E1
@@ -126,7 +126,7 @@
 # run an echo server on tl/a - note that this currently doesn't seem to
 # have any effect on the mount table - that is, I suspect the mount table
 # refuses the mount.
-echoServer  -- $localaddr "E2" tl/a
+echoServer  $localaddr "E2" tl/a
 set es_E2=$_
 read $es_E2
 eval $es_E2
@@ -207,7 +207,7 @@
 
 # Create a mount table with a 'long' name
 set long_name=tl/b/some/deep/name/that/is/a/mount/table
-mt -- $localaddr $long_name
+mt $localaddr $long_name
 set m=$_
 read $m
 eval $m
@@ -216,14 +216,14 @@
 
 # Create a second mount table with a 'long' name
 set second_long_name=tl/a/some/deep/name/that/is/a/mount/table
-mt -- $localaddr $second_long_name
+mt $localaddr $second_long_name
 set m=$_
 read $m
 eval $m
 set mt_l2_name=$MT_NAME
 
 # Run an echo server that uses that mount table
-echoServer -- $localaddr "E3" $long_name/echo
+echoServer $localaddr "E3" $long_name/echo
 set es_E3=$_
 eval $es_E3
 set es_E3_name=$NAME
@@ -246,7 +246,7 @@
 mount tl/b/symlink $mt_b_name/$symlink_target 1h M
 wait $_
 
-ls -- -l tl/b/symlink
+ls -l tl/b/symlink
 wait $_
 
 resolve tl/b/symlink
diff --git a/tools/naming/simulator/testdata/mt_simple.scr b/tools/naming/simulator/testdata/mt_simple.scr
index ef648ec..9c5b5f2 100644
--- a/tools/naming/simulator/testdata/mt_simple.scr
+++ b/tools/naming/simulator/testdata/mt_simple.scr
@@ -3,19 +3,19 @@
 set localaddr="--veyron.tcp.address=127.0.0.1:0"
 set ws=--veyron.tcp.protocol=ws
 
-root -- $localaddr
+root $localaddr
 set m=$_
 read $m
 eval $m
 set root=$MT_NAME
 
 set NAMESPACE_ROOT=$root
-mt -- $localaddr $ws $localaddr usa
+mt $localaddr $ws $localaddr usa
 set m=$_
 read $m
 eval $m
 set usa_mt=$MT_NAME
-mt -- $localaddr $ws $localaddr uk
+mt $localaddr $ws $localaddr uk
 set m=$_
 read $m
 eval $m
@@ -28,14 +28,14 @@
 wait $l
 
 set NAMESPACE_ROOT=$usa_mt
-mt -- $localaddr $ws $localaddr "palo alto"
+mt $localaddr $ws $localaddr "palo alto"
 set m=$_
 read $m
 eval $m
 set pa_mt=$MT_NAME
 
 set NAMESPACE_ROOT=$uk_mt
-mt -- $localaddr $ws $localaddr "cambridge"
+mt $localaddr $ws $localaddr "cambridge"
 set m=$_
 read $m
 eval $m
@@ -47,7 +47,7 @@
 assert $RN 7
 wait $l
 
-ls -- -l $root/...
+ls -l $root/...
 wait $_
 
 resolve $root/usa
diff --git a/tools/naming/simulator/testdata/proxy.scr b/tools/naming/simulator/testdata/proxy.scr
index cb0d6bc..855879e 100644
--- a/tools/naming/simulator/testdata/proxy.scr
+++ b/tools/naming/simulator/testdata/proxy.scr
@@ -3,7 +3,7 @@
 set localaddr=--veyron.tcp.address=127.0.0.1:0
 set ws=--veyron.tcp.protocol=ws
 
-root -- $localaddr
+root $localaddr
 set m=$_
 read $m
 eval $m
@@ -13,7 +13,7 @@
 print $NAMESPACE_ROOT
 
 # run a non-proxied echo server
-echoServer -- $localaddr $ws $localaddr noproxy echo/noproxy
+echoServer $localaddr $ws $localaddr noproxy echo/noproxy
 set esnp=$_
 read $esnp
 eval $esnp
@@ -25,7 +25,7 @@
 assert $l "noproxy: ohh"
 
 # run a proxy server
-proxyd -- $localaddr $ws $localaddr p1
+proxyd $localaddr $ws $localaddr p1
 set proxy=$_
 read $proxy
 # PROXY_NAME=<name of proxy>
@@ -44,7 +44,7 @@
 #assert $RN 3
 #wait $l
 
-echoServer -- $localaddr $ws $localaddr --veyron.proxy=p1 withproxy echo/withproxy
+echoServer $localaddr $ws $localaddr --veyron.proxy=p1 withproxy echo/withproxy
 set eswp=$_
 read $eswp
 eval $eswp
@@ -104,9 +104,9 @@
 # $ep4_addr
 assert $rid $ECHOS_RID
 
-ls -- -l echo/withproxy
+ls -l echo/withproxy
 wait $_
-ls -- -l echo/noproxy
+ls -l echo/noproxy
 wait $_
 
 echoClient echo/withproxy "ohh"
diff --git a/tools/naming/simulator/testdata/public_echo.scr b/tools/naming/simulator/testdata/public_echo.scr
index 4e508e9..5447fad 100644
--- a/tools/naming/simulator/testdata/public_echo.scr
+++ b/tools/naming/simulator/testdata/public_echo.scr
@@ -9,7 +9,7 @@
 # now use the global nameserver.
 
 set global_name=global/echo
-echoServer -- $localaddr "text2" $global_name
+echoServer $localaddr "text2" $global_name
 set es=$_
 read $es
 eval $es
diff --git a/tools/profile/impl_test.go b/tools/profile/impl_test.go
index f334e31..8ae4621 100644
--- a/tools/profile/impl_test.go
+++ b/tools/profile/impl_test.go
@@ -76,7 +76,7 @@
 type dispatcher struct {
 }
 
-func NewDispatcher() *dispatcher {
+func NewDispatcher() ipc.Dispatcher {
 	return &dispatcher{}
 }
 
diff --git a/tools/vrpc/test_base/test_base.vdl b/tools/vrpc/test_base/test_base.vdl
index e0406da..70e3b85 100644
--- a/tools/vrpc/test_base/test_base.vdl
+++ b/tools/vrpc/test_base/test_base.vdl
@@ -4,6 +4,8 @@
   X,Y int32
 }
 
+type Array2Int [2]int32
+
 // TypeTester methods are listed in alphabetical order, to make it easier to
 // test Signature output, which sorts methods alphabetically.
 type TypeTester interface {
@@ -19,7 +21,7 @@
 	EchoUint64(I1 uint64) (O1 uint64 | error)
 
 	// Methods to test support for composite types.
-	XEchoArray(I1 [2]int32) (O1 [2]int32 | error)
+	XEchoArray(I1 Array2Int) (O1 Array2Int | error)
 	XEchoMap(I1 map[int32]string) (O1 map[int32]string | error)
 	XEchoSet(I1 set[int32]) (O1 set[int32] | error)
 	XEchoSlice(I1 []int32) (O1 []int32 | error)
diff --git a/tools/vrpc/test_base/test_base.vdl.go b/tools/vrpc/test_base/test_base.vdl.go
index af0e095..11d7c40 100644
--- a/tools/vrpc/test_base/test_base.vdl.go
+++ b/tools/vrpc/test_base/test_base.vdl.go
@@ -22,8 +22,16 @@
 }) {
 }
 
+type Array2Int [2]int32
+
+func (Array2Int) __VDLReflect(struct {
+	Name string "v.io/core/veyron/tools/vrpc/test_base.Array2Int"
+}) {
+}
+
 func init() {
 	__vdl.Register(Struct{})
+	__vdl.Register(Array2Int{})
 }
 
 // TypeTesterClientMethods is the client interface
@@ -43,7 +51,7 @@
 	EchoUint32(ctx *__context.T, I1 uint32, opts ...__ipc.CallOpt) (O1 uint32, err error)
 	EchoUint64(ctx *__context.T, I1 uint64, opts ...__ipc.CallOpt) (O1 uint64, err error)
 	// Methods to test support for composite types.
-	XEchoArray(ctx *__context.T, I1 [2]int32, opts ...__ipc.CallOpt) (O1 [2]int32, err error)
+	XEchoArray(ctx *__context.T, I1 Array2Int, opts ...__ipc.CallOpt) (O1 Array2Int, err error)
 	XEchoMap(ctx *__context.T, I1 map[int32]string, opts ...__ipc.CallOpt) (O1 map[int32]string, err error)
 	XEchoSet(ctx *__context.T, I1 map[int32]struct{}, opts ...__ipc.CallOpt) (O1 map[int32]struct{}, err error)
 	XEchoSlice(ctx *__context.T, I1 []int32, opts ...__ipc.CallOpt) (O1 []int32, err error)
@@ -183,7 +191,7 @@
 	return
 }
 
-func (c implTypeTesterClientStub) XEchoArray(ctx *__context.T, i0 [2]int32, opts ...__ipc.CallOpt) (o0 [2]int32, err error) {
+func (c implTypeTesterClientStub) XEchoArray(ctx *__context.T, i0 Array2Int, opts ...__ipc.CallOpt) (o0 Array2Int, err error) {
 	var call __ipc.Call
 	if call, err = c.c(ctx).StartCall(ctx, c.name, "XEchoArray", []interface{}{i0}, opts...); err != nil {
 		return
@@ -356,7 +364,7 @@
 	EchoUint32(ctx __ipc.ServerContext, I1 uint32) (O1 uint32, err error)
 	EchoUint64(ctx __ipc.ServerContext, I1 uint64) (O1 uint64, err error)
 	// Methods to test support for composite types.
-	XEchoArray(ctx __ipc.ServerContext, I1 [2]int32) (O1 [2]int32, err error)
+	XEchoArray(ctx __ipc.ServerContext, I1 Array2Int) (O1 Array2Int, err error)
 	XEchoMap(ctx __ipc.ServerContext, I1 map[int32]string) (O1 map[int32]string, err error)
 	XEchoSet(ctx __ipc.ServerContext, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
 	XEchoSlice(ctx __ipc.ServerContext, I1 []int32) (O1 []int32, err error)
@@ -384,7 +392,7 @@
 	EchoUint32(ctx __ipc.ServerContext, I1 uint32) (O1 uint32, err error)
 	EchoUint64(ctx __ipc.ServerContext, I1 uint64) (O1 uint64, err error)
 	// Methods to test support for composite types.
-	XEchoArray(ctx __ipc.ServerContext, I1 [2]int32) (O1 [2]int32, err error)
+	XEchoArray(ctx __ipc.ServerContext, I1 Array2Int) (O1 Array2Int, err error)
 	XEchoMap(ctx __ipc.ServerContext, I1 map[int32]string) (O1 map[int32]string, err error)
 	XEchoSet(ctx __ipc.ServerContext, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
 	XEchoSlice(ctx __ipc.ServerContext, I1 []int32) (O1 []int32, err error)
@@ -461,7 +469,7 @@
 	return s.impl.EchoUint64(ctx, i0)
 }
 
-func (s implTypeTesterServerStub) XEchoArray(ctx __ipc.ServerContext, i0 [2]int32) ([2]int32, error) {
+func (s implTypeTesterServerStub) XEchoArray(ctx __ipc.ServerContext, i0 Array2Int) (Array2Int, error) {
 	return s.impl.XEchoArray(ctx, i0)
 }
 
@@ -605,10 +613,10 @@
 			Name: "XEchoArray",
 			Doc:  "// Methods to test support for composite types.",
 			InArgs: []__ipc.ArgDesc{
-				{"I1", ``}, // [2]int32
+				{"I1", ``}, // Array2Int
 			},
 			OutArgs: []__ipc.ArgDesc{
-				{"O1", ``},  // [2]int32
+				{"O1", ``},  // Array2Int
 				{"err", ``}, // error
 			},
 		},
diff --git a/tools/vrpc/vrpc_test.go b/tools/vrpc/vrpc_test.go
index 429552f..05906ff 100644
--- a/tools/vrpc/vrpc_test.go
+++ b/tools/vrpc/vrpc_test.go
@@ -63,7 +63,7 @@
 	return i1, nil
 }
 
-func (*server) XEchoArray(call ipc.ServerContext, i1 [2]int32) ([2]int32, error) {
+func (*server) XEchoArray(call ipc.ServerContext, i1 test_base.Array2Int) (test_base.Array2Int, error) {
 	vlog.VI(2).Info("XEchoArray(%v) was called.", i1)
 	return i1, nil
 }
@@ -154,7 +154,7 @@
 	EchoUint32(I1 uint32) (O1 uint32 | error)
 	EchoUint64(I1 uint64) (O1 uint64 | error)
 	// Methods to test support for composite types.
-	XEchoArray(I1 [2]int32) (O1 [2]int32 | error)
+	XEchoArray(I1 "v.io/core/veyron/tools/vrpc/test_base".Array2Int) (O1 "v.io/core/veyron/tools/vrpc/test_base".Array2Int | error)
 	XEchoMap(I1 map[int32]string) (O1 map[int32]string | error)
 	XEchoSet(I1 set[int32]) (O1 set[int32] | error)
 	XEchoSlice(I1 []int32) (O1 []int32 | error)
@@ -206,6 +206,8 @@
 	Tags []any
 }
 
+type "v.io/core/veyron/tools/vrpc/test_base".Array2Int [2]int32
+
 type "v.io/core/veyron/tools/vrpc/test_base".Struct struct {
 	X int32
 	Y int32
@@ -271,7 +273,7 @@
 		{"EchoByte", `33`, `byte(33)`},
 		{"EchoUint32", `44`, `uint32(44)`},
 		{"EchoUint64", `55`, `uint64(55)`},
-		{"XEchoArray", `{1,2}`, `[2]int32{1, 2}`},
+		{"XEchoArray", `{1,2}`, `"v.io/core/veyron/tools/vrpc/test_base".Array2Int{1, 2}`},
 		{"XEchoMap", `{1:"a"}`, `map[int32]string{1: "a"}`},
 		{"XEchoSet", `{1}`, `set[int32]{1}`},
 		{"XEchoSlice", `{1,2}`, `[]int32{1, 2}`},