diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,16 @@
+pandoc-citeproc (0.14.1)
+
+  * More robust handling of boolean metadata values.
+  * Keep position of citations with prefixes when sorting (behavior
+    change, #292).  If citations with prefixes are moved around,
+    gibberish can result.  E.g.:
+    `A fascinating research tidbit [@Zanadu1999, p. 35; see
+    for comparison @Aalto2005]` can become
+    "A fascinating research tidbit (see for comparison Aalto, 2005;
+    Zanadu, 1999: 35)" with a sorting style like sage-harvard.csl.
+    This change causes sorting to be applied only to subgroups of citations
+    that lack prefixes.
+
 pandoc-citeproc (0.14)
 
   * Fix non-numerical season parsing in RefDate (#316).
diff --git a/pandoc-citeproc.cabal b/pandoc-citeproc.cabal
--- a/pandoc-citeproc.cabal
+++ b/pandoc-citeproc.cabal
@@ -1,5 +1,5 @@
 name:               pandoc-citeproc
-version:            0.14
+version:            0.14.1
 cabal-version:      >= 1.12
 synopsis:           Supports using pandoc with citeproc
 
diff --git a/src/Text/CSL/Pandoc.hs b/src/Text/CSL/Pandoc.hs
--- a/src/Text/CSL/Pandoc.hs
+++ b/src/Text/CSL/Pandoc.hs
@@ -57,9 +57,8 @@
                         map (map (toCslCite locMap)) grps)
       cits_map      = tr' "cits_map" $ M.fromList $ zip grps (citations result)
       biblioList    = map (renderPandoc' style) $ zip (bibliography result) (citationIds result)
-      moveNotes     = case lookupMeta "notes-after-punctuation" m1 of
-                           Just (MetaBool False) -> False
-                           _                     -> True
+      moveNotes     = maybe True truish $
+                        lookupMeta "notes-after-punctuation" m1
       Pandoc m3 bs  = walk (mvPunct moveNotes style) . deNote .
                         walk (processCite style cits_map) $ Pandoc m2 b2
       m             = case metanocites of
@@ -109,19 +108,26 @@
 
 isRefRemove :: Meta -> Bool
 isRefRemove meta =
-  case lookupMeta "suppress-bibliography" meta of
-    Just (MetaBool True) -> True
-    _                    -> False
+  maybe False truish $ lookupMeta "suppress-bibliography" meta
 
 isLinkCitations :: Meta -> Bool
 isLinkCitations meta =
-  case lookupMeta "link-citations" meta of
-    Just (MetaBool True)   -> True
-    Just (MetaString s)    -> map toLower s `elem` yesValues
-    Just (MetaInlines ils) -> map toLower (stringify ils) `elem` yesValues
-    _                      -> False
-  where yesValues = ["true", "yes", "on"]
+  maybe False truish $ lookupMeta "link-citations" meta
 
+truish :: MetaValue -> Bool
+truish (MetaBool t) = t
+truish (MetaString s) = isYesValue (map toLower s)
+truish (MetaInlines ils) = isYesValue (map toLower (stringify ils))
+truish (MetaBlocks [Plain ils]) = isYesValue (map toLower (stringify ils))
+truish _ = False
+
+isYesValue :: String -> Bool
+isYesValue "t" = True
+isYesValue "true" = True
+isYesValue "yes" = True
+isYesValue "on" = True
+isYesValue _ = False
+
 -- if the 'nocite' Meta field contains a citation with id = '*',
 -- create a cite with to all the references.
 mkNociteWildcards :: [Reference] -> [[Citation]] -> [[Citation]]
@@ -194,7 +200,7 @@
   let idpred = if "*" `Set.member` citids
                   then const True
                   else (`Set.member` citids)
-  bibRefs <- getBibRefs idpred $ Data.Maybe.fromMaybe (MetaList [])
+  bibRefs <- getBibRefs idpred $ fromMaybe (MetaList [])
                                $ lookupMeta "bibliography" meta
   let refs = inlineRefs ++ bibRefs
   let cslAbbrevFile = lookupMeta "citation-abbreviations" meta >>= toPath
diff --git a/src/Text/CSL/Proc.hs b/src/Text/CSL/Proc.hs
--- a/src/Text/CSL/Proc.hs
+++ b/src/Text/CSL/Proc.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE PatternGuards     #-}
 -----------------------------------------------------------------------------
 -- |
@@ -19,6 +20,7 @@
 
 import           Control.Applicative    ((<|>))
 import           Control.Arrow          (second, (&&&), (>>>))
+import           Control.Monad.State    (execState, modify)
 import           Data.Aeson
 import           Data.Char              (isDigit, isLetter, toLower)
 import           Data.List
@@ -304,7 +306,19 @@
       format (c,r) = (c,  evalLayout (citLayout ct) (EvalCite c) False l ms opts' as r)
       sort_  (c,r) = evalSorting (EvalSorting c) l ms opts' (citSort ct) as r
       process      = map (second (flip Output emptyFormatting) . format &&& sort_)
-      result       = sortItems $ process cr
+      result       = concatMap sortItems $ toChunks $ process cr
+      -- toChunks splits the citations up into groups, such that
+      -- a citation with a non-null prefix is by itself in its
+      -- group, otherwise preserving the order (see #292 for
+      -- motivation; we don't want to move prefixed citations
+      -- around)
+      toChunks  xs = reverse $ execState (toChunks' xs) []
+      toChunks' xs = do
+        case break hasPrefix xs of
+                ([], [])   -> return ()
+                ([], y:ys) -> modify ([y]:) >> toChunks' ys
+                (zs, ys)   -> modify (zs:) >> toChunks' ys
+      hasPrefix ((c,_),_) = citePrefix c /= mempty
 
 formatBiblioLayout :: Formatting -> Delimiter -> [Output] -> [Output]
 formatBiblioLayout  f d = appendOutput f . addDelim d
diff --git a/tests/issue292.expected.native b/tests/issue292.expected.native
new file mode 100644
--- /dev/null
+++ b/tests/issue292.expected.native
@@ -0,0 +1,9 @@
+Pandoc (Meta {unMeta = fromList [("csl",MetaInlines [Str "tests/sage-harvard.csl"]),("references",MetaList [MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Doe"])])),("id",MetaInlines [Str "doe"]),("issued",MetaMap (fromList [("year",MetaString "2007")])),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Zoe"])])),("id",MetaInlines [Str "zoe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2009")])]),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Roe"])])),("id",MetaInlines [Str "roe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2007")])]),("type",MetaInlines [Str "article"])])])]})
+[Para [Cite [Citation {citationId = "zoe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 1},Citation {citationId = "roe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 2},Citation {citationId = "doe", citationPrefix = [Str "see",Space,Str "for",Space,Str "comparison"], citationSuffix = [Str ",",Space,Str "p.\160\&3"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 3}] [Str "(Roe,",Space,Str "2007;",Space,Str "Zoe,",Space,Str "2009;",Space,Str "see",Space,Str "for",Space,Str "comparison",Space,Str "Doe,",Space,Str "2007:",Space,Str "3)"]]
+,Div ("refs",["references"],[])
+ [Div ("ref-doe",[],[])
+  [Para [Str "Doe",Space,Str "(2007)."]]
+ ,Div ("ref-roe",[],[])
+  [Para [Str "Roe",Space,Str "(2007)."]]
+ ,Div ("ref-zoe",[],[])
+  [Para [Str "Zoe",Space,Str "(2009)."]]]]
diff --git a/tests/issue292.in.native b/tests/issue292.in.native
new file mode 100644
--- /dev/null
+++ b/tests/issue292.in.native
@@ -0,0 +1,2 @@
+Pandoc (Meta {unMeta = fromList [("csl",MetaInlines [Str "tests/sage-harvard.csl"]),("references",MetaList [MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Doe"])])),("id",MetaInlines [Str "doe"]),("issued",MetaMap (fromList [("year",MetaString "2007")])),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Zoe"])])),("id",MetaInlines [Str "zoe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2009")])]),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Roe"])])),("id",MetaInlines [Str "roe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2007")])]),("type",MetaInlines [Str "article"])])])]})
+[Para [Cite [Citation {citationId = "zoe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "roe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "doe", citationPrefix = [Str "see",Space,Str "for",Space,Str "comparison"], citationSuffix = [Str ",",Space,Str "p.\160\&3"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [Str "[@zoe;",Space,Str "@roe;",Space,Str "see",Space,Str "for",Space,Str "comparison",Space,Str "@doe,",Space,Str "p.",Space,Str "3]"]]]
diff --git a/tests/sage-harvard.csl b/tests/sage-harvard.csl
new file mode 100644
--- /dev/null
+++ b/tests/sage-harvard.csl
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="utf-8"?>
+<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="never" default-locale="en-GB">
+  <info>
+    <title>SAGE - Harvard</title>
+    <id>http://www.zotero.org/styles/sage-harvard</id>
+    <link href="http://www.zotero.org/styles/sage-harvard" rel="self"/>
+    <link href="http://www.zotero.org/styles/the-open-university-harvard" rel="template"/>
+    <link href="http://www.uk.sagepub.com/repository/binaries/pdf/SAGE_Harvard_reference_style.pdf" rel="documentation"/>
+    <author>
+      <name>Joseph Reagle</name>
+    </author>
+    <category citation-format="author-date"/>
+    <category field="generic-base"/>
+    <summary>The SAGE Harvard author-date style</summary>
+    <updated>2012-09-27T22:06:38+00:00</updated>
+    <rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
+  </info>
+  <locale xml:lang="en-GB">
+    <terms>
+      <term name="editor" form="short">
+        <single>ed.</single>
+        <multiple>eds</multiple>
+      </term>
+    </terms>
+  </locale>
+  <macro name="editor">
+    <names variable="editor" delimiter=", ">
+      <name and="text" initialize-with="" delimiter=", " sort-separator=" " name-as-sort-order="all"/>
+      <label form="short" prefix=" (" suffix=")"/>
+    </names>
+  </macro>
+  <macro name="author">
+    <names variable="author">
+      <name initialize-with="" name-as-sort-order="all" and="text" sort-separator=" " delimiter=", " delimiter-precedes-last="never" form="long"/>
+      <label form="short" prefix=" (" suffix=")"/>
+      <substitute>
+        <names variable="editor"/>
+        <names variable="translator"/>
+        <text variable="container-title" font-style="italic"/>
+        <text macro="title"/>
+      </substitute>
+    </names>
+  </macro>
+  <macro name="author-count">
+    <names variable="author">
+      <name form="count"/>
+      <substitute>
+        <names variable="editor"/>
+      </substitute>
+    </names>
+  </macro>
+  <macro name="author-short">
+    <names variable="author">
+      <name form="short" and="text" delimiter=", " delimiter-precedes-last="never" initialize-with=""/>
+      <substitute>
+        <names variable="editor"/>
+        <names variable="translator"/>
+        <text variable="container-title" font-style="italic"/>
+        <text macro="title"/>
+      </substitute>
+    </names>
+  </macro>
+  <macro name="access">
+    <choose>
+      <if variable="URL">
+        <text value="Available from: "/>
+        <text variable="URL"/>
+        <group prefix=" (" delimiter=" " suffix=")">
+          <text term="accessed"/>
+          <date variable="accessed">
+            <date-part name="day" suffix=" "/>
+            <date-part name="month" suffix=" "/>
+            <date-part name="year"/>
+          </date>
+        </group>
+      </if>
+    </choose>
+  </macro>
+  <macro name="title">
+    <choose>
+      <if type="bill book graphic legal_case motion_picture report song" match="any">
+        <text variable="title" font-style="italic"/>
+      </if>
+      <else>
+        <text variable="title"/>
+      </else>
+    </choose>
+  </macro>
+  <macro name="publisher">
+    <group delimiter=": ">
+      <text variable="publisher-place"/>
+      <text variable="publisher"/>
+    </group>
+  </macro>
+  <macro name="year-date">
+    <choose>
+      <if variable="issued">
+        <date variable="issued">
+          <date-part name="year"/>
+        </date>
+      </if>
+      <else>
+        <text term="no date" form="short"/>
+      </else>
+    </choose>
+  </macro>
+  <macro name="locator">
+    <choose>
+      <if type="article-journal">
+        <text variable="volume"/>
+        <text variable="issue" prefix="(" suffix=")"/>
+      </if>
+    </choose>
+  </macro>
+  <macro name="published-date">
+    <choose>
+      <if type="article-newspaper">
+        <date variable="issued">
+          <date-part name="day" form="ordinal" suffix=" "/>
+          <date-part name="month" form="long"/>
+        </date>
+      </if>
+    </choose>
+  </macro>
+  <macro name="pages">
+    <choose>
+      <if type="chapter paper-conference" match="any">
+        <group delimiter=" " prefix=", ">
+          <label variable="page" form="short" suffix=" "/>
+          <text variable="page"/>
+        </group>
+      </if>
+      <else-if type="article-journal">
+        <text variable="page" prefix=": "/>
+      </else-if>
+    </choose>
+  </macro>
+  <macro name="edition">
+    <choose>
+      <if is-numeric="edition">
+        <group delimiter=" ">
+          <number variable="edition" form="ordinal"/>
+          <text term="edition" form="short"/>
+        </group>
+      </if>
+      <else>
+        <text variable="edition" suffix="."/>
+      </else>
+    </choose>
+  </macro>
+  <macro name="container-prefix">
+    <choose>
+      <if type="chapter paper-conference" match="any">
+        <text term="in" text-case="capitalize-first" suffix=": "/>
+      </if>
+    </choose>
+  </macro>
+  <citation et-al-min="3" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" collapse="year">
+    <sort>
+      <key macro="author-short"/>
+      <key macro="year-date"/>
+    </sort>
+    <layout prefix="(" suffix=")" delimiter="; ">
+      <group delimiter=": ">
+        <group delimiter=", ">
+          <text macro="author-short"/>
+          <text macro="year-date"/>
+        </group>
+        <text variable="locator"/>
+      </group>
+    </layout>
+  </citation>
+  <bibliography hanging-indent="true" et-al-min="4" et-al-use-first="3">
+    <sort>
+      <key macro="author" names-min="1" names-use-first="1"/>
+      <key macro="author-count" names-min="3" names-use-first="3"/>
+      <key macro="author" names-min="3" names-use-first="1"/>
+      <key macro="year-date"/>
+      <key variable="title"/>
+    </sort>
+    <layout suffix=".">
+      <group delimiter=" ">
+        <text macro="author"/>
+        <text macro="year-date" prefix="(" suffix=")"/>
+        <text macro="title" suffix="."/>
+        <text macro="edition"/>
+        <text macro="container-prefix"/>
+        <group delimiter=", ">
+          <text macro="editor"/>
+          <text variable="container-title" font-style="italic"/>
+          <text variable="collection-title"/>
+          <text variable="genre"/>
+          <text macro="publisher"/>
+          <text macro="published-date"/>
+        </group>
+        <text macro="locator"/>
+      </group>
+      <text macro="pages"/>
+      <text macro="access" prefix=". "/>
+    </layout>
+  </bibliography>
+</style>
