diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,10 @@
+texmath (0.10.1.1)
+
+  * Handle multicharacter operators better in Eqn, TeX, OMML (#109).
+
+  * OMML reader: unwrap `<w:...>` tags immediately under `<m:oMath>`
+    (#111, Jesse Rosenthal).
+
 texmath (0.10.1)
 
   * Expose Text.TeXMath.TeX (TeX rendering functions) (#108).
diff --git a/src/Text/TeXMath/Readers/OMML.hs b/src/Text/TeXMath/Readers/OMML.hs
--- a/src/Text/TeXMath/Readers/OMML.hs
+++ b/src/Text/TeXMath/Readers/OMML.hs
@@ -58,8 +58,18 @@
   let expList = mapMaybe elemToOMML (elChildren element)
   return $ map (\l -> if length l == 1 then (head l) else EGrouped l) expList
 elemToOMML element  | isElem "m" "oMath" element =
-  Just $ concat $ mapMaybe (elemToExps) (elChildren element)
+  Just $ concat $ mapMaybe elemToExps $ unwrapWTags $ elChildren element
 elemToOMML _ = Nothing
+
+-- oMath can contain w:hyperlink, w:sdt, etc. I can't find a complete
+-- documentation of this, so we just unwrap any w:tag immediately
+-- beneath oMath. Note that this shouldn't affect the "w" tags in
+-- elemToOMathRunElem(s) because, those are underneath an "m:r" tag.
+unwrapWTags :: [Element] -> [Element]
+unwrapWTags elements = concatMap unwrapChild elements
+  where unwrapChild element = case qPrefix $ elName element of
+                                Just "w" -> elChildren element
+                                _        -> [element]
 
 isElem :: String -> String -> Element -> Bool
 isElem prefix name element =
diff --git a/src/Text/TeXMath/Readers/TeX.hs b/src/Text/TeXMath/Readers/TeX.hs
--- a/src/Text/TeXMath/Readers/TeX.hs
+++ b/src/Text/TeXMath/Readers/TeX.hs
@@ -623,9 +623,14 @@
 mathopWith name ty = try $ do
   ctrlseq name
   e <- expr1
-  case e of
+  let e' = case e of
+               EGrouped [x] -> x
+               _            -> e
+  case e' of
      ESymbol _ x   -> return $ ESymbol ty x
      EIdentifier x -> return $ ESymbol ty x
+     EText TextNormal x -> return $ ESymbol ty x
+     EText sty x -> return $ EStyled sty [ESymbol ty x]
      x | ty == Op  -> case expToOperatorName x of
                            Just y -> return $ EMathOperator y
                            _      -> return x
diff --git a/src/Text/TeXMath/Writers/Eqn.hs b/src/Text/TeXMath/Writers/Eqn.hs
--- a/src/Text/TeXMath/Writers/Eqn.hs
+++ b/src/Text/TeXMath/Writers/Eqn.hs
@@ -67,7 +67,7 @@
 writeExp (ESymbol Ord [c])  -- do not render "invisible operators"
   | c `elem` ['\x2061'..'\x2064'] = "" -- see 3.2.5.5 of mathml spec
 writeExp (EIdentifier s) = writeExp (ESymbol Ord s)
-writeExp (ESymbol _ s) =
+writeExp (ESymbol t s) =
   case s of
     "\8805" -> ">="
     "\8804" -> "<="
@@ -127,9 +127,22 @@
     "\958" -> "xi"
     "\926" -> "XI"
     "\950" -> "zeta"
-    _ | all isAscii s -> s
-      |otherwise -> "\\[" ++ intercalate " " (map toUchar s) ++ "]"
-  where toUchar c = printf "u%04x" (ord c)
+    _      -> let s' = if all isAscii s
+                          then s
+                          else "\\[" ++ unwords (map toUchar s) ++ "]"
+                  toUchar c = printf "u%04x" (ord c)
+              in  if length s > 1 && (t == Rel || t == Bin || t == Op)
+                     then "roman{\"" ++
+                          (if t == Rel || t == Bin
+                              then " "
+                              else "") ++
+                          s' ++
+                          (if t == Rel || t == Bin || t == Op
+                              then " "
+                              else "") ++
+                          "\"}"
+                     else s'
+
 writeExp (ESpace d) =
   case d of
       _ | d > 0 && d < (2 % 9) -> "^"
diff --git a/src/Text/TeXMath/Writers/OMML.hs b/src/Text/TeXMath/Writers/OMML.hs
--- a/src/Text/TeXMath/Writers/OMML.hs
+++ b/src/Text/TeXMath/Writers/OMML.hs
@@ -25,6 +25,7 @@
 import Text.XML.Light
 import Text.TeXMath.Types
 import Data.Generics (everywhere, mkT)
+import Data.Char (isSymbol, isPunctuation)
 
 -- | Transforms an expression tree to an OMML XML Tree
 writeOMML :: DisplayType -> [Exp] -> Element
@@ -191,7 +192,18 @@
 
    EIdentifier x    -> [str props x]
    EMathOperator x  -> [makeText TextNormal x]  -- TODO revisit, use props?
-   ESymbol _ x      -> [str props x]
+   ESymbol _ [c]
+    | isSymbol c || isPunctuation c
+                    -> [str props [c]]
+   ESymbol ty xs
+    | ty `elem` [Op, Bin, Rel]
+                    -> [mnode "box"
+                        [ mnode "boxPr"
+                          [ mnodeA "opEmu" "1" () ]
+                        , mnode "e"
+                          [str props xs]
+                        ]]
+   ESymbol _ xs     -> [str props xs]
    ESpace n
      | n > 0 && n <= 0.17    -> [str props "\x2009"]
      | n > 0.17 && n <= 0.23 -> [str props "\x2005"]
diff --git a/src/Text/TeXMath/Writers/TeX.hs b/src/Text/TeXMath/Writers/TeX.hs
--- a/src/Text/TeXMath/Writers/TeX.hs
+++ b/src/Text/TeXMath/Writers/TeX.hs
@@ -24,6 +24,7 @@
 import Text.TeXMath.Unicode.ToTeX (getTeXMath)
 import Text.TeXMath.Unicode.ToUnicode (fromUnicode)
 import qualified Text.TeXMath.Shared as S
+import Data.Char (toLower)
 import Data.Generics (everywhere, mkT)
 import Control.Applicative ((<$>), Applicative)
 import Control.Monad (when, unless, foldM_)
@@ -155,8 +156,12 @@
 writeExp (ESymbol Ord [c])  -- do not render "invisible operators"
   | c `elem` ['\x2061'..'\x2064'] = return () -- see 3.2.5.5 of mathml spec
 writeExp (ESymbol t s) = do
+  s' <- getTeXMathM s
   when (t == Bin || t == Rel) $ tell [Space]
-  tell =<< getTeXMathM s
+  if length s > 1 && (t == Bin || t == Rel || t == Op)
+     then tell [ControlSeq ("\\math" ++ map toLower (show t)),
+                 Grouped [ControlSeq "\\text", Grouped s']]
+     else tell s'
   when (t == Bin || t == Rel) $ tell [Space]
 writeExp (ESpace width) = do
   env <- asks mathEnv
diff --git a/tests/readers/omml/issue112.native b/tests/readers/omml/issue112.native
new file mode 100644
--- /dev/null
+++ b/tests/readers/omml/issue112.native
@@ -0,0 +1,1 @@
+[ESub (EIdentifier "A") (ENumber "2")]
diff --git a/tests/readers/tex/issue109.native b/tests/readers/tex/issue109.native
new file mode 100644
--- /dev/null
+++ b/tests/readers/tex/issue109.native
@@ -0,0 +1,1 @@
+[EIdentifier "a",ESymbol Rel ">",EIdentifier "b",ESymbol Rel "or",EIdentifier "a",ESymbol Rel ">",EIdentifier "c"]
diff --git a/tests/src/issue109.tex b/tests/src/issue109.tex
new file mode 100644
--- /dev/null
+++ b/tests/src/issue109.tex
@@ -0,0 +1,1 @@
+a > b \mathrel{\text{or}} a > c
diff --git a/tests/src/issue112.omml b/tests/src/issue112.omml
new file mode 100644
--- /dev/null
+++ b/tests/src/issue112.omml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<m:oMath>
+  <w:hyperlink r:id="rId6" w:history="1">
+    <m:sSub>
+      <m:sSubPr>
+        <m:ctrlPr>
+          <w:rPr>
+            <w:rStyle w:val="aa"/>
+            <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
+            <w:sz w:val="24"/>
+            <w:szCs w:val="24"/>
+          </w:rPr>
+        </m:ctrlPr>
+      </m:sSubPr>
+      <m:e>
+        <m:r>
+          <w:rPr>
+            <w:rStyle w:val="aa"/>
+            <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
+            <w:sz w:val="24"/>
+            <w:szCs w:val="24"/>
+          </w:rPr>
+          <m:t>A</m:t>
+        </m:r>
+      </m:e>
+      <m:sub>
+        <m:r>
+          <w:rPr>
+            <w:rStyle w:val="aa"/>
+            <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
+            <w:sz w:val="24"/>
+            <w:szCs w:val="24"/>
+          </w:rPr>
+          <m:t>2</m:t>
+        </m:r>
+      </m:sub>
+    </m:sSub>
+  </w:hyperlink>
+</m:oMath>
diff --git a/tests/test-texmath.hs b/tests/test-texmath.hs
--- a/tests/test-texmath.hs
+++ b/tests/test-texmath.hs
@@ -45,7 +45,7 @@
 main = do
   args <- getArgs
   let roundTrip = "--round-trip" `elem` args
-  let regen = "--regenerate-tests" `elem` args
+  let regen = "--regenerate-tests" `elem` args || "--accept" `elem` args
   setLocaleEncoding utf8
   setCurrentDirectory "tests"
   statuses <- if roundTrip
diff --git a/tests/writers/issue109.eqn b/tests/writers/issue109.eqn
new file mode 100644
--- /dev/null
+++ b/tests/writers/issue109.eqn
@@ -0,0 +1,1 @@
+a > b roman{" or "} a > c
diff --git a/tests/writers/issue109.mml b/tests/writers/issue109.mml
new file mode 100644
--- /dev/null
+++ b/tests/writers/issue109.mml
@@ -0,0 +1,12 @@
+<?xml version='1.0' ?>
+<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
+  <mrow>
+    <mi>a</mi>
+    <mo>&gt;</mo>
+    <mi>b</mi>
+    <mo>or</mo>
+    <mi>a</mi>
+    <mo>&gt;</mo>
+    <mi>c</mi>
+  </mrow>
+</math>
diff --git a/tests/writers/issue109.omml b/tests/writers/issue109.omml
new file mode 100644
--- /dev/null
+++ b/tests/writers/issue109.omml
@@ -0,0 +1,36 @@
+<?xml version='1.0' ?>
+<m:oMathPara>
+  <m:oMathParaPr>
+    <m:jc m:val="center" />
+  </m:oMathParaPr>
+  <m:oMath>
+    <m:r>
+      <m:t>a</m:t>
+    </m:r>
+    <m:r>
+      <m:t>&gt;</m:t>
+    </m:r>
+    <m:r>
+      <m:t>b</m:t>
+    </m:r>
+    <m:box>
+      <m:boxPr>
+        <m:opEmu m:val="1" />
+      </m:boxPr>
+      <m:e>
+        <m:r>
+          <m:t>or</m:t>
+        </m:r>
+      </m:e>
+    </m:box>
+    <m:r>
+      <m:t>a</m:t>
+    </m:r>
+    <m:r>
+      <m:t>&gt;</m:t>
+    </m:r>
+    <m:r>
+      <m:t>c</m:t>
+    </m:r>
+  </m:oMath>
+</m:oMathPara>
diff --git a/tests/writers/issue109.tex b/tests/writers/issue109.tex
new file mode 100644
--- /dev/null
+++ b/tests/writers/issue109.tex
@@ -0,0 +1,1 @@
+a > b \mathrel{\text{or}} a > c
diff --git a/texmath.cabal b/texmath.cabal
--- a/texmath.cabal
+++ b/texmath.cabal
@@ -1,5 +1,5 @@
 Name:                texmath
-Version:             0.10.1
+Version:             0.10.1.1
 Cabal-Version:       >= 1.10
 Build-type:          Simple
 Synopsis:            Conversion between formats used to represent mathematics.
