diff --git a/mps.cabal b/mps.cabal
--- a/mps.cabal
+++ b/mps.cabal
@@ -1,5 +1,5 @@
 Name:                 mps
-Version:              2010.1.24
+Version:              2010.1.24.1
 Build-type:           Simple
 Synopsis:             simply oo
 Description:          DSL that allows one to write Haskell from left to right
@@ -15,7 +15,7 @@
 
 library
   ghc-options: -Wall
-  build-depends: base >= 4 && < 5, containers, array, parallel, old-time, time, bytestring >= 0.9, regexpr >= 0.3.4, parsec >= 2, utf8-string >= 0.3.3, directory, old-locale, filepath, template-haskell
+  build-depends: base64-string, base >= 4 && < 5, zlib, containers, array, parallel, old-time, time, bytestring >= 0.9, regexpr >= 0.3.4, parsec >= 2, utf8-string >= 0.3.3, directory, old-locale, filepath, template-haskell
   hs-source-dirs: src/
   exposed-modules:  
                     MPS
@@ -23,4 +23,5 @@
                   , MPS.Light
                   , MPS.Extra
                   , MPS.Env
+                  , MPS.Heavy
   other-modules:    MPS.UTF8
diff --git a/src/MPS/Heavy.hs b/src/MPS/Heavy.hs
new file mode 100644
--- /dev/null
+++ b/src/MPS/Heavy.hs
@@ -0,0 +1,54 @@
+module MPS.Heavy where
+
+import Codec.Binary.Base64.String as C
+import Data.Char
+import MPS.Light
+import Prelude hiding ((.), (^), (>), (<), (/), elem, foldl)
+import qualified Prelude as P
+import Text.ParserCombinators.Parsec (many, char, many1, digit, (<|>), Parser, anyChar, try)
+import qualified Codec.Compression.GZip as GZip
+import qualified Data.ByteString.Lazy.Char8 as B
+import qualified Text.ParserCombinators.Parsec as P
+
+
+-- compress
+
+zip64, unzip64 :: String -> String
+zip64 = B.pack > GZip.compress > B.unpack > C.encode
+unzip64 = C.decode > B.pack > GZip.decompress > B.unpack
+  
+-- Parser
+parse :: P.GenParser tok () a -> [tok] -> a
+parse p s = case (P.parse p "" s) of
+  Left err -> err.show.error
+  Right x  -> x
+
+
+-- XML
+unescape_xml, escape_xml :: String -> String
+unescape_xml s = parse unescape_parser s
+  where
+    unicode_char :: Parser Char
+    unicode_char = do
+      char '&'
+      char '#'
+      word <- many1 digit
+      char ';'
+      return $ chr (read word)
+
+    unescape_parser :: Parser String
+    unescape_parser = many (try unicode_char <|> anyChar)
+
+escape_xml = concatMap fixChar
+    where
+      fixChar '<' = "<"
+      fixChar '>' = ">"
+      fixChar '&' = "&"
+      fixChar '"' = "\""
+      fixChar c | ord c P.< 0x80 = [c]
+      fixChar c = "&#" ++ show (ord c) ++ ";"
+
+-- backward compatible
+unescape_unicode_xml, escape_unicode_xml :: String -> String
+unescape_unicode_xml = unescape_xml
+escape_unicode_xml = escape_xml
