diff --git a/rust/hg-core/src/dirstate.rs b/rust/hg-core/src/dirstate.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS5ycw==..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS5ycw== 100644
--- a/rust/hg-core/src/dirstate.rs
+++ b/rust/hg-core/src/dirstate.rs
@@ -10,6 +10,7 @@
 use crate::revlog::Node;
 use crate::utils::hg_path::HgPath;
 use bytes_cast::BytesCast;
+use entry::DirstateEntry;
 
 pub mod dirs_multiset;
 pub mod dirstate_map;
@@ -20,8 +21,6 @@
 pub mod path_with_basename;
 pub mod status;
 
-pub use self::entry::*;
-
 #[derive(Debug, PartialEq, Copy, Clone, BytesCast)]
 #[repr(C)]
 pub struct DirstateParents {
diff --git a/rust/hg-core/src/dirstate/dirs_multiset.rs b/rust/hg-core/src/dirstate/dirs_multiset.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9kaXJzX211bHRpc2V0LnJz..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9kaXJzX211bHRpc2V0LnJz 100644
--- a/rust/hg-core/src/dirstate/dirs_multiset.rs
+++ b/rust/hg-core/src/dirstate/dirs_multiset.rs
@@ -14,7 +14,7 @@
         files,
         hg_path::{HgPath, HgPathBuf, HgPathError},
     },
-    DirstateEntry, DirstateError, DirstateMapError, FastHashMap,
+    DirstateError, DirstateMapError, FastHashMap,
 };
 use std::collections::{hash_map, hash_map::Entry, HashMap, HashSet};
 
@@ -18,6 +18,8 @@
 };
 use std::collections::{hash_map, hash_map::Entry, HashMap, HashSet};
 
+use super::entry::DirstateEntry;
+
 // could be encapsulated if we care API stability more seriously
 pub type DirsMultisetIter<'a> = hash_map::Keys<'a, HgPathBuf, u32>;
 
@@ -211,7 +213,7 @@
 
 #[cfg(test)]
 mod tests {
-    use crate::EntryState;
+    use crate::dirstate::entry::EntryState;
 
     use super::*;
 
diff --git a/rust/hg-core/src/dirstate/dirstate_map.rs b/rust/hg-core/src/dirstate/dirstate_map.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9kaXJzdGF0ZV9tYXAucnM=..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9kaXJzdGF0ZV9tYXAucnM= 100644
--- a/rust/hg-core/src/dirstate/dirstate_map.rs
+++ b/rust/hg-core/src/dirstate/dirstate_map.rs
@@ -8,7 +8,10 @@
 use super::on_disk::DirstateV2ParseError;
 use super::owning::OwningDirstateMap;
 use super::path_with_basename::WithBasename;
+use crate::dirstate::entry::{
+    DirstateEntry, DirstateV2Data, ParentFileData, TruncatedTimestamp,
+};
 use crate::dirstate::parsers::pack_entry;
 use crate::dirstate::parsers::packed_entry_size;
 use crate::dirstate::parsers::parse_dirstate_entries;
 use crate::dirstate::CopyMapIter;
@@ -11,7 +14,5 @@
 use crate::dirstate::parsers::pack_entry;
 use crate::dirstate::parsers::packed_entry_size;
 use crate::dirstate::parsers::parse_dirstate_entries;
 use crate::dirstate::CopyMapIter;
-use crate::dirstate::DirstateV2Data;
-use crate::dirstate::ParentFileData;
 use crate::dirstate::StateMapIter;
@@ -17,5 +18,4 @@
 use crate::dirstate::StateMapIter;
-use crate::dirstate::TruncatedTimestamp;
 use crate::matchers::Matcher;
 use crate::utils::filter_map_results;
 use crate::utils::hg_path::{HgPath, HgPathBuf};
@@ -19,7 +19,6 @@
 use crate::matchers::Matcher;
 use crate::utils::filter_map_results;
 use crate::utils::hg_path::{HgPath, HgPathBuf};
-use crate::DirstateEntry;
 use crate::DirstateError;
 use crate::DirstateMapError;
 use crate::DirstateParents;
diff --git a/rust/hg-core/src/dirstate/on_disk.rs b/rust/hg-core/src/dirstate/on_disk.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9vbl9kaXNrLnJz..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9vbl9kaXNrLnJz 100644
--- a/rust/hg-core/src/dirstate/on_disk.rs
+++ b/rust/hg-core/src/dirstate/on_disk.rs
@@ -6,4 +6,7 @@
 use crate::dirstate::dirstate_map::{
     self, DirstateMap, DirstateMapWriteMode, NodeRef,
 };
+use crate::dirstate::entry::{
+    DirstateEntry, DirstateV2Data, TruncatedTimestamp,
+};
 use crate::dirstate::path_with_basename::WithBasename;
@@ -9,6 +12,5 @@
 use crate::dirstate::path_with_basename::WithBasename;
-use crate::dirstate::{DirstateV2Data, TruncatedTimestamp};
 use crate::errors::{HgError, IoResultExt};
 use crate::repo::Repo;
 use crate::requirements::DIRSTATE_TRACKED_HINT_V1;
 use crate::utils::hg_path::HgPath;
@@ -11,8 +13,7 @@
 use crate::errors::{HgError, IoResultExt};
 use crate::repo::Repo;
 use crate::requirements::DIRSTATE_TRACKED_HINT_V1;
 use crate::utils::hg_path::HgPath;
-use crate::DirstateEntry;
 use crate::DirstateError;
 use crate::DirstateParents;
 use bitflags::bitflags;
diff --git a/rust/hg-core/src/dirstate/parsers.rs b/rust/hg-core/src/dirstate/parsers.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9wYXJzZXJzLnJz..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9wYXJzZXJzLnJz 100644
--- a/rust/hg-core/src/dirstate/parsers.rs
+++ b/rust/hg-core/src/dirstate/parsers.rs
@@ -3,5 +3,6 @@
 // This software may be used and distributed according to the terms of the
 // GNU General Public License version 2 or any later version.
 
+use crate::dirstate::entry::{DirstateEntry, EntryState};
 use crate::errors::HgError;
 use crate::utils::hg_path::HgPath;
@@ -6,6 +7,6 @@
 use crate::errors::HgError;
 use crate::utils::hg_path::HgPath;
-use crate::{dirstate::EntryState, DirstateEntry, DirstateParents};
+use crate::DirstateParents;
 use byteorder::{BigEndian, WriteBytesExt};
 use bytes_cast::{unaligned, BytesCast};
 
diff --git a/rust/hg-core/src/lib.rs b/rust/hg-core/src/lib.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jb3JlL3NyYy9saWIucnM=..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jb3JlL3NyYy9saWIucnM= 100644
--- a/rust/hg-core/src/lib.rs
+++ b/rust/hg-core/src/lib.rs
@@ -22,7 +22,7 @@
         BadMatch, BadType, DirstateStatus, HgPathCow, StatusError,
         StatusOptions,
     },
-    DirstateEntry, DirstateParents, EntryState,
+    DirstateParents,
 };
 pub mod copy_tracing;
 pub mod filepatterns;
diff --git a/rust/hg-core/src/update.rs b/rust/hg-core/src/update.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jb3JlL3NyYy91cGRhdGUucnM=..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jb3JlL3NyYy91cGRhdGUucnM= 100644
--- a/rust/hg-core/src/update.rs
+++ b/rust/hg-core/src/update.rs
@@ -10,4 +10,5 @@
 };
 
 use crate::{
+    dirstate::entry::{ParentFileData, TruncatedTimestamp},
     dirstate::{dirstate_map::DirstateEntryReset, on_disk::write_tracked_key},
@@ -13,5 +14,4 @@
     dirstate::{dirstate_map::DirstateEntryReset, on_disk::write_tracked_key},
-    dirstate::{ParentFileData, TruncatedTimestamp},
     errors::{HgError, IoResultExt},
     exit_codes, narrow,
     operations::{list_rev_tracked_files, ExpandedManifestEntry},
diff --git a/rust/hg-cpython/src/dirstate/dirstate_map.rs b/rust/hg-cpython/src/dirstate/dirstate_map.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jcHl0aG9uL3NyYy9kaXJzdGF0ZS9kaXJzdGF0ZV9tYXAucnM=..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jcHl0aG9uL3NyYy9kaXJzdGF0ZS9kaXJzdGF0ZV9tYXAucnM= 100644
--- a/rust/hg-cpython/src/dirstate/dirstate_map.rs
+++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs
@@ -18,7 +18,7 @@
     dirstate::dirstate_map::{
         DirstateEntryReset, DirstateIdentity as CoreDirstateIdentity,
     },
-    dirstate::{ParentFileData, TruncatedTimestamp},
+    dirstate::entry::{DirstateEntry, ParentFileData, TruncatedTimestamp},
 };
 
 use crate::{
@@ -30,8 +30,8 @@
     dirstate::dirstate_map::DirstateMapWriteMode,
     dirstate::on_disk::DirstateV2ParseError,
     dirstate::owning::OwningDirstateMap, dirstate::StateMapIter, revlog::Node,
-    utils::files::normalize_case, utils::hg_path::HgPath, DirstateEntry,
-    DirstateError, DirstateParents,
+    utils::files::normalize_case, utils::hg_path::HgPath, DirstateError,
+    DirstateParents,
 };
 
 // TODO
diff --git a/rust/hg-cpython/src/dirstate/item.rs b/rust/hg-cpython/src/dirstate/item.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9oZy1jcHl0aG9uL3NyYy9kaXJzdGF0ZS9pdGVtLnJz..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9oZy1jcHl0aG9uL3NyYy9kaXJzdGF0ZS9pdGVtLnJz 100644
--- a/rust/hg-cpython/src/dirstate/item.rs
+++ b/rust/hg-cpython/src/dirstate/item.rs
@@ -7,9 +7,7 @@
 use cpython::PyResult;
 use cpython::Python;
 use cpython::PythonObject;
-use hg::dirstate::DirstateEntry;
-use hg::dirstate::DirstateV2Data;
-use hg::dirstate::TruncatedTimestamp;
+use hg::dirstate::entry::{DirstateEntry, DirstateV2Data, TruncatedTimestamp};
 use std::cell::Cell;
 
 py_class!(pub class DirstateItem |py| {
diff --git a/rust/rhg/src/commands/status.rs b/rust/rhg/src/commands/status.rs
index db065b33fa56ad35b4b653ddbf0ee743f973ad0f_cnVzdC9yaGcvc3JjL2NvbW1hbmRzL3N0YXR1cy5ycw==..b422acba55f18379b00a491055a1886d73d5cd83_cnVzdC9yaGcvc3JjL2NvbW1hbmRzL3N0YXR1cy5ycw== 100644
--- a/rust/rhg/src/commands/status.rs
+++ b/rust/rhg/src/commands/status.rs
@@ -14,5 +14,5 @@
 use clap::Arg;
 use format_bytes::format_bytes;
 use hg::config::Config;
-use hg::dirstate::has_exec_bit;
+use hg::dirstate::entry::{has_exec_bit, TruncatedTimestamp};
 use hg::dirstate::status::StatusPath;
@@ -18,5 +18,4 @@
 use hg::dirstate::status::StatusPath;
-use hg::dirstate::TruncatedTimestamp;
 use hg::errors::{HgError, IoResultExt};
 use hg::filepatterns::parse_pattern_args;
 use hg::lock::LockError;