diff --git a/cabal-install/Distribution/Client/ProjectPlanOutput.hs b/cabal-install/Distribution/Client/ProjectPlanOutput.hs
index 2b6f31d50de33394ea1527f9d7f1361143a64929..0f5a18b76a9c4d2fc61c00068153a4bb578e4dfa 100644
--- a/cabal-install/Distribution/Client/ProjectPlanOutput.hs
+++ b/cabal-install/Distribution/Client/ProjectPlanOutput.hs
@@ -81,11 +81,12 @@ encodePlanAsJson elaboratedInstallPlan _elaboratedSharedConfig =
           ElabPackage pkg ->
             let components = J.object $
                   [ comp2str c J..= J.object
-                    [ "depends" J..= map (jdisplay . confInstId) v ]
-                  | (c,v) <- ComponentDeps.toList (pkgLibDependencies pkg) ] ++
-                  [ comp2str c J..= J.object
-                    [ "exe-depends" J..= map (jdisplay . confInstId) v ]
-                  | (c,v) <- ComponentDeps.toList (pkgExeDependencies pkg) ]
+                    [ "depends"     J..= map (jdisplay . confInstId) ldeps
+                    , "exe-depends" J..= map (jdisplay . confInstId) edeps ]
+                  | (c,(ldeps,edeps))
+                      <- ComponentDeps.toList $
+                         ComponentDeps.zip (pkgLibDependencies pkg)
+                                           (pkgExeDependencies pkg) ]
             in ["components" J..= components]
           ElabComponent _ ->
             ["depends"     J..= map (jdisplay . confInstId) (elabLibDependencies elab)
diff --git a/cabal-install/Distribution/Solver/Types/ComponentDeps.hs b/cabal-install/Distribution/Solver/Types/ComponentDeps.hs
index 6c36cc6083ef310cd6f475194eae8f730d0cb3e7..621d12df117a84c33c1e23998861b184fa8dd187 100644
--- a/cabal-install/Distribution/Solver/Types/ComponentDeps.hs
+++ b/cabal-install/Distribution/Solver/Types/ComponentDeps.hs
@@ -22,6 +22,7 @@ module Distribution.Solver.Types.ComponentDeps (
   , fromList
   , singleton
   , insert
+  , zip
   , filterDeps
   , fromLibraryDeps
   , fromSetupDeps
@@ -35,6 +36,7 @@ module Distribution.Solver.Types.ComponentDeps (
   , select
   ) where
 
+import Prelude hiding (zip)
 import Data.Map (Map)
 import qualified Data.Map as Map
 import Distribution.Compat.Binary (Binary)
@@ -119,6 +121,28 @@ insert comp a = ComponentDeps . Map.alter aux comp . unComponentDeps
     aux Nothing   = Just a
     aux (Just a') = Just $ a `mappend` a'
 
+-- | Zip two 'ComponentDeps' together by 'Component', using 'mempty'
+-- as the neutral element when a 'Component' is present only in one.
+zip :: (Monoid a, Monoid b) => ComponentDeps a -> ComponentDeps b -> ComponentDeps (a, b)
+{- TODO/FIXME: Once we can expect containers>=0.5, switch to the more efficient version below:
+
+zip (ComponentDeps d1) (ComponentDeps d2) =
+    ComponentDeps $
+      Map.mergeWithKey
+        (\_ a b -> Just (a,b))
+        (fmap (\a -> (a, mempty)))
+        (fmap (\b -> (mempty, b)))
+        d1 d2
+
+-}
+zip (ComponentDeps d1) (ComponentDeps d2) =
+    ComponentDeps $
+      Map.unionWith
+        mappend
+        (Map.map (\a -> (a, mempty)) d1)
+        (Map.map (\b -> (mempty, b)) d2)
+
+
 -- | Keep only selected components (and their associated deps info).
 filterDeps :: (Component -> a -> Bool) -> ComponentDeps a -> ComponentDeps a
 filterDeps p = ComponentDeps . Map.filterWithKey p . unComponentDeps
diff --git a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs
index 2d06a8cdb2b20a06e8a8ceefdef06aa59a27c36e..74528a1f6e0c84b8ed7d0d6860874badedf09ece 100644
--- a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs
+++ b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs
@@ -11,7 +11,7 @@ import qualified Distribution.Compat.Graph as Graph
 import           Distribution.Compat.Graph (IsNode(..))
 import           Distribution.Solver.Types.Settings
 import           Distribution.Solver.Types.PackageFixedDeps
-import           Distribution.Solver.Types.ComponentDeps as CD
+import qualified Distribution.Solver.Types.ComponentDeps as CD
 import           Distribution.Client.Types
 import           Distribution.Client.JobControl