diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,17 @@
 Seonbi changelog
 ================
 
+Version 0.2.2
+-------------
+
+Released on September 25, 2021.
+
+ -  Fixed stops normalizer's bug where unnecessary trailing spaces following
+    stops had been left even after normalized.
+ -  Fixed stops normalizer's bug where commas followed by tag boundaries had
+    been not normalized.
+
+
 Version 0.2.1
 -------------
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@
 [hackage]: https://hackage.haskell.org/package/seonbi
 [hackage-badge]: https://img.shields.io/hackage/v/seonbi
 [dockerhub]: https://hub.docker.com/r/dahlia/seonbi
-[dockerhub-badge]: https://img.shields.io/microbadger/image-size/dahlia/seonbi
+[dockerhub-badge]: https://img.shields.io/docker/v/dahlia/seonbi?label=docker%20image&sort=semver
 [ci]: https://github.com/dahlia/seonbi/actions
 [ci-status-badge]: https://github.com/dahlia/seonbi/workflows/build/badge.svg
 [demo web app]: https://dahlia.github.io/seonbi/
@@ -128,7 +128,7 @@
 
     HTTP/1.1 200 OK
     Content-Type: application/json
-    Server: Seonbi/0.2.1
+    Server: Seonbi/0.2.2
 
     {
       "success": true,
diff --git a/seonbi.cabal b/seonbi.cabal
--- a/seonbi.cabal
+++ b/seonbi.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           seonbi
-version:        0.2.1
+version:        0.2.2
 synopsis:       SmartyPants for Korean language
 description:    Please see the README.md on GitHub at <https://github.com/dahlia/seonbi>.
 category:       Text
@@ -234,7 +234,8 @@
       test
   ghc-options: -Wno-incomplete-uni-patterns -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      aeson >=1.3.1 && <1.5
+      Diff >=0.3.4 && <0.4
+    , aeson >=1.3.1 && <1.5
     , base >=4.7 && <5
     , bytestring
     , containers
diff --git a/src/Text/Seonbi/Punctuation.hs b/src/Text/Seonbi/Punctuation.hs
--- a/src/Text/Seonbi/Punctuation.hs
+++ b/src/Text/Seonbi/Punctuation.hs
@@ -36,6 +36,7 @@
 
 import Prelude hiding (takeWhile)
 
+import Control.Applicative ((<|>))
 import Control.Monad
 import Data.Char (isSpace)
 import Data.Either
@@ -315,7 +316,7 @@
             , Data.Text.singleton <$> anyChar
             ]
         endOfInput
-        return $ Data.Text.concat chunks
+        return $ Data.Text.dropWhileEnd (' ' ==) $ Data.Text.concat chunks
     stops' :: Parser Text
     stops' = choice
         [ period' >> return (toEntity $ period stops)
@@ -340,7 +341,7 @@
     comma' :: Parser ()
     comma' = void $ choice
         [ char '、' >> return ""
-        , string ", "
+        , string "," >> (takeWhile isSpace <|> (endOfInput >> return ""))
         , string "&comma; "
         , string "&#44; "
         , string "&#12289;"
diff --git a/test/Text/Seonbi/FacadeSpec.hs b/test/Text/Seonbi/FacadeSpec.hs
--- a/test/Text/Seonbi/FacadeSpec.hs
+++ b/test/Text/Seonbi/FacadeSpec.hs
@@ -4,6 +4,8 @@
 
 import Control.Monad
 
+import Data.Algorithm.Diff
+import Data.Text.Lazy
 import Data.Text.Lazy.IO
 import System.Directory
 import System.FilePath
@@ -23,6 +25,27 @@
     , (".ko-KP.html", ko_KP)
     ]
 
+shouldHaveSameText :: (HasCallStack) => Text -> Text -> Expectation
+actual `shouldHaveSameText` expected =
+    unless (actual == expected) (expectationFailure msg)
+  where
+    expectedLines :: [Text]
+    expectedLines = Data.Text.Lazy.lines expected
+    actualLines :: [Text]
+    actualLines = Data.Text.Lazy.lines actual
+    diffLines :: [Diff Text]
+    diffLines = getDiff expectedLines actualLines
+    diff :: Text
+    diff = Data.Text.Lazy.unlines
+        [ case d of
+            First line -> "- " <> line
+            Second line -> "+ " <> line
+            Both line _ -> "  " <> line
+        | d <- diffLines
+        ]
+    msg :: String
+    msg = "Two values are not equal:\n\n--- expected\n+++ actual\n\n" ++
+        unpack diff
 
 spec :: Spec
 spec = do
@@ -39,10 +62,13 @@
             inputData <- Data.Text.Lazy.IO.readFile (dataDirPath </> input)
             outputData <- Data.Text.Lazy.IO.readFile (dataDirPath </> output)
             return (input, output, inputData, outputData, cfg)
-    forM_ testData $ \ (iname, oname, input, output, cfg) ->
-        specify ("transformHtmlLazyText: " ++ iname ++ " -> " ++ oname) $ do
-            transformHtmlLazyText noOp input `shouldBe` Just input
-            transformHtmlLazyText cfg input `shouldBe` Just output
+    describe "transformHtmlLazyText" $
+        forM_ testData $ \ (iname, oname, input, output, cfg) ->
+            specify (iname ++ " -> " ++ oname) $ do
+                let Just noOpResult = transformHtmlLazyText noOp input
+                noOpResult `shouldHaveSameText` input
+                let Just cfgResult = transformHtmlLazyText cfg input
+                cfgResult `shouldHaveSameText` output
   where
     noOp :: Monad m => Configuration m a
     noOp = Configuration
diff --git a/test/Text/Seonbi/PunctuationSpec.hs b/test/Text/Seonbi/PunctuationSpec.hs
--- a/test/Text/Seonbi/PunctuationSpec.hs
+++ b/test/Text/Seonbi/PunctuationSpec.hs
@@ -498,7 +498,7 @@
                 normalizeStops horizontalStops input `shouldBe`
                     [ HtmlStartTag [] P ""
                     , HtmlText [P]
-                        "봄&#xb7;여름&#xb7;가을&#xb7;겨울. 어제, 오늘. "
+                        "봄&#xb7;여름&#xb7;가을&#xb7;겨울. 어제, 오늘."
                     , HtmlEndTag [] P
                     ]
                 normalizeStops verticalStops input `shouldBe`
@@ -509,6 +509,27 @@
                     ]
                 normalizeStops horizontalStopsWithSlashes input `shouldBe`
                     [ HtmlStartTag [] P ""
-                    , HtmlText [P] "봄/여름/가을/겨울. 어제, 오늘. "
+                    , HtmlText [P] "봄/여름/가을/겨울. 어제, 오늘."
+                    , HtmlEndTag [] P
+                    ]
+        it "normalizes stops followed by boundaries as well" $ do
+            let input =
+                    [ HtmlStartTag [] P ""
+                    , HtmlStartTag [P] Span ""
+                    , HtmlText [P, Span] "쉼표,"
+                    , HtmlEndTag [P] Span
+                    , HtmlStartTag [P] Span ""
+                    , HtmlText [P, Span] "마침표."
+                    , HtmlEndTag [P] Span
+                    , HtmlEndTag [] P
+                    ] :: [HtmlEntity]
+            normalizeStops verticalStops input `shouldBe`
+                    [ HtmlStartTag [] P ""
+                    , HtmlStartTag [P] Span ""
+                    , HtmlText [P, Span] "쉼표&#x3001;"
+                    , HtmlEndTag [P] Span
+                    , HtmlStartTag [P] Span ""
+                    , HtmlText [P, Span] "마침표&#x3002;"
+                    , HtmlEndTag [P] Span
                     , HtmlEndTag [] P
                     ]
