diff --git a/android/neverallow.go b/android/neverallow.go
index 600175d..e93763b 100644
--- a/android/neverallow.go
+++ b/android/neverallow.go
@@ -60,7 +60,6 @@
 	AddNeverAllowRules(createCcStubsRule())
 	AddNeverAllowRules(createProhibitHeaderOnlyRule())
 	AddNeverAllowRules(createLimitNdkExportRule()...)
-	AddNeverAllowRules(createFilesystemIsAutoGeneratedRule())
 }
 
 // Add a NeverAllow rule to the set of rules to apply.
@@ -276,14 +275,6 @@
 	}
 }
 
-func createFilesystemIsAutoGeneratedRule() Rule {
-	return NeverAllow().
-		NotIn("build/soong/fsgen").
-		ModuleType("filesystem", "android_system_image").
-		WithMatcher("is_auto_generated", isSetMatcherInstance).
-		Because("is_auto_generated property is only allowed for filesystem modules in build/soong/fsgen directory")
-}
-
 func neverallowMutator(ctx BottomUpMutatorContext) {
 	m, ok := ctx.Module().(Module)
 	if !ok {
diff --git a/android/neverallow_test.go b/android/neverallow_test.go
index caec8c7..192c924 100644
--- a/android/neverallow_test.go
+++ b/android/neverallow_test.go
@@ -359,21 +359,6 @@
 			`headers_only can only be used for generating framework-minus-apex headers for non-updatable modules`,
 		},
 	},
-	// Test for the rule restricting use of is_auto_generated
-	{
-		name: `"is_auto_generated" outside allowed directory`,
-		fs: map[string][]byte{
-			"a/b/Android.bp": []byte(`
-				filesystem {
-					name: "baaz",
-					is_auto_generated: true,
-				}
-			`),
-		},
-		expectedErrors: []string{
-			`is_auto_generated property is only allowed for filesystem modules in build/soong/fsgen directory`,
-		},
-	},
 }
 
 var prepareForNeverAllowTest = GroupFixturePreparers(
@@ -382,7 +367,6 @@
 		ctx.RegisterModuleType("java_library", newMockJavaLibraryModule)
 		ctx.RegisterModuleType("java_library_host", newMockJavaLibraryModule)
 		ctx.RegisterModuleType("java_device_for_host", newMockJavaLibraryModule)
-		ctx.RegisterModuleType("filesystem", newMockFilesystemModule)
 	}),
 )
 
diff --git a/android/visibility_test.go b/android/visibility_test.go
index 277be0f..1a2eeca 100644
--- a/android/visibility_test.go
+++ b/android/visibility_test.go
@@ -2098,9 +2098,8 @@
 }
 
 type mockFilesystemModuleProperties struct {
-	Partition_type    *string
-	Deps              []string
-	Is_auto_generated *bool
+	Partition_type *string
+	Deps           []string
 }
 
 type mockFilesystemModule struct {
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go
index 7d3b8e1..1e816a7 100644
--- a/filesystem/filesystem.go
+++ b/filesystem/filesystem.go
@@ -145,10 +145,6 @@
 	Unchecked_module *bool `blueprint:"mutated"`
 
 	Erofs ErofsProperties
-
-	// Determines if the module is auto-generated from Soong or not. If the module is
-	// auto-generated, its deps are exempted from visibility enforcement.
-	Is_auto_generated *bool
 }
 
 // Additional properties required to generate erofs FS partitions.
@@ -183,29 +179,13 @@
 	android.InitDefaultableModule(module)
 }
 
-type depTag struct {
+var dependencyTag = struct {
 	blueprint.BaseDependencyTag
 	android.PackagingItemAlwaysDepTag
-}
-
-var dependencyTag = depTag{}
-
-type depTagWithVisibilityEnforcementBypass struct {
-	depTag
-}
-
-var _ android.ExcludeFromVisibilityEnforcementTag = (*depTagWithVisibilityEnforcementBypass)(nil)
-
-func (t depTagWithVisibilityEnforcementBypass) ExcludeFromVisibilityEnforcement() {}
-
-var dependencyTagWithVisibilityEnforcementBypass = depTagWithVisibilityEnforcementBypass{}
+}{}
 
 func (f *filesystem) DepsMutator(ctx android.BottomUpMutatorContext) {
-	if proptools.Bool(f.properties.Is_auto_generated) {
-		f.AddDeps(ctx, dependencyTagWithVisibilityEnforcementBypass)
-	} else {
-		f.AddDeps(ctx, dependencyTag)
-	}
+	f.AddDeps(ctx, dependencyTag)
 }
 
 type fsType int
diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go
index 8acc74c..ed0c390 100644
--- a/fsgen/filesystem_creator.go
+++ b/fsgen/filesystem_creator.go
@@ -43,52 +43,36 @@
 
 func RegisterCollectFileSystemDepsMutators(ctx android.RegisterMutatorsContext) {
 	ctx.BottomUp("fs_collect_deps", collectDepsMutator).MutatesGlobalState()
-	ctx.BottomUp("fs_set_deps", setDepsMutator)
 }
 
 var fsDepsMutex = sync.Mutex{}
 var collectFsDepsOnceKey = android.NewOnceKey("CollectFsDeps")
 var depCandidatesOnceKey = android.NewOnceKey("DepCandidates")
 
-// List of partitions that the filesystem_creator module currently generates the partition
-var soongGeneratedPartitions = []string{"system"}
-
-// Map of partition module name to its partition that may be generated by Soong.
-// Note that it is not guaranteed that all modules returned by this function are successfully
-// created.
-func getAllSoongGeneratedPartitionNames(config android.Config) map[string]string {
-	ret := map[string]string{}
-	for _, partition := range soongGeneratedPartitions {
-		ret[generatedModuleNameForPartition(config, partition)] = partition
-	}
-	return ret
-}
-
 func collectDepsMutator(mctx android.BottomUpMutatorContext) {
 	// These additional deps are added according to the cuttlefish system image bp.
 	fsDeps := mctx.Config().Once(collectFsDepsOnceKey, func() interface{} {
-		deps := map[string][]string{
-			"system": {
-				"com.android.apex.cts.shim.v1_prebuilt",
-				"dex_bootjars",
-				"framework_compatibility_matrix.device.xml",
-				"idc_data",
-				"init.environ.rc-soong",
-				"keychars_data",
-				"keylayout_data",
-				"libclang_rt.asan",
-				"libcompiler_rt",
-				"libdmabufheap",
-				"libgsi",
-				"llndk.libraries.txt",
-				"logpersist.start",
-				"preloaded-classes",
-				"public.libraries.android.txt",
-				"update_engine_sideload",
-			},
+		deps := []string{
+			"android_vintf_manifest",
+			"com.android.apex.cts.shim.v1_prebuilt",
+			"dex_bootjars",
+			"framework_compatibility_matrix.device.xml",
+			"idc_data",
+			"init.environ.rc-soong",
+			"keychars_data",
+			"keylayout_data",
+			"libclang_rt.asan",
+			"libcompiler_rt",
+			"libdmabufheap",
+			"libgsi",
+			"llndk.libraries.txt",
+			"logpersist.start",
+			"preloaded-classes",
+			"public.libraries.android.txt",
+			"update_engine_sideload",
 		}
 		return &deps
-	}).(*map[string][]string)
+	}).(*[]string)
 
 	depCandidates := mctx.Config().Once(depCandidatesOnceKey, func() interface{} {
 		partitionVars := mctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
@@ -98,30 +82,10 @@
 
 	m := mctx.Module()
 	if slices.Contains(*depCandidates, m.Name()) {
-		installPartition := getInstallPartition(m, mctx.DeviceConfig())
-		fsDepsMutex.Lock()
-		if _, ok := (*fsDeps)[installPartition]; !ok {
-			(*fsDeps)[installPartition] = make([]string, 0)
-		}
-		if m.Enabled(mctx) {
-			(*fsDeps)[installPartition] = append((*fsDeps)[installPartition], m.Name())
-		}
-		fsDepsMutex.Unlock()
-	}
-}
-
-type depsStruct struct {
-	Deps []string
-}
-
-func setDepsMutator(mctx android.BottomUpMutatorContext) {
-	fsDeps := mctx.Config().Get(collectFsDepsOnceKey).(*map[string][]string)
-	soongGeneratedPartitionMap := getAllSoongGeneratedPartitionNames(mctx.Config())
-	m := mctx.Module()
-	if partition, ok := soongGeneratedPartitionMap[m.Name()]; ok {
-		deps := (*fsDeps)[partition]
-		if err := proptools.AppendMatchingProperties(m.GetProperties(), &depsStruct{Deps: deps}, nil); err != nil {
-			mctx.ModuleErrorf(err.Error())
+		if installInSystem(mctx, m) {
+			fsDepsMutex.Lock()
+			*fsDeps = append(*fsDeps, m.Name())
+			fsDepsMutex.Unlock()
 		}
 	}
 }
@@ -150,7 +114,7 @@
 }
 
 func (f *filesystemCreator) createInternalModules(ctx android.LoadHookContext) {
-	for _, partitionType := range soongGeneratedPartitions {
+	for _, partitionType := range []string{"system"} {
 		if f.createPartition(ctx, partitionType) {
 			f.properties.Generated_partition_types = append(f.properties.Generated_partition_types, partitionType)
 		} else {
@@ -160,7 +124,7 @@
 	f.createDeviceModule(ctx)
 }
 
-func generatedModuleName(cfg android.Config, suffix string) string {
+func (f *filesystemCreator) generatedModuleName(cfg android.Config, suffix string) string {
 	prefix := "soong"
 	if cfg.HasDeviceProduct() {
 		prefix = cfg.DeviceProduct()
@@ -168,21 +132,21 @@
 	return fmt.Sprintf("%s_generated_%s", prefix, suffix)
 }
 
-func generatedModuleNameForPartition(cfg android.Config, partitionType string) string {
-	return generatedModuleName(cfg, fmt.Sprintf("%s_image", partitionType))
+func (f *filesystemCreator) generatedModuleNameForPartition(cfg android.Config, partitionType string) string {
+	return f.generatedModuleName(cfg, fmt.Sprintf("%s_image", partitionType))
 }
 
 func (f *filesystemCreator) createDeviceModule(ctx android.LoadHookContext) {
 	baseProps := &struct {
 		Name *string
 	}{
-		Name: proptools.StringPtr(generatedModuleName(ctx.Config(), "device")),
+		Name: proptools.StringPtr(f.generatedModuleName(ctx.Config(), "device")),
 	}
 
 	// Currently, only the system partition module is created.
 	partitionProps := &filesystem.PartitionNameProperties{}
 	if android.InList("system", f.properties.Generated_partition_types) {
-		partitionProps.System_partition_name = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system"))
+		partitionProps.System_partition_name = proptools.StringPtr(f.generatedModuleNameForPartition(ctx.Config(), "system"))
 	}
 
 	ctx.CreateModule(filesystem.AndroidDeviceFactory, baseProps, partitionProps)
@@ -194,7 +158,7 @@
 	baseProps := &struct {
 		Name *string
 	}{
-		Name: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), partitionType)),
+		Name: proptools.StringPtr(f.generatedModuleNameForPartition(ctx.Config(), partitionType)),
 	}
 
 	fsProps := &filesystem.FilesystemProperties{}
@@ -231,8 +195,6 @@
 
 	fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true)
 
-	fsProps.Is_auto_generated = proptools.BoolPtr(true)
-
 	// Identical to that of the generic_system_image
 	fsProps.Fsverity.Inputs = []string{
 		"etc/boot-image.prof",
@@ -267,7 +229,7 @@
 }
 
 func (f *filesystemCreator) createDiffTest(ctx android.ModuleContext, partitionType string) android.Path {
-	partitionModuleName := generatedModuleNameForPartition(ctx.Config(), partitionType)
+	partitionModuleName := f.generatedModuleNameForPartition(ctx.Config(), partitionType)
 	systemImage := ctx.GetDirectDepWithTag(partitionModuleName, generatedFilesystemDepTag)
 	filesystemInfo, ok := android.OtherModuleProvider(ctx, systemImage, filesystem.FilesystemProvider)
 	if !ok {
@@ -311,7 +273,7 @@
 
 func (f *filesystemCreator) DepsMutator(ctx android.BottomUpMutatorContext) {
 	for _, partitionType := range f.properties.Generated_partition_types {
-		ctx.AddDependency(ctx.Module(), generatedFilesystemDepTag, generatedModuleNameForPartition(ctx.Config(), partitionType))
+		ctx.AddDependency(ctx.Module(), generatedFilesystemDepTag, f.generatedModuleNameForPartition(ctx.Config(), partitionType))
 	}
 }
 
@@ -336,8 +298,11 @@
 	ctx.Phony("soong_generated_filesystem_tests", diffTestFiles...)
 }
 
-func getInstallPartition(m android.Module, config android.DeviceConfig) string {
-	return m.PartitionTag(config)
+func installInSystem(ctx android.BottomUpMutatorContext, m android.Module) bool {
+	return m.PartitionTag(ctx.DeviceConfig()) == "system" && !m.InstallInData() &&
+		!m.InstallInTestcases() && !m.InstallInSanitizerDir() && !m.InstallInVendorRamdisk() &&
+		!m.InstallInDebugRamdisk() && !m.InstallInRecovery() && !m.InstallInOdm() &&
+		!m.InstallInVendor()
 }
 
 // TODO: assemble baseProps and fsProps here
@@ -347,9 +312,9 @@
 		return ""
 	}
 
-	deps := ctx.Config().Get(collectFsDepsOnceKey).(*map[string][]string)
+	deps := ctx.Config().Get(collectFsDepsOnceKey).(*[]string)
 	depProps := &android.PackagingProperties{
-		Deps: android.NewSimpleConfigurable(android.SortedUniqueStrings((*deps)[partitionType])),
+		Deps: android.NewSimpleConfigurable(android.SortedUniqueStrings(*deps)),
 	}
 
 	result, err := proptools.RepackProperties([]interface{}{depProps})
diff --git a/fsgen/filesystem_creator_test.go b/fsgen/filesystem_creator_test.go
index f96bdce..554b66b 100644
--- a/fsgen/filesystem_creator_test.go
+++ b/fsgen/filesystem_creator_test.go
@@ -17,7 +17,6 @@
 import (
 	"android/soong/android"
 	"android/soong/filesystem"
-	"android/soong/java"
 	"testing"
 
 	"github.com/google/blueprint/proptools"
@@ -29,7 +28,6 @@
 	result := android.GroupFixturePreparers(
 		android.PrepareForIntegrationTestWithAndroid,
 		android.PrepareForTestWithAndroidBuildComponents,
-		android.PrepareForTestWithAllowMissingDependencies,
 		filesystem.PrepareForTestWithFilesystemBuildComponents,
 		prepareForTestWithFsgenBuildComponents,
 		android.FixtureModifyConfig(func(config android.Config) {
@@ -88,55 +86,3 @@
 		proptools.String(fooSystem.FsProps().Type),
 	)
 }
-
-func TestFileSystemCreatorSetPartitionDeps(t *testing.T) {
-	result := android.GroupFixturePreparers(
-		android.PrepareForIntegrationTestWithAndroid,
-		android.PrepareForTestWithAndroidBuildComponents,
-		android.PrepareForTestWithAllowMissingDependencies,
-		filesystem.PrepareForTestWithFilesystemBuildComponents,
-		prepareForTestWithFsgenBuildComponents,
-		java.PrepareForTestWithJavaBuildComponents,
-		java.PrepareForTestWithJavaDefaultModules,
-		android.FixtureModifyConfig(func(config android.Config) {
-			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.ProductPackages = []string{"bar", "baz"}
-			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.PartitionQualifiedVariables =
-				map[string]android.PartitionQualifiedVariablesType{
-					"system": {
-						BoardFileSystemType: "ext4",
-					},
-				}
-		}),
-		android.FixtureMergeMockFs(android.MockFS{
-			"external/avb/test/data/testkey_rsa4096.pem": nil,
-			"build/soong/fsgen/Android.bp": []byte(`
-			soong_filesystem_creator {
-				name: "foo",
-			}
-			`),
-		}),
-	).RunTestWithBp(t, `
-	java_library {
-		name: "bar",
-		srcs: ["A.java"],
-	}
-	java_library {
-		name: "baz",
-		srcs: ["A.java"],
-		product_specific: true,
-	}
-	`)
-
-	android.AssertBoolEquals(
-		t,
-		"Generated system image expected to depend on system partition installed \"bar\"",
-		true,
-		java.CheckModuleHasDependency(t, result.TestContext, "test_product_generated_system_image", "android_common", "bar"),
-	)
-	android.AssertBoolEquals(
-		t,
-		"Generated system image expected to not depend on product partition installed \"baz\"",
-		false,
-		java.CheckModuleHasDependency(t, result.TestContext, "test_product_generated_system_image", "android_common", "baz"),
-	)
-}
