diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal
index b4e133014b2c87d8a69a834270ac1db0c7ac811d..56176dffc72d5f4fbf41ef6f1138176501e60fe2 100644
--- a/Cabal/Cabal.cabal
+++ b/Cabal/Cabal.cabal
@@ -51,6 +51,8 @@ extra-source-files:
   tests/ParserTests/errors/issue-5055.errors
   tests/ParserTests/errors/leading-comma.cabal
   tests/ParserTests/errors/leading-comma.errors
+  tests/ParserTests/errors/multiple-libs.cabal
+  tests/ParserTests/errors/multiple-libs.errors
   tests/ParserTests/errors/noVersion.cabal
   tests/ParserTests/errors/noVersion.errors
   tests/ParserTests/errors/noVersion2.cabal
@@ -110,6 +112,9 @@ extra-source-files:
   tests/ParserTests/regressions/ghc-option-j.check
   tests/ParserTests/regressions/haddock-api-2.18.1-check.cabal
   tests/ParserTests/regressions/haddock-api-2.18.1-check.check
+  tests/ParserTests/regressions/hidden-main-lib.cabal
+  tests/ParserTests/regressions/hidden-main-lib.expr
+  tests/ParserTests/regressions/hidden-main-lib.format
   tests/ParserTests/regressions/issue-5055.cabal
   tests/ParserTests/regressions/issue-5055.expr
   tests/ParserTests/regressions/issue-5055.format
@@ -120,6 +125,10 @@ extra-source-files:
   tests/ParserTests/regressions/leading-comma.cabal
   tests/ParserTests/regressions/leading-comma.expr
   tests/ParserTests/regressions/leading-comma.format
+  tests/ParserTests/regressions/multiple-libs-2.cabal
+  tests/ParserTests/regressions/multiple-libs-2.check
+  tests/ParserTests/regressions/multiple-libs-2.expr
+  tests/ParserTests/regressions/multiple-libs-2.format
   tests/ParserTests/regressions/noVersion.cabal
   tests/ParserTests/regressions/noVersion.expr
   tests/ParserTests/regressions/noVersion.format
@@ -333,6 +342,7 @@ library
     Distribution.Types.Executable
     Distribution.Types.ExecutableScope
     Distribution.Types.Library
+    Distribution.Types.LibraryVisibility
     Distribution.Types.ForeignLib
     Distribution.Types.ForeignLibType
     Distribution.Types.ForeignLibOption
diff --git a/Cabal/Distribution/PackageDescription/FieldGrammar.hs b/Cabal/Distribution/PackageDescription/FieldGrammar.hs
index 63a9fff875981820e602614cadc71706c290a3f7..8fefbf4bc47acd7a5430680057236d1673363833 100644
--- a/Cabal/Distribution/PackageDescription/FieldGrammar.hs
+++ b/Cabal/Distribution/PackageDescription/FieldGrammar.hs
@@ -56,6 +56,7 @@ import Distribution.Pretty                    (prettyShow)
 import Distribution.Types.ExecutableScope
 import Distribution.Types.ForeignLib
 import Distribution.Types.ForeignLibType
+import Distribution.Types.LibraryVisibility
 import Distribution.Types.UnqualComponentName
 import Distribution.Version                   (anyVersion)
 
@@ -122,14 +123,25 @@ packageDescriptionFieldGrammar = PackageDescription
 
 libraryFieldGrammar
     :: (FieldGrammar g, Applicative (g Library), Applicative (g BuildInfo))
-    => Maybe UnqualComponentName -> g Library Library
+    => Maybe UnqualComponentName
+    -> g Library Library
 libraryFieldGrammar n = Library n
     <$> monoidalFieldAla  "exposed-modules"    (alaList' VCat MQuoted) L.exposedModules
     <*> monoidalFieldAla  "reexported-modules" (alaList  CommaVCat)    L.reexportedModules
     <*> monoidalFieldAla  "signatures"         (alaList' VCat MQuoted) L.signatures
         ^^^ availableSince CabalSpecV2_0 []
     <*> booleanFieldDef   "exposed"                                    L.libExposed True
+    <*> visibilityField
     <*> blurFieldGrammar L.libBuildInfo buildInfoFieldGrammar
+  where
+    visibilityField
+        -- nameless/"main" libraries are public
+        | isNothing n = pure LibraryVisibilityPublic
+        -- named libraries have the field
+        | otherwise   =
+            optionalFieldDef "visibility" L.libVisibility LibraryVisibilityPrivate
+            ^^^ availableSince CabalSpecV3_0 LibraryVisibilityPrivate
+
 {-# SPECIALIZE libraryFieldGrammar :: Maybe UnqualComponentName -> ParsecFieldGrammar' Library #-}
 {-# SPECIALIZE libraryFieldGrammar :: Maybe UnqualComponentName -> PrettyFieldGrammar' Library #-}
 
diff --git a/Cabal/Distribution/PackageDescription/Parsec.hs b/Cabal/Distribution/PackageDescription/Parsec.hs
index 7855e4d91f185ff5526b5fcb8efd091c7a97f886..c73d7de38ede726cf80580596dee07bea5a1e8d5 100644
--- a/Cabal/Distribution/PackageDescription/Parsec.hs
+++ b/Cabal/Distribution/PackageDescription/Parsec.hs
@@ -62,6 +62,7 @@ import Distribution.Types.Dependency                (Dependency)
 import Distribution.Types.ForeignLib
 import Distribution.Types.ForeignLibType            (knownForeignLibTypes)
 import Distribution.Types.GenericPackageDescription (emptyGenericPackageDescription)
+import Distribution.Types.LibraryVisibility         (LibraryVisibility (..))
 import Distribution.Types.PackageDescription        (specVersion')
 import Distribution.Types.UnqualComponentName       (UnqualComponentName, mkUnqualComponentName)
 import Distribution.Utils.Generic                   (breakMaybe, unfoldrM, validateUTF8)
@@ -236,8 +237,9 @@ goSections specVer = traverse_ process
 
     -- we need signature, because this is polymorphic, but not-closed
     parseCondTree'
-        :: FromBuildInfo a
+        :: L.HasBuildInfo a
         => ParsecFieldGrammar' a       -- ^ grammar
+        -> (BuildInfo -> a)
         -> Map String CondTreeBuildInfo  -- ^ common stanzas
         -> [Field Position]
         -> ParseResult (CondTree ConfVar [Dependency] a)
@@ -251,7 +253,7 @@ goSections specVer = traverse_ process
         | name == "common" = do
             commonStanzas <- use stateCommonStanzas
             name' <- lift $ parseCommonName pos args
-            biTree <- lift $ parseCondTree' buildInfoFieldGrammar commonStanzas fields
+            biTree <- lift $ parseCondTree' buildInfoFieldGrammar id commonStanzas fields
 
             case Map.lookup name' commonStanzas of
                 Nothing -> stateCommonStanzas .= Map.insert name' biTree commonStanzas
@@ -259,9 +261,13 @@ goSections specVer = traverse_ process
                     "Duplicate common stanza: " ++ name'
 
         | name == "library" && null args = do
+            prev <- use $ stateGpd . L.condLibrary
+            when (isJust prev) $ lift $ parseFailure pos $
+                "Multiple main libraries; have you forgotten to specify a name for an internal library?"
+
             commonStanzas <- use stateCommonStanzas
-            lib <- lift $ parseCondTree' (libraryFieldGrammar Nothing) commonStanzas fields
-            -- TODO: check that library is defined once
+            lib <- lift $ parseCondTree' (libraryFieldGrammar Nothing) (libraryFromBuildInfo Nothing) commonStanzas fields
+
             stateGpd . L.condLibrary ?= lib
 
         -- Sublibraries
@@ -269,7 +275,8 @@ goSections specVer = traverse_ process
         | name == "library" = do
             commonStanzas <- use stateCommonStanzas
             name' <- parseUnqualComponentName pos args
-            lib   <- lift $ parseCondTree' (libraryFieldGrammar $ Just name') commonStanzas fields
+            let name'' = Just name'
+            lib   <- lift $ parseCondTree' (libraryFieldGrammar name'') (libraryFromBuildInfo name'') commonStanzas fields
             -- TODO check duplicate name here?
             stateGpd . L.condSubLibraries %= snoc (name', lib)
 
@@ -277,7 +284,7 @@ goSections specVer = traverse_ process
         | name == "foreign-library" = do
             commonStanzas <- use stateCommonStanzas
             name' <- parseUnqualComponentName pos args
-            flib  <- lift $ parseCondTree' (foreignLibFieldGrammar name')  commonStanzas fields
+            flib  <- lift $ parseCondTree' (foreignLibFieldGrammar name') fromBuildInfo' commonStanzas fields
 
             let hasType ts = foreignLibType ts /= foreignLibType mempty
             unless (onAllBranches hasType flib) $ lift $ parseFailure pos $ concat
@@ -294,14 +301,14 @@ goSections specVer = traverse_ process
         | name == "executable" = do
             commonStanzas <- use stateCommonStanzas
             name' <- parseUnqualComponentName pos args
-            exe   <- lift $ parseCondTree' (executableFieldGrammar name') commonStanzas fields
+            exe   <- lift $ parseCondTree' (executableFieldGrammar name') fromBuildInfo' commonStanzas fields
             -- TODO check duplicate name here?
             stateGpd . L.condExecutables %= snoc (name', exe)
 
         | name == "test-suite" = do
             commonStanzas <- use stateCommonStanzas
             name'      <- parseUnqualComponentName pos args
-            testStanza <- lift $ parseCondTree' testSuiteFieldGrammar commonStanzas fields
+            testStanza <- lift $ parseCondTree' testSuiteFieldGrammar fromBuildInfo' commonStanzas fields
             testSuite  <- lift $ traverse (validateTestSuite pos) testStanza
 
             let hasType ts = testInterface ts /= testInterface mempty
@@ -319,7 +326,7 @@ goSections specVer = traverse_ process
         | name == "benchmark" = do
             commonStanzas <- use stateCommonStanzas
             name'       <- parseUnqualComponentName pos args
-            benchStanza <- lift $ parseCondTree' benchmarkFieldGrammar commonStanzas fields
+            benchStanza <- lift $ parseCondTree' benchmarkFieldGrammar fromBuildInfo' commonStanzas fields
             bench       <- lift $ traverse (validateBenchmark pos) benchStanza
 
             let hasType ts = benchmarkInterface ts /= benchmarkInterface mempty
@@ -532,27 +539,34 @@ type CondTreeBuildInfo = CondTree ConfVar [Dependency] BuildInfo
 --
 -- Law: @view buildInfo . fromBuildInfo = id@
 class L.HasBuildInfo a => FromBuildInfo a where
-    fromBuildInfo :: BuildInfo -> a
+    fromBuildInfo' :: BuildInfo -> a
+
+libraryFromBuildInfo :: Maybe UnqualComponentName -> BuildInfo -> Library
+libraryFromBuildInfo n bi = emptyLibrary
+    { libName       = n
+    , libVisibility = if isNothing n then LibraryVisibilityPublic else LibraryVisibilityPrivate
+    , libBuildInfo  = bi
+    }
 
-instance FromBuildInfo BuildInfo  where fromBuildInfo = id
-instance FromBuildInfo Library    where fromBuildInfo bi = set L.buildInfo bi emptyLibrary
-instance FromBuildInfo ForeignLib where fromBuildInfo bi = set L.buildInfo bi emptyForeignLib
-instance FromBuildInfo Executable where fromBuildInfo bi = set L.buildInfo bi emptyExecutable
+instance FromBuildInfo BuildInfo  where fromBuildInfo' = id
+instance FromBuildInfo ForeignLib where fromBuildInfo' bi = set L.buildInfo bi emptyForeignLib
+instance FromBuildInfo Executable where fromBuildInfo' bi = set L.buildInfo bi emptyExecutable
 
 instance FromBuildInfo TestSuiteStanza where
-    fromBuildInfo = TestSuiteStanza Nothing Nothing Nothing
+    fromBuildInfo' = TestSuiteStanza Nothing Nothing Nothing
 
 instance FromBuildInfo BenchmarkStanza where
-    fromBuildInfo = BenchmarkStanza Nothing Nothing Nothing
+    fromBuildInfo' = BenchmarkStanza Nothing Nothing Nothing
 
 parseCondTreeWithCommonStanzas
-    :: forall a. FromBuildInfo a
+    :: forall a. L.HasBuildInfo a
     => CabalSpecVersion
     -> ParsecFieldGrammar' a       -- ^ grammar
+    -> (BuildInfo -> a)              -- ^ construct fromBuildInfo
     -> Map String CondTreeBuildInfo  -- ^ common stanzas
     -> [Field Position]
     -> ParseResult (CondTree ConfVar [Dependency] a)
-parseCondTreeWithCommonStanzas v grammar commonStanzas = goImports []
+parseCondTreeWithCommonStanzas v grammar fromBuildInfo commonStanzas = goImports []
   where
     hasElif = specHasElif v
     hasCommonStanzas = specHasCommonStanzas v
@@ -585,14 +599,15 @@ parseCondTreeWithCommonStanzas v grammar commonStanzas = goImports []
     go :: [CondTreeBuildInfo] -> [Field Position] -> ParseResult (CondTree ConfVar [Dependency] a)
     go bis fields = do
         x <- parseCondTree v hasElif grammar (view L.targetBuildDepends) fields
-        pure $ foldr mergeCommonStanza x bis
+        pure $ foldr (mergeCommonStanza fromBuildInfo) x bis
 
 mergeCommonStanza
-    :: forall a. FromBuildInfo a
-    => CondTree ConfVar [Dependency] BuildInfo
+    :: L.HasBuildInfo a
+    => (BuildInfo -> a)
+    -> CondTree ConfVar [Dependency] BuildInfo
     -> CondTree ConfVar [Dependency] a
     -> CondTree ConfVar [Dependency] a
-mergeCommonStanza (CondNode bi _ bis) (CondNode x _ cs) =
+mergeCommonStanza fromBuildInfo (CondNode bi _ bis) (CondNode x _ cs) =
     CondNode x' (x' ^. L.targetBuildDepends) cs'
   where
     -- new value is old value with buildInfo field _prepended_.
diff --git a/Cabal/Distribution/Simple/Build.hs b/Cabal/Distribution/Simple/Build.hs
index 86a226ae119159458001aab9bc287a1c0c887186..30fc3583319700bcfbf732f41993c6eb8219ef35 100644
--- a/Cabal/Distribution/Simple/Build.hs
+++ b/Cabal/Distribution/Simple/Build.hs
@@ -31,16 +31,17 @@ module Distribution.Simple.Build (
 import Prelude ()
 import Distribution.Compat.Prelude
 
-import Distribution.Types.Dependency
-import Distribution.Types.LocalBuildInfo
-import Distribution.Types.TargetInfo
+import Distribution.Types.ComponentLocalBuildInfo
 import Distribution.Types.ComponentRequestedSpec
+import Distribution.Types.Dependency
+import Distribution.Types.ExecutableScope
 import Distribution.Types.ForeignLib
+import Distribution.Types.LibraryVisibility
+import Distribution.Types.LocalBuildInfo
 import Distribution.Types.MungedPackageId
 import Distribution.Types.MungedPackageName
+import Distribution.Types.TargetInfo
 import Distribution.Types.UnqualComponentName
-import Distribution.Types.ComponentLocalBuildInfo
-import Distribution.Types.ExecutableScope
 
 import Distribution.Package
 import Distribution.Backpack
@@ -458,6 +459,7 @@ testSuiteLibV09AsLibAndExe pkg_descr
             reexportedModules = [],
             signatures = [],
             libExposed     = True,
+            libVisibility  = LibraryVisibilityPrivate,
             libBuildInfo   = bi
           }
     -- This is, like, the one place where we use a CTestName for a library.
diff --git a/Cabal/Distribution/Types/Library.hs b/Cabal/Distribution/Types/Library.hs
index 32d087ae8b1f8147465b83430bc385ddd814fc94..3a57a9e03756e0f3d715dd9960099f8b3c21b96d 100644
--- a/Cabal/Distribution/Types/Library.hs
+++ b/Cabal/Distribution/Types/Library.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveGeneric      #-}
 
 module Distribution.Types.Library (
     Library(..),
@@ -9,13 +9,14 @@ module Distribution.Types.Library (
     libModules,
 ) where
 
-import Prelude ()
 import Distribution.Compat.Prelude
+import Prelude ()
 
+import Distribution.ModuleName
 import Distribution.Types.BuildInfo
+import Distribution.Types.LibraryVisibility
 import Distribution.Types.ModuleReexport
 import Distribution.Types.UnqualComponentName
-import Distribution.ModuleName
 
 import qualified Distribution.Types.BuildInfo.Lens as L
 
@@ -23,8 +24,9 @@ data Library = Library
     { libName           :: Maybe UnqualComponentName
     , exposedModules    :: [ModuleName]
     , reexportedModules :: [ModuleReexport]
-    , signatures        :: [ModuleName]   -- ^ What sigs need implementations?
-    , libExposed        :: Bool           -- ^ Is the lib to be exposed by default?
+    , signatures        :: [ModuleName]       -- ^ What sigs need implementations?
+    , libExposed        :: Bool               -- ^ Is the lib to be exposed by default? (i.e. whether its modules available in GHCi for example)
+    , libVisibility     :: LibraryVisibility  -- ^ Whether this multilib can be dependent from outside.
     , libBuildInfo      :: BuildInfo
     }
     deriving (Generic, Show, Eq, Read, Typeable, Data)
@@ -36,31 +38,41 @@ instance Binary Library
 
 instance NFData Library where rnf = genericRnf
 
+emptyLibrary :: Library
+emptyLibrary = Library
+    { libName           = mempty
+    , exposedModules    = mempty
+    , reexportedModules = mempty
+    , signatures        = mempty
+    , libExposed        = True
+    , libVisibility     = mempty
+    , libBuildInfo      = mempty
+    }
+
+-- | This instance is not good.
+--
+-- We need it for 'PackageDescription.Configuration.addBuildableCondition'.
+-- More correct method would be some kind of "create empty clone".
+--
+-- More concretely, 'addBuildableCondition' will make `libVisibility = False`
+-- libraries when `buildable: false`. This may cause problems.
+--
 instance Monoid Library where
-  mempty = Library {
-    libName = mempty,
-    exposedModules = mempty,
-    reexportedModules = mempty,
-    signatures = mempty,
-    libExposed     = True,
-    libBuildInfo   = mempty
-  }
-  mappend = (<>)
+    mempty = emptyLibrary
+    mappend = (<>)
 
 instance Semigroup Library where
-  a <> b = Library {
-    libName = combine libName,
-    exposedModules = combine exposedModules,
-    reexportedModules = combine reexportedModules,
-    signatures = combine signatures,
-    libExposed     = libExposed a && libExposed b, -- so False propagates
-    libBuildInfo   = combine libBuildInfo
-  }
+  a <> b = Library
+    { libName           = combine libName
+    , exposedModules    = combine exposedModules
+    , reexportedModules = combine reexportedModules
+    , signatures        = combine signatures
+    , libExposed        = libExposed a && libExposed b -- so False propagates
+    , libVisibility     = combine libVisibility
+    , libBuildInfo      = combine libBuildInfo
+    }
     where combine field = field a `mappend` field b
 
-emptyLibrary :: Library
-emptyLibrary = mempty
-
 -- | Get all the module names from the library (exposed and internal modules)
 -- which are explicitly listed in the package description which would
 -- need to be compiled.  (This does not include reexports, which
diff --git a/Cabal/Distribution/Types/Library/Lens.hs b/Cabal/Distribution/Types/Library/Lens.hs
index d0ab5801b73011b13f05d480c3c2cf6cbe1d22b6..bd40c1a2a65398d8c3f53696fc526659ae4f1f94 100644
--- a/Cabal/Distribution/Types/Library/Lens.hs
+++ b/Cabal/Distribution/Types/Library/Lens.hs
@@ -3,13 +3,14 @@ module Distribution.Types.Library.Lens (
     module Distribution.Types.Library.Lens,
     ) where
 
-import Prelude ()
-import Distribution.Compat.Prelude
 import Distribution.Compat.Lens
+import Distribution.Compat.Prelude
+import Prelude ()
 
 import Distribution.ModuleName                (ModuleName)
 import Distribution.Types.BuildInfo           (BuildInfo)
 import Distribution.Types.Library             (Library)
+import Distribution.Types.LibraryVisibility   (LibraryVisibility)
 import Distribution.Types.ModuleReexport      (ModuleReexport)
 import Distribution.Types.UnqualComponentName (UnqualComponentName)
 
@@ -35,6 +36,10 @@ libExposed :: Lens' Library Bool
 libExposed f s = fmap (\x -> s { T.libExposed = x }) (f (T.libExposed s))
 {-# INLINE libExposed #-}
 
+libVisibility :: Lens' Library LibraryVisibility
+libVisibility f s = fmap (\x -> s { T.libVisibility = x }) (f (T.libVisibility s))
+{-# INLINE libVisibility #-}
+
 libBuildInfo :: Lens' Library BuildInfo
 libBuildInfo f s = fmap (\x -> s { T.libBuildInfo = x }) (f (T.libBuildInfo s))
 {-# INLINE libBuildInfo #-}
diff --git a/Cabal/Distribution/Types/LibraryVisibility.hs b/Cabal/Distribution/Types/LibraryVisibility.hs
new file mode 100644
index 0000000000000000000000000000000000000000..bab029eb602fd0194ab13bccb0a879dad9c5bed3
--- /dev/null
+++ b/Cabal/Distribution/Types/LibraryVisibility.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+
+module Distribution.Types.LibraryVisibility(
+    LibraryVisibility(..),
+) where
+
+import Distribution.Compat.Prelude
+import Prelude ()
+
+import Distribution.Parsec.Class
+import Distribution.Pretty
+
+import qualified Distribution.Compat.CharParsing as P
+import qualified Text.PrettyPrint                as Disp
+
+-- | Multi-lib visibility
+--
+-- @since 3.0.0.0
+--
+data LibraryVisibility
+      -- | Can be depenendent from other packages
+    = LibraryVisibilityPublic
+      -- | Internal library, default
+    | LibraryVisibilityPrivate
+    deriving (Generic, Show, Read, Eq, Typeable, Data)
+
+instance Pretty LibraryVisibility where
+    pretty LibraryVisibilityPublic  = Disp.text "public"
+    pretty LibraryVisibilityPrivate = Disp.text "private"
+
+instance Parsec LibraryVisibility where
+  parsec = do
+    name <- P.munch1 isAlpha
+    case name of
+      "public"  -> return LibraryVisibilityPublic
+      "private" -> return LibraryVisibilityPrivate
+      _         -> fail $ "Unknown visibility: " ++ name
+
+instance Binary LibraryVisibility
+instance NFData LibraryVisibility where rnf = genericRnf
+
+instance Semigroup LibraryVisibility where
+    LibraryVisibilityPrivate <> LibraryVisibilityPrivate = LibraryVisibilityPrivate
+    _                        <> _                        = LibraryVisibilityPublic
+
+instance Monoid LibraryVisibility where
+    mempty  = LibraryVisibilityPrivate
+    mappend = (<>)
diff --git a/Cabal/doc/developing-packages.rst b/Cabal/doc/developing-packages.rst
index 737db58f71aae7910ed5832114f04ced67564569..3a2f65235015788fcb90e47c8ef155f4c9846f53 100644
--- a/Cabal/doc/developing-packages.rst
+++ b/Cabal/doc/developing-packages.rst
@@ -1218,6 +1218,16 @@ The library section should contain the following fields:
     that use a flat module namespace or where it is known that the
     exposed modules would clash with other common modules.
 
+.. pkg-field:: visibility: visibilty specifiers
+
+    :since 3.0
+
+    :default: ``private`` for internal libraries. Cannot be set for public library.
+
+    Cabal recognizes ``public`` and ``private`` here...
+
+    Multiple public libraries...
+
 .. pkg-field:: reexported-modules: exportlist
     :since: 1.22
 
diff --git a/Cabal/tests/CheckTests.hs b/Cabal/tests/CheckTests.hs
index ab21b10104cf72349c2ea31b4c26c8a3e480909a..f947167700cbd0b62aeb8c3c4d0d34eb7552877f 100644
--- a/Cabal/tests/CheckTests.hs
+++ b/Cabal/tests/CheckTests.hs
@@ -36,6 +36,7 @@ checkTests = testGroup "regressions"
     , checkTest "cc-options-with-optimization.cabal"
     , checkTest "cxx-options-with-optimization.cabal"
     , checkTest "ghc-option-j.cabal"
+    , checkTest "multiple-libs-2.cabal"
     ]
 
 checkTest :: FilePath -> TestTree
diff --git a/Cabal/tests/Instances/TreeDiff.hs b/Cabal/tests/Instances/TreeDiff.hs
index 6d386ca2054b5491e988175f7a83bfdd0e78c9cc..d134ec49f5d8b3d09bb9491e72d233e3d68843bf 100644
--- a/Cabal/tests/Instances/TreeDiff.hs
+++ b/Cabal/tests/Instances/TreeDiff.hs
@@ -31,6 +31,7 @@ import Distribution.Types.ForeignLibOption
 import Distribution.Types.ForeignLibType
 import Distribution.Types.IncludeRenaming     (IncludeRenaming)
 import Distribution.Types.LegacyExeDependency
+import Distribution.Types.LibraryVisibility   (LibraryVisibility)
 import Distribution.Types.Mixin
 import Distribution.Types.PkgconfigDependency
 import Distribution.Types.UnitId              (DefUnitId, UnitId)
@@ -70,6 +71,7 @@ instance ToExpr InstalledPackageInfo
 instance ToExpr LegacyExeDependency where toExpr = defaultExprViaShow
 instance ToExpr LibVersionInfo where toExpr = defaultExprViaShow
 instance ToExpr Library
+instance ToExpr LibraryVisibility
 instance ToExpr LibraryName
 instance ToExpr Mixin where toExpr = defaultExprViaShow
 instance ToExpr ModuleName where toExpr = defaultExprViaShow
diff --git a/Cabal/tests/ParserTests.hs b/Cabal/tests/ParserTests.hs
index e26f98591887ddee3913eca501f63c28ab6c643c..b91b73cf1c7e2302d38467dfe1916883e77f7e0b 100644
--- a/Cabal/tests/ParserTests.hs
+++ b/Cabal/tests/ParserTests.hs
@@ -10,7 +10,7 @@ import Test.Tasty
 import Test.Tasty.Golden.Advanced (goldenTest)
 import Test.Tasty.HUnit
 
-import Control.Monad                               (void)
+import Control.Monad                               (unless, void)
 import Data.Algorithm.Diff                         (Diff (..), getGroupedDiff)
 import Data.Maybe                                  (isNothing)
 import Distribution.PackageDescription             (GenericPackageDescription)
@@ -28,7 +28,7 @@ import qualified Data.ByteString.Char8 as BS8
 import qualified Distribution.InstalledPackageInfo as IPI
 
 #ifdef MIN_VERSION_tree_diff
-import Data.TreeDiff        (toExpr)
+import Data.TreeDiff        (ansiWlEditExpr, ediff, toExpr)
 import Data.TreeDiff.Golden (ediffGolden)
 import Instances.TreeDiff ()
 #endif
@@ -102,6 +102,7 @@ errorTests = testGroup "errors"
     , errorTest "issue-5055-2.cabal"
     , errorTest "noVersion.cabal"
     , errorTest "noVersion2.cabal"
+    , errorTest "multiple-libs.cabal"
     , errorTest "spdx-1.cabal"
     , errorTest "spdx-2.cabal"
     , errorTest "spdx-3.cabal"
@@ -132,6 +133,7 @@ regressionTests = testGroup "regressions"
     [ regressionTest "encoding-0.8.cabal"
     , regressionTest "Octree-0.5.cabal"
     , regressionTest "nothing-unicode.cabal"
+    , regressionTest "multiple-libs-2.cabal"
     , regressionTest "issue-774.cabal"
     , regressionTest "generics-sop.cabal"
     , regressionTest "elif.cabal"
@@ -147,6 +149,7 @@ regressionTests = testGroup "regressions"
     , regressionTest "spdx-1.cabal"
     , regressionTest "spdx-2.cabal"
     , regressionTest "spdx-3.cabal"
+    , regressionTest "hidden-main-lib.cabal"
     ]
 
 regressionTest :: FilePath -> TestTree
@@ -196,7 +199,21 @@ formatRoundTripTest fp = testCase "roundtrip" $ do
     y <- parse (toUTF8BS contents')
     -- previously we mangled licenses a bit
     let y' = y
-    assertEqual "re-parsed doesn't match" x y'
+    unless (x == y') $
+#ifdef MIN_VERSION_tree_diff
+        assertFailure $ unlines
+            [ "re-parsed doesn't match"
+            , show $ ansiWlEditExpr $ ediff x y
+            ]
+#else
+        assertFailure $ unlines
+            [ "re-parsed doesn't match"
+            , "expected"
+            , show x
+            , "actual"
+            , show y
+            ]
+#endif
   where
     parse :: BS.ByteString -> IO GenericPackageDescription
     parse c = do
diff --git a/Cabal/tests/ParserTests/errors/multiple-libs.cabal b/Cabal/tests/ParserTests/errors/multiple-libs.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..ceb03e0991b433aaa295b7d39762d0d44f04417c
--- /dev/null
+++ b/Cabal/tests/ParserTests/errors/multiple-libs.cabal
@@ -0,0 +1,14 @@
+name:                multipleLibs
+version:             0
+synopsis:            multiple main/nameless libs
+build-type:          Simple
+cabal-version:       1.20
+
+library
+  default-language: Haskell2010
+  exposed-modules:  ElseIf
+  build-depends:    base
+
+library
+  default-language: Haskell2010
+  exposed-modules:  ElseIf
diff --git a/Cabal/tests/ParserTests/errors/multiple-libs.errors b/Cabal/tests/ParserTests/errors/multiple-libs.errors
new file mode 100644
index 0000000000000000000000000000000000000000..5d2524d42a938a77de017293d45a2add48c059fb
--- /dev/null
+++ b/Cabal/tests/ParserTests/errors/multiple-libs.errors
@@ -0,0 +1,2 @@
+VERSION: Just (mkVersion [1,20])
+multiple-libs.cabal:12:1: Multiple main libraries; have you forgotten to specify a name for an internal library?
diff --git a/Cabal/tests/ParserTests/regressions/Octree-0.5.expr b/Cabal/tests/ParserTests/regressions/Octree-0.5.expr
index 783250161514b874ba3c02dd2235238ddf8dc460..ec58bcd20115e5bcda37fe66a0e605e21b2e0318 100644
--- a/Cabal/tests/ParserTests/regressions/Octree-0.5.expr
+++ b/Cabal/tests/ParserTests/regressions/Octree-0.5.expr
@@ -39,7 +39,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Nothing,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -87,6 +87,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
@@ -127,7 +128,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Nothing,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
@@ -217,7 +218,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Nothing,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
diff --git a/Cabal/tests/ParserTests/regressions/common.expr b/Cabal/tests/ParserTests/regressions/common.expr
index 460a6549566a39a81bcc1fd6ef59dcc620163da3..75dec662ccb438f0177595da4dcca51e0b4f8f57 100644
--- a/Cabal/tests/ParserTests/regressions/common.expr
+++ b/Cabal/tests/ParserTests/regressions/common.expr
@@ -29,7 +29,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -60,6 +60,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
@@ -90,7 +91,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Nothing,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
diff --git a/Cabal/tests/ParserTests/regressions/common2.cabal b/Cabal/tests/ParserTests/regressions/common2.cabal
index c84479b85ef8069baa2ce42eeef96a0cfded414f..0b63fdaf87ca21769ab71c8303bd1a91d64fe954 100644
--- a/Cabal/tests/ParserTests/regressions/common2.cabal
+++ b/Cabal/tests/ParserTests/regressions/common2.cabal
@@ -28,6 +28,16 @@ library
   build-depends:
     ghc-prim
 
+-- .expr should show libVisible: False
+library internal
+  import: deps
+
+  default-language: Haskell2010
+  exposed-modules:  ElseIf2
+
+  build-depends:
+    ghc-prim
+
 test-suite tests
   import: deps, win-dows
 
diff --git a/Cabal/tests/ParserTests/regressions/common2.expr b/Cabal/tests/ParserTests/regressions/common2.expr
index 119035b5124e4199fbadebccdbf51d9188a516be..30fffdaf23560e5e722f9e0f594c985f5568d37d 100644
--- a/Cabal/tests/ParserTests/regressions/common2.expr
+++ b/Cabal/tests/ParserTests/regressions/common2.expr
@@ -34,7 +34,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -65,6 +65,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}}],
                       condTreeConstraints = [Dependency
@@ -101,7 +102,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -146,9 +147,159 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
-   condSubLibraries = [],
+   condSubLibraries = [_×_
+                         `UnqualComponentName "internal"`
+                         CondNode
+                           {condTreeComponents = [CondBranch
+                                                    {condBranchCondition = `Var (OS Windows)`,
+                                                     condBranchIfFalse = Nothing,
+                                                     condBranchIfTrue = CondNode
+                                                                          {condTreeComponents = [],
+                                                                           condTreeConstraints = [Dependency
+                                                                                                    `PackageName "Win32"`
+                                                                                                    AnyVersion
+                                                                                                    (Set.fromList
+                                                                                                       [LMainLibName])],
+                                                                           condTreeData = Library
+                                                                                            {exposedModules = [],
+                                                                                             libBuildInfo = BuildInfo
+                                                                                                              {asmOptions = [],
+                                                                                                               asmSources = [],
+                                                                                                               autogenModules = [],
+                                                                                                               buildToolDepends = [],
+                                                                                                               buildTools = [],
+                                                                                                               buildable = True,
+                                                                                                               cSources = [],
+                                                                                                               ccOptions = [],
+                                                                                                               cmmOptions = [],
+                                                                                                               cmmSources = [],
+                                                                                                               cppOptions = [],
+                                                                                                               customFieldsBI = [],
+                                                                                                               cxxOptions = [],
+                                                                                                               cxxSources = [],
+                                                                                                               defaultExtensions = [],
+                                                                                                               defaultLanguage = Nothing,
+                                                                                                               extraBundledLibs = [],
+                                                                                                               extraDynLibFlavours = [],
+                                                                                                               extraFrameworkDirs = [],
+                                                                                                               extraGHCiLibs = [],
+                                                                                                               extraLibDirs = [],
+                                                                                                               extraLibFlavours = [],
+                                                                                                               extraLibs = [],
+                                                                                                               frameworks = [],
+                                                                                                               hsSourceDirs = [],
+                                                                                                               includeDirs = [],
+                                                                                                               includes = [],
+                                                                                                               installIncludes = [],
+                                                                                                               jsSources = [],
+                                                                                                               ldOptions = [],
+                                                                                                               mixins = [],
+                                                                                                               oldExtensions = [],
+                                                                                                               options = [],
+                                                                                                               otherExtensions = [],
+                                                                                                               otherLanguages = [],
+                                                                                                               otherModules = [],
+                                                                                                               pkgconfigDepends = [],
+                                                                                                               profOptions = [],
+                                                                                                               sharedOptions = [],
+                                                                                                               staticOptions = [],
+                                                                                                               targetBuildDepends = [Dependency
+                                                                                                                                       `PackageName "Win32"`
+                                                                                                                                       AnyVersion
+                                                                                                                                       (Set.fromList
+                                                                                                                                          [LMainLibName])],
+                                                                                                               virtualModules = []},
+                                                                                             libExposed = True,
+                                                                                             libName = Just
+                                                                                                         `UnqualComponentName "internal"`,
+                                                                                             libVisibility = LibraryVisibilityPrivate,
+                                                                                             reexportedModules = [],
+                                                                                             signatures = []}}}],
+                            condTreeConstraints = [Dependency
+                                                     `PackageName "base"`
+                                                     (IntersectVersionRanges
+                                                        (OrLaterVersion `mkVersion [4,10]`)
+                                                        (EarlierVersion `mkVersion [4,11]`))
+                                                     (Set.fromList [LMainLibName]),
+                                                   Dependency
+                                                     `PackageName "containers"`
+                                                     AnyVersion
+                                                     (Set.fromList [LMainLibName]),
+                                                   Dependency
+                                                     `PackageName "ghc-prim"`
+                                                     AnyVersion
+                                                     (Set.fromList [LMainLibName])],
+                            condTreeData = Library
+                                             {exposedModules = [`ModuleName ["ElseIf2"]`],
+                                              libBuildInfo = BuildInfo
+                                                               {asmOptions = [],
+                                                                asmSources = [],
+                                                                autogenModules = [],
+                                                                buildToolDepends = [],
+                                                                buildTools = [],
+                                                                buildable = True,
+                                                                cSources = [],
+                                                                ccOptions = [],
+                                                                cmmOptions = [],
+                                                                cmmSources = [],
+                                                                cppOptions = [],
+                                                                customFieldsBI = [],
+                                                                cxxOptions = [],
+                                                                cxxSources = [],
+                                                                defaultExtensions = [],
+                                                                defaultLanguage = Just Haskell2010,
+                                                                extraBundledLibs = [],
+                                                                extraDynLibFlavours = [],
+                                                                extraFrameworkDirs = [],
+                                                                extraGHCiLibs = [],
+                                                                extraLibDirs = [],
+                                                                extraLibFlavours = [],
+                                                                extraLibs = [],
+                                                                frameworks = [],
+                                                                hsSourceDirs = [],
+                                                                includeDirs = [],
+                                                                includes = [],
+                                                                installIncludes = [],
+                                                                jsSources = [],
+                                                                ldOptions = [],
+                                                                mixins = [],
+                                                                oldExtensions = [],
+                                                                options = [],
+                                                                otherExtensions = [],
+                                                                otherLanguages = [],
+                                                                otherModules = [],
+                                                                pkgconfigDepends = [],
+                                                                profOptions = [],
+                                                                sharedOptions = [],
+                                                                staticOptions = [],
+                                                                targetBuildDepends = [Dependency
+                                                                                        `PackageName "base"`
+                                                                                        (IntersectVersionRanges
+                                                                                           (OrLaterVersion
+                                                                                              `mkVersion [4,10]`)
+                                                                                           (EarlierVersion
+                                                                                              `mkVersion [4,11]`))
+                                                                                        (Set.fromList
+                                                                                           [LMainLibName]),
+                                                                                      Dependency
+                                                                                        `PackageName "containers"`
+                                                                                        AnyVersion
+                                                                                        (Set.fromList
+                                                                                           [LMainLibName]),
+                                                                                      Dependency
+                                                                                        `PackageName "ghc-prim"`
+                                                                                        AnyVersion
+                                                                                        (Set.fromList
+                                                                                           [LMainLibName])],
+                                                                virtualModules = []},
+                                              libExposed = True,
+                                              libName = Just `UnqualComponentName "internal"`,
+                                              libVisibility = LibraryVisibilityPrivate,
+                                              reexportedModules = [],
+                                              signatures = []}}],
    condTestSuites = [_×_
                        `UnqualComponentName "tests"`
                        CondNode
@@ -181,7 +332,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -244,7 +395,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -303,7 +454,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -366,7 +517,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Nothing,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
diff --git a/Cabal/tests/ParserTests/regressions/common2.format b/Cabal/tests/ParserTests/regressions/common2.format
index 616d7ac38b22316cae6e2ee3dda0923ce46f9ff7..5274884910d58426122b7e026d100e7e4cd14756 100644
--- a/Cabal/tests/ParserTests/regressions/common2.format
+++ b/Cabal/tests/ParserTests/regressions/common2.format
@@ -21,6 +21,19 @@ library
         build-depends:
             Win32 -any
 
+library internal
+    exposed-modules:
+        ElseIf2
+    default-language: Haskell2010
+    build-depends:
+        base >=4.10 && <4.11,
+        containers -any,
+        ghc-prim -any
+    
+    if os(windows)
+        build-depends:
+            Win32 -any
+
 test-suite tests
     type: exitcode-stdio-1.0
     main-is: Tests.hs
diff --git a/Cabal/tests/ParserTests/regressions/elif.expr b/Cabal/tests/ParserTests/regressions/elif.expr
index 0db83600cd7dfd87480898b8e545ebd568fa6a20..cac0c35c1346d97097ef328bbf6c88cafc66c586 100644
--- a/Cabal/tests/ParserTests/regressions/elif.expr
+++ b/Cabal/tests/ParserTests/regressions/elif.expr
@@ -34,7 +34,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -65,6 +65,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}}],
                       condTreeConstraints = [],
@@ -88,7 +89,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -115,6 +116,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/elif2.expr b/Cabal/tests/ParserTests/regressions/elif2.expr
index 9787045a44e119ae58f93b1d2cff96eb20689810..b17ee3ff0e3a9e15176d074275e5b60bf0f6a815 100644
--- a/Cabal/tests/ParserTests/regressions/elif2.expr
+++ b/Cabal/tests/ParserTests/regressions/elif2.expr
@@ -34,7 +34,7 @@ GenericPackageDescription
                                                                                                                                                               defaultExtensions = [],
                                                                                                                                                               defaultLanguage = Nothing,
                                                                                                                                                               extraBundledLibs = [],
-																			       extraDynLibFlavours = [],
+                                                                                                                                                              extraDynLibFlavours = [],
                                                                                                                                                               extraFrameworkDirs = [],
                                                                                                                                                               extraGHCiLibs = [],
                                                                                                                                                               extraLibDirs = [],
@@ -61,6 +61,7 @@ GenericPackageDescription
                                                                                                                                                               virtualModules = []},
                                                                                                                                             libExposed = True,
                                                                                                                                             libName = Nothing,
+                                                                                                                                            libVisibility = LibraryVisibilityPublic,
                                                                                                                                             reexportedModules = [],
                                                                                                                                             signatures = []}},
                                                                                                  condBranchIfTrue = CondNode
@@ -90,7 +91,7 @@ GenericPackageDescription
                                                                                                                                                            defaultExtensions = [],
                                                                                                                                                            defaultLanguage = Nothing,
                                                                                                                                                            extraBundledLibs = [],
-																			    extraDynLibFlavours = [],
+                                                                                                                                                           extraDynLibFlavours = [],
                                                                                                                                                            extraFrameworkDirs = [],
                                                                                                                                                            extraGHCiLibs = [],
                                                                                                                                                            extraLibDirs = [],
@@ -121,6 +122,7 @@ GenericPackageDescription
                                                                                                                                                            virtualModules = []},
                                                                                                                                          libExposed = True,
                                                                                                                                          libName = Nothing,
+                                                                                                                                         libVisibility = LibraryVisibilityPublic,
                                                                                                                                          reexportedModules = [],
                                                                                                                                          signatures = []}}}],
                                                                         condTreeConstraints = [],
@@ -144,7 +146,7 @@ GenericPackageDescription
                                                                                                             defaultExtensions = [],
                                                                                                             defaultLanguage = Nothing,
                                                                                                             extraBundledLibs = [],
-													    extraDynLibFlavours = [],
+                                                                                                            extraDynLibFlavours = [],
                                                                                                             extraFrameworkDirs = [],
                                                                                                             extraGHCiLibs = [],
                                                                                                             extraLibDirs = [],
@@ -171,6 +173,7 @@ GenericPackageDescription
                                                                                                             virtualModules = []},
                                                                                           libExposed = True,
                                                                                           libName = Nothing,
+                                                                                          libVisibility = LibraryVisibilityPublic,
                                                                                           reexportedModules = [],
                                                                                           signatures = []}},
                                                condBranchIfTrue = CondNode
@@ -200,7 +203,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -231,6 +234,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}}],
                       condTreeConstraints = [],
@@ -254,7 +258,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -281,6 +285,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/encoding-0.8.expr b/Cabal/tests/ParserTests/regressions/encoding-0.8.expr
index 623be0feea7c3c42e0b7779b30fa87c958f10505..4f2caa2155e4e304758762f71be5b9687e5da7be 100644
--- a/Cabal/tests/ParserTests/regressions/encoding-0.8.expr
+++ b/Cabal/tests/ParserTests/regressions/encoding-0.8.expr
@@ -32,7 +32,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Nothing,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -74,6 +74,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/generics-sop.expr b/Cabal/tests/ParserTests/regressions/generics-sop.expr
index d5637aa10f04e4031cf13523004b8d3a32789cab..bede65704343d9ab60eef54a144bce50951ea7ce 100644
--- a/Cabal/tests/ParserTests/regressions/generics-sop.expr
+++ b/Cabal/tests/ParserTests/regressions/generics-sop.expr
@@ -38,7 +38,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -73,6 +73,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}},
                                             CondBranch
@@ -118,7 +119,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -162,6 +163,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}},
                                             CondBranch
@@ -191,7 +193,7 @@ GenericPackageDescription
                                                                                                                                 AutoDeriveTypeable],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -218,6 +220,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}},
                                             CondBranch
@@ -246,7 +249,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -274,6 +277,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}}],
                       condTreeConstraints = [Dependency
@@ -367,7 +371,7 @@ GenericPackageDescription
                                                                                  FunctionalDependencies],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -440,6 +444,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
@@ -478,7 +483,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Just Haskell2010,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
@@ -554,7 +559,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Just Haskell2010,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
diff --git a/Cabal/tests/ParserTests/regressions/hidden-main-lib.cabal b/Cabal/tests/ParserTests/regressions/hidden-main-lib.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..94bb17ef817ca20c7a5e5b1a1c80499b6fb15b2d
--- /dev/null
+++ b/Cabal/tests/ParserTests/regressions/hidden-main-lib.cabal
@@ -0,0 +1,11 @@
+cabal-version:       2.5
+name:                hidden-main-lib
+version:             0
+synopsis:            main lib have to be visible
+build-type:          Simple
+
+library
+  default-language: Haskell2010
+  exposed-modules:  ElseIf
+  build-depends:    base
+  visibility:       private
diff --git a/Cabal/tests/ParserTests/regressions/hidden-main-lib.expr b/Cabal/tests/ParserTests/regressions/hidden-main-lib.expr
new file mode 100644
index 0000000000000000000000000000000000000000..521aaa3fbe57b502565341b8ee53fd030b46975d
--- /dev/null
+++ b/Cabal/tests/ParserTests/regressions/hidden-main-lib.expr
@@ -0,0 +1,101 @@
+GenericPackageDescription
+  {condBenchmarks = [],
+   condExecutables = [],
+   condForeignLibs = [],
+   condLibrary = Just
+                   CondNode
+                     {condTreeComponents = [],
+                      condTreeConstraints = [Dependency
+                                               `PackageName "base"`
+                                               AnyVersion
+                                               (Set.fromList [LMainLibName])],
+                      condTreeData = Library
+                                       {exposedModules = [`ModuleName ["ElseIf"]`],
+                                        libBuildInfo = BuildInfo
+                                                         {asmOptions = [],
+                                                          asmSources = [],
+                                                          autogenModules = [],
+                                                          buildToolDepends = [],
+                                                          buildTools = [],
+                                                          buildable = True,
+                                                          cSources = [],
+                                                          ccOptions = [],
+                                                          cmmOptions = [],
+                                                          cmmSources = [],
+                                                          cppOptions = [],
+                                                          customFieldsBI = [],
+                                                          cxxOptions = [],
+                                                          cxxSources = [],
+                                                          defaultExtensions = [],
+                                                          defaultLanguage = Just Haskell2010,
+                                                          extraBundledLibs = [],
+                                                          extraDynLibFlavours = [],
+                                                          extraFrameworkDirs = [],
+                                                          extraGHCiLibs = [],
+                                                          extraLibDirs = [],
+                                                          extraLibFlavours = [],
+                                                          extraLibs = [],
+                                                          frameworks = [],
+                                                          hsSourceDirs = [],
+                                                          includeDirs = [],
+                                                          includes = [],
+                                                          installIncludes = [],
+                                                          jsSources = [],
+                                                          ldOptions = [],
+                                                          mixins = [],
+                                                          oldExtensions = [],
+                                                          options = [],
+                                                          otherExtensions = [],
+                                                          otherLanguages = [],
+                                                          otherModules = [],
+                                                          pkgconfigDepends = [],
+                                                          profOptions = [],
+                                                          sharedOptions = [],
+                                                          staticOptions = [],
+                                                          targetBuildDepends = [Dependency
+                                                                                  `PackageName "base"`
+                                                                                  AnyVersion
+                                                                                  (Set.fromList
+                                                                                     [LMainLibName])],
+                                                          virtualModules = []},
+                                        libExposed = True,
+                                        libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
+                                        reexportedModules = [],
+                                        signatures = []}},
+   condSubLibraries = [],
+   condTestSuites = [],
+   genPackageFlags = [],
+   packageDescription = PackageDescription
+                          {author = "",
+                           benchmarks = [],
+                           bugReports = "",
+                           buildTypeRaw = Just Simple,
+                           category = "",
+                           copyright = "",
+                           customFieldsPD = [],
+                           dataDir = "",
+                           dataFiles = [],
+                           description = "",
+                           executables = [],
+                           extraDocFiles = [],
+                           extraSrcFiles = [],
+                           extraTmpFiles = [],
+                           foreignLibs = [],
+                           homepage = "",
+                           library = Nothing,
+                           licenseFiles = [],
+                           licenseRaw = Left NONE,
+                           maintainer = "",
+                           package = PackageIdentifier
+                                       {pkgName = `PackageName "hidden-main-lib"`,
+                                        pkgVersion = `mkVersion [0]`},
+                           pkgUrl = "",
+                           setupBuildInfo = Nothing,
+                           sourceRepos = [],
+                           specVersionRaw = Left `mkVersion [2,5]`,
+                           stability = "",
+                           subLibraries = [],
+                           synopsis = "main lib have to be visible",
+                           testSuites = [],
+                           testedWith = []}}
diff --git a/Cabal/tests/ParserTests/regressions/hidden-main-lib.format b/Cabal/tests/ParserTests/regressions/hidden-main-lib.format
new file mode 100644
index 0000000000000000000000000000000000000000..86f7468a5fc406e102a97d61843e062a8235928d
--- /dev/null
+++ b/Cabal/tests/ParserTests/regressions/hidden-main-lib.format
@@ -0,0 +1,13 @@
+hidden-main-lib.cabal:11:3: Unknown field: "visibility"
+cabal-version: 2.5
+name: hidden-main-lib
+version: 0
+synopsis: main lib have to be visible
+build-type: Simple
+
+library
+    exposed-modules:
+        ElseIf
+    default-language: Haskell2010
+    build-depends:
+        base -any
diff --git a/Cabal/tests/ParserTests/regressions/issue-774.expr b/Cabal/tests/ParserTests/regressions/issue-774.expr
index 440526e3df459895adf0058e9c1f5f8fb53c97be..1c600153dde09b43ecf27d38bff1cfadae99d32f 100644
--- a/Cabal/tests/ParserTests/regressions/issue-774.expr
+++ b/Cabal/tests/ParserTests/regressions/issue-774.expr
@@ -26,7 +26,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -58,6 +58,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/leading-comma.expr b/Cabal/tests/ParserTests/regressions/leading-comma.expr
index 052c9bfbc089481a05a778212cbdf1556705c0b3..c5b4571411c7bd74490a87b03f7f49cd3bc2bd93 100644
--- a/Cabal/tests/ParserTests/regressions/leading-comma.expr
+++ b/Cabal/tests/ParserTests/regressions/leading-comma.expr
@@ -49,7 +49,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -105,6 +105,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/multiple-libs-2.cabal b/Cabal/tests/ParserTests/regressions/multiple-libs-2.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..f3494185671c1b28135a2792e59ec85fba56f122
--- /dev/null
+++ b/Cabal/tests/ParserTests/regressions/multiple-libs-2.cabal
@@ -0,0 +1,17 @@
+cabal-version:       2.0
+name:                multiple-libs
+version:             0
+
+synopsis:            visible flag only since 3.0
+build-type:          Simple
+
+library
+  default-language: Haskell2010
+  exposed-modules:  ElseIf
+  build-depends:    base
+
+library public
+  default-language: Haskell2010
+  exposed-modules:  ElseIf2
+  build-depends:    base
+  visibility:       public
diff --git a/Cabal/tests/ParserTests/regressions/multiple-libs-2.check b/Cabal/tests/ParserTests/regressions/multiple-libs-2.check
new file mode 100644
index 0000000000000000000000000000000000000000..c9d75918dc64e3b0a92049dcef7c51d155b2eb8a
--- /dev/null
+++ b/Cabal/tests/ParserTests/regressions/multiple-libs-2.check
@@ -0,0 +1,6 @@
+multiple-libs-2.cabal:17:3: The field "visibility" is available only since the Cabal specification version 3.0.
+No 'category' field.
+No 'maintainer' field.
+No 'description' field.
+The 'license' field is missing or is NONE.
+The dependency 'build-depends: base' does not specify an upper bound on the version number. Each major release of the 'base' package changes the API in various ways and most packages will need some changes to compile with it. The recommended practise is to specify an upper bound on the version of the 'base' package. This ensures your package will continue to build when a new major version of the 'base' package is released. If you are not sure what upper bound to use then use the next  major version. For example if you have tested your package with 'base' version 4.5 and 4.6 then use 'build-depends: base >= 4.5 && < 4.7'.
diff --git a/Cabal/tests/ParserTests/regressions/multiple-libs-2.expr b/Cabal/tests/ParserTests/regressions/multiple-libs-2.expr
new file mode 100644
index 0000000000000000000000000000000000000000..fa8ab2b21275de2f6ccfa4f80fcd84f48bc4d300
--- /dev/null
+++ b/Cabal/tests/ParserTests/regressions/multiple-libs-2.expr
@@ -0,0 +1,162 @@
+GenericPackageDescription
+  {condBenchmarks = [],
+   condExecutables = [],
+   condForeignLibs = [],
+   condLibrary = Just
+                   CondNode
+                     {condTreeComponents = [],
+                      condTreeConstraints = [Dependency
+                                               `PackageName "base"`
+                                               AnyVersion
+                                               (Set.fromList [LMainLibName])],
+                      condTreeData = Library
+                                       {exposedModules = [`ModuleName ["ElseIf"]`],
+                                        libBuildInfo = BuildInfo
+                                                         {asmOptions = [],
+                                                          asmSources = [],
+                                                          autogenModules = [],
+                                                          buildToolDepends = [],
+                                                          buildTools = [],
+                                                          buildable = True,
+                                                          cSources = [],
+                                                          ccOptions = [],
+                                                          cmmOptions = [],
+                                                          cmmSources = [],
+                                                          cppOptions = [],
+                                                          customFieldsBI = [],
+                                                          cxxOptions = [],
+                                                          cxxSources = [],
+                                                          defaultExtensions = [],
+                                                          defaultLanguage = Just Haskell2010,
+                                                          extraBundledLibs = [],
+                                                          extraDynLibFlavours = [],
+                                                          extraFrameworkDirs = [],
+                                                          extraGHCiLibs = [],
+                                                          extraLibDirs = [],
+                                                          extraLibFlavours = [],
+                                                          extraLibs = [],
+                                                          frameworks = [],
+                                                          hsSourceDirs = [],
+                                                          includeDirs = [],
+                                                          includes = [],
+                                                          installIncludes = [],
+                                                          jsSources = [],
+                                                          ldOptions = [],
+                                                          mixins = [],
+                                                          oldExtensions = [],
+                                                          options = [],
+                                                          otherExtensions = [],
+                                                          otherLanguages = [],
+                                                          otherModules = [],
+                                                          pkgconfigDepends = [],
+                                                          profOptions = [],
+                                                          sharedOptions = [],
+                                                          staticOptions = [],
+                                                          targetBuildDepends = [Dependency
+                                                                                  `PackageName "base"`
+                                                                                  AnyVersion
+                                                                                  (Set.fromList
+                                                                                     [LMainLibName])],
+                                                          virtualModules = []},
+                                        libExposed = True,
+                                        libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
+                                        reexportedModules = [],
+                                        signatures = []}},
+   condSubLibraries = [_×_
+                         `UnqualComponentName "public"`
+                         CondNode
+                           {condTreeComponents = [],
+                            condTreeConstraints = [Dependency
+                                                     `PackageName "base"`
+                                                     AnyVersion
+                                                     (Set.fromList [LMainLibName])],
+                            condTreeData = Library
+                                             {exposedModules = [`ModuleName ["ElseIf2"]`],
+                                              libBuildInfo = BuildInfo
+                                                               {asmOptions = [],
+                                                                asmSources = [],
+                                                                autogenModules = [],
+                                                                buildToolDepends = [],
+                                                                buildTools = [],
+                                                                buildable = True,
+                                                                cSources = [],
+                                                                ccOptions = [],
+                                                                cmmOptions = [],
+                                                                cmmSources = [],
+                                                                cppOptions = [],
+                                                                customFieldsBI = [],
+                                                                cxxOptions = [],
+                                                                cxxSources = [],
+                                                                defaultExtensions = [],
+                                                                defaultLanguage = Just Haskell2010,
+                                                                extraBundledLibs = [],
+                                                                extraDynLibFlavours = [],
+                                                                extraFrameworkDirs = [],
+                                                                extraGHCiLibs = [],
+                                                                extraLibDirs = [],
+                                                                extraLibFlavours = [],
+                                                                extraLibs = [],
+                                                                frameworks = [],
+                                                                hsSourceDirs = [],
+                                                                includeDirs = [],
+                                                                includes = [],
+                                                                installIncludes = [],
+                                                                jsSources = [],
+                                                                ldOptions = [],
+                                                                mixins = [],
+                                                                oldExtensions = [],
+                                                                options = [],
+                                                                otherExtensions = [],
+                                                                otherLanguages = [],
+                                                                otherModules = [],
+                                                                pkgconfigDepends = [],
+                                                                profOptions = [],
+                                                                sharedOptions = [],
+                                                                staticOptions = [],
+                                                                targetBuildDepends = [Dependency
+                                                                                        `PackageName "base"`
+                                                                                        AnyVersion
+                                                                                        (Set.fromList
+                                                                                           [LMainLibName])],
+                                                                virtualModules = []},
+                                              libExposed = True,
+                                              libName = Just `UnqualComponentName "public"`,
+                                              libVisibility = LibraryVisibilityPrivate,
+                                              reexportedModules = [],
+                                              signatures = []}}],
+   condTestSuites = [],
+   genPackageFlags = [],
+   packageDescription = PackageDescription
+                          {author = "",
+                           benchmarks = [],
+                           bugReports = "",
+                           buildTypeRaw = Just Simple,
+                           category = "",
+                           copyright = "",
+                           customFieldsPD = [],
+                           dataDir = "",
+                           dataFiles = [],
+                           description = "",
+                           executables = [],
+                           extraDocFiles = [],
+                           extraSrcFiles = [],
+                           extraTmpFiles = [],
+                           foreignLibs = [],
+                           homepage = "",
+                           library = Nothing,
+                           licenseFiles = [],
+                           licenseRaw = Left NONE,
+                           maintainer = "",
+                           package = PackageIdentifier
+                                       {pkgName = `PackageName "multiple-libs"`,
+                                        pkgVersion = `mkVersion [0]`},
+                           pkgUrl = "",
+                           setupBuildInfo = Nothing,
+                           sourceRepos = [],
+                           specVersionRaw = Left `mkVersion [2,0]`,
+                           stability = "",
+                           subLibraries = [],
+                           synopsis = "visible flag only since 3.0",
+                           testSuites = [],
+                           testedWith = []}}
diff --git a/Cabal/tests/ParserTests/regressions/multiple-libs-2.format b/Cabal/tests/ParserTests/regressions/multiple-libs-2.format
new file mode 100644
index 0000000000000000000000000000000000000000..02fe68503344f72d2eff5455c4cf31e2b964d04f
--- /dev/null
+++ b/Cabal/tests/ParserTests/regressions/multiple-libs-2.format
@@ -0,0 +1,20 @@
+multiple-libs-2.cabal:17:3: The field "visibility" is available only since the Cabal specification version 3.0.
+cabal-version: 2.0
+name: multiple-libs
+version: 0
+synopsis: visible flag only since 3.0
+build-type: Simple
+
+library
+    exposed-modules:
+        ElseIf
+    default-language: Haskell2010
+    build-depends:
+        base -any
+
+library public
+    exposed-modules:
+        ElseIf2
+    default-language: Haskell2010
+    build-depends:
+        base -any
diff --git a/Cabal/tests/ParserTests/regressions/noVersion.expr b/Cabal/tests/ParserTests/regressions/noVersion.expr
index c79a98bc507f61c60538a794b45a3fa0680487c4..27d8b17508cd666a71b0e94395a6a8e6ae2de266 100644
--- a/Cabal/tests/ParserTests/regressions/noVersion.expr
+++ b/Cabal/tests/ParserTests/regressions/noVersion.expr
@@ -31,7 +31,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -66,6 +66,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/nothing-unicode.expr b/Cabal/tests/ParserTests/regressions/nothing-unicode.expr
index df4f2bf24152cc890334b505f9549508457c62eb..b28db8f2ba3993ce69bbeb8e71681935aa32c1dc 100644
--- a/Cabal/tests/ParserTests/regressions/nothing-unicode.expr
+++ b/Cabal/tests/ParserTests/regressions/nothing-unicode.expr
@@ -30,7 +30,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -57,6 +57,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}}],
                       condTreeConstraints = [],
@@ -80,7 +81,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -107,6 +108,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/shake.expr b/Cabal/tests/ParserTests/regressions/shake.expr
index ca48569a2e030ca4265af8617994acf9ce19a33a..6a16e32e9e7d93403fe974adba8396c1dffa5b28 100644
--- a/Cabal/tests/ParserTests/regressions/shake.expr
+++ b/Cabal/tests/ParserTests/regressions/shake.expr
@@ -28,7 +28,7 @@ GenericPackageDescription
                                                                                                            defaultExtensions = [],
                                                                                                            defaultLanguage = Nothing,
                                                                                                            extraBundledLibs = [],
-													   extraDynLibFlavours = [],
+                                                                                                           extraDynLibFlavours = [],
                                                                                                            extraFrameworkDirs = [],
                                                                                                            extraGHCiLibs = [],
                                                                                                            extraLibDirs = [],
@@ -93,7 +93,7 @@ GenericPackageDescription
                                                                                                                                                              defaultExtensions = [],
                                                                                                                                                              defaultLanguage = Nothing,
                                                                                                                                                              extraBundledLibs = [],
-																			      extraDynLibFlavours = [],
+                                                                                                                                                             extraDynLibFlavours = [],
                                                                                                                                                              extraFrameworkDirs = [],
                                                                                                                                                              extraGHCiLibs = [],
                                                                                                                                                              extraLibDirs = [],
@@ -146,7 +146,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -204,7 +204,7 @@ GenericPackageDescription
                                                                                                                                                           defaultExtensions = [],
                                                                                                                                                           defaultLanguage = Nothing,
                                                                                                                                                           extraBundledLibs = [],
-																			   extraDynLibFlavours = [],
+                                                                                                                                                          extraDynLibFlavours = [],
                                                                                                                                                           extraFrameworkDirs = [],
                                                                                                                                                           extraGHCiLibs = [],
                                                                                                                                                           extraLibDirs = [],
@@ -256,7 +256,7 @@ GenericPackageDescription
                                                                                                            defaultExtensions = [],
                                                                                                            defaultLanguage = Nothing,
                                                                                                            extraBundledLibs = [],
-													   extraDynLibFlavours = [],
+                                                                                                           extraDynLibFlavours = [],
                                                                                                            extraFrameworkDirs = [],
                                                                                                            extraGHCiLibs = [],
                                                                                                            extraLibDirs = [],
@@ -313,7 +313,7 @@ GenericPackageDescription
                                                                                                            defaultExtensions = [],
                                                                                                            defaultLanguage = Nothing,
                                                                                                            extraBundledLibs = [],
-													   extraDynLibFlavours = [],
+                                                                                                           extraDynLibFlavours = [],
                                                                                                            extraFrameworkDirs = [],
                                                                                                            extraGHCiLibs = [],
                                                                                                            extraLibDirs = [],
@@ -432,7 +432,7 @@ GenericPackageDescription
                                                             defaultExtensions = [],
                                                             defaultLanguage = Just Haskell2010,
                                                             extraBundledLibs = [],
-							    extraDynLibFlavours = [],
+                                                            extraDynLibFlavours = [],
                                                             extraFrameworkDirs = [],
                                                             extraGHCiLibs = [],
                                                             extraLibDirs = [],
@@ -648,7 +648,7 @@ GenericPackageDescription
                                                                                                                                                            defaultExtensions = [],
                                                                                                                                                            defaultLanguage = Nothing,
                                                                                                                                                            extraBundledLibs = [],
-																			    extraDynLibFlavours = [],
+                                                                                                                                                           extraDynLibFlavours = [],
                                                                                                                                                            extraFrameworkDirs = [],
                                                                                                                                                            extraGHCiLibs = [],
                                                                                                                                                            extraLibDirs = [],
@@ -680,6 +680,7 @@ GenericPackageDescription
                                                                                                                                                            virtualModules = []},
                                                                                                                                          libExposed = True,
                                                                                                                                          libName = Nothing,
+                                                                                                                                         libVisibility = LibraryVisibilityPublic,
                                                                                                                                          reexportedModules = [],
                                                                                                                                          signatures = []}}}],
                                                                         condTreeConstraints = [],
@@ -703,7 +704,7 @@ GenericPackageDescription
                                                                                                             defaultExtensions = [],
                                                                                                             defaultLanguage = Nothing,
                                                                                                             extraBundledLibs = [],
-													    extraDynLibFlavours = [],
+                                                                                                            extraDynLibFlavours = [],
                                                                                                             extraFrameworkDirs = [],
                                                                                                             extraGHCiLibs = [],
                                                                                                             extraLibDirs = [],
@@ -730,6 +731,7 @@ GenericPackageDescription
                                                                                                             virtualModules = []},
                                                                                           libExposed = True,
                                                                                           libName = Nothing,
+                                                                                          libVisibility = LibraryVisibilityPublic,
                                                                                           reexportedModules = [],
                                                                                           signatures = []}},
                                                condBranchIfTrue = CondNode
@@ -763,7 +765,7 @@ GenericPackageDescription
                                                                                                                                                         defaultExtensions = [],
                                                                                                                                                         defaultLanguage = Nothing,
                                                                                                                                                         extraBundledLibs = [],
-																			 extraDynLibFlavours = [],
+                                                                                                                                                        extraDynLibFlavours = [],
                                                                                                                                                         extraFrameworkDirs = [],
                                                                                                                                                         extraGHCiLibs = [],
                                                                                                                                                         extraLibDirs = [],
@@ -794,6 +796,7 @@ GenericPackageDescription
                                                                                                                                                         virtualModules = []},
                                                                                                                                       libExposed = True,
                                                                                                                                       libName = Nothing,
+                                                                                                                                      libVisibility = LibraryVisibilityPublic,
                                                                                                                                       reexportedModules = [],
                                                                                                                                       signatures = []}}}],
                                                                      condTreeConstraints = [],
@@ -817,7 +820,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -844,6 +847,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}},
                                             CondBranch
@@ -876,7 +880,7 @@ GenericPackageDescription
                                                                                                          defaultExtensions = [],
                                                                                                          defaultLanguage = Nothing,
                                                                                                          extraBundledLibs = [],
-													 extraDynLibFlavours = [],
+                                                                                                         extraDynLibFlavours = [],
                                                                                                          extraFrameworkDirs = [],
                                                                                                          extraGHCiLibs = [],
                                                                                                          extraLibDirs = [],
@@ -907,6 +911,7 @@ GenericPackageDescription
                                                                                                          virtualModules = []},
                                                                                        libExposed = True,
                                                                                        libName = Nothing,
+                                                                                       libVisibility = LibraryVisibilityPublic,
                                                                                        reexportedModules = [],
                                                                                        signatures = []}}}],
                       condTreeConstraints = [Dependency
@@ -1000,7 +1005,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -1155,6 +1160,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
@@ -1186,7 +1192,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -1243,7 +1249,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -1309,7 +1315,7 @@ GenericPackageDescription
                                                                                                                                                                 defaultExtensions = [],
                                                                                                                                                                 defaultLanguage = Nothing,
                                                                                                                                                                 extraBundledLibs = [],
-																				 extraDynLibFlavours = [],
+                                                                                                                                                                extraDynLibFlavours = [],
                                                                                                                                                                 extraFrameworkDirs = [],
                                                                                                                                                                 extraGHCiLibs = [],
                                                                                                                                                                 extraLibDirs = [],
@@ -1364,7 +1370,7 @@ GenericPackageDescription
                                                                                                                  defaultExtensions = [],
                                                                                                                  defaultLanguage = Nothing,
                                                                                                                  extraBundledLibs = [],
-														 extraDynLibFlavours = [],
+                                                                                                                 extraDynLibFlavours = [],
                                                                                                                  extraFrameworkDirs = [],
                                                                                                                  extraGHCiLibs = [],
                                                                                                                  extraLibDirs = [],
@@ -1424,7 +1430,7 @@ GenericPackageDescription
                                                                                                                                                              defaultExtensions = [],
                                                                                                                                                              defaultLanguage = Nothing,
                                                                                                                                                              extraBundledLibs = [],
-																			      extraDynLibFlavours = [],
+                                                                                                                                                             extraDynLibFlavours = [],
                                                                                                                                                              extraFrameworkDirs = [],
                                                                                                                                                              extraGHCiLibs = [],
                                                                                                                                                              extraLibDirs = [],
@@ -1478,7 +1484,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -1537,7 +1543,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -1658,7 +1664,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Just Haskell2010,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
diff --git a/Cabal/tests/ParserTests/regressions/spdx-1.expr b/Cabal/tests/ParserTests/regressions/spdx-1.expr
index b0d7fba2f7686a6b98db8eef4db7c70ba6d9a20b..b4153a1b6b93bacd1d524f7d48f7466aa8cb40f3 100644
--- a/Cabal/tests/ParserTests/regressions/spdx-1.expr
+++ b/Cabal/tests/ParserTests/regressions/spdx-1.expr
@@ -26,7 +26,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -53,6 +53,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/spdx-2.expr b/Cabal/tests/ParserTests/regressions/spdx-2.expr
index c39b7be471557cdb4ae3601da3362e7a3e152d43..4ee43ab0acf679c6545cbc6617c3c18607faa684 100644
--- a/Cabal/tests/ParserTests/regressions/spdx-2.expr
+++ b/Cabal/tests/ParserTests/regressions/spdx-2.expr
@@ -26,7 +26,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -53,6 +53,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/spdx-3.expr b/Cabal/tests/ParserTests/regressions/spdx-3.expr
index 2982c30d117992807b2dda0e2742ff88355cdffe..354de4777dc71b74c1ffdb9bd4413a47b9f641c8 100644
--- a/Cabal/tests/ParserTests/regressions/spdx-3.expr
+++ b/Cabal/tests/ParserTests/regressions/spdx-3.expr
@@ -26,7 +26,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -53,6 +53,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
diff --git a/Cabal/tests/ParserTests/regressions/th-lift-instances.expr b/Cabal/tests/ParserTests/regressions/th-lift-instances.expr
index 33aba1d89a17ab0fb32bfce9cd14409274f32fd3..2f0d596ec54fdd8fb37fb2ea80802d27a73d894d 100644
--- a/Cabal/tests/ParserTests/regressions/th-lift-instances.expr
+++ b/Cabal/tests/ParserTests/regressions/th-lift-instances.expr
@@ -63,7 +63,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Just Haskell2010,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -148,6 +148,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],
@@ -216,7 +217,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Just Haskell2010,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
@@ -333,7 +334,7 @@ GenericPackageDescription
                                                                                                               defaultExtensions = [],
                                                                                                               defaultLanguage = Nothing,
                                                                                                               extraBundledLibs = [],
-													      extraDynLibFlavours = [],
+                                                                                                              extraDynLibFlavours = [],
                                                                                                               extraFrameworkDirs = [],
                                                                                                               extraGHCiLibs = [],
                                                                                                               extraLibDirs = [],
@@ -400,7 +401,7 @@ GenericPackageDescription
                                                                defaultExtensions = [],
                                                                defaultLanguage = Just Haskell2010,
                                                                extraBundledLibs = [],
-							       extraDynLibFlavours = [],
+                                                               extraDynLibFlavours = [],
                                                                extraFrameworkDirs = [],
                                                                extraGHCiLibs = [],
                                                                extraLibDirs = [],
diff --git a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr
index c01702714e7128a0d3c52ae3685aa687f9b6f03a..9092ddc0acd05ec6dfb595c8ef56945a46726b19 100644
--- a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr
+++ b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr
@@ -35,7 +35,7 @@ GenericPackageDescription
                                                             defaultExtensions = [],
                                                             defaultLanguage = Nothing,
                                                             extraBundledLibs = [],
-							    extraDynLibFlavours = [],
+                                                            extraDynLibFlavours = [],
                                                             extraFrameworkDirs = [],
                                                             extraGHCiLibs = [],
                                                             extraLibDirs = [],
@@ -111,7 +111,7 @@ GenericPackageDescription
                                                           defaultExtensions = [],
                                                           defaultLanguage = Nothing,
                                                           extraBundledLibs = [],
-							  extraDynLibFlavours = [],
+                                                          extraDynLibFlavours = [],
                                                           extraFrameworkDirs = [],
                                                           extraGHCiLibs = [],
                                                           extraLibDirs = [],
@@ -149,6 +149,7 @@ GenericPackageDescription
                                                           virtualModules = []},
                                         libExposed = True,
                                         libName = Nothing,
+                                        libVisibility = LibraryVisibilityPublic,
                                         reexportedModules = [],
                                         signatures = []}},
    condSubLibraries = [],