diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+#### 0.3.11.0
+
+* Add `toFeedDateStringUTC` which uses UTCTime rather than ClockTime (thanks to Emanuel Borsboom)
+* Now with explicit export lists!
+
 #### 0.3.10.4
 
 * Fix toFeedDateString time format, It used %s (seconds since epoch) instead of %S (seconds of minute), and %m (month) instead of %M (minute) (thanks to Emanuel Borsboom)
diff --git a/feed.cabal b/feed.cabal
--- a/feed.cabal
+++ b/feed.cabal
@@ -1,5 +1,5 @@
 name:                feed
-version:             0.3.10.4
+version:             0.3.11.0
 license:             BSD3
 license-file:        LICENSE
 category:            Text
diff --git a/src/Text/Atom/Feed.hs b/src/Text/Atom/Feed.hs
--- a/src/Text/Atom/Feed.hs
+++ b/src/Text/Atom/Feed.hs
@@ -11,7 +11,31 @@
 --
 --------------------------------------------------------------------
 
-module Text.Atom.Feed where
+module Text.Atom.Feed
+  ( URI
+  , NCName
+  , Date
+  , MediaType
+  , Feed (..)
+  , Entry (..)
+  , EntryContent (..)
+  , Category (..)
+  , Generator (..)
+  , Link (..)
+  , TextContent (..)
+  , txtToString
+  , Source (..)
+  , Person (..)
+  , InReplyTo (..)
+  , InReplyTotal (..)
+  , newCategory
+  , nullFeed
+  , nullEntry
+  , nullGenerator
+  , nullLink
+  , nullSource
+  , nullPerson
+  ) where
 
 import qualified Text.XML.Light as XML
 
diff --git a/src/Text/Atom/Feed/Export.hs b/src/Text/Atom/Feed/Export.hs
--- a/src/Text/Atom/Feed/Export.hs
+++ b/src/Text/Atom/Feed/Export.hs
@@ -15,7 +15,45 @@
 --------------------------------------------------------------------
 
 
-module Text.Atom.Feed.Export where
+module Text.Atom.Feed.Export
+  ( atom_prefix
+  , atom_thr_prefix
+  , atomNS
+  , atomThreadNS
+  , xmlns_atom
+  , xmlns_atom_thread
+  , atomName
+  , atomAttr
+  , atomNode
+  , atomLeaf
+  , atomThreadName
+  , atomThreadAttr
+  , atomThreadNode
+  , atomThreadLeaf
+  , xmlFeed
+  , xmlEntry
+  , xmlContent
+  , xmlCategory
+  , xmlLink
+  , xmlSource
+  , xmlGenerator
+  , xmlAuthor
+  , xmlContributor
+  , xmlPerson
+  , xmlInReplyTo
+  , xmlInReplyTotal
+  , xmlId
+  , xmlIcon
+  , xmlLogo
+  , xmlUpdated
+  , xmlPublished
+  , xmlRights
+  , xmlTitle
+  , xmlSubtitle
+  , xmlSummary
+  , xmlTextContent
+  , mb
+  ) where
 
 import Text.XML.Light as XML
 import Text.Atom.Feed
diff --git a/src/Text/Atom/Feed/Import.hs b/src/Text/Atom/Feed/Import.hs
--- a/src/Text/Atom/Feed/Import.hs
+++ b/src/Text/Atom/Feed/Import.hs
@@ -14,7 +14,30 @@
 --
 --------------------------------------------------------------------
 
-module Text.Atom.Feed.Import where
+module Text.Atom.Feed.Import
+  ( pNodes
+  , pQNodes
+  , pNode
+  , pQNode
+  , pLeaf
+  , pQLeaf
+  , pAttr
+  , pAttrs
+  , pQAttr
+  , pMany
+  , children
+  , elementFeed
+  , pTextContent
+  , pPerson
+  , pCategory
+  , pGenerator
+  , pSource
+  , pLink
+  , pEntry
+  , pContent
+  , pInReplyTotal
+  , pInReplyTo
+  ) where
 
 import Data.Maybe (listToMaybe, mapMaybe, isJust)
 import Data.List  (find)
diff --git a/src/Text/Atom/Feed/Link.hs b/src/Text/Atom/Feed/Link.hs
--- a/src/Text/Atom/Feed/Link.hs
+++ b/src/Text/Atom/Feed/Link.hs
@@ -12,10 +12,10 @@
 --------------------------------------------------------------------
 
 module Text.Atom.Feed.Link
-       ( LinkRelation(..)
-       , showLinkRelation
-       , showLinkAttr
-       ) where
+  ( LinkRelation(..)
+  , showLinkRelation
+  , showLinkAttr
+  ) where
 
 -- | Atom feeds uses typed IRI links to represent
 -- information \/ metadata that is of interest to the
@@ -78,4 +78,3 @@
  where
   escQ '"' = "&dquot;"
   escQ x   = [x]
-
diff --git a/src/Text/Atom/Feed/Validate.hs b/src/Text/Atom/Feed/Validate.hs
--- a/src/Text/Atom/Feed/Validate.hs
+++ b/src/Text/Atom/Feed/Validate.hs
@@ -10,12 +10,41 @@
 -- Portability: portable
 --
 --------------------------------------------------------------------
-module Text.Atom.Feed.Validate where
+module Text.Atom.Feed.Validate
+  ( VTree (..)
+  , ValidatorResult
+  , advice
+  , demand
+  , valid
+  , mkTree
+  , flattenT
+  , validateEntry
+  , checkEntryAuthor
+  , checkCats
+  , checkContents
+  , checkContributor
+  , checkContentLink
+  , checkLinks
+  , checkId
+  , checkPublished
+  , checkRights
+  , checkSource
+  , checkSummary
+  , checkTitle
+  , checkUpdated
+  , checkCat
+  , checkContent
+  , checkTerm
+  , checkAuthor
+  , checkPerson
+  , checkName
+  , checkEmail
+  , checkUri
+  ) where
 
 import Text.Atom.Feed.Import
 import Text.XML.Light.Types
 import Text.XML.Light.Proc
-
 
 import Data.List
 import Data.Maybe
diff --git a/src/Text/Atom/Pub.hs b/src/Text/Atom/Pub.hs
--- a/src/Text/Atom/Pub.hs
+++ b/src/Text/Atom/Pub.hs
@@ -12,7 +12,13 @@
 -- Types for the Atom Publishing Protocol (APP)
 --
 --------------------------------------------------------------------
-module Text.Atom.Pub where
+module Text.Atom.Pub
+  ( Service (..)
+  , Workspace (..)
+  , Collection (..)
+  , Categories (..)
+  , Accept (..)
+  ) where
 
 import Text.XML.Light.Types as XML
 import Text.Atom.Feed ( TextContent, Category, URI )
diff --git a/src/Text/Atom/Pub/Export.hs b/src/Text/Atom/Pub/Export.hs
--- a/src/Text/Atom/Pub/Export.hs
+++ b/src/Text/Atom/Pub/Export.hs
@@ -13,7 +13,20 @@
 -- Serializing Atom Publishing Protocol types as XML.
 --
 --------------------------------------------------------------------
-module Text.Atom.Pub.Export where
+module Text.Atom.Pub.Export
+  ( showServiceDoc
+  , mkQName
+  , mkElem
+  , mkLeaf
+  , mkAttr
+  , xmlns_app
+  , appNS
+  , xmlService
+  , xmlWorkspace
+  , xmlCollection
+  , xmlCategories
+  , xmlAccept
+  ) where
 
 import Text.XML.Light
 import Text.Atom.Pub
diff --git a/src/Text/DublinCore/Types.hs b/src/Text/DublinCore/Types.hs
--- a/src/Text/DublinCore/Types.hs
+++ b/src/Text/DublinCore/Types.hs
@@ -12,7 +12,12 @@
 -- For information on the Dublin Core Metadata Element Set,
 -- see: <http://dublincore.org/>
 --
-module Text.DublinCore.Types where
+module Text.DublinCore.Types
+  ( DCItem (..)
+  , DCInfo (..)
+  , infoToTag
+  , dc_element_names
+  ) where
 
 -- | A DCItem pairs a specific element with its (string) value.
 data DCItem
diff --git a/src/Text/Feed/Translate.hs b/src/Text/Feed/Translate.hs
--- a/src/Text/Feed/Translate.hs
+++ b/src/Text/Feed/Translate.hs
@@ -18,14 +18,13 @@
        , withRSS1Item     -- :: (RSS1.Item -> RSS1.Item) -> Item -> Item
        ) where
 
-import Text.Feed.Types as Feed
+import Text.Atom.Feed as Atom
 import Text.Feed.Constructor
-
+import Text.Feed.Types as Feed
 import Text.RSS.Syntax as RSS
 import qualified Text.RSS1.Syntax as RSS1
-import Text.Atom.Feed as Atom
 
-import Data.Maybe ( fromMaybe )
+import Data.Maybe (fromMaybe)
 
 -- functions for performing format-specific transformations.
 -- If the item isn't in the of-interest format, no transformation
diff --git a/src/Text/Feed/Types.hs b/src/Text/Feed/Types.hs
--- a/src/Text/Feed/Types.hs
+++ b/src/Text/Feed/Types.hs
@@ -11,12 +11,16 @@
 --
 --------------------------------------------------------------------
 
-module Text.Feed.Types where
+module Text.Feed.Types
+  ( Feed (..)
+  , Item (..)
+  , FeedKind (..)
+  ) where
 
-import Text.RSS.Syntax  as RSS
-import Text.Atom.Feed   as Atom
-import Text.RSS1.Syntax as RSS1
-import Text.XML.Light as XML
+import qualified Text.RSS.Syntax  as RSS
+import qualified Text.Atom.Feed   as Atom
+import qualified Text.RSS1.Syntax as RSS1
+import qualified Text.XML.Light   as XML
 
 -- | The abstract type of feed documents. The internal representation
 -- is as whatever feed variant type the document was either imported or
@@ -46,4 +50,3 @@
  | RSSKind (Maybe String)  -- Nothing => default version (2.0)
  | RDFKind (Maybe String)  -- Nothing => default version (1.0)
  deriving (Eq, Show)
-
diff --git a/src/Text/Feed/Util.hs b/src/Text/Feed/Util.hs
--- a/src/Text/Feed/Util.hs
+++ b/src/Text/Feed/Util.hs
@@ -10,17 +10,40 @@
 -- Portability: portable
 --
 --------------------------------------------------------------------
-module Text.Feed.Util where
+module Text.Feed.Util
+       ( toFeedDateString
+       , toFeedDateStringUTC
+       ) where
 
 import Text.Feed.Types
-import System.Time
-import System.Locale
+import Data.Time (UTCTime, formatTime)
+import qualified Data.Time.Locale.Compat
+import qualified System.Locale
+import System.Time (ClockTime, formatCalendarTime, toUTCTime)
 
--- | 'toFeedDate' translates a calendar time into
+-- | 'toFeedDateString' translates a calendar time into
 -- the format expected by the feed kind.
 toFeedDateString :: FeedKind -> ClockTime -> {-Date-}String
 toFeedDateString fk ct =
-  case fk of
-    AtomKind{} -> formatCalendarTime defaultTimeLocale "%Y-%m-%dT%H:%M:%SZ" (toUTCTime ct)
-    RSSKind{}  -> formatCalendarTime defaultTimeLocale "%a, %d %b %Y %H:%M:%S GMT" (toUTCTime ct)
-    RDFKind{}  -> formatCalendarTime defaultTimeLocale "%Y-%m-%dT%H:%M:%SZ" (toUTCTime ct)
+    formatCalendarTime System.Locale.defaultTimeLocale fmt ut
+  where
+    fmt = feedKindTimeFormat fk
+    ut = toUTCTime ct
+
+-- | 'toFeedDateStringUTC' translates a UTC time into
+-- the format expected by the feed kind.
+toFeedDateStringUTC :: FeedKind -> UTCTime -> {-Date-}String
+toFeedDateStringUTC fk =
+    formatTime Data.Time.Locale.Compat.defaultTimeLocale fmt
+  where
+    fmt = feedKindTimeFormat fk
+
+-- | Time format expected by the feed kind.
+feedKindTimeFormat :: FeedKind -> String
+feedKindTimeFormat fk =
+    case fk of
+        AtomKind{} -> atomRdfTimeFormat
+        RSSKind{}  -> "%a, %d %b %Y %H:%M:%S GMT"
+        RDFKind{}  -> atomRdfTimeFormat
+  where
+    atomRdfTimeFormat = "%Y-%m-%dT%H:%M:%SZ"
diff --git a/src/Text/RSS/Export.hs b/src/Text/RSS/Export.hs
--- a/src/Text/RSS/Export.hs
+++ b/src/Text/RSS/Export.hs
@@ -12,7 +12,25 @@
 --------------------------------------------------------------------
 
 
-module Text.RSS.Export where
+module Text.RSS.Export
+  ( qualNode
+  , qualName
+  , xmlRSS
+  , xmlChannel
+  , xmlItem
+  , xmlSource
+  , xmlEnclosure
+  , xmlCategory
+  , xmlGuid
+  , xmlImage
+  , xmlCloud
+  , xmlTextInput
+  , xmlSkipHours
+  , xmlSkipDays
+  , xmlAttr
+  , xmlLeaf
+  , mb
+  ) where
 
 import Text.XML.Light as XML
 import Text.RSS.Syntax
diff --git a/src/Text/RSS/Import.hs b/src/Text/RSS/Import.hs
--- a/src/Text/RSS/Import.hs
+++ b/src/Text/RSS/Import.hs
@@ -12,7 +12,33 @@
 --
 --------------------------------------------------------------------
 
-module Text.RSS.Import where
+module Text.RSS.Import
+  ( pNodes
+  , pQNodes
+  , pNode
+  , pQNode
+  , pLeaf
+  , pQLeaf
+  , pAttr
+  , pMany
+  , children
+  , qualName
+  , dcName
+  , elementToRSS
+  , elementToChannel
+  , elementToImage
+  , elementToCategory
+  , elementToCloud
+  , elementToItem
+  , elementToSource
+  , elementToEnclosure
+  , elementToGuid
+  , elementToTextInput
+  , elementToSkipHours
+  , elementToSkipDays
+  , readInt
+  , readBool
+  ) where
 
 import Text.RSS.Syntax
 import Text.RSS1.Utils ( dcNS, dcPrefix )
@@ -274,4 +300,3 @@
     't':'r':'u':'e':_ -> Just True
     'f':'a':'l':'s':'e':_ -> Just False
     _ -> Nothing
-
diff --git a/src/Text/RSS/Syntax.hs b/src/Text/RSS/Syntax.hs
--- a/src/Text/RSS/Syntax.hs
+++ b/src/Text/RSS/Syntax.hs
@@ -16,7 +16,31 @@
 --------------------------------------------------------------------
 
 
-module Text.RSS.Syntax where
+module Text.RSS.Syntax
+  ( RSS (..)
+  , URLString
+  , DateString
+  , RSSChannel (..)
+  , RSSItem (..)
+  , RSSSource (..)
+  , RSSEnclosure (..)
+  , RSSCategory (..)
+  , RSSGuid (..)
+  , RSSImage (..)
+  , RSSCloud (..)
+  , RSSTextInput (..)
+  , nullRSS
+  , nullChannel
+  , nullItem
+  , nullSource
+  , nullEnclosure
+  , newCategory
+  , nullGuid
+  , nullPermaGuid
+  , nullImage
+  , nullCloud
+  , nullTextInput
+  ) where
 
 import Text.XML.Light as XML
 
@@ -290,4 +314,3 @@
      , rssTextInputAttrs = []
      , rssTextInputOther = []
      }
-
diff --git a/src/Text/RSS1/Export.hs b/src/Text/RSS1/Export.hs
--- a/src/Text/RSS1/Export.hs
+++ b/src/Text/RSS1/Export.hs
@@ -11,9 +11,7 @@
 --
 --------------------------------------------------------------------
 
-module Text.RSS1.Export
-       ( xmlFeed
-       ) where
+module Text.RSS1.Export (xmlFeed) where
 
 import Text.XML.Light as XML
 import Text.RSS1.Syntax
@@ -43,7 +41,7 @@
              ] ))
         -- should we expect these to be derived by the XML pretty printer..?
     { elAttribs =   nub $
-                    Attr (qualName  (Nothing,Nothing) "xmlns") (fromJust rss10NS) :
+                    Attr (qualName (Nothing,Nothing) "xmlns") (fromJust rss10NS) :
                     Attr (qualName (Nothing,Just "xmlns") (fromJust rdfPrefix)) (fromJust rdfNS) :
                     Attr (qualName (Nothing,Just "xmlns") (fromJust synPrefix)) (fromJust synNS) :
                     Attr (qualName (Nothing,Just "xmlns") (fromJust taxPrefix)) (fromJust taxNS) :
diff --git a/src/Text/RSS1/Import.hs b/src/Text/RSS1/Import.hs
--- a/src/Text/RSS1/Import.hs
+++ b/src/Text/RSS1/Import.hs
@@ -11,9 +11,7 @@
 --
 --------------------------------------------------------------------
 
-module Text.RSS1.Import
-       ( elementToFeed
-       ) where
+module Text.RSS1.Import (elementToFeed) where
 
 import Text.RSS1.Syntax
 import Text.RSS1.Utils
diff --git a/src/Text/RSS1/Syntax.hs b/src/Text/RSS1/Syntax.hs
--- a/src/Text/RSS1/Syntax.hs
+++ b/src/Text/RSS1/Syntax.hs
@@ -11,7 +11,27 @@
 --
 --------------------------------------------------------------------
 
-module Text.RSS1.Syntax where
+module Text.RSS1.Syntax
+  ( URIString
+  , TitleString
+  , TimeString
+  , TextString
+  , Feed (..)
+  , Channel (..)
+  , Image (..)
+  , Item (..)
+  , TextInputInfo (..)
+  , TaxonomyTopic (..)
+  , UpdatePeriod (..)
+  , ContentInfo (..)
+  , nullFeed
+  , nullChannel
+  , nullImage
+  , nullItem
+  , nullTextInputInfo
+  , nullTaxonomyTopic
+  , nullContentInfo
+  ) where
 
 import Text.XML.Light.Types as XML
 import Text.DublinCore.Types
@@ -216,4 +236,3 @@
         , contentEncoding = Nothing
         , contentValue    = Nothing
         }
-
diff --git a/src/Text/RSS1/Utils.hs b/src/Text/RSS1/Utils.hs
--- a/src/Text/RSS1/Utils.hs
+++ b/src/Text/RSS1/Utils.hs
@@ -11,9 +11,41 @@
 --
 --------------------------------------------------------------------
 
-module Text.RSS1.Utils where
+module Text.RSS1.Utils
+  ( pQNodes
+  , pNode
+  , pQNode
+  , pLeaf
+  , pQLeaf
+  , pAttr
+  , pMany
+  , children
+  , qualName
+  , rssPrefix
+  , rss10NS
+  , rdfPrefix
+  , rdfNS
+  , synPrefix
+  , synNS
+  , taxPrefix
+  , taxNS
+  , conPrefix
+  , conNS
+  , dcPrefix
+  , dcNS
+  , rdfName
+  , rssName
+  , synName
+  , known_rss_elts
+  , known_syn_elts
+  , known_dc_elts
+  , known_tax_elts
+  , known_con_elts
+  , removeKnownElts
+  , removeKnownAttrs
+  ) where
 
-import Text.XML.Light      as XML
+import Text.XML.Light as XML
 import Text.DublinCore.Types
 
 import Data.Maybe (listToMaybe, mapMaybe)
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -3,9 +3,11 @@
 import Test.Framework (defaultMain)
 import Text.RSS.Tests (rssTests)
 import Text.Atom.Tests (atomTests)
+import Text.Feed.Util.Tests (feedUtilTests)
 
 main :: IO ()
 main = defaultMain
   [ rssTests
   , atomTests
+  , feedUtilTests
   ]
