diff --git a/metropolis/node/core/curator/impl_leader_curator.go b/metropolis/node/core/curator/impl_leader_curator.go
index fd8602d..30324ca 100644
--- a/metropolis/node/core/curator/impl_leader_curator.go
+++ b/metropolis/node/core/curator/impl_leader_curator.go
@@ -41,7 +41,7 @@
 		return status.Errorf(codes.InvalidArgument, "invalid node name: %v", err)
 	}
 
-	value := etcd.NewValue(l.etcd, nodePath, func(data []byte) (interface{}, error) {
+	value := etcd.NewValue(l.etcd, nodePath, func(_, data []byte) (interface{}, error) {
 		return nodeUnmarshal(data)
 	})
 	w := value.Watch()
diff --git a/metropolis/pkg/event/etcd/etcd.go b/metropolis/pkg/event/etcd/etcd.go
index ff40bcd..7b914f7 100644
--- a/metropolis/pkg/event/etcd/etcd.go
+++ b/metropolis/pkg/event/etcd/etcd.go
@@ -27,30 +27,76 @@
 type Value struct {
 	etcd    client.Namespaced
 	key     string
+	keyEnd  string
 	decoder BytesDecoder
 }
 
-// NewValue creates a new Value for a given key in an etcd client. The
-// given decoder will be used to convert bytes retrieved from etcd into the
-// interface{} value retrieved by Get by this value's watcher.
-func NewValue(etcd client.Namespaced, key string, decoder BytesDecoder) *Value {
-	return &Value{
-		etcd:    etcd,
-		key:     key,
-		decoder: decoder,
+type Option struct {
+	rangeEnd string
+}
+
+// Range creates a Value that is backed a range of etcd key/value pairs from
+// 'key' passed to NewValue to 'end' passed to Range.
+//
+// The key range semantics (ie. lexicographic ordering) are the same as in etcd
+// ranges, so for example to retrieve all keys prefixed by `foo/` key should be
+// `foo/` and end should be `foo0`.
+//
+// For any update in the given range, the decoder will be called and its result
+// will trigger the return of a Get() call. The decoder should return a type
+// that lets the user distinguish which of the multiple objects in the range got
+// updated, as the Get() call returns no additional information about the
+// location of the retrieved object by itself.
+//
+// The order of values retrieved by Get() is currently fully arbitrary and must
+// not be relied on. It's possible that in the future the order of updates and
+// the blocking behaviour of Get will be formalized, but this is not yet the
+// case. Instead, the data returned should be treated as eventually consistent
+// with the etcd state.
+//
+// For some uses, it might be necessary to first retrieve all the objects
+// contained within the range before starting to block on updates - in this
+// case, the BacklogOnly option should be used when calling Get.
+func Range(end string) *Option {
+	return &Option{
+		rangeEnd: end,
 	}
 }
 
+// NewValue creates a new Value for a given key(s) in an etcd client. The
+// given decoder will be used to convert bytes retrieved from etcd into the
+// interface{} value retrieved by Get by this value's watcher.
+func NewValue(etcd client.Namespaced, key string, decoder BytesDecoder, options ...*Option) *Value {
+	res := &Value{
+		etcd:    etcd,
+		key:     key,
+		keyEnd:  key,
+		decoder: decoder,
+	}
+
+	for _, opt := range options {
+		if end := opt.rangeEnd; end != "" {
+			res.keyEnd = end
+		}
+	}
+
+	return res
+}
+
 // BytesDecoder is a function that converts bytes retrieved from etcd into an
-// end-user facing value. If an error is returned, the Get call performed on a
-// watcher configured with this decoder will fail, swallowing that particular
-// update, but the watcher will continue to work.
-// Any provided BytesDecoder implementations must be safe to copy.
-type BytesDecoder = func(data []byte) (interface{}, error)
+// end-user facing value. Additionally, a key is available so that returned
+// values can be augmented with the location they were retrieved from. This is
+// especially useful when returning values resulting from an etcd range.
+//
+// If an error is returned, the Get call performed on a watcher configured with
+// this decoder will fail, swallowing that particular update, but the watcher
+// will continue to work. Any provided BytesDecoder implementations must be safe
+// to copy.
+type BytesDecoder = func(key []byte, data []byte) (interface{}, error)
 
 // NoDecoder is a no-op decoder which passes through the retrieved bytes as a
 // []byte type to the user.
-func NoDecoder(data []byte) (interface{}, error) {
+func NoDecoder(key []byte, data []byte) (interface{}, error) {
 	return data, nil
 }
 
@@ -66,6 +112,13 @@
 	}
 }
 
+// keyValue is an intermediate type used to keep etcd values in the watcher's
+// backlog.
+type keyValue struct {
+	key   []byte
+	value []byte
+}
+
 type watcher struct {
 	// Value copy, used to configure the behaviour of this watcher.
 	Value
@@ -79,11 +132,15 @@
 	// error if concurrent access is attempted.
 	getSem chan struct{}
 
-	// backlogged is the value retrieved by an initial KV Get from etcd that
-	// should be returned at the next opportunity, or nil if there isn't any.
-	backlogged *[]byte
-	// prev is the revision of a previously retrieved value within this
-	// watcher, or nil if there hasn't been any.
+	// backlogged is a list of (key, value) pairs retrieved from etcd but not yet
+	// returned via Get. These items are not a replay of all the updates from etcd,
+	// but are already compacted to deduplicate updates to the same object (ie., if
+	// the update stream from etcd is for keys A, B, and A, the backlogged list will
+	// only contain one update for A and B each, with the first update for A being
+	// discarded upon arrival of the second update).
+	backlogged []*keyValue
+	// prev is the etcd store revision of a previously completed etcd Get/Watch
+	// call, used to resume a Watch call in case of failures.
 	prev *int64
 	// wc is the etcd watch channel, or nil if no channel is yet open.
 	wc clientv3.WatchChan
@@ -98,34 +155,49 @@
 	testSetupWG *sync.WaitGroup
 }
 
+// setup initiates wc (the watch channel from etcd) after retrieving the initial
+// value(s) with a get operation.
 func (w *watcher) setup(ctx context.Context) error {
 	if w.wc != nil {
 		return nil
 	}
+	ranged := w.key != w.keyEnd
 
-	// First, check if some data under this key already exists.
+	// First, check if some data under this key/range already exists.
+
 	// We use an exponential backoff and retry here as the initial Get can fail
 	// if the cluster is unstable (eg. failing over). We only fail the retry if
 	// the context expires.
 	bo := backoff.NewExponentialBackOff()
 	bo.MaxElapsedTime = 0
+
 	err := backoff.Retry(func() error {
-		get, err := w.etcd.Get(ctx, w.key)
+
+		var getOpts []clientv3.OpOption
+		if ranged {
+			getOpts = append(getOpts, clientv3.WithRange(w.keyEnd))
+		}
+		get, err := w.etcd.Get(ctx, w.key, getOpts...)
 		if err != nil {
 			return fmt.Errorf("when retrieving initial value: %w", err)
 		}
+
+		// Assert that the etcd API is behaving as expected.
+		if !ranged && len(get.Kvs) > 1 {
+			panic("More than one key returned in unary GET response")
+		}
+
+		// After a successful Get, save the revision to watch from and re-build the
+		// backlog from scratch based on what was available in the etcd store at that
+		// time.
 		w.prev = &get.Header.Revision
-		if len(get.Kvs) != 0 {
-			// Assert that the etcd API is behaving as expected.
-			if len(get.Kvs) > 1 {
-				panic("More than one key returned in unary GET response")
-			}
-			// If an existing value is present, backlog it and set the prev value
-			// accordingly.
-			kv := get.Kvs[0]
-			w.backlogged = &kv.Value
-		} else {
-			w.backlogged = nil
+
+		w.backlogged = nil
+		for _, kv := range get.Kvs {
+			w.backlogged = append(w.backlogged, &keyValue{
+				key:   kv.Key,
+				value: kv.Value,
+			})
 		}
 		return nil
 
@@ -138,10 +210,11 @@
 		return err
 	}
 
-	var watchOpts []clientv3.OpOption
-	if w.prev != nil {
-		watchOpts = append(watchOpts, clientv3.WithRev(*w.prev+1))
-	} else {
+	watchOpts := []clientv3.OpOption{
+		clientv3.WithRev(*w.prev + 1),
+	}
+	if ranged {
+		watchOpts = append(watchOpts, clientv3.WithRange(w.keyEnd))
 	}
 	w.wc = w.etcd.Watch(w.ctx, w.key, watchOpts...)
 
@@ -151,23 +224,17 @@
 	return nil
 }
 
-func (w *watcher) get(ctx context.Context) ([]byte, error) {
-	// Return backlogged value, if present.
-	if w.backlogged != nil {
-		value := *w.backlogged
-		w.backlogged = nil
-		return value, nil
-	}
-
-	// Keep watching for a watch event.
-	var event *clientv3.Event
+// backfill blocks until a backlog of items is available. An error is returned
+// if the context is canceled.
+func (w *watcher) backfill(ctx context.Context) error {
+	// Keep watching for watch events.
 	for {
 		var resp *clientv3.WatchResponse
 		select {
 		case r := <-w.wc:
 			resp = &r
 		case <-ctx.Done():
-			return nil, ctx.Err()
+			return ctx.Err()
 		}
 
 		if resp.Canceled {
@@ -175,52 +242,128 @@
 			// cancellations. Any other error is something we need to handle,
 			// eg. a client close or compaction error.
 			if errors.Is(resp.Err(), ctx.Err()) {
-				return nil, fmt.Errorf("watch canceled: %w", resp.Err())
+				return fmt.Errorf("watch canceled: %w", resp.Err())
 			}
 
 			// Attempt to reconnect.
-			w.wc = nil
-			w.setup(ctx)
+			if w.wc != nil {
+				// If a wc already exists, close it. This forces a reconnection
+				// by the next setup call.
+				w.ctxC()
+				w.ctx, w.ctxC = context.WithCancel(context.Background())
+				w.wc = nil
+			}
+			if err := w.setup(ctx); err != nil {
+				return fmt.Errorf("failed to setup watcher: %w", err)
+			}
 			continue
 		}
 
-		if len(resp.Events) < 1 {
+		w.prev = &resp.Header.Revision
+		// Spurious watch event with no update? Keep trying.
+		if len(resp.Events) == 0 {
 			continue
 		}
 
-		event = resp.Events[len(resp.Events)-1]
-		break
-	}
+		// Process updates into compacted list, transforming deletions into value: nil
+		// keyValues. This maps an etcd key into a pointer in the already existing
+		// backlog list. It will then be used to compact all updates into the smallest
+		// backlog possible (by overriding previously backlogged items for a key if this
+		// key is encountered again).
+		//
+		// TODO(q3k): this could be stored in the watcher state to not waste time on
+		// each update, but it's good enough for now.
+		lastUpdate := make(map[string]*keyValue)
+		for _, kv := range w.backlogged {
+			kv := kv
+			lastUpdate[string(kv.key)] = kv
+		}
+		for _, ev := range resp.Events {
+			var value []byte
+			switch ev.Type {
+			case clientv3.EventTypeDelete:
+			case clientv3.EventTypePut:
+				value = ev.Kv.Value
+			default:
+				return fmt.Errorf("invalid event type %v", ev.Type)
+			}
 
-	w.prev = &event.Kv.ModRevision
-	// Return deletions as nil, and new values as their content.
-	switch event.Type {
-	case clientv3.EventTypeDelete:
-		return nil, nil
-	case clientv3.EventTypePut:
-		return event.Kv.Value, nil
-	default:
-		return nil, fmt.Errorf("invalid event type %v", event.Type)
+			keyS := string(ev.Kv.Key)
+			prev := lastUpdate[keyS]
+			if prev == nil {
+				kv := &keyValue{
+					key: ev.Kv.Key,
+				}
+				w.backlogged = append(w.backlogged, kv)
+				prev = kv
+			}
+			prev.value = value
+		}
+
+		// Still nothing in backlog? Keep trying.
+		if len(w.backlogged) == 0 {
+			continue
+		}
+
+		return nil
 	}
 }
 
+type GetOption struct {
+	backlogOnly bool
+}
+
+var (
+	// BacklogOnly will prevent Get from blocking on waiting for more updates from
+	// etcd, by instead returning BacklogDone whenever no more data is currently
+	// locally available. This is different however, from establishing that there
+	// are no more pending updates from the etcd cluster - the only way to ensure
+	// the local client is up to date is by performing Get calls without this option
+	// set.
+	//
+	// This mode of retrieval should only be used for the retrieval of the existing
+	// data in the etcd cluster on the initial creation of the Watcher (by
+	// repeatedly calling Get until BacklogDone isreturned), and shouldn't be set
+	// for any subsequent call. Any use of this option after that initial fetch is
+	// undefined behaviour that exposes the internals of the Get implementation, and
+	// must not be relied on. However, in the future, this behaviour might be
+	// formalized.
+	//
+	// This mode is particularly useful for ranged watchers. Non-ranged watchers can
+	// still use this option to distinguish between blocking because of the
+	// nonexistence of an object vs. blocking because of networking issues. However,
+	// non-ranged retrieval semantics generally will rarely need to make this
+	// distinction.
+	BacklogOnly = GetOption{backlogOnly: true}
+
+	// BacklogDone is returned by Get when BacklogOnly is set and there is no more
+	// event data stored in the Watcher client, ie. when the initial cluster state
+	// of the requested key has been retrieved.
+	BacklogDone = errors.New("no more backlogged data")
+)
+
 // Get implements the Get method of the Watcher interface.
-// It can return an error in two cases:
+// It can return an error in three cases:
 //  - the given context is canceled (in which case, the given error will wrap
 //    the context error)
 //  - the watcher's BytesDecoder returned an error (in which case the error
 //    returned by the BytesDecoder will be returned verbatim)
+//  - it has been called with BacklogOnly and the Watcher has no more local
+//    event data to return (see BacklogOnly for more information on the
+//    semantics of this mode of operation)
 // Note that transient and permanent etcd errors are never returned, and the
 // Get call will attempt to recover from these errors as much as possible. This
 // also means that the user of the Watcher will not be notified if the
 // underlying etcd client disconnects from the cluster, or if the cluster loses
 // quorum.
+//
 // TODO(q3k): implement leases to allow clients to be notified when there are
 // transient cluster/quorum/partition errors, if needed.
+//
 // TODO(q3k): implement internal, limited buffering for backlogged data not yet
 // consumed by client, as etcd client library seems to use an unbound buffer in
 // case this happens ( see: watcherStream.buf in clientv3).
-func (w *watcher) Get(ctx context.Context) (interface{}, error) {
+func (w *watcher) Get(ctx context.Context, opts ...event.GetOption) (interface{}, error) {
 	select {
 	case w.getSem <- struct{}{}:
 	default:
@@ -230,6 +373,17 @@
 		<-w.getSem
 	}()
 
+	backlogOnly := false
+	for _, optI := range opts {
+		opt, ok := optI.(GetOption)
+		if !ok {
+			return nil, fmt.Errorf("get options must be of type etcd.GetOption")
+		}
+		if opt.backlogOnly {
+			backlogOnly = true
+		}
+	}
+
 	// Early check for context cancelations, preventing spurious contact with etcd
 	// if there's no need to.
 	if w.ctx.Err() != nil {
@@ -240,11 +394,34 @@
 		return nil, fmt.Errorf("when setting up watcher: %w", err)
 	}
 
-	value, err := w.get(ctx)
-	if err != nil {
-		return nil, fmt.Errorf("when watching for new value: %w", err)
+	if backlogOnly && len(w.backlogged) == 0 {
+		return nil, BacklogDone
 	}
-	return w.decoder(value)
+
+	// Update backlog from etcd if needed.
+	if len(w.backlogged) < 1 {
+		err := w.backfill(ctx)
+		if err != nil {
+			return nil, fmt.Errorf("when watching for new value: %w", err)
+		}
+	}
+	// Backlog is now guaranteed to contain at least one element.
+
+	ranged := w.key != w.keyEnd
+	if !ranged {
+		// For non-ranged queries, drain backlog fully.
+		if len(w.backlogged) != 1 {
+			panic("multiple keys in nonranged value")
+		}
+		kv := w.backlogged[0]
+		w.backlogged = nil
+		return w.decoder(kv.key, kv.value)
+	} else {
+		// For ranged queries, pop one ranged query off the backlog.
+		kv := w.backlogged[0]
+		w.backlogged = w.backlogged[1:]
+		return w.decoder(kv.key, kv.value)
+	}
 }
 
 func (w *watcher) Close() error {
diff --git a/metropolis/pkg/event/etcd/etcd_test.go b/metropolis/pkg/event/etcd/etcd_test.go
index 79d9875..4b620c0 100644
--- a/metropolis/pkg/event/etcd/etcd_test.go
+++ b/metropolis/pkg/event/etcd/etcd_test.go
@@ -233,6 +233,81 @@
 	cancel()
 }
 
+// stringAt is a helper type for testing ranged watchers. It's returned by a
+// watcher whose decoder is set to stringDecoder.
+type stringAt struct {
+	key, value string
+}
+
+func stringAtDecoder(key, value []byte) (interface{}, error) {
+	valueS := ""
+	if value != nil {
+		valueS = string(value)
+	}
+	return stringAt{
+		key:   string(key),
+		value: valueS,
+	}, nil
+}
+
+// stringAtGet performs a Get from a Watcher, expecting a stringAt and updating
+// the given map with the retrieved value.
+func stringAtGet(ctx context.Context, t *testing.T, w event.Watcher, m map[string]string) {
+	t.Helper()
+
+	vr, err := w.Get(ctx)
+	if err != nil {
+		t.Fatalf("Get: %v", err)
+	}
+	v := vr.(stringAt)
+	m[v.key] = v.value
+}
+
+// TestSimpleRange exercises the simplest behaviour of a ranged watcher,
+// retrieving updaates via Get in a fully blocking fashion.
+func TestSimpleRange(t *testing.T) {
+	tc := newTestClient(t)
+	defer tc.close()
+
+	ks := "test-simple-range/"
+	ke := "test-simple-range0"
+	value := NewValue(tc.namespaced, ks, stringAtDecoder, Range(ke))
+	tc.put(t, ks+"a", "one")
+	tc.put(t, ks+"b", "two")
+	tc.put(t, ks+"c", "three")
+	tc.put(t, ks+"b", "four")
+
+	w := value.Watch()
+	defer w.Close()
+
+	ctx, ctxC := context.WithCancel(context.Background())
+	defer ctxC()
+
+	res := make(map[string]string)
+	stringAtGet(ctx, t, w, res)
+	stringAtGet(ctx, t, w, res)
+	stringAtGet(ctx, t, w, res)
+
+	tc.put(t, ks+"a", "five")
+	tc.put(t, ks+"e", "six")
+
+	stringAtGet(ctx, t, w, res)
+	stringAtGet(ctx, t, w, res)
+
+	for _, te := range []struct {
+		k, w string
+	}{
+		{ks + "a", "five"},
+		{ks + "b", "four"},
+		{ks + "c", "three"},
+		{ks + "e", "six"},
+	} {
+		if want, got := te.w, res[te.k]; want != got {
+			t.Errorf("res[%q]: wanted %q, got %q", te.k, want, got)
+		}
+	}
+}
+
 // TestCancel ensures that watchers can resume after being canceled.
 func TestCancel(t *testing.T) {
 	tc := newTestClient(t)
@@ -433,6 +508,44 @@
 	expect(t, watcher, "")
 }
 
+// TestRemoveRange exercises the behaviour of a Get on a ranged watcher when a
+// value is removed.
+func TestRemoveRange(t *testing.T) {
+	tc := newTestClient(t)
+	defer tc.close()
+
+	ks := "test-remove-range/"
+	ke := "test-remove-range0"
+	value := NewValue(tc.namespaced, ks, stringAtDecoder, Range(ke))
+	tc.put(t, ks+"a", "one")
+	tc.put(t, ks+"b", "two")
+	tc.put(t, ks+"c", "three")
+	tc.put(t, ks+"b", "four")
+	tc.remove(t, ks+"c")
+
+	w := value.Watch()
+	defer w.Close()
+
+	ctx, ctxC := context.WithCancel(context.Background())
+	defer ctxC()
+
+	res := make(map[string]string)
+	stringAtGet(ctx, t, w, res)
+	stringAtGet(ctx, t, w, res)
+
+	for _, te := range []struct {
+		k, w string
+	}{
+		{ks + "a", "one"},
+		{ks + "b", "four"},
+		{ks + "c", ""},
+	} {
+		if want, got := te.w, res[te.k]; want != got {
+			t.Errorf("res[%q]: wanted %q, got %q", te.k, want, got)
+		}
+	}
+}
+
 // TestEmptyRace forces the watcher to retrieve an empty value from the K/V
 // store at first, and establishing the watch channel after a new value has
 // been stored in the same place.
@@ -473,7 +586,7 @@
 // on Get, but that the watcher continues to work after the error has been
 // returned.
 func TestDecoder(t *testing.T) {
-	decodeStringifiedNumbersDivisibleBy3 := func(data []byte) (interface{}, error) {
+	decodeStringifiedNumbersDivisibleBy3 := func(_, data []byte) (interface{}, error) {
 		num, err := strconv.ParseInt(string(data), 10, 64)
 		if err != nil {
 			return nil, fmt.Errorf("not a valid number")
@@ -582,3 +695,165 @@
 		}
 	}
 }
+
+// TestBacklogRange ensures that the ranged etcd watcher can handle a large
+// backlog of changes in etcd that the client didn't keep up with.
+func TestBacklogRange(t *testing.T) {
+	tc := newTestClient(t)
+	defer tc.close()
+
+	ks := "test-backlog-range/"
+	ke := "test-backlog-range0"
+	value := NewValue(tc.namespaced, ks, stringAtDecoder, Range(ke))
+	w := value.Watch()
+	defer w.Close()
+
+	for i := 0; i < 100; i++ {
+		if i%2 == 0 {
+			tc.put(t, ks+"a", fmt.Sprintf("val-%d", i))
+		} else {
+			tc.put(t, ks+"b", fmt.Sprintf("val-%d", i))
+		}
+	}
+
+	ctx, ctxC := context.WithCancel(context.Background())
+	defer ctxC()
+
+	res := make(map[string]string)
+	stringAtGet(ctx, t, w, res)
+	stringAtGet(ctx, t, w, res)
+
+	for _, te := range []struct {
+		k, w string
+	}{
+		{ks + "a", "val-98"},
+		{ks + "b", "val-99"},
+	} {
+		if want, got := te.w, res[te.k]; want != got {
+			t.Errorf("res[%q]: wanted %q, got %q", te.k, want, got)
+		}
+	}
+}
+
+// TestBacklogOnly exercises the BacklogOnly option for non-ranged watchers,
+// which effectively makes any Get operation non-blocking (but also showcases
+// that unless a Get without BacklogOnly is issues, no new data will appear by
+// itself in the watcher - which is an undocumented implementation detail of the
+// option).
+func TestBacklogOnly(t *testing.T) {
+	tc := newTestClient(t)
+	defer tc.close()
+	ctx, ctxC := context.WithCancel(context.Background())
+	defer ctxC()
+
+	k := "test-backlog-only"
+	tc.put(t, k, "initial")
+
+	value := NewValue(tc.namespaced, k, NoDecoder)
+	watcher := value.Watch()
+	defer watcher.Close()
+
+	d, err := watcher.Get(ctx, BacklogOnly)
+	if err != nil {
+		t.Fatalf("First Get failed: %v", err)
+	}
+	if want, got := "initial", string(d.([]byte)); want != got {
+		t.Fatalf("First Get: wanted value %q, got %q", want, got)
+	}
+
+	// As expected, next call to Get with BacklogOnly fails - there truly is no new
+	// updates to emit.
+	_, err = watcher.Get(ctx, BacklogOnly)
+	if want, got := BacklogDone, err; want != got {
+		t.Fatalf("Second Get: wanted %v, got %v", want, got)
+	}
+
+	// Implementation detail: even though there is a new value ('second'),
+	// BacklogOnly will still return BacklogDone.
+	tc.put(t, k, "second")
+	_, err = watcher.Get(ctx, BacklogOnly)
+	if want, got := BacklogDone, err; want != got {
+		t.Fatalf("Third Get: wanted %v, got %v", want, got)
+	}
+
+	// ... However, a Get  without BacklogOnly will return the new value.
+	d, err = watcher.Get(ctx)
+	if err != nil {
+		t.Fatalf("Fourth Get failed: %v", err)
+	}
+	if want, got := "second", string(d.([]byte)); want != got {
+		t.Fatalf("Fourth Get: wanted value %q, got %q", want, got)
+	}
+}
+
+// TestBacklogOnlyRange exercises the BacklogOnly option for ranged watchers,
+// showcasing how it expected to be used for keeping up with the external state
+// of a range by synchronizing to a local map.
+func TestBacklogOnlyRange(t *testing.T) {
+	tc := newTestClient(t)
+	defer tc.close()
+	ctx, ctxC := context.WithCancel(context.Background())
+	defer ctxC()
+
+	ks := "test-backlog-only-range/"
+	ke := "test-backlog-only-range0"
+
+	for i := 0; i < 100; i++ {
+		if i%2 == 0 {
+			tc.put(t, ks+"a", fmt.Sprintf("val-%d", i))
+		} else {
+			tc.put(t, ks+"b", fmt.Sprintf("val-%d", i))
+		}
+	}
+
+	value := NewValue(tc.namespaced, ks, stringAtDecoder, Range(ke))
+	w := value.Watch()
+	defer w.Close()
+
+	// Collect results into a map from key to value.
+	res := make(map[string]string)
+
+	// Run first Get - this is the barrier defining what's part of the backlog.
+	g, err := w.Get(ctx, BacklogOnly)
+	if err != nil {
+		t.Fatalf("Get: %v", err)
+	}
+	kv := g.(stringAt)
+	res[kv.key] = kv.value
+
+	// These won't be part of the backlog.
+	tc.put(t, ks+"a", fmt.Sprintf("val-100"))
+	tc.put(t, ks+"b", fmt.Sprintf("val-101"))
+
+	// Retrieve the rest of the backlog until BacklogDone is returned.
+	nUpdates := 1
+	for {
+		g, err := w.Get(ctx, BacklogOnly)
+		if err == BacklogDone {
+			break
+		}
+		if err != nil {
+			t.Fatalf("Get: %v", err)
+		}
+		nUpdates += 1
+		kv := g.(stringAt)
+		res[kv.key] = kv.value
+	}
+
+	// The backlog should've been compacted to just two entries at their newest
+	// state.
+	if want, got := 2, nUpdates; want != got {
+		t.Fatalf("wanted backlog in %d updates, got it in %d", want, got)
+	}
+
+	for _, te := range []struct {
+		k, w string
+	}{
+		{ks + "a", "val-98"},
+		{ks + "b", "val-99"},
+	} {
+		if want, got := te.w, res[te.k]; want != got {
+			t.Errorf("res[%q]: wanted %q, got %q", te.k, want, got)
+		}
+	}
+}
diff --git a/metropolis/pkg/event/event.go b/metropolis/pkg/event/event.go
index 6c40666..bc46525 100644
--- a/metropolis/pkg/event/event.go
+++ b/metropolis/pkg/event/event.go
@@ -168,9 +168,11 @@
 	// continue skipping some updates.
 	// If multiple goroutines need to access the Value, they should each use
 	// their own Watcher.
-	Get(context.Context) (interface{}, error)
+	Get(context.Context, ...GetOption) (interface{}, error)
 
 	// Close must be called if the Watcher is not going to be used anymore -
 	// otherwise, a goroutine will leak.
 	Close() error
 }
+
+type GetOption interface{}
diff --git a/metropolis/pkg/event/memory/memory.go b/metropolis/pkg/event/memory/memory.go
index 1e94a93..0db2524 100644
--- a/metropolis/pkg/event/memory/memory.go
+++ b/metropolis/pkg/event/memory/memory.go
@@ -230,9 +230,14 @@
 	return nil
 }
 
+// GetOption is a memory.Get-specific option passed to Get. Currently no options
+// are implemented.
+type GetOption struct {
+}
+
 // Get blocks until a Value's data is available. See event.Watcher.Get for
 // guarantees and more information.
-func (m *watcher) Get(ctx context.Context) (interface{}, error) {
+func (m *watcher) Get(ctx context.Context, opts ...event.GetOption) (interface{}, error) {
 	// Make sure we're the only active .Get call.
 	select {
 	case m.getSem <- struct{}{}:
@@ -243,6 +248,13 @@
 		<-m.getSem
 	}()
 
+	for _, optI := range opts {
+		_, ok := optI.(GetOption)
+		if !ok {
+			return nil, fmt.Errorf("get options must be of type memory.GetOption")
+		}
+	}
+
 	c := make(chan interface{})
 
 	// Start responding on activeReqC. This signals to .update and to the
