diff --git a/CMarkGFM.hsc b/CMarkGFM.hsc
--- a/CMarkGFM.hsc
+++ b/CMarkGFM.hsc
@@ -7,7 +7,6 @@
   , commonmarkToMan
   , commonmarkToLaTeX
   , commonmarkToNode
-  , registerPlugins
   , nodeToHtml
   , nodeToXml
   , nodeToMan
@@ -42,7 +41,6 @@
 import qualified System.IO.Unsafe as Unsafe
 import Data.Maybe (fromMaybe)
 import GHC.Generics (Generic)
-import Data.Maybe (catMaybes)
 import Data.Data (Data)
 import Data.Typeable (Typeable)
 import Data.Text (Text, empty)
@@ -54,9 +52,9 @@
 #include <cmark.h>
 #include <core-extensions.h>
 
--- | Register core extensions.  This should be done once at program start.
-registerPlugins :: IO ()
-registerPlugins = c_cmark_register_plugin c_core_extensions_registration
+-- | Ensure core extensions are registered.
+ensurePluginsRegistered :: IO ()
+ensurePluginsRegistered = c_core_extensions_ensure_registered
 
 -- | Frees a cmark linked list, produced by extsToLlist.
 freeLlist :: LlistPtr a -> IO ()
@@ -71,21 +69,26 @@
   t' <- extsToLlist t
   c_cmark_llist_append c_CMARK_DEFAULT_MEM_ALLOCATOR t' (castPtr h)
 
--- | Resolves a CMarkExtension to its pointer.
-resolveExt :: CMarkExtension -> IO (Maybe ExtensionPtr)
-resolveExt e = do
-  p <- withCString (unCMarkExtension e) c_cmark_find_syntax_extension
-  return (if p == nullPtr then Nothing else Just p)
+-- | Resolves CMarkExtensions to pointers.
+resolveExts :: [CMarkExtension] -> IO [ExtensionPtr]
+resolveExts exts = do
+  ensurePluginsRegistered
+  mapM resolveExt exts
+  where resolveExt ext = do p <- withCString (unCMarkExtension ext) c_cmark_find_syntax_extension
+                            if p == nullPtr then
+                              fail $ "could not load extension " ++ unCMarkExtension ext
+                            else
+                              return p
 
 -- | Convert CommonMark formatted text to Html, using cmark's
 -- built-in renderer.
 commonmarkToHtml :: [CMarkOption] -> [CMarkExtension] -> Text -> Text
 commonmarkToHtml opts exts =
   commonmarkToX render_html opts exts Nothing
-  where exts' = Unsafe.unsafePerformIO $ fmap catMaybes $ mapM resolveExt exts
-        render_html n o _ = Unsafe.unsafePerformIO $ do
+  where exts' = Unsafe.unsafePerformIO $ resolveExts exts
+        render_html n o _ = do
           llist <- extsToLlist exts'
-          let r = c_cmark_render_html n o llist
+          r <- c_cmark_render_html n o llist
           freeLlist llist
           return r
 
@@ -109,7 +112,7 @@
 -- which can be transformed or rendered using Haskell code.
 commonmarkToNode :: [CMarkOption] -> [CMarkExtension] -> Text -> Node
 commonmarkToNode opts exts s = Unsafe.unsafePerformIO $ do
-  exts' <- fmap catMaybes $ mapM resolveExt exts
+  exts' <- resolveExts exts
   parser <- c_cmark_parser_new (combineOptions opts)
   mapM_ (c_cmark_parser_attach_syntax_extension parser) exts'
   TF.withCStringLen s $! \(ptr, len) ->
@@ -122,10 +125,10 @@
 nodeToHtml :: [CMarkOption] -> [CMarkExtension] -> Node -> Text
 nodeToHtml opts exts =
   nodeToX render_html opts Nothing
-  where exts' = Unsafe.unsafePerformIO $ fmap catMaybes $ mapM resolveExt exts
-        render_html n o _ = Unsafe.unsafePerformIO $ do
+  where exts' = Unsafe.unsafePerformIO $ resolveExts exts
+        render_html n o _ = do
           llist <- extsToLlist exts'
-          let r = c_cmark_render_html n o llist
+          r <- c_cmark_render_html n o llist
           freeLlist llist
           return r
 
@@ -161,7 +164,7 @@
 commonmarkToX renderer opts exts mbWidth s = Unsafe.unsafePerformIO $
   TF.withCStringLen s $ \(ptr, len) -> do
     let opts' = combineOptions opts
-    exts' <- fmap catMaybes $ mapM resolveExt exts
+    exts' <- resolveExts exts
     parser <- c_cmark_parser_new opts'
     mapM_ (c_cmark_parser_attach_syntax_extension parser) exts'
     c_cmark_parser_feed parser ptr len
@@ -185,9 +188,6 @@
 data MemPhantom
 type MemPtr = Ptr MemPhantom
 
-data PluginPhantom
-type PluginPtr = Ptr PluginPhantom
-
 data ExtensionPhantom
 type ExtensionPtr = Ptr ExtensionPhantom
 
@@ -223,7 +223,7 @@
 
 type OnExit = Text
 
-data TableCellAlignment = None | Left | Center | Right
+data TableCellAlignment = NoAlignment | LeftAligned | CenterAligned | RightAligned
      deriving (Show, Read, Eq, Ord, Typeable, Data, Generic)
 
 data NodeType =
@@ -380,10 +380,10 @@
           ncols <- c_cmarkextensions_get_table_columns ptr
           cols <- c_cmarkextensions_get_table_alignments ptr
           mapM (fmap ucharToAlignment . peekElemOff cols) [0..(fromIntegral ncols) - 1]
-        ucharToAlignment (CUChar 108) = CMarkGFM.Left
-        ucharToAlignment (CUChar 99)  = CMarkGFM.Center
-        ucharToAlignment (CUChar 114) = CMarkGFM.Right
-        ucharToAlignment _            = None
+        ucharToAlignment (CUChar 108) = LeftAligned
+        ucharToAlignment (CUChar 99)  = CenterAligned
+        ucharToAlignment (CUChar 114) = RightAligned
+        ucharToAlignment _            = NoAlignment
 
 getPosInfo :: NodePtr -> IO (Maybe PosInfo)
 getPosInfo ptr = do
@@ -621,11 +621,8 @@
 foreign import ccall "cmark.h &cmark_node_free"
     c_cmark_node_free :: FunPtr (NodePtr -> IO ())
 
-foreign import ccall "registry.h cmark_register_plugin"
-    c_cmark_register_plugin :: FunPtr (PluginPtr -> IO Int) -> IO ()
-
-foreign import ccall "core-extensions.h &core_extensions_registration"
-    c_core_extensions_registration :: FunPtr (PluginPtr -> IO Int)
+foreign import ccall "core-extensions.h core_extensions_ensure_registered"
+    c_core_extensions_ensure_registered :: IO ()
 
 foreign import ccall "cmark_extension_api.h cmark_find_syntax_extension"
     c_cmark_find_syntax_extension :: CString -> IO ExtensionPtr
diff --git a/cbits/cmark_export.h b/cbits/cmark_export.h
--- a/cbits/cmark_export.h
+++ b/cbits/cmark_export.h
@@ -7,7 +7,7 @@
 #  define CMARK_NO_EXPORT
 #else
 #  ifndef CMARK_EXPORT
-#    ifdef libcmark_EXPORTS
+#    ifdef libcmark_gfm_EXPORTS
         /* We are building this library */
 #      define CMARK_EXPORT __attribute__((visibility("default")))
 #    else
diff --git a/cbits/core-extensions.c b/cbits/core-extensions.c
--- a/cbits/core-extensions.c
+++ b/cbits/core-extensions.c
@@ -3,12 +3,22 @@
 #include "strikethrough.h"
 #include "table.h"
 #include "tagfilter.h"
+#include "registry.h"
 
-int core_extensions_registration(cmark_plugin *plugin) {
+static int core_extensions_registration(cmark_plugin *plugin) {
   cmark_plugin_register_syntax_extension(plugin, create_table_extension());
   cmark_plugin_register_syntax_extension(plugin,
                                          create_strikethrough_extension());
   cmark_plugin_register_syntax_extension(plugin, create_autolink_extension());
   cmark_plugin_register_syntax_extension(plugin, create_tagfilter_extension());
   return 1;
+}
+
+void core_extensions_ensure_registered(void) {
+  static int registered = 0;
+
+  if (!registered) {
+    cmark_register_plugin(core_extensions_registration);
+    registered = 1;
+  }
 }
diff --git a/cbits/core-extensions.h b/cbits/core-extensions.h
--- a/cbits/core-extensions.h
+++ b/cbits/core-extensions.h
@@ -9,7 +9,7 @@
 #include "cmarkextensions_export.h"
 
 CMARKEXTENSIONS_EXPORT
-int core_extensions_registration(cmark_plugin *plugin);
+void core_extensions_ensure_registered(void);
 
 CMARKEXTENSIONS_EXPORT
 uint16_t cmarkextensions_get_table_columns(cmark_node *node);
diff --git a/cmark-gfm.cabal b/cmark-gfm.cabal
--- a/cmark-gfm.cabal
+++ b/cmark-gfm.cabal
@@ -1,5 +1,5 @@
 name:                cmark-gfm
-version:             0.1.0
+version:             0.1.1
 synopsis:            Fast, accurate GitHub Flavored Markdown parser and renderer
 description:
   This package provides Haskell bindings for
diff --git a/test/test-cmark.hs b/test/test-cmark.hs
--- a/test/test-cmark.hs
+++ b/test/test-cmark.hs
@@ -7,7 +7,6 @@
 
 main :: IO ()
 main = do
-  registerPlugins
   counts' <- runTestTT tests
   case (errors counts' + failures counts') of
        0 -> exitWith ExitSuccess
@@ -30,7 +29,7 @@
   , "<p><a href=\"http://www.google.com\">www.google.com</a></p>\n" ~=? commonmarkToHtml [] [extAutolink] "www.google.com"
   , "<p>| a |\n| --- |\n| b |</p>\n" ~=? commonmarkToHtml [] [] "| a |\n| --- |\n| b |\n"
   , "<table>\n<thead>\n<tr>\n<th>a</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>b</td>\n</tr></tbody></table>\n" ~=? commonmarkToHtml [] [extTable] "| a |\n| --- |\n| b |\n"
-  , (Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) (TABLE [CMarkGFM.Left,Center,None,CMarkGFM.Right]) [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_ROW [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "a") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "b") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "c") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "d") []]],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "y") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "o") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "s") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "h") []]]]]) ~=? commonmarkToNode [] [extTable] "| a | b | c | d |\n| :-- | :-: | --- | --: |\n| y | o | s | h |"
+  , (Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) (TABLE [LeftAligned,CenterAligned,NoAlignment,RightAligned]) [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_ROW [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "a") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "b") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "c") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "d") []]],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "y") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "o") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "s") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "h") []]]]]) ~=? commonmarkToNode [] [extTable] "| a | b | c | d |\n| :-- | :-: | --- | --: |\n| y | o | s | h |"
   , "<xmp>\n" ~=? commonmarkToHtml [] [] "<xmp>"
   , "&lt;xmp>\n" ~=? commonmarkToHtml [] [extTagfilter] "<xmp>"
   ]
