diff --git a/routing/dht/dht.go b/routing/dht/dht.go
index c0b7970be5766f0d09456052ea70ed8c268d0e97..015b77805a207d651ec0ee93761b14a88431f41f 100644
--- a/routing/dht/dht.go
+++ b/routing/dht/dht.go
@@ -150,6 +150,8 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, skey string) err
 	return nil
 }
 
+var errInvalidRecord = errors.New("received invalid record")
+
 // getValueOrPeers queries a particular peer p for the value for
 // key. It returns either the value or a list of closer peers.
 // NOTE: it will update the dht's peerstore with any new addresses
@@ -173,11 +175,11 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID,
 		err = dht.verifyRecordOnline(ctx, record)
 		if err != nil {
 			log.Info("Received invalid record! (discarded)")
-			// still return a non-nil record to signify that we received
-			// a bad record from this peer
+			// return a sentinal to signify an invalid record was received
+			err = errInvalidRecord
 			record = new(pb.Record)
 		}
-		return record, peers, nil
+		return record, peers, err
 	}
 
 	if len(peers) > 0 {
diff --git a/routing/dht/routing.go b/routing/dht/routing.go
index 0f6d50d1afe29d1ae95c9f8fa66a1b9b42a70ea5..627c936078cc0083b47ad6e08f4251fafc057a76 100644
--- a/routing/dht/routing.go
+++ b/routing/dht/routing.go
@@ -171,21 +171,26 @@ func (dht *IpfsDHT) GetValues(ctx context.Context, key key.Key, nvals int) ([]ro
 		})
 
 		rec, peers, err := dht.getValueOrPeers(ctx, p, key)
-		if err != nil {
-			if err == routing.ErrNotFound {
-				// in this case, they responded with nothing,
-				// still send a notification
-				notif.PublishQueryEvent(parent, &notif.QueryEvent{
-					Type: notif.PeerResponse,
-					ID:   p,
-				})
-			}
+		switch err {
+		case routing.ErrNotFound:
+			// in this case, they responded with nothing,
+			// still send a notification so listeners can know the
+			// request has completed 'successfully'
+			notif.PublishQueryEvent(parent, &notif.QueryEvent{
+				Type: notif.PeerResponse,
+				ID:   p,
+			})
+			return nil, err
+		default:
 			return nil, err
+
+		case nil, errInvalidRecord:
+			// in either of these cases, we want to keep going
 		}
 
 		res := &dhtQueryResult{closerPeers: peers}
 
-		if rec.GetValue() != nil {
+		if rec.GetValue() != nil || err == errInvalidRecord {
 			rv := routing.RecvdVal{
 				Val:  rec.GetValue(),
 				From: p,