diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -163,3 +163,7 @@
 
 * Fourteenth version. Fixed issue with distance between line options in several branches. Added a possibility to analyse and compare two lines from the same file using either additionally to +m also +m2 group of command line arguments, or +m3 group of arguments instead.
 
+## 0.14.1.0 -- 2023-12-30
+
+* Fourteenth version revised A. Some code refactoring. Added new functions to simplify understanding and testing. Changed the function to count syllables in test and other cases modes. Now it includes the "\_{set of digits}" groups as syllables. Some minor documentation improvements.
+
diff --git a/Phladiprelio/General/Simple.hs b/Phladiprelio/General/Simple.hs
--- a/Phladiprelio/General/Simple.hs
+++ b/Phladiprelio/General/Simple.hs
@@ -4,13 +4,13 @@
 
 import GHC.Base
 import GHC.Enum (fromEnum,toEnum)
-import GHC.Real (fromIntegral,(/),quot,rem,quotRem,round,gcd,(^))
+import GHC.Real (Integral,fromIntegral,(/),quot,rem,quotRem,round,gcd,(^))
 import Text.Show (Show(..))
 import Phladiprelio.General.PrepareText 
 import Phladiprelio.General.Syllables 
 import Phladiprelio.General.Base
 import System.Environment (getArgs)
-import GHC.Num ((+),(-),(*),Integer)
+import GHC.Num (Num,(+),(-),(*),Integer)
 import Text.Read (readMaybe)
 import System.IO (putStrLn, FilePath,stdout,universalNewlineMode,hSetNewlineMode,getLine,appendFile,readFile,writeFile)
 import Rhythmicity.MarkerSeqs hiding (id) 
@@ -77,15 +77,7 @@
           | null selStr = (if null compards then (sum . countHashes2G hashStep hc grps mxms) else (round . (*10^power10) . distanceSqrG2 ldc compards)) . read3 (not . null . filter (not . isSpace)) 1.0 (mconcat . h .  createSyllablesPL wrs ks arr gs us vs)
           | otherwise = fromIntegral . diverse2GGL (selectSounds selFun selStr) (us `mappend` vs) . concatMap string1 . stringToXG wrs . filter (\c -> not (isDigit c) && c /= '_' && c /= '=')
    hSetNewlineMode stdout universalNewlineMode
-   if numTest >= 0 && numTest <= 179 && numTest /= 1 && null compards then do
-      putStrLn "Feet   Val  Stat   Proxim" 
-      (if concurrently then mapConcurrently else mapM) 
-           (\(q,qs) -> let m = stat1 syllN (q,qs)
-                           (min1,max1) = minMax11ByCList (comparing (f ldc [] q qs)) universalSet 
-                           mx = f ldc [] q qs max1
-                           strTest = (show (fromEnum q) `mappend` "   |   " `mappend`  show mx `mappend` "     " `mappend` show m `mappend` "  -> " `mappend` showFFloat (Just 3) (100 * fromIntegral mx / fromIntegral m) "%" `mappend` (if rem numTest 10 >= 4 
-                                                               then let min1 = minimumBy (comparing (f ldc [] q qs)) universalSet in ("\n" `mappend` min1 `mappend` "\n" `mappend` max1 `mappend` "\n")  
-                                                               else "")) in putStrLn strTest >> return strTest) . zip (sel2 numTest) $ (sel numTest)
+   if numTest >= 0 && numTest <= 179 && numTest /= 1 && null compards then testsOutput concurrently syllN f ldc numTest universalSet 
    else let sRepresent = zipWith (\k (x, ys) -> S k x ys) [1..] . 
              (let h1 = if descending then (\(u,w) -> ((-1)*u,w)) else id in sortOn h1) . map (\xss -> (f ldc compards grps mxms xss, xss)) $ universalSet
             strOutput = (:[]) . halfsplit1G (\(S _ y _) -> y) (if html then "<br>" else "") (jjj splitting) $ sRepresent
@@ -103,23 +95,7 @@
                                          permiss <- getPermissions fs
                                          let writ = writable permiss
                                              readab = readable permiss
-                                         if writ && readab then do
-                                             if null selStr && null compards then do 
-                                                  let lineOption = head . filter (\(S k _ ts) -> k == num) $ sRepresent
-                                                      textP = (\(S _ _ ts) -> ts) lineOption
-                                                      sylls = createSyllablesPL wrs ks arr gs us vs textP
-                                                  if code >= 10 && code <= 19 && grps == 2
-                                                      then do
-                                                          let qqs = readEq4 (mconcat . h . createSyllablesPL wrs ks arr gs us vs) (map (map charS) . mconcat . createSyllablesPL wrs ks arr gs us vs) . basicSplit $ textP
-                                                              (breaks,rs) = showZerosFor2PeriodMusic qqs
-                                                          putStrLn textP
-                                                          putStrLn breaks
-                                                          putStrLn . show $ rs
-                                                          appendFile fs ((if code >= 15 then (show rs `mappend` "\n" `mappend` breaks `mappend` "\n") else "") `mappend` outputSel lineOption code)
-                                                  else appendFile fs (outputSel lineOption code)
-                                             else do
-                                                let lineOption = head . filter (\(S k _ ts) -> k == num) $ sRepresent
-                                                appendFile fs (outputSel lineOption code)
+                                         if writ && readab then outputWithFile h wrs ks arr gs us vs selStr compards sRepresent code grps fs num
                                          else error "The specified file cannot be used for appending the text! Please, specify another file!"
                                          return []
      where jjj kk = let (q1,r1) = quotRem kk (if kk < 0 then -10 else 10) in jjj' q1 r1 emptyline
@@ -141,8 +117,9 @@
   -> String -- ^ Corresponds to the 101 delimiter in the @ukrainian-phonetics-basic-array@ package.
   -> String 
   -> Int
-countSyll wrs arr us vs xs = fromEnum . foldr (\x y -> if createsSyllable x then y + 1 else y) 0 . concatMap (str2PRSs arr) . words1 . mapMaybe g . concatMap string1 . stringToXG wrs $ xs
-   where g :: Char -> Maybe Char
+countSyll wrs arr us vs xs = numUnderscoresSyll + (fromEnum . foldr (\x y -> if createsSyllable x then y + 1 else y) 0 . concatMap (str2PRSs arr) . words1 . mapMaybe g . concatMap string1 . stringToXG wrs $ xs)
+   where numUnderscoresSyll = length . filter (\xs -> let (ys,ts) = splitAt 1 xs in ys == "_" && all isDigit ts && not (null ts)) . groupBy (\x y -> x=='_' && isDigit y) $ xs
+         g :: Char -> Maybe Char
          g x
           | x `elem` us = Nothing
           | x `notElem` vs = Just x
@@ -316,4 +293,54 @@
            | x == y = f ts
            | otherwise = x:f ts
           f xs = xs
+
+-- | Internal part of the 'generalF' for processment in case of using tests mode.
+testsOutput
+  :: (Show a1, Integral a1) =>
+     Bool
+     -> Int
+     -> (p -> [a2] -> Int8 -> [Int8] -> String -> a1)
+     -> p
+     -> Int
+     -> [String]
+     -> IO [String]
+testsOutput concurrently syllN f ldc numTest universalSet = do
+      putStrLn "Feet   Val  Stat   Proxim" 
+      (if concurrently then mapConcurrently else mapM) 
+           (\(q,qs) -> let m = stat1 syllN (q,qs)
+                           (min1,max1) = minMax11ByCList (comparing (f ldc [] q qs)) universalSet 
+                           mx = f ldc [] q qs max1
+                           strTest = (show (fromEnum q) `mappend` "   |   " `mappend`  show mx `mappend` "     " `mappend` show m `mappend` "  -> " `mappend` showFFloat (Just 3) (100 * fromIntegral mx / fromIntegral m) "%" `mappend` (if rem numTest 10 >= 4 
+                                                               then let min1 = minimumBy (comparing (f ldc [] q qs)) universalSet in ("\n" `mappend` min1 `mappend` "\n" `mappend` max1 `mappend` "\n")  
+                                                               else "")) in putStrLn strTest >> return strTest) . zip (sel2 numTest) $ (sel numTest)
+
+-- | Internal part of the 'generalF' for processment with a file.
+outputWithFile
+  :: (Eq a1, Num a1) =>
+     ([[[PRS]]] -> [[Double]])
+     -> GWritingSystemPRPLX -- ^ Data used to obtain the phonetic language representation of the text.
+     -> [(Char, Char)] -- ^ The pairs of the 'Char' that corresponds to the similar phonetic languages consonant phenomenon (e. g. allophones). Must be sorted in the ascending order to be used correctly. 
+     -> CharPhoneticClassification
+     -> SegmentRulesG
+     -> String -- ^ Corresponds to the 100 delimiter in the @ukrainian-phonetics-basic-array@ package.
+     -> String -- ^ Corresponds to the 101 delimiter in the @ukrainian-phonetics-basic-array@ package.
+     -> String -- ^ If not null than instead of rhythmicity evaluation using hashes and and feets, there is computed a diversity property for the specified 'String' here using the 'selectSounds' function. For more information, see: 'https://oleksandr-zhabenko.github.io/uk/rhythmicity/PhLADiPreLiO.Eng.21.html#types'
+     -> [Double] -- ^ A list of non-negative values normed by 1.0 (the greatest of which is 1.0) that the line options are compared with. If null, then the program works as for version 0.12.1.0 without this newly-introduced argument since the version 0.13.0.0. The length of it must be a least common multiplier of the (number of syllables plus number of \'_digits\' groups) to work correctly. Is not used when the next 'FilePath' and 'String' arguments are not null.
+     -> [PhladiprelioGen]
+     -> Int
+     -> a1
+     -> FilePath -- ^ A file to be probably added output parts to.
+     -> Int
+     -> IO ()
+outputWithFile h wrs ks arr gs us vs selStr compards sRepresent code grps fs num
+  | mBool && code >= 10 && code <= 19 && grps == 2 = putStrLn (mconcat [textP, "\n", breaks, "\n", show rs]) >> appendF ((if code >= 15 then mconcat [show rs, "\n", breaks, "\n"] else "") `mappend` outputS)
+  | otherwise = appendF outputS
+           where mBool = null selStr && null compards
+                 appendF = appendFile fs
+                 lineOption = head . filter (\(S k _ ts) -> k == num) $ sRepresent
+                 textP = (\(S _ _ ts) -> ts) lineOption
+                 sylls = createSyllablesPL wrs ks arr gs us vs textP
+                 outputS = outputSel lineOption code
+                 qqs = readEq4 (mconcat . h . createSyllablesPL wrs ks arr gs us vs) (map (map charS) . mconcat . createSyllablesPL wrs ks arr gs us vs) . basicSplit $ textP
+                 (breaks,rs) = showZerosFor2PeriodMusic qqs
 
diff --git a/phladiprelio-general-simple.cabal b/phladiprelio-general-simple.cabal
--- a/phladiprelio-general-simple.cabal
+++ b/phladiprelio-general-simple.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               phladiprelio-general-simple
-version:            0.14.0.0
+version:            0.14.1.0
 
 -- A short (one-line) description of the package.
 synopsis:           A generalized functionality of PhLADiPreLiO for different languages that uses hash algorithms.
