diff --git a/Changelog b/Changelog
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,10 @@
+iptadmin 1.3.4    19.05.2013:
+  * Get rid of ptmpl utility, simplify building
+  * Migrate to github
+
+iptadmin 1.3.3    29.12.2012:
+  * Allow '_' character in name of user chain
+
 iptadmin 1.3.2	  28.10.2012:
   * add --no-daemon option to run on centos 5
 
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,7 @@
 all: dist/build/iptadmin/iptadmin
 
-dist/build/iptadmin/iptadmin: src/Template.hs src/IptAdmin/AddPage.hs src/IptAdmin/EditForm/Utils.hs src/IptAdmin/EditForm/Render.hs src/IptAdmin/EditForm/Class.hs src/IptAdmin/EditForm/Types.hs src/IptAdmin/Utils.hs src/IptAdmin/Render.hs src/IptAdmin/EditPage.hs src/IptAdmin/InsertPage.hs src/IptAdmin/EditChainForm/Render.hs src/IptAdmin/EditChainForm/Parse.hs src/IptAdmin/DelPage.hs src/IptAdmin/EditForm.hs src/IptAdmin/DelPage/Render.hs src/IptAdmin/ShowPage/Render.hs src/IptAdmin/EditPolicyPage.hs src/IptAdmin/EditPolicyForm/Render.hs src/IptAdmin/EditChainPage.hs src/IptAdmin/AccessControl.hs src/IptAdmin/DelChainPage.hs src/IptAdmin/LoginPage.hs src/IptAdmin/Types.hs src/IptAdmin/System.hs src/IptAdmin/DelChainPage/Render.hs src/IptAdmin/Config.hs src/IptAdmin/AddChainPage.hs src/IptAdmin/ShowPage.hs src/IptAdmin/Static.hs src/Main.hs iptadmin.cabal
-	cabal install
-
-src/Template.hs: html/htmlwrapper.html
-	ptmpl src/Template.hs html/htmlwrapper.html
+dist/build/iptadmin/iptadmin: src/IptAdmin/AddPage.hs src/IptAdmin/EditForm/Utils.hs src/IptAdmin/EditForm/Render.hs src/IptAdmin/EditForm/Class.hs src/IptAdmin/EditForm/Types.hs src/IptAdmin/Utils.hs src/IptAdmin/Render.hs src/IptAdmin/EditPage.hs src/IptAdmin/InsertPage.hs src/IptAdmin/EditChainForm/Render.hs src/IptAdmin/EditChainForm/Parse.hs src/IptAdmin/DelPage.hs src/IptAdmin/EditForm.hs src/IptAdmin/DelPage/Render.hs src/IptAdmin/ShowPage/Render.hs src/IptAdmin/EditPolicyPage.hs src/IptAdmin/EditPolicyForm/Render.hs src/IptAdmin/EditChainPage.hs src/IptAdmin/AccessControl.hs src/IptAdmin/DelChainPage.hs src/IptAdmin/LoginPage.hs src/IptAdmin/Types.hs src/IptAdmin/System.hs src/IptAdmin/DelChainPage/Render.hs src/IptAdmin/Config.hs src/IptAdmin/AddChainPage.hs src/IptAdmin/ShowPage.hs src/IptAdmin/Static.hs src/Main.hs iptadmin.cabal
+	cabal-dev install
 
 install: /usr/bin/iptadmin /etc/iptadmin/iptadmin.conf /etc/pam.d/iptadmin /etc/init.d/iptadmin
 	groupadd iptadmin || true
diff --git a/html/htmlwrapper.html b/html/htmlwrapper.html
deleted file mode 100644
--- a/html/htmlwrapper.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--h htmlWrapper content h-->
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-    <head>
-        <title>IptAdmin</title>
-        <meta name="AUTHOR" content="Evgeny Tarasov" />
-        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-        <meta name="DESCRIPTION" content="iptables web interface"/>
-        <meta name="KEYWORDS" content="iptables, haskell" />
-        <link rel="stylesheet" type="text/css" href="/static/css/iptadmin-theme/jquery-ui-1.8.16.custom.css" />
-        <script type="text/javascript" src="/static/js/jquery-1.6.2.min.js"></script>
-        <script type="text/javascript" src="/static/js/jquery-ui-1.8.16.custom.min.js"></script>
-        <link href="/static/css/iptadmin.css" rel="stylesheet" type="text/css" title="Iptadmin" />
-    </head>
-    <body>
-!@#content
-    </body>
-</html>
-<!--^^^-->
diff --git a/iptadmin.cabal b/iptadmin.cabal
--- a/iptadmin.cabal
+++ b/iptadmin.cabal
@@ -1,6 +1,6 @@
 Name:           iptadmin
-Version:        1.3.3
-Cabal-Version:  >= 1.4
+Version:        1.3.4
+Cabal-Version:  >= 1.6
 Author:         Evgeny Tarasov
 Build-type:     Simple
 Copyright:      2011 Evgeny Tarasov
@@ -12,12 +12,7 @@
 Synopsis:       web-interface for iptables
 Description:    web-interface for iptables with PAM authorization
 Category:       System, Tools, Web, Application
-Extra-source-files: html/htmlwrapper.html,
-                    util/ptmpl/Setup.hs,
-                    util/ptmpl/ptmpl.cabal,
-                    util/ptmpl/src/Main.hs
-                    src/Template.hs,
-                    doc/examples/config/iptadmin.conf
+Extra-source-files: doc/examples/config/iptadmin.conf
                     doc/examples/init/iptadmin
                     doc/examples/pam/iptadmin
                     INSTALL
@@ -41,6 +36,9 @@
                     static/js/jquery-1.6.2.min.js
                     static/js/jquery-ui-1.8.16.custom.min.js
                     static/js/showpage.js
+Source-repository   head
+    type:           git
+    location:       https://github.com/etarasov/iptadmin.git
 
 Executable iptadmin
     Build-Depends:  base >= 4 && < 5,
diff --git a/src/IptAdmin/AddChainPage.hs b/src/IptAdmin/AddChainPage.hs
--- a/src/IptAdmin/AddChainPage.hs
+++ b/src/IptAdmin/AddChainPage.hs
@@ -3,7 +3,6 @@
 
 import Control.Monad.Error
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.EditChainForm.Parse
 import IptAdmin.EditChainForm.Render
 import IptAdmin.Render
diff --git a/src/IptAdmin/DelChainPage.hs b/src/IptAdmin/DelChainPage.hs
--- a/src/IptAdmin/DelChainPage.hs
+++ b/src/IptAdmin/DelChainPage.hs
@@ -3,10 +3,10 @@
 
 import Control.Monad.Error
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.DelChainPage.Render
 import IptAdmin.Render
 import IptAdmin.System
+import IptAdmin.Template
 import IptAdmin.Types
 import IptAdmin.Utils
 import Iptables
@@ -30,19 +30,19 @@
         Just chain ->
             if not $ null $ cRules chain
                 then
-                    return $ buildResponse $ Template.htmlWrapper $ renderHtml $
+                    return $ buildResponse $ renderHtml $ htmlWrapper $
                         header tableName $ "'" ++ chainName
                                          ++ "' chain is not empty. Please, remove all rules before deleting a chain"
                 else
                     let linkedChains = scanTableForLink (cName chain) table
                     in
                     if not $ null linkedChains
-                        then return $ buildResponse $ Template.htmlWrapper $ renderHtml $
+                        then return $ buildResponse $ renderHtml $ htmlWrapper $
                             header tableName $ "There are links to the '" ++ chainName
                                              ++ "' chain from chains : " ++ show linkedChains
                                              ++ ". Please, remove all links before deleting a chain"
                         else
-                            return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
+                            return $ buildResponse $ renderHtml $ htmlWrapper $ do
                                 header tableName $ "Delete '" ++ chainName
                                                  ++ "' user defined chain from '"
                                                  ++ tableName ++ "' table"
diff --git a/src/IptAdmin/DelPage.hs b/src/IptAdmin/DelPage.hs
--- a/src/IptAdmin/DelPage.hs
+++ b/src/IptAdmin/DelPage.hs
@@ -3,10 +3,10 @@
 
 import Control.Monad.Error
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.DelPage.Render
 import IptAdmin.Render
 import IptAdmin.System
+import IptAdmin.Template
 import IptAdmin.Types
 import IptAdmin.Utils
 import Iptables
@@ -29,7 +29,7 @@
 
     (_, rule) <- checkParams tableName chainName rulePosition
 
-    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
+    return $ buildResponse $ renderHtml $ htmlWrapper $ do
         header tableName $ "Delete rule from '" ++ chainName
                          ++ "' chain in '" ++ tableName
                          ++ "' table in position " ++ show rulePosition
diff --git a/src/IptAdmin/EditChainPage.hs b/src/IptAdmin/EditChainPage.hs
--- a/src/IptAdmin/EditChainPage.hs
+++ b/src/IptAdmin/EditChainPage.hs
@@ -3,7 +3,6 @@
 
 import Control.Monad.Error
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.EditChainForm.Parse
 import IptAdmin.EditChainForm.Render
 import IptAdmin.Render
diff --git a/src/IptAdmin/EditIpForwPage.hs b/src/IptAdmin/EditIpForwPage.hs
--- a/src/IptAdmin/EditIpForwPage.hs
+++ b/src/IptAdmin/EditIpForwPage.hs
@@ -3,7 +3,6 @@
 
 import Control.Monad.Error
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.EditIpForwForm.Render
 import IptAdmin.Render
 import IptAdmin.System
diff --git a/src/IptAdmin/EditPage.hs b/src/IptAdmin/EditPage.hs
--- a/src/IptAdmin/EditPage.hs
+++ b/src/IptAdmin/EditPage.hs
@@ -3,7 +3,6 @@
 import Control.Monad.Error
 import Control.Monad.State
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.EditForm
 import IptAdmin.EditForm.Class
 import IptAdmin.EditForm.Render
diff --git a/src/IptAdmin/EditPolicyPage.hs b/src/IptAdmin/EditPolicyPage.hs
--- a/src/IptAdmin/EditPolicyPage.hs
+++ b/src/IptAdmin/EditPolicyPage.hs
@@ -3,7 +3,6 @@
 
 import Control.Monad.Error
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.EditPolicyForm.Render
 import IptAdmin.Render
 import IptAdmin.System
diff --git a/src/IptAdmin/InsertPage.hs b/src/IptAdmin/InsertPage.hs
--- a/src/IptAdmin/InsertPage.hs
+++ b/src/IptAdmin/InsertPage.hs
@@ -4,7 +4,6 @@
 import Control.Monad.Error
 import Control.Monad.State
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.EditForm
 import IptAdmin.EditForm.Render
 import IptAdmin.EditForm.Class
diff --git a/src/IptAdmin/LoginPage.hs b/src/IptAdmin/LoginPage.hs
--- a/src/IptAdmin/LoginPage.hs
+++ b/src/IptAdmin/LoginPage.hs
@@ -9,9 +9,9 @@
 import Data.String
 import Data.Time
 import Happstack.Server.SimpleHTTP hiding (Session)
-import Template
 import IptAdmin.Render
 import IptAdmin.System
+import IptAdmin.Template
 import IptAdmin.Types
 import IptAdmin.Utils
 import System.Random
@@ -28,7 +28,7 @@
 
 pageHandlerGet :: IptAdminAuth Response
 pageHandlerGet =
-    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
+    return $ buildResponse $ renderHtml $ htmlWrapper $ do
         title
         loginForm "" Nothing
 
@@ -44,7 +44,7 @@
     authRes <- liftIO $ authenticate login password
     case authRes of
         Just errorMsg ->
-            return $ buildResponse $ htmlWrapper $ renderHtml $ do
+            return $ buildResponse $ renderHtml $ htmlWrapper $ do
                    title
                    loginForm login $ Just errorMsg
         Nothing -> do
diff --git a/src/IptAdmin/ShowPage.hs b/src/IptAdmin/ShowPage.hs
--- a/src/IptAdmin/ShowPage.hs
+++ b/src/IptAdmin/ShowPage.hs
@@ -7,10 +7,10 @@
 import Data.IORef
 import Data.Map hiding (filter)
 import Happstack.Server.SimpleHTTP
-import Template
 import IptAdmin.Render
 import IptAdmin.ShowPage.Render
 import IptAdmin.System
+import IptAdmin.Template
 import IptAdmin.Types
 import IptAdmin.Utils
 import Iptables
@@ -145,7 +145,7 @@
                               refreshString
                               (sortFilterTable $ tFilter iptables)
                               (sortFilterTable $ tFilter iptables')
-    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
+    return $ buildResponse $ renderHtml $ htmlWrapper $ do
         includeJs
         header "filter" "Iptables Filter table"
         showPageHtml filter'
@@ -160,7 +160,7 @@
                           (sortNatTable $ tNat iptables)
                           (sortNatTable $ tNat iptables')
     forwState <- getForwardingState
-    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
+    return $ buildResponse $ renderHtml $ htmlWrapper $ do
         includeJs
         header "nat" "Iptables Nat table"
         renderIpForwarding forwState
@@ -175,7 +175,7 @@
                              refreshString
                              (sortMangleTable $ tMangle iptables)
                              (sortMangleTable $ tMangle iptables')
-    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
+    return $ buildResponse $ renderHtml $ htmlWrapper $ do
         includeJs
         header "mangle" "Iptables Mangle table. Rule editing is not supported for Mangle yet."
         showPageHtml mangle
diff --git a/src/IptAdmin/Utils.hs b/src/IptAdmin/Utils.hs
--- a/src/IptAdmin/Utils.hs
+++ b/src/IptAdmin/Utils.hs
@@ -18,6 +18,7 @@
 import Text.ParserCombinators.Parsec.Char
 import Text.ParserCombinators.Parsec.Combinator
 
+
 buildResponse :: String -> Response
 buildResponse input = let respPlain = toResponse input
                       in respPlain {rsHeaders = mkHeaders [("Content-type", "text/html; charset=utf8")]}
diff --git a/src/Template.hs b/src/Template.hs
deleted file mode 100644
--- a/src/Template.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-module Template where
-
-htmlWrapper content = unlines ["",
- ""++"<?xml version=\"1.0\" encoding=\"utf-8\"?>",
- ""++"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">",
- ""++"<html xmlns=\"http://www.w3.org/1999/xhtml\">",
- ""++"    <head>",
- ""++"        <title>IptAdmin</title>",
- ""++"        <meta name=\"AUTHOR\" content=\"Evgeny Tarasov\" />",
- ""++"        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />",
- ""++"        <meta name=\"DESCRIPTION\" content=\"iptables web interface\"/>",
- ""++"        <meta name=\"KEYWORDS\" content=\"iptables, haskell\" />",
- ""++"        <link rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/iptadmin-theme/jquery-ui-1.8.16.custom.css\" />",
- ""++"        <script type=\"text/javascript\" src=\"/static/js/jquery-1.6.2.min.js\"></script>",
- ""++"        <script type=\"text/javascript\" src=\"/static/js/jquery-ui-1.8.16.custom.min.js\"></script>",
- ""++"        <link href=\"/static/css/iptadmin.css\" rel=\"stylesheet\" type=\"text/css\" title=\"Iptadmin\" />",
- ""++"    </head>",
- ""++"    <body>",
- ""++content,
- ""++"    </body>",
- ""++"</html>",
- ""]
diff --git a/util/ptmpl/Setup.hs b/util/ptmpl/Setup.hs
deleted file mode 100644
--- a/util/ptmpl/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/util/ptmpl/ptmpl.cabal b/util/ptmpl/ptmpl.cabal
deleted file mode 100644
--- a/util/ptmpl/ptmpl.cabal
+++ /dev/null
@@ -1,19 +0,0 @@
-Name:           ptmpl
-Version:        1.0.0
-Cabal-Version:  >= 1.2
-Author:         Evgeny Tarasov
-Build-type:     Simple
-License:        BSD3
-Copyright:      (c) 2009 Evgeny Tarasov
-Maintainer:     etarasov.ekb@gmail.com
-Stability:      Stable
-Synopsis:       Source generator with embedding text(html) templates
-Description:    The simplest string template generator
-Tested-with:    GHC==6.10.3
-
-Executable ptmpl
-    Build-Depends:  base >= 3 && < 5,
-                    parsec >= 2.1
-    Main-Is:        Main.hs
-    Hs-Source-Dirs: src
-    Ghc-options:    -Wall -O2 -fno-warn-unused-do-bind
diff --git a/util/ptmpl/src/Main.hs b/util/ptmpl/src/Main.hs
deleted file mode 100644
--- a/util/ptmpl/src/Main.hs
+++ /dev/null
@@ -1,75 +0,0 @@
-
-module Main where
-
-import System.Environment
-import Text.ParserCombinators.Parsec
-
-main :: IO ()
-main = do
-    putStrLn "Starting plain templater"
-    args <- getArgs
-    let outFile = head args
-    input <- mapM readFile $ tail args
-    -- TODO: parse files separately
-    let outputE = parse ptemplParser "plain templater" $ unlines input
-    case outputE of
-        Left e -> print e
-        Right output -> do
-            putStrLn "Translation is completed successfully"
-            writeFile outFile output
-
-ptemplParser :: GenParser Char () String
-ptemplParser = do
-    res <- concat `fmap` many tmplFunc
-    let header = "module Template where\n\n"
-    return $ header ++ res
-
-tmplFunc :: GenParser Char () String
-tmplFunc = do
-    try $ manyTill anyChar $
-        try $ string "<!--h "
-    spaces
-    funcName <- many1 alphaNum
-    spaces
-    funcParams <- manyTill param $
-        try $ string "h-->\n"
-    lines' <- manyTill line $
-        try $ string "<!--^^^-->" >> spaces
-    return $ unwords (funcName : funcParams) ++ " = unlines [\"\",\n"
-           ++ unlines lines'
-           ++ " \"\"]\n"
-
-param :: GenParser Char () String
-param = do
-    res <- many1 alphaNum
-    spaces
-    return res
-
-line :: GenParser Char () String
-line = do
-    elements <- manyTill lineElement $ char '\n'
-    return $ " \"\""
-           ++ unwords elements
-           ++ ","
-
-lineElement :: GenParser Char () String
-lineElement = inlineParam <|> plainString
-
-inlineParam :: GenParser Char () String
-inlineParam = do
-    try $ string "!@#"
-    res <- many1 alphaNum
-    return $ "++" ++ res
-
-plainString :: GenParser Char () String
-plainString = do
-    res <- manyTill anyChar
-                    ( lookAhead (try $ string "!@#")
-                      <|> lookAhead ((: []) `fmap` char '\n')
-                    )
-    return $ "++\"" ++ screenString res ++ "\""
-
-screenString :: String -> String
-screenString [] = []
-screenString (x : xs) | x == '"' = '\\' : '"' : screenString xs
-                      | otherwise = x : screenString xs
