diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,20 @@
+## 0.3.9.0
+
+### New features
+
+-   Add header multilevel templates and secLevelLabels
+-   Add lowercase roman custom numbering
+
+### Fixes
+
+-   Label precedence fix: label attr > secLevelLabels > xLabels
+
+### Misc
+
+-   Update LaTeX tests for pandoc 2.11.3.1
+-   Update docs
+-   Relax bound on optparse-applicative
+
 ## 0.3.8.4
 
 -   [Fix] secLabels
diff --git a/docs/index.md b/docs/index.md
--- a/docs/index.md
+++ b/docs/index.md
@@ -503,7 +503,8 @@
 -   `titleDelim`, default `:`: What to put between object number and
     caption text.
 -   `secHeaderDelim`, default ` ` (i.e. space): What to put between section
-    number and title when `numberSections` is `true`.
+    number and title when `numberSections` is `true`. Can be a list,
+    in that case it's indexed by heading level, 0-based.
 
 #### Subfigure-specific
 
@@ -595,6 +596,7 @@
 -   `tblLabels`, default `arabic`: the numbering scheme for tables.
 -   `lstLabels`, default `arabic`: the numbering scheme for listings.
 -   `secLabels`, default `arabic`: the numbering scheme for sections.
+-   `secLevelLabels`, default unset: the numbering scheme for sections, YAML array, indexed by heading level; will override `secLabels` if set.
 
 ### Item title templates
 
@@ -608,7 +610,7 @@
 -   `listingTemplate`, default
     `$$listingTitle$$ $$i$$$$titleDelim$$ $$t$$`: template for listing
     captions
--   `secHeaderTemplate`, default `$$i$$$$secHeaderDelim$$$$t$$`: template for
+-   `secHeaderTemplate`, default `$$i$$$$secHeaderDelim[n]$$$$t$$`: template for
     section header
     text when `numberSections` is `true`
 
@@ -740,6 +742,7 @@
 
 -   `arabic` -- arabic numbers (1, 2, 3 ...)
 -   `roman` -- roman numbers (I, II, III, IV, ...)
+-   `lowercase roman` -- lowercase roman numbers (i, ii, iii, iv, ...)
 -   `alpha x`, where `x` is first letter to start from. This will work
     for any letter, but will use UTF-8 codepage to determine what's
     next, so using something strange is not advised. For example, you
diff --git a/lib/Text/Pandoc/CrossRef/References/Blocks.hs b/lib/Text/Pandoc/CrossRef/References/Blocks.hs
--- a/lib/Text/Pandoc/CrossRef/References/Blocks.hs
+++ b/lib/Text/Pandoc/CrossRef/References/Blocks.hs
@@ -78,7 +78,7 @@
     unless ("unnumbered" `elem` cls) $ do
       modify curChap $ \cc ->
         let ln = length cc
-            cl i = lookup "label" attrs <> customLabel opts "sec" i
+            cl i = lookup "label" attrs <|> customHeadingLabel opts n i <|> customLabel opts "sec" i
             inc l = let i = fst (last l) + 1 in init l <> [(i, cl i)]
             cc' | ln > n = inc $ take n cc
                 | ln == n = inc cc
@@ -382,7 +382,7 @@
     chap  <- take (chaptersDepth o) `fmap` get curChap
     prop' <- get prop
     let i = 1+ (M.size . M.filter (\x -> (chap == init (refIndex x)) && isNothing (refSubfigure x)) $ prop')
-        index = chap <> [(i, refLabel <> customLabel o ref i)]
+        index = chap <> [(i, refLabel <|> customLabel o ref i)]
         ref = either id (T.takeWhile (/=':')) label
         label' = either (<> T.pack (':' : show index)) id label
     when (M.member label' prop') $
diff --git a/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs b/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs
--- a/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs
@@ -19,7 +19,7 @@
 -}
 
 {-# LANGUAGE OverloadedStrings #-}
-module Text.Pandoc.CrossRef.Util.CustomLabels (customLabel) where
+module Text.Pandoc.CrossRef.Util.CustomLabels (customLabel, customHeadingLabel) where
 
 import Text.Pandoc.Definition
 import Text.Pandoc.CrossRef.Util.Meta
@@ -33,6 +33,12 @@
   = mkLabel i (refLabel <> "Labels") cl
   | otherwise = Nothing
 
+customHeadingLabel :: Meta -> Int -> Int -> Maybe T.Text
+customHeadingLabel meta lvl i
+  | Just cl <- getMetaList Just "secLevelLabels" meta (lvl-1)
+  = mkLabel i "secLevelLabels" cl
+  | otherwise = Nothing
+
 mkLabel :: Int -> T.Text -> MetaValue -> Maybe T.Text
 mkLabel i n lt
   | MetaList _ <- lt
@@ -42,6 +48,8 @@
   = Nothing
   | toString n lt == "roman"
   = Just $ toRoman i
+  | toString n lt == "lowercase roman"
+  = Just $ T.toLower $ toRoman i
   | Just (startWith, _) <- T.uncons =<< T.stripPrefix "alpha " (toString n lt)
   = Just . T.singleton $ [startWith..] !! (i-1)
   | otherwise = error $ "Unknown numeration type: " ++ show lt
diff --git a/lib/Text/Pandoc/CrossRef/Util/Options.hs b/lib/Text/Pandoc/CrossRef/Util/Options.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Options.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Options.hs
@@ -59,6 +59,7 @@
                        , tableTemplate  :: Template
                        , listingTemplate :: Template
                        , customLabel :: Text -> Int -> Maybe Text
+                       , customHeadingLabel :: Int -> Int -> Maybe Text
                        , ccsDelim :: [Inline]
                        , ccsLabelSep :: [Inline]
                        , tableEqns :: Bool
diff --git a/lib/Text/Pandoc/CrossRef/Util/Settings.hs b/lib/Text/Pandoc/CrossRef/Util/Settings.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Settings.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Settings.hs
@@ -91,7 +91,7 @@
   <> secPrefixTemplate (var "p" <> str "\160" <> var "i")
   <> refIndexTemplate (var "i" <> var "suf")
   <> subfigureRefIndexTemplate (var "i" <> var "suf" <> space <> str "(" <> var "s" <> str ")")
-  <> secHeaderTemplate (var "i" <> var "secHeaderDelim" <> var "t")
+  <> secHeaderTemplate (var "i" <> var "secHeaderDelim[n]" <> var "t")
   <> secHeaderDelim space
   <> lofTitle (header 1 $ text "List of Figures")
   <> lotTitle (header 1 $ text "List of Tables")
diff --git a/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs b/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs
@@ -29,7 +29,7 @@
 import Language.Haskell.TH.Syntax hiding (Inline)
 import Data.List
 import Text.Pandoc.CrossRef.Util.Template
-import Text.Pandoc.CrossRef.Util.CustomLabels (customLabel)
+import Text.Pandoc.CrossRef.Util.CustomLabels
 import Data.Text (Text)
 import qualified Data.Text as T
 
@@ -80,6 +80,7 @@
     intT <- [t|$(conT t) -> Int|]
     tmplT <- [t|$(conT t) -> Template|]
     clT <- [t|$(conT t) -> Text -> Int -> Maybe Text|]
+    chlT <- [t|$(conT t) -> Int -> Int -> Maybe Text|]
     let varName | Name (OccName n) _ <- accName = liftString n
     let dtv = return $ VarE $ mkName "dtv"
     body <-
@@ -91,6 +92,7 @@
       | t' == blkT -> [|getMetaBlock $(varName) $(dtv)|]
       | t' == tmplT -> [|makeTemplate $(dtv) $ getMetaInlines $(varName) $(dtv)|]
       | t' == clT -> [|customLabel $(dtv)|]
+      | t' == chlT -> [|customHeadingLabel $(dtv)|]
       | t' == fmtT -> return $ VarE $ mkName "fmt"
       | otherwise -> fail $ show t'
     return [(accName, body)]
diff --git a/pandoc-crossref.cabal b/pandoc-crossref.cabal
--- a/pandoc-crossref.cabal
+++ b/pandoc-crossref.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: e482ef1e6f935e9229bb87d11a279dd174efa3767a94b99a83941d6bd6cfad1e
+-- hash: f420e59b52c7b2a0721bad7e6dcccdadc76346e81ef5ee0ced55461962dc3a15
 
 name:           pandoc-crossref
-version:        0.3.8.4
+version:        0.3.9.0
 synopsis:       Pandoc filter for cross-references
 description:    pandoc-crossref is a pandoc filter for numbering figures, equations, tables and cross-references to them.
 category:       Text
@@ -40,6 +40,9 @@
     test/m2m/equations/expect.md
     test/m2m/equations/expect.tex
     test/m2m/equations/input.md
+    test/m2m/label-precedence/expect.md
+    test/m2m/label-precedence/expect.tex
+    test/m2m/label-precedence/input.md
     test/m2m/links-names/expect.md
     test/m2m/links-names/expect.tex
     test/m2m/links-names/input.md
@@ -58,6 +61,9 @@
     test/m2m/secLabels/expect.md
     test/m2m/secLabels/expect.tex
     test/m2m/secLabels/input.md
+    test/m2m/secLevelLabels/expect.md
+    test/m2m/secLevelLabels/expect.tex
+    test/m2m/secLevelLabels/input.md
     test/m2m/section-template/expect.md
     test/m2m/section-template/expect.tex
     test/m2m/section-template/input.md
@@ -143,7 +149,7 @@
     , gitrev >=1.3.1 && <1.4
     , mtl >=1.1 && <2.3
     , open-browser >=0.2 && <0.3
-    , optparse-applicative >=0.13 && <0.16
+    , optparse-applicative >=0.13 && <0.17
     , pandoc >=2.10 && <2.12
     , pandoc-crossref
     , pandoc-types >=1.21 && <1.23
diff --git a/test/m2m/label-precedence/expect.md b/test/m2m/label-precedence/expect.md
new file mode 100644
--- /dev/null
+++ b/test/m2m/label-precedence/expect.md
@@ -0,0 +1,15 @@
+# \* First Section {#first-section label="*"}
+
+text
+
+![Figure α: A figure](image.png){#fig:fig1}
+
+## \*.A Subsection {#subsection}
+
+other text
+
+![Figure +: A figure with custom label](image.png){#fig:fig2 label="+"}
+
+### \*.A.A Subsubsection {#subsubsection}
+
+text text text
diff --git a/test/m2m/label-precedence/expect.tex b/test/m2m/label-precedence/expect.tex
new file mode 100644
--- /dev/null
+++ b/test/m2m/label-precedence/expect.tex
@@ -0,0 +1,30 @@
+\hypertarget{first-section}{%
+\section{* First Section}\label{first-section}}
+
+text
+
+\begin{figure}
+\hypertarget{fig:fig1}{%
+\centering
+\includegraphics{image.png}
+\caption{A figure}\label{fig:fig1}
+}
+\end{figure}
+
+\hypertarget{subsection}{%
+\subsection{*.A Subsection}\label{subsection}}
+
+other text
+
+\begin{figure}
+\hypertarget{fig:fig2}{%
+\centering
+\includegraphics{image.png}
+\caption{A figure with custom label}\label{fig:fig2}
+}
+\end{figure}
+
+\hypertarget{subsubsection}{%
+\subsubsection{*.A.A Subsubsection}\label{subsubsection}}
+
+text text text
diff --git a/test/m2m/label-precedence/input.md b/test/m2m/label-precedence/input.md
new file mode 100644
--- /dev/null
+++ b/test/m2m/label-precedence/input.md
@@ -0,0 +1,24 @@
+---
+numberSections: true
+sectionsDepth: -1
+secLabels: roman
+secLevelLabels:
+  - alpha A
+figLabels: alpha α
+---
+
+# First Section {label="*"}
+
+text
+
+![A figure](image.png){#fig:fig1}
+
+## Subsection
+
+other text
+
+![A figure with custom label](image.png){#fig:fig2 label="+"}
+
+### Subsubsection
+
+text text text
diff --git a/test/m2m/secLabels/expect.tex b/test/m2m/secLabels/expect.tex
--- a/test/m2m/secLabels/expect.tex
+++ b/test/m2m/secLabels/expect.tex
@@ -20,14 +20,14 @@
 \begin{longtable}[]{@{}lll@{}}
 \caption{\label{tbl:mytable}My table}\tabularnewline
 \toprule
-a & b & c\tabularnewline
+a & b & c \\ \addlinespace
 \midrule
 \endfirsthead
 \toprule
-a & b & c\tabularnewline
+a & b & c \\ \addlinespace
 \midrule
 \endhead
-1 & 2 & 3\tabularnewline
-4 & 5 & 6\tabularnewline
+1 & 2 & 3 \\ \addlinespace
+4 & 5 & 6 \\ \addlinespace
 \bottomrule
 \end{longtable}
diff --git a/test/m2m/secLevelLabels/expect.md b/test/m2m/secLevelLabels/expect.md
new file mode 100644
--- /dev/null
+++ b/test/m2m/secLevelLabels/expect.md
@@ -0,0 +1,11 @@
+# A. First Section {#first-section}
+
+text
+
+## A.1) Subsection {#subsection}
+
+other text
+
+### A.1.i Subsubsection {#subsubsection}
+
+text text text
diff --git a/test/m2m/secLevelLabels/expect.tex b/test/m2m/secLevelLabels/expect.tex
new file mode 100644
--- /dev/null
+++ b/test/m2m/secLevelLabels/expect.tex
@@ -0,0 +1,14 @@
+\hypertarget{first-section}{%
+\section{A. First Section}\label{first-section}}
+
+text
+
+\hypertarget{subsection}{%
+\subsection{A.1) Subsection}\label{subsection}}
+
+other text
+
+\hypertarget{subsubsection}{%
+\subsubsection{A.1.i Subsubsection}\label{subsubsection}}
+
+text text text
diff --git a/test/m2m/secLevelLabels/input.md b/test/m2m/secLevelLabels/input.md
new file mode 100644
--- /dev/null
+++ b/test/m2m/secLevelLabels/input.md
@@ -0,0 +1,24 @@
+---
+numberSections: true
+sectionsDepth: -1
+secHeaderDelim:
+  - ".&#32;"
+  - ")&#32;"
+  - "&#32;"
+secLevelLabels:
+  - alpha A
+  - arabic
+  - lowercase roman
+---
+
+# First Section
+
+text
+
+## Subsection
+
+other text
+
+### Subsubsection
+
+text text text
diff --git a/test/test-pandoc-crossref.hs b/test/test-pandoc-crossref.hs
--- a/test/test-pandoc-crossref.hs
+++ b/test/test-pandoc-crossref.hs
@@ -313,7 +313,7 @@
         it "Tbl labels" $
           table' "A table" "some_table1"
             <> para (citeGen "tbl:some_table" [1])
-            `test` "\\hypertarget{tbl:some_table1}{}\n\\begin{longtable}[]{@{}@{}}\n\\caption{\\label{tbl:some_table1}A table}\\tabularnewline\n\\toprule\n\\endhead\n\\tabularnewline\n\\bottomrule\n\\end{longtable}\n\ntbl.~\\ref{tbl:some_table1}"
+            `test` "\\hypertarget{tbl:some_table1}{}\n\\begin{longtable}[]{@{}@{}}\n\\caption{\\label{tbl:some_table1}A table}\\tabularnewline\n\\toprule\n\\endhead\n \\\\ \\addlinespace\n\\bottomrule\n\\end{longtable}\n\ntbl.~\\ref{tbl:some_table1}"
 #endif
 
         it "Code block labels" $ do
