diff --git a/atlassian-connect-descriptor.cabal b/atlassian-connect-descriptor.cabal
--- a/atlassian-connect-descriptor.cabal
+++ b/atlassian-connect-descriptor.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.4.6.0
+version:             0.4.7.0
 
 -- A short (one-line) description of the package.
 synopsis:            Code that helps you create a valid Atlassian Connect Descriptor.
diff --git a/src/Data/Connect/Descriptor.hs b/src/Data/Connect/Descriptor.hs
--- a/src/Data/Connect/Descriptor.hs
+++ b/src/Data/Connect/Descriptor.hs
@@ -128,6 +128,8 @@
    , JIRAProjectAdminTabPanel(..)
    -- ** JIRA Specific Modules
    , JIRASearchRequestView(..)
+   , JIRAIssueContent(..)
+   , JIRAIssueContentTarget(..)
    , JIRAIssueGlance(..)
    , JIRAIssueGlanceContent(..)
    , JIRAIssueGlanceTarget(..)
diff --git a/src/Data/Connect/Modules.hs b/src/Data/Connect/Modules.hs
--- a/src/Data/Connect/Modules.hs
+++ b/src/Data/Connect/Modules.hs
@@ -16,6 +16,8 @@
    , JIRAGenericTabPanel(..)
    , JIRAProjectAdminTabPanel(..)
    , JIRASearchRequestView(..)
+   , JIRAIssueContent(..)
+   , JIRAIssueContentTarget(..)
    , JIRAIssueGlance(..)
    , JIRAIssueGlanceContent(..)
    , JIRAIssueGlanceTarget(..)
@@ -117,6 +119,7 @@
    , jmJiraProjectAdminTabPanels :: Maybe [JIRAProjectAdminTabPanel]
    , jmJiraIssueTabPanels        :: Maybe [JIRAGenericTabPanel]
    , jmJiraComponentTabPanels    :: Maybe [JIRAGenericTabPanel]
+   , jmJiraIssueContents         :: Maybe [JIRAIssueContent]
    , jmJiraIssueGlances          :: Maybe [JIRAIssueGlance]
    , jmJiraReports               :: Maybe [JIRAReport]
    , jmWebhooks                  :: Maybe [Webhook]
@@ -163,6 +166,7 @@
       Nothing
       Nothing
       Nothing
+      Nothing
 
 -- | Empty Confluence Modules; useful when you only want to define a few modules via Haskell record syntax.
 emptyConfluenceModules :: ConfluenceModules
@@ -411,6 +415,32 @@
    toJSON = genericToJSON baseOptions
       { fieldLabelModifier = stripFieldNamePrefix "jiraPage"
       }
+
+-- | This module adds a content button to the context area of the new Jira issue view.
+-- Content can have an icon, tooltip, and target.
+data JIRAIssueContent = JIRAIssueContent
+   { jicKey             :: T.Text -- ^ The add-on unique key for this module.
+   , jicName            :: I18nText -- ^ The name of this JIRA Issue Content.
+   , jicTooltip         :: I18nText -- ^ The tooltip for this JIRA Issue Content.
+   , jicIcon            :: IconDetails -- ^ The icon for this JIRA Issue Content.
+   , jicTarget          :: JIRAIssueContentTarget -- ^ Specifies the target action when clicking on the content.
+   , jicConditions      :: [Condition] -- ^ The conditions under which the content will be shown.
+   } deriving (Show, Generic)
+
+instance ToJSON JIRAIssueContent where
+   toJSON = genericToJSON baseOptions
+      { fieldLabelModifier = stripFieldNamePrefix "jic"
+      }
+
+data JIRAIssueContentTarget = JIRAIssueContentTargetWebPanel
+   { jictwpUrl :: T.Text -- ^ The url to the content that will be loaded in the glance iframe.
+   } deriving (Show)
+
+instance ToJSON JIRAIssueContentTarget where
+   toJSON wp@(JIRAIssueContentTargetWebPanel {}) = object
+      [ "type" .= T.pack "web_panel"
+      , "url" .= (jictwpUrl wp)
+      ]
 
 -- | This module adds a glance to the context area of the new Jira issue view.
 -- Glances can have an icon, content, and status.
diff --git a/tests/ModulesTest.hs b/tests/ModulesTest.hs
--- a/tests/ModulesTest.hs
+++ b/tests/ModulesTest.hs
@@ -15,6 +15,7 @@
     , testGeneralPageCorrectFormat
     , testEmptyModulesAreNotShown
     , testIssueGlanceCorrectFormat
+    , testIssueContentCorrectFormat
     ]
 
 testIssueGlanceCorrectFormat :: Test
@@ -39,6 +40,31 @@
     (getString =<< get "url" =<< get "target" jv) `isEqualTo` "/panel_url"
     (getString =<< get "type" =<< get "content" jv) `isEqualTo` "label"
     (getString =<< get "value" =<< get "label" =<< get "content" jv) `isEqualTo` "my label"
+    (get "url" =<< get "icon" jv) `isEqualTo` "my_icon.svg"
+    (getNumber =<< get "width" =<< get "icon" jv) `isEqualTo` 24
+    (getNumber =<< get "height" =<< get "icon" jv) `isEqualTo` 25
+
+testIssueContentCorrectFormat :: Test
+testIssueContentCorrectFormat = TestCase $ do
+    let jic = JIRAIssueContent
+                { jicKey = "jira-issue-content-module"
+                , jicName = simpleText "My content"
+                , jicTooltip = simpleText "My tooltip"
+                , jicIcon = IconDetails
+                    { iconUrl = "my_icon.svg"
+                    , iconWidth = Just 24
+                    , iconHeight = Just 25
+                    }
+                , jicTarget = JIRAIssueContentTargetWebPanel "/panel_url"
+                , jicConditions = []
+                }
+    let jv = toJSON jic
+    isObject jv @? "Expected the issue glance to be an object"
+    (getString =<< get "key" jv) `isEqualTo` "jira-issue-content-module"
+    (getString =<< get "value" =<< get "name" jv) `isEqualTo` "My content"
+    (getString =<< get "value" =<< get "tooltip" jv) `isEqualTo` "My tooltip"
+    (getString =<< get "type" =<< get "target" jv) `isEqualTo` "web_panel"
+    (getString =<< get "url" =<< get "target" jv) `isEqualTo` "/panel_url"
     (get "url" =<< get "icon" jv) `isEqualTo` "my_icon.svg"
     (getNumber =<< get "width" =<< get "icon" jv) `isEqualTo` 24
     (getNumber =<< get "height" =<< get "icon" jv) `isEqualTo` 25
