diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -171,4 +171,7 @@
 
 * Fourteenth version revised B. Switched to newer versions of dependencies and removed the unneeded ones. Some performance improvements. Some documentation improvements. Added bug-tracker.
 
+## 0.15.0.0 -- 2024-03-08
 
+* Fifteenth version. Added special comparative mode to choose the option for the line among the lines in files using '-cm' command line argument. Some code improvements. Updated the  dependency boundaries. 
+ 
diff --git a/Phladiprelio/General/Simple.hs b/Phladiprelio/General/Simple.hs
--- a/Phladiprelio/General/Simple.hs
+++ b/Phladiprelio/General/Simple.hs
@@ -3,7 +3,7 @@
 module Phladiprelio.General.Simple where
 
 import GHC.Base
-import GHC.Enum (fromEnum,toEnum)
+import GHC.Enum (fromEnum)
 import GHC.Real (Integral,fromIntegral,(/),quot,rem,quotRem,round,gcd,(^))
 import Text.Show (Show(..))
 import Phladiprelio.General.PrepareText 
@@ -12,19 +12,17 @@
 import System.Environment (getArgs)
 import GHC.Num (Num,(+),(-),(*),Integer)
 import Text.Read (readMaybe)
-import System.IO (putStrLn, FilePath,stdout,universalNewlineMode,hSetNewlineMode,getLine,appendFile,readFile,writeFile)
+import System.IO (putStrLn, FilePath,stdout,universalNewlineMode,hSetNewlineMode,getLine,appendFile,readFile,writeFile,putStr)
 import Rhythmicity.MarkerSeqs hiding (id) 
-import Rhythmicity.BasicF 
 import Data.List hiding (foldr)
 import Data.Maybe (fromMaybe, mapMaybe, catMaybes,isNothing,fromJust) 
-import Data.Tuple (fst,snd)
-import Data.Char (isDigit,isAlpha,isSpace)
+import Data.Tuple (fst)
+import Data.Char (isDigit,isSpace)
 import CLI.Arguments
 import CLI.Arguments.Get
 import CLI.Arguments.Parsing
 import GHC.Int (Int8)
 import Data.Ord (comparing)
-import Phladiprelio.PermutationsRepresent
 import Phladiprelio.ConstraintsEncoded
 import Phladiprelio.PermutationsArr
 import Phladiprelio.StrictVG
@@ -38,6 +36,7 @@
 import Phladiprelio.General.Datatype3
 import Phladiprelio.General.Distance
 import Phladiprelio.UniquenessPeriodsG
+import Data.ChooseLine
 
 generalF 
  :: Int -- ^ A power of 10. 10 in this power is then multiplied the value of distance if the next ['Double'] argument is not empty. The default one is 4. The proper values are in the range [2..6].
@@ -69,8 +68,13 @@
  -> [String] 
  -> IO [String] 
 generalF power10 ldc compards html dcfile selStr selFun (prestr,poststr) lineNmb wrs ks arr gs us vs h numTest hc (grps,mxms) descending hashStep emptyline splitting (fs, code) concurrently initstr universalSet 
- | null universalSet = let strOutput = ["You have specified the data and constraints on it that lead to no further possible options.", "Please, specify another data and constraints."] in mapM putStrLn strOutput >> return strOutput
- | length universalSet == 1 = mapM putStrLn universalSet >> return universalSet
+ | null universalSet = do
+     let strOutput = ["You have specified the data and constraints on it that lead to no further possible options.", "Please, specify another data and constraints."] 
+     putStrLn . unlines $ strOutput
+     return strOutput
+ | length universalSet == 1 = do
+     putStrLn . unlines $ universalSet
+     return universalSet
  | otherwise = do
    let syllN = countSyll wrs arr us vs initstr
 --       universalSet = map unwords . permutations $ rss
@@ -82,8 +86,18 @@
    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
+            lns1 = unlines strOutput
                           in do
-                             _ <- (if null dcfile then mapM putStrLn strOutput else do {mapM putStrLn strOutput >> doesFileExist dcfile >>= \exist -> if exist then do {getPermissions dcfile >>= \perms -> if writable perms then mapM (writeFile dcfile) strOutput else error $ "Phladiprelio.General.IO.generalF: File " `mappend` dcfile `mappend` " is not writable!"} else do {getCurrentDirectory >>= \currdir -> do {getPermissions currdir >>= \perms -> if writable perms then mapM (writeFile dcfile) strOutput else error $ "Phladiprelio.General.IO.generalF: Directory of the file " `mappend` dcfile `mappend` " is not writable!"}}})
+                             putStrLn lns1
+                             if null dcfile then putStr "" 
+                             else do 
+                                 doesFileExist dcfile >>= \exist -> if exist then do 
+                                       getPermissions dcfile >>= \perms -> if writable perms then writeFile dcfile lns1 
+                                                                           else error $ "Phladiprelio.General.IO.generalF: File " `mappend` dcfile `mappend` " is not writable!" 
+                                    else do 
+                                       getCurrentDirectory >>= \currdir -> do 
+                                          getPermissions currdir >>= \perms -> if writable perms then writeFile dcfile lns1 
+                                                                               else error $ "Phladiprelio.General.IO.generalF: Directory of the file " `mappend` dcfile `mappend` " is not writable!"
                              let l1 = length sRepresent
                              if code == -1 
                                  then if lineNmb == -1 then return strOutput
@@ -170,87 +184,92 @@
   args0 <- getArgs
   let (argsC, args) = takeCs1R ('+','-') cSpecs args0
       (argsB, args11) = takeBsR bSpecs args
-      prepare = any (== "-p") args11
-      emptyline = any (== "+l") args11 
-      splitting = fromMaybe 50 (readMaybe (concat . getB "+w" $ argsB)::Maybe Int8) 
-      concurrently = any (== "-C") args11
-      dcspecs = getB "+dc" argsB
-      (html,dcfile) 
-        | null dcspecs = (False, "")
-        | otherwise = (head dcspecs == "1",last dcspecs)
-      selStr = concat . getB "+ul" $ argsB
-      filedata = getB "+f" argsB
-      power10' = fromMaybe 4 (readMaybe (concat . getB "+q" $ argsB)::Maybe Int)
-      power10 
-         | power10' < 2 && power10' > 6 = 4
-         | otherwise = power10'
-      (multiline2, multiline2LineNum)
-        | oneB "+m3" argsB =
-            let r1ss = getB "+m3" argsB in
-                  if length r1ss == 3
-                      then let (kss,qss) = splitAt 2 r1ss in
-                                   (kss, max 1 (fromMaybe 1 (readMaybe (concat qss)::Maybe Int)))
-                      else (r1ss, 1)
-        | oneB "+m2" argsB = (getB "+m" argsB,  max 1 (fromMaybe 1 (readMaybe (concat . getB "+m2" $ argsB)::Maybe Int)))
-        | otherwise = (getB "+m" argsB, -1)
-      (fileread,lineNmb)
-        | null multiline2 = ("",-1)
-        | length multiline2 == 2 = (head multiline2, fromMaybe 1 (readMaybe (last multiline2)::Maybe Int))
-        | otherwise = (head multiline2, 1)
-  (arg3s,prestr,poststr,linecomp3) <- do
-       if lineNmb /= -1 then do
-           txtFromFile <- readFile fileread
-           let lns = lines txtFromFile
-               ll1 = length lns
-               ln0 = max 1 (min lineNmb (length lns))
-               lm3
-                 | multiline2LineNum < 1 = -1
-                 | otherwise = max 1 . min multiline2LineNum $ ll1
-               linecomp3
-                 | lm3 == -1 = []
-                 | otherwise = lns !! (lm3 - 1)
-               ln_1 
-                  | ln0 == 1 = 0
-                  | otherwise = ln0 - 1
-               ln1
-                  | ln0 == length lns = 0
-                  | otherwise = ln0 + 1
-               lineF = lns !! (ln0 - 1)
-               line_1F 
-                  | ln_1 == 0 = []
-                  | otherwise = lns !! (ln_1 - 1)
-               line1F
-                  | ln1 == 0 = []
-                  | otherwise = lns !! (ln1 - 1)
-           return $ (words lineF, line_1F,line1F,linecomp3)
-       else return (args11, [], [],[])
-  let line2comparewith
-        | oneC "+l2" argsC || null linecomp3 = unwords . getC "+l2" $ argsC
-        | otherwise = linecomp3
-      basecomp = read3 (not . null . filter (not . isSpace)) 1.0 (mconcat . h . createSyllablesPL wrs ks arr gs us vs) line2comparewith
-      (filesave,codesave)
-        | null filedata = ("",-1)
-        | length filedata == 2 = (head filedata, fromMaybe 0 (readMaybe (last filedata)::Maybe Int))
-        | otherwise = (head filedata,0)
-      ll = let maxWordsNum = (if any (== "+x") arg3s then 9 else 7) in take maxWordsNum . (if prepare then id else words . mconcat . prepareTextN maxWordsNum ysss zsss xs . unwords) $ arg3s
-      l = length ll
-      argCs = catMaybes (fmap (readMaybeECG l) . getC "+a" $ argsC)
-      argCBs = unwords . getC "+b" $ argsC -- If you use the parenthese with +b ... -b then consider also using the quotation marks for the whole algebraic constraint. At the moment though it is still not working properly for parentheses functionality. The issue should be fixed in the further releases.
-      !perms 
-        | not (null argCBs) = filterGeneralConv l argCBs . genPermutationsL $ l
-        | null argCs = genPermutationsL l
-        | otherwise = decodeLConstraints argCs . genPermutationsL $ l 
-      basiclineoption = unwords arg3s
-      example = read3 (not . null . filter (not . isSpace)) 1.0 (mconcat . h .  createSyllablesPL wrs ks arr gs us vs) (unwords arg3s)
-      le = length example
-      lb = length basecomp
-      gcd1 = gcd le lb
-      ldc = le * lb `quot` gcd1
-      mulp = ldc `quot` lb
-      max2 = maximum basecomp
-      compards = concatMap (replicate mulp . (/ max2)) basecomp
-      variants1 = uniquenessVariants2GNBL ' ' id id id perms ll
-  return (power10, ldc, compards, html, dcfile, selStr, prestr, poststr, lineNmb, emptyline, splitting, filesave, codesave, concurrently, basiclineoption, variants1)
+      compareByLinesFinalFile = concat . getB "-cm" $ argsB
+  if not . null $ compareByLinesFinalFile then do
+      compareFilesToOneCommon 14 args11 compareByLinesFinalFile
+      return (0,0,[],False,[],[],[],[],0,False,0,[],0,False,[],[]) 
+  else do
+    let prepare = any (== "-p") args11
+        emptyline = any (== "+l") args11 
+        splitting = fromMaybe 50 (readMaybe (concat . getB "+w" $ argsB)::Maybe Int8) 
+        concurrently = any (== "-C") args11
+        dcspecs = getB "+dc" argsB
+        (html,dcfile) 
+          | null dcspecs = (False, "")
+          | otherwise = (head dcspecs == "1",last dcspecs)
+        selStr = concat . getB "+ul" $ argsB
+        filedata = getB "+f" argsB
+        power10' = fromMaybe 4 (readMaybe (concat . getB "+q" $ argsB)::Maybe Int)
+        power10 
+           | power10' < 2 && power10' > 6 = 4
+           | otherwise = power10'
+        (multiline2, multiline2LineNum)
+          | oneB "+m3" argsB =
+              let r1ss = getB "+m3" argsB in
+                    if length r1ss == 3
+                        then let (kss,qss) = splitAt 2 r1ss in
+                                     (kss, max 1 (fromMaybe 1 (readMaybe (concat qss)::Maybe Int)))
+                        else (r1ss, 1)
+          | oneB "+m2" argsB = (getB "+m" argsB,  max 1 (fromMaybe 1 (readMaybe (concat . getB "+m2" $ argsB)::Maybe Int)))
+          | otherwise = (getB "+m" argsB, -1)
+        (fileread,lineNmb)
+          | null multiline2 = ("",-1)
+          | length multiline2 == 2 = (head multiline2, fromMaybe 1 (readMaybe (last multiline2)::Maybe Int))
+          | otherwise = (head multiline2, 1)
+    (arg3s,prestr,poststr,linecomp3) <- do
+         if lineNmb /= -1 then do
+             txtFromFile <- readFile fileread
+             let lns = lines txtFromFile
+                 ll1 = length lns
+                 ln0 = max 1 (min lineNmb (length lns))
+                 lm3
+                   | multiline2LineNum < 1 = -1
+                   | otherwise = max 1 . min multiline2LineNum $ ll1
+                 linecomp3
+                   | lm3 == -1 = []
+                   | otherwise = lns !! (lm3 - 1)
+                 ln_1 
+                    | ln0 == 1 = 0
+                    | otherwise = ln0 - 1
+                 ln1
+                    | ln0 == length lns = 0
+                    | otherwise = ln0 + 1
+                 lineF = lns !! (ln0 - 1)
+                 line_1F 
+                    | ln_1 == 0 = []
+                    | otherwise = lns !! (ln_1 - 1)
+                 line1F
+                    | ln1 == 0 = []
+                    | otherwise = lns !! (ln1 - 1)
+             return $ (words lineF, line_1F,line1F,linecomp3)
+         else return (args11, [], [],[])
+    let line2comparewith
+          | oneC "+l2" argsC || null linecomp3 = unwords . getC "+l2" $ argsC
+          | otherwise = linecomp3
+        basecomp = read3 (not . null . filter (not . isSpace)) 1.0 (mconcat . h . createSyllablesPL wrs ks arr gs us vs) line2comparewith
+        (filesave,codesave)
+          | null filedata = ("",-1)
+          | length filedata == 2 = (head filedata, fromMaybe 0 (readMaybe (last filedata)::Maybe Int))
+          | otherwise = (head filedata,0)
+        ll = let maxWordsNum = (if any (== "+x") arg3s then 9 else 7) in take maxWordsNum . (if prepare then id else words . mconcat . prepareTextN maxWordsNum ysss zsss xs . unwords) $ arg3s
+        l = length ll
+        argCs = catMaybes (fmap (readMaybeECG l) . getC "+a" $ argsC)
+        argCBs = unwords . getC "+b" $ argsC -- If you use the parenthese with +b ... -b then consider also using the quotation marks for the whole algebraic constraint. At the moment though it is still not working properly for parentheses functionality. The issue should be fixed in the further releases.
+        !perms 
+          | not (null argCBs) = filterGeneralConv l argCBs . genPermutationsL $ l
+          | null argCs = genPermutationsL l
+          | otherwise = decodeLConstraints argCs . genPermutationsL $ l 
+        basiclineoption = unwords arg3s
+        example = read3 (not . null . filter (not . isSpace)) 1.0 (mconcat . h .  createSyllablesPL wrs ks arr gs us vs) (unwords arg3s)
+        le = length example
+        lb = length basecomp
+        gcd1 = gcd le lb
+        ldc = le * lb `quot` gcd1
+        mulp = ldc `quot` lb
+        max2 = maximum basecomp
+        compards = concatMap (replicate mulp . (/ max2)) basecomp
+        variants1 = uniquenessVariants2GNBL ' ' id id id perms ll
+    return (power10, ldc, compards, html, dcfile, selStr, prestr, poststr, lineNmb, emptyline, splitting, filesave, codesave, concurrently, basiclineoption, variants1)
 
 processingF
  :: (String -> String) -- ^ A function that specifies what 'Char's in the list the first argument makes to be the function sensitive to. Analogue of the @g@ function in the definition: https://hackage.haskell.org/package/phonetic-languages-simplified-examples-array-0.21.0.0/docs/src/Phonetic.Languages.Simplified.Array.Ukrainian.FuncRep2RelatedG2.html#parsey0Choice. Use just small 'Char' if they are letters, do not use \'.\' and spaces.
@@ -280,7 +299,7 @@
 cSpecs = zip ["+a","+b","+l2"] . cycle $ [-1]
 
 bSpecs :: CLSpecifications
-bSpecs = [("+f",2),("+m",2),("+m2",2),("+m3",3),("+ul",1),("+w",1),("+dc",2),("+q",1)]
+bSpecs = [("+f",2),("+m",2),("+m2",2),("+m3",3),("+ul",1),("+w",1),("+dc",2),("+q",1),("-cm",1)]
 
 {-| 'selectSounds' converts the argument after \"+ul\" command line argument into a list of sound representations that is used for evaluation of \'uniqueness periods\' properties of the line. Is a modified Phonetic.Languages.Simplified.Array.General.FuncRep2RelatedG2.parsey0Choice from the @phonetic-languages-simplified-generalized-examples-array-0.19.0.1@ package.
  -}
@@ -289,8 +308,8 @@
   -> String 
   -> String
 selectSounds g xs = f . sort . concatMap g . words . map (\c -> if c  == '.' then ' ' else c) $ us
-    where (ts,us) = break (== '.') . filter (\c -> c /= 'H' && c /= 'G') $ xs
-          f (x:ts@(y:xs)) 
+    where (_,us) = break (== '.') . filter (\c -> c /= 'H' && c /= 'G') $ xs
+          f (x:ts@(y:_)) 
            | x == y = f ts
            | otherwise = x:f ts
           f xs = xs
@@ -339,9 +358,8 @@
   | otherwise = appendF outputS
            where mBool = null selStr && null compards
                  appendF = appendFile fs
-                 lineOption = head . filter (\(S k _ ts) -> k == num) $ sRepresent
+                 lineOption = head . filter (\(S k _ _) -> 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/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -127,6 +127,11 @@
 
 The version 0.14.2.0 is also devoted to Sophie Kok, a sister of Emma Kok, who turned 18 on the 06/01/2024. Besides, on the 22/01/2024 there is Day of Unity of Ukraine and on the 23/01/2024 there is for Orthodox Church memory of St. Paulinus of Nola. On the 30/01/2024 there is for the Greek-Orthodox and Greek-Catholics memory of Saints Basil the Great, Gregory the Theologian and John Chrysostom in their Council.
 
+The version 0.15.0.0 added new comparative line-by-line mode from various files. Uses '-cm' command line parameter. Analogue of the functionality by the link:
+https://oleksandr-zhabenko.github.io/uk/rhythmicity/PhLADiPreLiO.Eng.21.html#comparative-mode-of-operation-c
+
+On the 08/03/2024 there is International Women's Day.
+
 All support is welcome, including donations for the needs of the Ukrainian army, IDPs and refugees.
 
 If you would like to share some financial support, please, contact the mentioned foundation
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.2.0
+version:            0.15.0.0
 
 -- A short (one-line) description of the package.
 synopsis:           A generalized functionality of PhLADiPreLiO for different languages that uses hash algorithms.
@@ -28,7 +28,7 @@
 
     -- LANGUAGE extensions used by modules in this package.
     other-extensions: NoImplicitPrelude, BangPatterns
-    build-depends:    base >=4.13 && <5, rhythmic-sequences ==0.4.1.0, phonetic-languages-phonetics-basics ==0.11.0.0, phladiprelio-general-shared ==0.1.2.0, cli-arguments ==0.7.0.0, phonetic-languages-permutations-array ==0.5.0.0, phonetic-languages-constraints-array ==0.8.0.0, phonetic-languages-simplified-base ==0.8.0.0, halfsplit ==0.4.2.0, directory >=1.3.4.0 && <2, rev-scientific ==0.2.1.0, async >=2.2.2 && <3, phladiprelio-tests ==0.1.0.0, phladiprelio-general-datatype ==0.7.0.0, phonetic-languages-basis ==0.3.0.0, minmax ==0.1.1.0
+    build-depends:    base >=4.13 && <5, rhythmic-sequences ==0.4.1.0, phonetic-languages-phonetics-basics ==0.11.0.0, phladiprelio-general-shared ==0.1.2.0, cli-arguments ==0.7.0.0, phonetic-languages-permutations-array ==0.5.0.0, phonetic-languages-constraints-array ==0.8.0.0, phonetic-languages-simplified-base ==0.9.0.0, halfsplit ==0.4.2.0, directory >=1.3.4.0 && <2, rev-scientific ==0.2.1.0, async >=2.2.2 && <3, phladiprelio-tests ==0.1.0.0, phladiprelio-general-datatype ==0.7.0.0, phonetic-languages-basis ==0.3.0.0, minmax ==0.1.1.0
     hs-source-dirs:   .
     default-language: Haskell2010
 
