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.5.0
+version:             0.4.6.0
 
 -- A short (one-line) description of the package.
 synopsis:            Code that helps you create a valid Atlassian Connect Descriptor.
@@ -93,9 +93,9 @@
 
 Test-Suite test-descriptor
   hs-source-dirs: tests
-  type:        detailed-0.9
+  type:        exitcode-stdio-1.0
 
-  test-module: Test
+  main-is: Main.hs
   other-modules: Util
                  , AssertionHelpers
                  , ValueExtractors
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,9 @@
    , JIRAProjectAdminTabPanel(..)
    -- ** JIRA Specific Modules
    , JIRASearchRequestView(..)
+   , JIRAIssueGlance(..)
+   , JIRAIssueGlanceContent(..)
+   , JIRAIssueGlanceTarget(..)
    , JIRAReport(..)
    , JIRAReportCategory(..)
    , Target(..)
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
@@ -1,5 +1,6 @@
 {-# LANGUAGE DeriveGeneric     #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverloadedStrings #-}
 module Data.Connect.Modules
    ( Modules(..)
    , JIRAModules(..)
@@ -15,6 +16,9 @@
    , JIRAGenericTabPanel(..)
    , JIRAProjectAdminTabPanel(..)
    , JIRASearchRequestView(..)
+   , JIRAIssueGlance(..)
+   , JIRAIssueGlanceContent(..)
+   , JIRAIssueGlanceTarget(..)
    , JIRAReport(..)
    , JIRAReportCategory(..)
    , Target(..)
@@ -113,6 +117,7 @@
    , jmJiraProjectAdminTabPanels :: Maybe [JIRAProjectAdminTabPanel]
    , jmJiraIssueTabPanels        :: Maybe [JIRAGenericTabPanel]
    , jmJiraComponentTabPanels    :: Maybe [JIRAGenericTabPanel]
+   , jmJiraIssueGlances          :: Maybe [JIRAIssueGlance]
    , jmJiraReports               :: Maybe [JIRAReport]
    , jmWebhooks                  :: Maybe [Webhook]
    , jmJiraWorkflowPostFunctions :: Maybe [JIRAWorkflowPostFunction]
@@ -157,6 +162,7 @@
       Nothing
       Nothing
       Nothing
+      Nothing
 
 -- | Empty Confluence Modules; useful when you only want to define a few modules via Haskell record syntax.
 emptyConfluenceModules :: ConfluenceModules
@@ -405,6 +411,42 @@
    toJSON = genericToJSON baseOptions
       { fieldLabelModifier = stripFieldNamePrefix "jiraPage"
       }
+
+-- | This module adds a glance to the context area of the new Jira issue view.
+-- Glances can have an icon, content, and status.
+data JIRAIssueGlance = JIRAIssueGlance
+   { jigKey             :: T.Text -- ^ The add-on unique key for this module.
+   , jigName            :: I18nText -- ^ The name of this JIRA Glance.
+   , jigContent         :: JIRAIssueGlanceContent -- ^ This content becomes the label next to the icon. It's handy for communicating a small amount of information.
+   , jigIcon            :: IconDetails -- ^ Specifies an icon to display at the left of the glance view control. The icon resource provided in this field should be 24x24 pixels or larger, preferably in .SVG format.
+   , jigTarget          :: JIRAIssueGlanceTarget -- ^ Specifies the target action when clicking on the glance.
+   , jigConditions      :: [Condition] -- ^ The conditions under which the glance will be shown.
+   } deriving (Show, Generic)
+
+instance ToJSON JIRAIssueGlance where
+   toJSON = genericToJSON baseOptions
+      { fieldLabelModifier = stripFieldNamePrefix "jig"
+      }
+
+data JIRAIssueGlanceContent = JIRAIssueGlanceContentLabel
+   { jigclLabel :: I18nText
+   } deriving (Show)
+
+instance ToJSON JIRAIssueGlanceContent where
+   toJSON label@(JIRAIssueGlanceContentLabel {}) = object
+      [ "type" .= T.pack "label"
+      , "label" .= (jigclLabel label)            
+      ]
+
+data JIRAIssueGlanceTarget = JIRAIssueGlanceTargetWebPanel
+   { jigtwpUrl :: T.Text -- ^ The url to the content that will be loaded in the glance iframe.
+   } deriving (Show)
+
+instance ToJSON JIRAIssueGlanceTarget where
+   toJSON wp@(JIRAIssueGlanceTargetWebPanel {}) = object
+      [ "type" .= T.pack "web_panel"
+      , "url" .= (jigtwpUrl wp)
+      ]
 
 -- |  A Search Request View allows you to render a custom representation of a search result. Rendering a custom XML
 -- format is a common example.
diff --git a/tests/Main.hs b/tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/tests/Main.hs
@@ -0,0 +1,20 @@
+module Main where
+
+import           ConditionsTest
+import           DescriptorTest
+import           ModulesTest
+import qualified Test.HUnit             as HU
+import           System.Exit (exitWith, ExitCode(..))
+
+hunitTests :: HU.Test
+hunitTests = HU.TestList
+    [ HU.TestLabel "Condition Tests" conditionsTests
+    , HU.TestLabel "Module Tests" moduleTests
+    , HU.TestLabel "Descriptor Tests" descriptorTests
+    ]
+
+main :: IO ()
+main = do
+    counts <- HU.runTestTT hunitTests
+    let mistakes = HU.errors counts + HU.failures counts
+    exitWith (if mistakes > 0 then ExitFailure mistakes else ExitSuccess)
diff --git a/tests/ModulesTest.hs b/tests/ModulesTest.hs
--- a/tests/ModulesTest.hs
+++ b/tests/ModulesTest.hs
@@ -14,7 +14,34 @@
     [ testWebPanelCorrectFormat
     , testGeneralPageCorrectFormat
     , testEmptyModulesAreNotShown
+    , testIssueGlanceCorrectFormat
     ]
+
+testIssueGlanceCorrectFormat :: Test
+testIssueGlanceCorrectFormat = TestCase $ do
+    let jig = JIRAIssueGlance
+                { jigKey = "jira-issue-glance-module"
+                , jigName = simpleText "My glance"
+                , jigContent = JIRAIssueGlanceContentLabel (simpleText "my label")
+                , jigIcon = IconDetails
+                    { iconUrl = "my_icon.svg"
+                    , iconWidth = Just 24
+                    , iconHeight = Just 25
+                    }
+                , jigTarget = JIRAIssueGlanceTargetWebPanel ("/panel_url")
+                , jigConditions = []
+                }
+    let jv = toJSON jig
+    isObject jv @? "Expected the issue glance to be an object"
+    (getString =<< get "key" jv) `isEqualTo` "jira-issue-glance-module"
+    (getString =<< get "value" =<< get "name" jv) `isEqualTo` "My glance"
+    (getString =<< get "type" =<< get "target" jv) `isEqualTo` "web_panel"
+    (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
 
 testWebPanelCorrectFormat :: Test
 testWebPanelCorrectFormat = TestCase $ do
diff --git a/tests/Test.hs b/tests/Test.hs
deleted file mode 100644
--- a/tests/Test.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-module Test where
-
-import           ConditionsTest
-import           DescriptorTest
-import qualified Distribution.TestSuite as TS
-import           ModulesTest
-import qualified Test.HUnit             as HU
-import           Util
-
-hunitTests :: HU.Test
-hunitTests = HU.TestList
-    [ HU.TestLabel "Condition Tests" conditionsTests
-    , HU.TestLabel "Module Tests" moduleTests
-    , HU.TestLabel "Descriptor Tests" descriptorTests
-    ]
-
-tests :: IO [TS.Test]
-tests = return [ TS.Test (hunitTestInstance hunitTests) ]
