diff --git a/pyhmmer/daemon.pyx b/pyhmmer/daemon.pyx
index db31f05cd756350b90a7d2effe843bdd6e86b086..d832cf0c5721cf552506909eb2125cc0a3daeffc 100644
--- a/pyhmmer/daemon.pyx
+++ b/pyhmmer/daemon.pyx
@@ -355,9 +355,7 @@ cdef class Client:
             txt = buffer.getvalue()
 
         hits = self._client(txt, db, ranges, pli, p7_pipemodes_e.p7_SEARCH_SEQS)
-        hits._qname = query.name
-        hits._qacc = query.accession
-        hits._qlen = len(query)
+        hits._query = query
 
         return hits
 
@@ -396,9 +394,7 @@ cdef class Client:
             txt = buffer.getvalue()
 
         hits = self._client(txt, db, ranges, pli, p7_pipemodes_e.p7_SEARCH_SEQS)
-        hits._qname = query.name
-        hits._qacc = query.accession
-        hits._qlen = query.M
+        hits._query = query
 
         return hits
 
@@ -430,9 +426,7 @@ cdef class Client:
             txt = buffer.getvalue()
 
         hits = self._client(txt, db, None, pli, p7_pipemodes_e.p7_SCAN_MODELS)
-        hits._qname = query.name
-        hits._qacc = query.accession
-        hits._qlen = len(query)
+        hits._query = query
 
         return hits
 
diff --git a/pyhmmer/plan7.pyx b/pyhmmer/plan7.pyx
index 743866e4124b3b4790f97803f7cb9e2a96312300..9b5fc58c6af6f78a91c26c8973e2d0e960b4bb9d 100644
--- a/pyhmmer/plan7.pyx
+++ b/pyhmmer/plan7.pyx
@@ -7749,7 +7749,7 @@ cdef class TopHits:
             hits.append(offset)
 
         return {
-            "query": self.query,
+            "query": self._query,
             "unsrt": unsrt,
             "hit": hits,
             "Nalloc": self._th.Nalloc,
@@ -7815,7 +7815,7 @@ cdef class TopHits:
         cdef VectorU8 hit_state
 
         # record query name and accession
-        self.query = state["query"]
+        self._query = state["query"]
 
         # deallocate current data if needed
         if self._th != NULL:
@@ -7924,6 +7924,8 @@ cdef class TopHits:
         .. versionadded:: 0.6.1
 
         """
+        if self._query is None:
+            return None
         return self._query.name
 
     @property
@@ -7933,6 +7935,8 @@ cdef class TopHits:
         .. versionadded:: 0.6.1
 
         """
+        if self._query is None:
+            return None
         return self._query.accession
 
     @property
@@ -7942,6 +7946,8 @@ cdef class TopHits:
         .. versionadded:: 0.10.5
 
         """
+        if self._query is None:
+            return 0
         return self._query.M if isinstance(self._query, HMM) else len(self._query)
 
     @property
@@ -8214,9 +8220,7 @@ cdef class TopHits:
         cdef TopHits copy = TopHits.__new__(TopHits)
 
         # record query metatada
-        copy._qname = self._qname
-        copy._qacc = self._qacc
-        copy._qlen = self._qlen
+        copy._query = self._query
 
         with nogil:
             # copy pipeline configuration
@@ -8442,9 +8446,14 @@ cdef class TopHits:
         cdef FILE* file
         cdef str   fname
         cdef int   status
-        cdef char* unk    = b"-"
-        cdef char* qname  = unk if self._qname is None else <char*> self._qname
-        cdef char* qacc   = unk if self._qacc is None else <char*> self._qacc
+        cdef bytes qname  = b"-"
+        cdef bytes qacc   = b"-"
+
+        if self._query is not None:
+            if self._query.name is not None:
+                qname = self._query.name
+            if self._query.accession is not None:
+                qacc = self._query.accession
 
         file = fopen_obj(fh, "w")
         try:
@@ -8536,10 +8545,8 @@ cdef class TopHits:
             other_copy = other.copy()
 
             # just store the copy if merging inside an empty uninitialized `TopHits`
-            if merged._th.N == 0 and merged._qname is None and merged._qacc is None:
-                merged._qname = other._qname
-                merged._qacc = other._qacc
-                merged._qlen = other._qlen
+            if merged._th.N == 0 and merged._query is None:
+                merged._query = other._query
                 memcpy(&merged._pli, &other_copy._pli, sizeof(P7_PIPELINE))
                 merged._th, other_copy._th = other_copy._th, merged._th
                 continue