diff --git a/tools/aconfig/aconfig/src/codegen/rust.rs b/tools/aconfig/aconfig/src/codegen/rust.rs
index 591781e..6042593 100644
--- a/tools/aconfig/aconfig/src/codegen/rust.rs
+++ b/tools/aconfig/aconfig/src/codegen/rust.rs
@@ -114,7 +114,7 @@
 
 static STORAGE_MIGRATION_MARKER_FILE: &str =
     "/metadata/aconfig/storage_test_mission_1";
-static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
+static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
 
 /// flag provider
 pub struct FlagProvider;
@@ -517,7 +517,7 @@
 
 static STORAGE_MIGRATION_MARKER_FILE: &str =
     "/metadata/aconfig/storage_test_mission_1";
-static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
+static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
 
 /// flag provider
 pub struct FlagProvider;
@@ -546,20 +546,17 @@
 impl FlagProvider {
     /// query flag disabled_rw_exported
     pub fn disabled_rw_exported(&self) -> bool {
-        let result = *CACHED_disabled_rw_exported;
-        result
+        *CACHED_disabled_rw_exported
     }
 
     /// query flag enabled_fixed_ro_exported
     pub fn enabled_fixed_ro_exported(&self) -> bool {
-        let result = *CACHED_enabled_fixed_ro_exported;
-        result
+        *CACHED_enabled_fixed_ro_exported
     }
 
     /// query flag enabled_ro_exported
     pub fn enabled_ro_exported(&self) -> bool {
-        let result = *CACHED_enabled_ro_exported;
-        result
+        *CACHED_enabled_ro_exported
     }
 }
 
@@ -594,7 +591,7 @@
 
 static STORAGE_MIGRATION_MARKER_FILE: &str =
     "/metadata/aconfig/storage_test_mission_1";
-static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
+static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
 
 /// flag provider
 pub struct FlagProvider;
@@ -602,344 +599,32 @@
 impl FlagProvider {
     /// query flag disabled_ro
     pub fn disabled_ro(&self) -> bool {
-        let result = false;
-
-        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
-            return result;
-        }
-
-        // This will be called multiple times. Subsequent calls after the first
-        // are noops.
-        logger::init(
-            logger::Config::default()
-                .with_tag_on_device(MIGRATION_LOG_TAG)
-                .with_max_level(LevelFilter::Info),
-        );
-
-        unsafe {
-            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
-                Ok(file) => file,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_ro': {}", err);
-                    return result;
-                }
-            };
-            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
-                Ok(Some(offset)) => offset,
-                Ok(None) => {
-                    error!("failed to read flag 'disabled_ro', not found in package map");
-                    return result;
-                },
-                Err(err) => {
-                    error!("failed to read flag 'disabled_ro': {}", err);
-                    return result;
-                }
-            };
-            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
-                Ok(val_map) => val_map,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_ro': {}", err);
-                    return result;
-                }
-            };
-            let value = match get_boolean_flag_value(&flag_val_map, 0 + package_offset.boolean_offset) {
-                Ok(val) => val,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_ro': {}", err);
-                    return result;
-                }
-            };
-            if false != value {
-                let default_value = false;
-                error!("flag mismatch for 'disabled_ro'. Legacy storage was {default_value}, new storage was {value}")
-            }
-        }
-        result
+        false
     }
 
     /// query flag disabled_rw
     pub fn disabled_rw(&self) -> bool {
-        let result = false;
-
-        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
-            return result;
-        }
-
-        // This will be called multiple times. Subsequent calls after the first
-        // are noops.
-        logger::init(
-            logger::Config::default()
-                .with_tag_on_device(MIGRATION_LOG_TAG)
-                .with_max_level(LevelFilter::Info),
-        );
-
-        unsafe {
-            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
-                Ok(file) => file,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw': {}", err);
-                    return result;
-                }
-            };
-            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
-                Ok(Some(offset)) => offset,
-                Ok(None) => {
-                    error!("failed to read flag 'disabled_rw', not found in package map");
-                    return result;
-                },
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw': {}", err);
-                    return result;
-                }
-            };
-            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
-                Ok(val_map) => val_map,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw': {}", err);
-                    return result;
-                }
-            };
-            let value = match get_boolean_flag_value(&flag_val_map, 1 + package_offset.boolean_offset) {
-                Ok(val) => val,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw': {}", err);
-                    return result;
-                }
-            };
-            if false != value {
-                let default_value = false;
-                error!("flag mismatch for 'disabled_rw'. Legacy storage was {default_value}, new storage was {value}")
-            }
-        }
-        result
+        false
     }
 
     /// query flag disabled_rw_in_other_namespace
     pub fn disabled_rw_in_other_namespace(&self) -> bool {
-        let result = false;
-
-        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
-            return result;
-        }
-
-        // This will be called multiple times. Subsequent calls after the first
-        // are noops.
-        logger::init(
-            logger::Config::default()
-                .with_tag_on_device(MIGRATION_LOG_TAG)
-                .with_max_level(LevelFilter::Info),
-        );
-
-        unsafe {
-            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
-                Ok(file) => file,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
-                    return result;
-                }
-            };
-            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
-                Ok(Some(offset)) => offset,
-                Ok(None) => {
-                    error!("failed to read flag 'disabled_rw_in_other_namespace', not found in package map");
-                    return result;
-                },
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
-                    return result;
-                }
-            };
-            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
-                Ok(val_map) => val_map,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
-                    return result;
-                }
-            };
-            let value = match get_boolean_flag_value(&flag_val_map, 2 + package_offset.boolean_offset) {
-                Ok(val) => val,
-                Err(err) => {
-                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
-                    return result;
-                }
-            };
-            if false != value {
-                let default_value = false;
-                error!("flag mismatch for 'disabled_rw_in_other_namespace'. Legacy storage was {default_value}, new storage was {value}")
-            }
-        }
-        result
+        false
     }
 
     /// query flag enabled_fixed_ro
     pub fn enabled_fixed_ro(&self) -> bool {
-        let result = true;
-
-        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
-            return result;
-        }
-
-        // This will be called multiple times. Subsequent calls after the first
-        // are noops.
-        logger::init(
-            logger::Config::default()
-                .with_tag_on_device(MIGRATION_LOG_TAG)
-                .with_max_level(LevelFilter::Info),
-        );
-
-        unsafe {
-            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
-                Ok(file) => file,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
-                    return result;
-                }
-            };
-            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
-                Ok(Some(offset)) => offset,
-                Ok(None) => {
-                    error!("failed to read flag 'enabled_fixed_ro', not found in package map");
-                    return result;
-                },
-                Err(err) => {
-                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
-                    return result;
-                }
-            };
-            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
-                Ok(val_map) => val_map,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
-                    return result;
-                }
-            };
-            let value = match get_boolean_flag_value(&flag_val_map, 3 + package_offset.boolean_offset) {
-                Ok(val) => val,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
-                    return result;
-                }
-            };
-            if true != value {
-                let default_value = true;
-                error!("flag mismatch for 'enabled_fixed_ro'. Legacy storage was {default_value}, new storage was {value}")
-            }
-        }
-        result
+        true
     }
 
     /// query flag enabled_ro
     pub fn enabled_ro(&self) -> bool {
-        let result = true;
-
-        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
-            return result;
-        }
-
-        // This will be called multiple times. Subsequent calls after the first
-        // are noops.
-        logger::init(
-            logger::Config::default()
-                .with_tag_on_device(MIGRATION_LOG_TAG)
-                .with_max_level(LevelFilter::Info),
-        );
-
-        unsafe {
-            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
-                Ok(file) => file,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_ro': {}", err);
-                    return result;
-                }
-            };
-            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
-                Ok(Some(offset)) => offset,
-                Ok(None) => {
-                    error!("failed to read flag 'enabled_ro', not found in package map");
-                    return result;
-                },
-                Err(err) => {
-                    error!("failed to read flag 'enabled_ro': {}", err);
-                    return result;
-                }
-            };
-            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
-                Ok(val_map) => val_map,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_ro': {}", err);
-                    return result;
-                }
-            };
-            let value = match get_boolean_flag_value(&flag_val_map, 4 + package_offset.boolean_offset) {
-                Ok(val) => val,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_ro': {}", err);
-                    return result;
-                }
-            };
-            if true != value {
-                let default_value = true;
-                error!("flag mismatch for 'enabled_ro'. Legacy storage was {default_value}, new storage was {value}")
-            }
-        }
-        result
+        true
     }
 
     /// query flag enabled_rw
     pub fn enabled_rw(&self) -> bool {
-        let result = true;
-
-        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
-            return result;
-        }
-
-        // This will be called multiple times. Subsequent calls after the first
-        // are noops.
-        logger::init(
-            logger::Config::default()
-                .with_tag_on_device(MIGRATION_LOG_TAG)
-                .with_max_level(LevelFilter::Info),
-        );
-
-        unsafe {
-            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
-                Ok(file) => file,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_rw': {}", err);
-                    return result;
-                }
-            };
-            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
-                Ok(Some(offset)) => offset,
-                Ok(None) => {
-                    error!("failed to read flag 'enabled_rw', not found in package map");
-                    return result;
-                },
-                Err(err) => {
-                    error!("failed to read flag 'enabled_rw': {}", err);
-                    return result;
-                }
-            };
-            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
-                Ok(val_map) => val_map,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_rw': {}", err);
-                    return result;
-                }
-            };
-            let value = match get_boolean_flag_value(&flag_val_map, 5 + package_offset.boolean_offset) {
-                Ok(val) => val,
-                Err(err) => {
-                    error!("failed to read flag 'enabled_rw': {}", err);
-                    return result;
-                }
-            };
-            if true != value {
-                let default_value = true;
-                error!("flag mismatch for 'enabled_rw'. Legacy storage was {default_value}, new storage was {value}")
-            }
-        }
-        result
+        true
     }
 }
 
@@ -1020,16 +705,16 @@
 
     #[test]
     fn test_generate_rust_code_for_test() {
-        test_generate_rust_code(CodegenMode::Test, true);
+        test_generate_rust_code(CodegenMode::Test, false);
     }
 
     #[test]
     fn test_generate_rust_code_for_exported() {
-        test_generate_rust_code(CodegenMode::Exported, true);
+        test_generate_rust_code(CodegenMode::Exported, false);
     }
 
     #[test]
     fn test_generate_rust_code_for_force_read_only() {
-        test_generate_rust_code(CodegenMode::ForceReadOnly, true);
+        test_generate_rust_code(CodegenMode::ForceReadOnly, false);
     }
 }
diff --git a/tools/aconfig/aconfig/templates/rust.template b/tools/aconfig/aconfig/templates/rust.template
index 4b1ad83..fe07ac5 100644
--- a/tools/aconfig/aconfig/templates/rust.template
+++ b/tools/aconfig/aconfig/templates/rust.template
@@ -7,7 +7,7 @@
 
 static STORAGE_MIGRATION_MARKER_FILE: &str =
     "/metadata/aconfig/storage_test_mission_1";
-static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
+static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
 
 /// flag provider
 pub struct FlagProvider;
@@ -31,76 +31,11 @@
 {{ for flag in template_flags }}
     /// query flag {flag.name}
     pub fn {flag.name}(&self) -> bool \{
-        {{ if not allow_instrumentation }}
-
         {{ -if flag.readwrite }}
         *CACHED_{flag.name}
         {{ -else }}
         {flag.default_value}
         {{ -endif }}
-
-        {{ else }}
-        let result = {{ -if flag.readwrite }} *CACHED_{flag.name}{{ else }} {flag.default_value} {{ -endif }};
-
-        {{ if flag.readwrite }}
-        result
-        {{ else }}
-
-        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() \{
-            return result;
-        }
-
-        // This will be called multiple times. Subsequent calls after the first
-        // are noops.
-        logger::init(
-            logger::Config::default()
-                .with_tag_on_device(MIGRATION_LOG_TAG)
-                .with_max_level(LevelFilter::Info),
-        );
-
-        unsafe \{
-            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) \{
-                Ok(file) => file,
-                Err(err) => \{
-                    error!("failed to read flag '{flag.name}': \{}", err);
-                    return result;
-                }
-            };
-            let package_offset = match get_package_offset(&package_map, "{package}") \{
-                Ok(Some(offset)) => offset,
-                Ok(None) => \{
-                    error!("failed to read flag '{flag.name}', not found in package map");
-                    return result;
-                },
-                Err(err) => \{
-                    error!("failed to read flag '{flag.name}': \{}", err);
-                    return result;
-                }
-            };
-            let flag_val_map = match get_mapped_storage_file("{flag.container}", StorageFileType::FlagVal) \{
-                Ok(val_map) => val_map,
-                Err(err) => \{
-                    error!("failed to read flag '{flag.name}': \{}", err);
-                    return result;
-                }
-            };
-            let value = match get_boolean_flag_value(&flag_val_map, {flag.flag_offset} + package_offset.boolean_offset) \{
-                Ok(val) => val,
-                Err(err) => \{
-                    error!("failed to read flag '{flag.name}': \{}", err);
-                    return result;
-                }
-            };
-
-            if {flag.default_value} != value \{
-                let default_value = {flag.default_value};
-                error!("flag mismatch for '{flag.name}'. Legacy storage was \{default_value}, new storage was \{value}")
-            }
-        }
-
-        result
-        {{ endif }}
-        {{ endif }}
     }
 {{ endfor }}
 
@@ -117,7 +52,67 @@
     PROVIDER.{flag.name}()
 {{ -else }}
 pub fn {flag.name}() -> bool \{
+    {{ if not allow_instrumentation }}
     {flag.default_value}
+    {{ else }}
+
+    let result = {flag.default_value};
+    if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() \{
+        return result;
+    }
+
+    // This will be called multiple times. Subsequent calls after the first
+    // are noops.
+    logger::init(
+        logger::Config::default()
+            .with_tag_on_device(MIGRATION_LOG_TAG)
+            .with_max_level(LevelFilter::Info),
+    );
+
+    unsafe \{
+        let package_map = match get_mapped_storage_file("{flag.container}", StorageFileType::PackageMap) \{
+            Ok(file) => file,
+            Err(err) => \{
+                error!("failed to read flag '{flag.name}': \{}", err);
+                return result;
+            }
+        };
+        let package_offset = match get_package_offset(&package_map, "{package}") \{
+            Ok(Some(offset)) => offset,
+            Ok(None) => \{
+                error!("failed to read flag '{flag.name}', not found in package map");
+                return result;
+            },
+            Err(err) => \{
+                error!("failed to read flag '{flag.name}': \{}", err);
+                return result;
+            }
+        };
+        let flag_val_map = match get_mapped_storage_file("{flag.container}", StorageFileType::FlagVal) \{
+            Ok(val_map) => val_map,
+            Err(err) => \{
+                error!("failed to read flag '{flag.name}': \{}", err);
+                return result;
+            }
+        };
+        let value = match get_boolean_flag_value(&flag_val_map, {flag.flag_offset} + package_offset.boolean_offset) \{
+            Ok(val) => val,
+            Err(err) => \{
+                error!("failed to read flag '{flag.name}': \{}", err);
+                return result;
+            }
+        };
+
+        if result != value \{
+            error!("error: flag mismatch for '{flag.name}'. Legacy storage was \{result}, new storage was \{value}")
+        } else \{
+            let default_value = {flag.default_value};
+            info!("success! flag '{flag.name}' contained correct value. Legacy storage was \{default_value}, new storage was \{value}")
+        }
+    }
+
+    result
+    {{ endif }}
 {{ -endif }}
 }
 {{ endfor }}
