diff --git a/ldif.cabal b/ldif.cabal
--- a/ldif.cabal
+++ b/ldif.cabal
@@ -1,5 +1,5 @@
 Name:            ldif
-Version:         0.0.7
+Version:         0.0.8
 License:         BSD3
 License-File:    LICENSE
 Synopsis:        The LDAP Data Interchange Format (LDIF) parser 
@@ -17,9 +17,12 @@
  .
  - diffLDIF command generates change LDIF between two 
    content LDIF files.
+ .
  - ldif2html command generates hypertext HTML browsable
    LDIF file. 
  .
+ - ldifmodify commmand apply change LDIF on contenct LDIF
+ .
 Category:        Text
 Stability:       experimental
 Build-Type:      Simple
@@ -52,11 +55,11 @@
   Build-Depends:   ghc,
                    base         < 5,
                    filepath,
-                   haskell98,
                    containers,
                    cmdargs,
+                   directory,
                    parsec       >= 2.1.0,
-                   Cabal        >= 1.5 && < 1.9
+                   Cabal        >= 1.4
   Hs-Source-Dirs:  src
   Extensions:      CPP, PatternGuards
   Ghc-Options:      -Wall -fno-warn-orphans
diff --git a/src/Text/LDIF/Parser.hs b/src/Text/LDIF/Parser.hs
--- a/src/Text/LDIF/Parser.hs
+++ b/src/Text/LDIF/Parser.hs
@@ -68,7 +68,7 @@
     pSEPs
     ver <- optionMaybe pVersionSpec
     pSEPs
-    recs <- sepEndBy1 pChangeRec pSEPs
+    recs <- sepEndBy pChangeRec pSEPs
     eof
     return $ LDIF ver recs
 
@@ -77,7 +77,7 @@
     pSEPs
     ver <- optionMaybe pVersionSpec
     pSEPs
-    recs <- sepEndBy1 pRec pSEPs
+    recs <- sepEndBy pRec pSEPs
     eof
     return $ LDIF ver recs
 
@@ -86,7 +86,7 @@
     pSEPs
     ver <- optionMaybe pVersionSpec
     pSEPs
-    recs <- sepEndBy1 pAttrValRec pSEPs
+    recs <- sepEndBy pAttrValRec pSEPs
     eof
     return $ LDIF ver recs
 
diff --git a/src/Text/LDIF/Printer.hs b/src/Text/LDIF/Printer.hs
--- a/src/Text/LDIF/Printer.hs
+++ b/src/Text/LDIF/Printer.hs
@@ -19,7 +19,7 @@
 
 -- | Serialize DN to LDIF Format
 dn2str :: DN -> String
-dn2str (DN xs) = intercalate "," $ map (\((Attribute n),v) -> n++"="++v) xs
+dn2str xs = intercalate "," $ map (\((Attribute n),v) -> n++"="++v) (dnAttrVals xs)
 
 -- | Serialize Content Record in LDIF Format
 record2str :: LDIFRecord -> String
diff --git a/src/Text/LDIF/Types.hs b/src/Text/LDIF/Types.hs
--- a/src/Text/LDIF/Types.hs
+++ b/src/Text/LDIF/Types.hs
@@ -53,4 +53,10 @@
             | ModReplace { modAttr :: Attribute, modAttrVals :: [Value] } deriving (Show, Eq)
 
 -- | Represents Distinguished Name (DN)
-data DN = DN { dnAttrVals :: [AttrValue] } deriving (Show, Eq)
+data DN = DN { dnAttrVals :: [AttrValue] } 
+        | DNi { dnAttrVals :: [AttrValue] } deriving (Show)
+
+instance Eq DN where
+    (DN xs)  == (DN ys)   = xs == ys
+    (DNi xs) == (DNi ys)  = (map (\(n,v) -> (n,(map toUpper v)))  xs) == (map (\(n,v) -> (n,(map toUpper v))) ys)
+    x        == y         = (DNi (dnAttrVals x)) == (DNi (dnAttrVals y))
diff --git a/src/Text/LDIF/Utils.hs b/src/Text/LDIF/Utils.hs
--- a/src/Text/LDIF/Utils.hs
+++ b/src/Text/LDIF/Utils.hs
@@ -13,7 +13,9 @@
         ldif2tree,
         getLDIFType,
         isContentRecord,
-        isChangeRecord
+        isChangeRecord,
+        dn2dnI,
+        ldif2ldifI
 )
 where
 import Text.LDIF.Types
@@ -50,13 +52,14 @@
 rootOfDN xs = getDNValue xs ((sizeOfDN xs)-1)
 
 sizeOfDN :: DN -> Int
-sizeOfDN (DN vals) = length vals
+sizeOfDN xs = length (dnAttrVals xs)
 
 getDNValue :: DN -> Int -> AttrValue
-getDNValue (DN vals) idx = vals !! idx
+getDNValue xs idx = (dnAttrVals xs) !! idx
 
 takeDNPrefix :: DN -> Int -> DN
-takeDNPrefix (DN vals) n = (DN (reverse $ take n (reverse vals)))
+takeDNPrefix (DN vals) n  = (DN (reverse $ take n (reverse vals)))
+takeDNPrefix (DNi vals) n = (DNi (reverse $ take n (reverse vals)))
 
 -- | Check if the dn1 is prefix of dn2
 isDNPrefixOf :: DN -> DN -> Bool
@@ -100,3 +103,12 @@
       getLDIFType' [] _  = LDIFChangesType
       getLDIFType' _  [] = LDIFContentType
       getLDIFType' _  _  = LDIFMixedType
+
+dn2dnI :: DN -> DN
+dn2dnI (DN xs) = (DNi xs)
+dn2dnI xs = xs
+
+ldif2ldifI :: LDIF -> LDIF
+ldif2ldifI (LDIF v xs) = LDIF v ys
+    where
+      ys = map (\x -> x { reDN = dn2dnI (reDN x) } )  xs
diff --git a/tests/TestMain.hs b/tests/TestMain.hs
--- a/tests/TestMain.hs
+++ b/tests/TestMain.hs
@@ -2,7 +2,7 @@
 import Test.HUnit
 import Data.Either
 import Data.List
-import Directory
+import System.Directory
 import System.FilePath
 import Control.Monad (liftM)
 
