diff --git a/pandoc.cabal b/pandoc.cabal
index 4b2da0f9e..587258dc2 100644
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -177,6 +177,7 @@ Extra-Source-Files:
                  tests/docx.codeblock.docx,
                  tests/docx.deep_normalize.docx,
                  tests/docx.definition_list.docx,
+                 tests/docx.drop_cap.docx,
                  tests/docx.hanging_indent.docx,
                  tests/docx.headers.docx,
                  tests/docx.image.docx,
diff --git a/src/Text/Pandoc/Readers/Docx.hs b/src/Text/Pandoc/Readers/Docx.hs
index 085ee01fc..c856ca30a 100644
--- a/src/Text/Pandoc/Readers/Docx.hs
+++ b/src/Text/Pandoc/Readers/Docx.hs
@@ -105,11 +105,15 @@ readDocx opts bytes =
     Left _   -> error $ "couldn't parse docx file"
 
 data DState = DState { docxAnchorMap :: M.Map String String
-                     , docxMediaBag      :: MediaBag }
+                     , docxMediaBag      :: MediaBag
+                     , docxDropCap       :: [Inline]
+                     }
 
 instance Default DState where
   def = DState { docxAnchorMap = M.empty
-               , docxMediaBag  = mempty }
+               , docxMediaBag  = mempty
+               , docxDropCap   = []
+               }
 
 data DEnv = DEnv { docxOptions  :: ReaderOptions
                  , docxInHeaderBlock :: Bool }
@@ -457,13 +461,17 @@ bodyPartToBlocks (Paragraph pPr parparts)
     return [hdr]
 bodyPartToBlocks (Paragraph pPr parparts) = do
   ils <- parPartsToInlines parparts >>= (return . normalizeSpaces)
-  case ils of
-    [] -> return []
-    _ -> do
-      return $
-       rebuild
-       (parStyleToContainers pPr)
-       [Para ils]
+  dropIls <- gets docxDropCap
+  let ils' = reduceList $ dropIls ++ ils
+  if dropCap pPr
+    then do modify $ \s -> s { docxDropCap = ils' }
+            return []
+    else do modify $ \s -> s { docxDropCap = [] }
+            return $ case ils' of
+              [] -> []
+              _ -> rebuild
+                   (parStyleToContainers pPr)
+                   [Para $ ils']
 bodyPartToBlocks (ListItem pPr numId lvl levelInfo parparts) = do
   let
     kvs = case levelInfo of
diff --git a/src/Text/Pandoc/Readers/Docx/Parse.hs b/src/Text/Pandoc/Readers/Docx/Parse.hs
index 1abd4bc6b..175bf2784 100644
--- a/src/Text/Pandoc/Readers/Docx/Parse.hs
+++ b/src/Text/Pandoc/Readers/Docx/Parse.hs
@@ -146,12 +146,14 @@ data ParIndentation = ParIndentation { leftParIndent :: Maybe Integer
 
 data ParagraphStyle = ParagraphStyle { pStyle :: [String]
                                      , indentation :: Maybe ParIndentation
+                                     , dropCap     :: Bool
                                      }
                       deriving Show
 
 defaultParagraphStyle :: ParagraphStyle
 defaultParagraphStyle = ParagraphStyle { pStyle = []
                                        , indentation = Nothing
+                                       , dropCap     = False
                                        }
 
 
@@ -637,8 +639,16 @@ elemToParagraphStyle ns element
           (findAttr (elemName ns "w" "val"))
           (findChildren (elemName ns "w" "pStyle") pPr)
       , indentation =
-            findChild (elemName ns "w" "ind") pPr >>=
-            elemToParIndentation ns
+          findChild (elemName ns "w" "ind") pPr >>=
+          elemToParIndentation ns
+      , dropCap =
+          case
+            findChild (elemName ns "w" "framePr") pPr >>=
+            findAttr (elemName ns "w" "dropCap")
+          of
+            Just "none" -> False
+            Just _      -> True
+            Nothing     -> False
       }
 elemToParagraphStyle _ _ =  defaultParagraphStyle
 
diff --git a/tests/Tests/Readers/Docx.hs b/tests/Tests/Readers/Docx.hs
index c310cc8d7..65fdd4a55 100644
--- a/tests/Tests/Readers/Docx.hs
+++ b/tests/Tests/Readers/Docx.hs
@@ -82,14 +82,14 @@ compareMediaBagIO docxFile = do
     df <- B.readFile docxFile
     let (_, mb) = readDocx def df
     bools <- mapM
-             (\(fp, _, _) -> compareMediaPathIO fp mb docxFile) 
+             (\(fp, _, _) -> compareMediaPathIO fp mb docxFile)
              (mediaDirectory mb)
     return $ and bools
 
 testMediaBagIO :: String -> FilePath -> IO Test
 testMediaBagIO name docxFile = do
   outcome <- compareMediaBagIO docxFile
-  return $ testCase name (assertBool 
+  return $ testCase name (assertBool
                           ("Media didn't match media bag in file " ++ docxFile)
                           outcome)
 
@@ -176,7 +176,10 @@ tests = [ testGroup "inlines"
             "code block"
             "docx.codeblock.docx"
             "docx.codeblock.native"
-
+          , testCompare
+            "dropcap paragraphs"
+            "docx.drop_cap.docx"
+            "docx.drop_cap.native"
           ]
         , testGroup "track changes"
           [ testCompare
@@ -229,4 +232,3 @@ tests = [ testGroup "inlines"
           ]
 
         ]
-
diff --git a/tests/docx.drop_cap.docx b/tests/docx.drop_cap.docx
new file mode 100644
index 000000000..19fab4a52
Binary files /dev/null and b/tests/docx.drop_cap.docx differ
diff --git a/tests/docx.drop_cap.native b/tests/docx.drop_cap.native
new file mode 100644
index 000000000..d361cfb0b
--- /dev/null
+++ b/tests/docx.drop_cap.native
@@ -0,0 +1,4 @@
+[Para [Str "Drop",Space,Str "cap."]
+,Para [Str "Next",Space,Str "paragraph."]
+,Para [Str "Drop",Space,Str "cap",Space,Str "in",Space,Str "margin."]
+,Para [Str "Drop",Space,Str "cap",Space,Str "(not",Space,Str "really)."]]