diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,8 @@
+# Changelog for seitz-symbol
+
+## 0.1.0.0  -- 2020-08-??
+
+* First version. Released on an unsuspecting world.
+
+## Unreleased changes
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Jun Narumi.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,73 @@
+# seitz-symbol
+
+[![Continuous Integration status][status-png]][status]
+[![Hackage page (downloads and API reference)][hackage-png]][hackage]
+[![Hackage-Deps][hackage-deps-png]][hackage-deps]
+
+Read and Display Seitz Symbol
+
+## Quickstart
+
+Make new stack project and move to project directory.
+
+```shell
+% stack new symopRepl
+% cd symopRepl
+```
+
+Edit your stack.yaml and set the following:
+
+```
+extra-deps:
+- matrix-as-xyz-0.1.2.2@sha256:9ba89fbcc029fc769eac26d10460de093c8e6bbbcb60385a3990aadd3f2a27bb,2071
+- symmetry-operations-symbols-0.0.2.1@sha256:4a443a1bd8f4ac155bb90906ee90f41f00ad7b50fd282a47498a00048124634c,2845
+- location: https://github.com/narumij/seitz-symbol/archive/0.1.0.0.dev4.tar.gz
+```
+
+Edit your package.yaml and set the following:
+
+```
+dependencies:
+- base >= 4.8 && < 5
+- matrix-as-xyz
+- seitz-symbol
+- symmetry-operations-symbols
+```
+
+Then start repl.
+
+```shell
+% stack repl
+```
+
+Setup packages and load modules.
+
+```haskell
+repl> :m Data.Matrix.AsXYZ Data.Matrix.SeitzSymbol Data.Matrix.SymmetryOperationsSymbols
+```
+
+Use like below.
+
+```haskell
+repl> prettyXYZ <$> fromSeitzSymbolS "{ 2 010 | 1/2 1/2 1/2 }"
+Right "-x+1/2,y+1/2,-z+1/2"
+
+repl>  (liftError . fromSeitzSymbolS) "{ 2 010 | 1/2 1/2 1/2 }" >>= fromMatrix
+Right " 2 (0,1/2,0) 1/4,y,1/4"
+```
+
+## References
+
+A. Michael Glazer et al. Seitz symbols Acta Cryst. (2014). A70
+
+ネスポロ マッシモ:日本結晶学会誌 59，210-222(2017).
+https://www.jstage.jst.go.jp/article/jcrsj/59/5/59_210/_pdf
+
+
+ [hackage]: http://hackage.haskell.org/package/seitz-symbol
+ [hackage-png]: http://img.shields.io/hackage/v/seitz-symbol.svg
+ [hackage-deps]: http://packdeps.haskellers.com/reverse/seitz-symbol
+ [hackage-deps-png]: https://img.shields.io/hackage-deps/v/seitz-symbol.svg
+
+ [status]: http://travis-ci.org/narumij/seitz-symbol?branch=master
+ [status-png]: https://api.travis-ci.org/narumij/seitz-symbol.svg?branch=master
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/seitz-symbol.cabal b/seitz-symbol.cabal
new file mode 100644
--- /dev/null
+++ b/seitz-symbol.cabal
@@ -0,0 +1,78 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.33.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: c53005896eabdb6edf8972bbdbd22adf3da5d2abc84ae0c6edb49e29f8c5b2f3
+
+name:           seitz-symbol
+version:        0.1.0.0
+synopsis:       Read and Display Seitz Symbol
+description:    Please see the README on GitHub at <https://github.com/narumij/seitz-symbol#readme>
+category:       Chemistry
+homepage:       https://github.com/narumij/seitz-symbol#readme
+bug-reports:    https://github.com/narumij/seitz-symbol/issues
+author:         Jun Narumi
+maintainer:     narumij@gmail.com
+copyright:      Jun Narumi
+license:        MIT
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+
+source-repository head
+  type: git
+  location: https://github.com/narumij/seitz-symbol
+
+library
+  exposed-modules:
+      Data.Matrix.SeitzSymbol
+      Data.Matrix.SeitzSymbol.Parser
+  other-modules:
+      Paths_seitz_symbol
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.8 && <5
+    , matrix >=0.1 && <0.4
+    , matrix-as-xyz >=0.1.1 && <0.2
+    , parsec >=3 && <4
+    , symmetry-operations-symbols >=0.0.2.1 && <0.1
+  default-language: Haskell2010
+
+test-suite seitz-symbol-doctest
+  type: exitcode-stdio-1.0
+  main-is: test/doctests.hs
+  other-modules:
+      Paths_seitz_symbol
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      base >=4.8 && <5
+    , doctest
+    , matrix >=0.1 && <0.4
+    , matrix-as-xyz
+    , parsec >=3 && <4
+    , symmetry-operations-symbols >=0.0.2.1 && <0.1
+  default-language: Haskell2010
+
+test-suite seitz-symbol-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  other-modules:
+      SetizSymbolSpec
+      Paths_seitz_symbol
+  hs-source-dirs:
+      test
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      base >=4.8 && <5
+    , hspec
+    , matrix >=0.1 && <0.4
+    , matrix-as-xyz >=0.1.1 && <0.2
+    , parsec >=3 && <4
+    , seitz-symbol
+    , symmetry-operations-symbols >=0.0.2.1 && <0.1
+  default-language: Haskell2010
diff --git a/src/Data/Matrix/SeitzSymbol.hs b/src/Data/Matrix/SeitzSymbol.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Matrix/SeitzSymbol.hs
@@ -0,0 +1,104 @@
+{- |
+Module      : Data.Matrix.SeitzSymbol
+Copyright   : (c) Jun Narumi 2020
+License     : MIT
+Maintainer  : narumij@gmail.com
+Stability   : experimental
+
+Read and Display Seitz Symbol
+
+[References]
+
+A. Michael Glazer et al. Seitz symbols Acta Cryst. (2014). A70
+
+ネスポロ マッシモ:日本結晶学会誌 59，210-222(2017).
+https://www.jstage.jst.go.jp/article/jcrsj/59/5/59_210/_pdf
+
+-}
+module Data.Matrix.SeitzSymbol (
+  P.SeitzSymbol(..),
+  fromSeitzSymbolS,
+  fromSeitzSymbolHexS,
+  toSeitzSymbolS,
+  ) where
+
+import Text.Parsec
+import Text.Parsec.String (Parser)
+
+import Data.Ratio (Ratio(..))
+import Data.Matrix (Matrix(..))
+import Data.Matrix.AsXYZ (fromXYZ,prettyXYZ)
+import qualified Data.Matrix.SeitzSymbol.Parser
+  as P (SeitzSymbol(..),seitzSymbol,toMatrix,toSeitzSymbol,toString)
+import Data.Matrix.SymmetryOperationsSymbols
+import Data.Matrix.SymmetryOperationsSymbols.Common (
+  properMatricesForPointGroup,
+  hexagonalMatricesForPointGroup,
+  MatrixForPointGroupCorrespondingSymmetryElement(..)
+  )
+
+parser :: (Integral a, Read a) => 
+          [MatrixForPointGroupCorrespondingSymmetryElement a]
+        -> Parser (Matrix (Ratio a))
+parser tbl = do
+  s <- P.seitzSymbol
+  case P.toMatrix tbl s of
+    Just m -> return m
+    Nothing -> parserFail "Matrix not found."
+
+-- | for cubic, tetragonal, orthorhombic, monoclinic and triclinic crystal systems.
+--
+-- >>> prettyXYZ <$> fromSeitzSymbolS "{ 1 | 0 0 0 }"
+-- Right "x,y,z"
+-- >>> prettyXYZ <$> fromSeitzSymbolS "{ 2 010 | 1/2 1/2 1/2 }"
+-- Right "-x+1/2,y+1/2,-z+1/2"
+-- >>> prettyXYZ <$> fromSeitzSymbolS "{ 3+ 111 | 1/2 1/2 1/2 }"
+-- Right "z+1/2,x+1/2,y+1/2"
+-- >>> prettyXYZ <$> fromSeitzSymbolS "{ -3+ 111 | 1/2 1/2 1/2 }"
+-- Right "-z+1/2,-x+1/2,-y+1/2"
+-- >>> prettyXYZ <$> fromSeitzSymbolS "{ m 100 | 0 0 0 }"
+-- Right "-x,y,z"
+-- >>> (liftError . fromSeitzSymbolS) "{ 2 010 | 1/2 1/2 1/2 }" >>= fromMatrix
+-- Right " 2 (0,1/2,0) 1/4,y,1/4"
+-- >>> (liftError . fromSeitzSymbolS) "{ 3+ 111 | 1/2 1/2 1/2 }" >>= fromMatrix
+-- Right " 3+(1/2,1/2,1/2) x,x,x"
+-- >>> (liftError . fromSeitzSymbolS) "{ -3+ 111 | 1/2 1/2 1/2 }" >>= fromMatrix
+-- Right "-3+ x,x,x; 1/4,1/4,1/4"
+-- >>> (liftError . fromSeitzSymbolS) "{ m 100 | 0 0 0 }" >>= fromMatrix
+-- Right " m  0,y,z"
+--
+fromSeitzSymbolS :: (Integral a, Read a) =>
+                    SourceName
+                 -> Either ParseError (Matrix (Ratio a))
+fromSeitzSymbolS s = parse (parser properMatricesForPointGroup) s s
+
+
+-- | for hexagonal and trigonal crystal systems.
+--
+-- >>> prettyXYZ <$> fromSeitzSymbolHexS "{ m 100 | 0 0 0 }"
+-- Right "y-x,y,z"
+-- >>> prettyXYZ <$> fromSeitzSymbolHexS "{ m 120 | 0 0 0 }"
+-- Right "x-y,-y,z"
+-- >>> prettyXYZ <$> fromSeitzSymbolHexS "{ 2 100 | 0 0 0 }"
+-- Right "x-y,-y,-z"
+-- >>> (liftError . fromSeitzSymbolHexS) "{ m 100 | 0 0 0 }" >>= fromMatrix
+-- Right " m  x,2x,z"
+-- >>> (liftError . fromSeitzSymbolHexS) "{ m 120 | 0 0 0 }" >>= fromMatrix
+-- Right " m  x,0,z"
+-- >>> (liftError . fromSeitzSymbolHexS) "{ 2 100 | 0 0 0 }" >>= fromMatrix
+-- Right " 2  x,0,0"
+--
+fromSeitzSymbolHexS :: (Integral a, Read a) =>
+                       String
+                    -> Either ParseError (Matrix (Ratio a))
+fromSeitzSymbolHexS s = parse (parser hexagonalMatricesForPointGroup) s s
+
+-- |
+--
+-- >>> toSeitzSymbolS . fromXYZ $ "x,y,z"
+-- Just "{ 1 | 0 0 0 }"
+-- >>> toSeitzSymbolS . fromXYZ $ "-x+1/2,y+1/2,-z+1/2"
+-- Just "{ 2 010 | 1/2 1/2 1/2 }"
+--
+toSeitzSymbolS :: (Integral a, Show a) => Matrix (Ratio a) -> Maybe String
+toSeitzSymbolS m = P.toString <$> P.toSeitzSymbol m
diff --git a/src/Data/Matrix/SeitzSymbol/Parser.hs b/src/Data/Matrix/SeitzSymbol/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Matrix/SeitzSymbol/Parser.hs
@@ -0,0 +1,201 @@
+{- |
+Module      : Data.Matrix.SeitzSymbol.Parser
+Copyright   : (c) Jun Narumi 2020
+License     : MIT
+Maintainer  : narumij@gmail.com
+Stability   : experimental
+
+Seitz Symbol parser and etc.
+
+[References]
+
+A. Michael Glazer et al. Seitz symbols Acta Cryst. (2014). A70
+
+ネスポロ マッシモ:日本結晶学会誌 59，210-222(2017).
+https://www.jstage.jst.go.jp/article/jcrsj/59/5/59_210/_pdf
+
+-}
+module Data.Matrix.SeitzSymbol.Parser (
+  SeitzSymbol(..),
+  seitzSymbol,
+  toMatrix,
+  toSeitzSymbol,
+  toString,
+  ) where
+
+import Data.Ratio (Ratio(..),(%))
+import Text.Parsec
+import Text.Parsec.String (Parser)
+
+import Data.Ratio.Slash (Slash(..))
+import Data.Matrix (Matrix(..),fromLists,toList,submatrix)
+import Data.Matrix.AsXYZ (fromXYZ)
+import qualified Data.Matrix as M ((<->),(<|>))
+
+import Data.Matrix.SymmetryOperationsSymbols.Common (properMatricesForPointGroup,MatrixForPointGroupCorrespondingSymmetryElement(..))
+
+type SeitzSymbol a = (String,String,(a,a,a),(Ratio a,Ratio a,Ratio a))
+
+optionSpaces :: Parser ()
+optionSpaces = skipMany space
+
+identity :: Parser String
+identity = do
+  char '1'
+  return "1"
+
+symbol :: Parser (String,String)
+symbol = try irot <|> try rot <|> miller <|> two
+  where
+    sign = oneOf "-+"
+    rot = do
+      a <- oneOf "346"
+      b <- sign
+      return (a:[],b:[])
+    two = do
+      char '2'
+      return ("2","")
+    miller = do
+      char 'm'
+      return ("m","")
+    irot = do
+      char '-'
+      a <- oneOf "346"
+      b <- sign
+      return ('-':a:[],b:[])
+
+zero :: Num a => Parser a
+zero = do
+  char '0'
+  return 0
+
+one :: Num a => Parser a
+one = do
+  char '1'
+  return 1
+
+two :: Num a => Parser a
+two = do
+  char '2'
+  return 2
+
+minus :: Num a => Parser a
+minus = do
+  string "-1"
+  return (-1)
+
+d :: Num a => Parser a
+d = do
+  a <- (zero <|> one <|> two <|> minus)
+  return a
+
+orientation :: Num a => Parser (a,a,a)
+orientation = try a <|> b
+  where
+    a = do
+      char '['
+      a <- d
+      b <- d
+      c <- d
+      char ']'
+      return (a,b,c)
+    b = do
+      a <- d
+      b <- d
+      c <- d
+      return (a,b,c)
+
+
+num :: (Num a, Read a) => Parser a
+num = do
+  x <- oneOf "123456789"
+  xs <- many digit
+  return $ read (x : xs)
+
+int :: (Integral a, Read a) => Parser a
+int = zero <|> num
+
+fract :: (Integral a, Read a) => Parser (Ratio a)
+fract = do
+  n <- int
+  char '/'
+  d <- int
+  return $ n % d
+
+integer :: (Integral a, Read a) => Parser (Ratio a)
+integer = do
+  i <- int
+  return (i%1)
+
+number :: (Integral a, Read a) => Parser (Ratio a)
+number = do
+  try fract <|> integer
+
+matrixPart :: Num a => Parser (String,String,(a,a,a))
+matrixPart = try a <|> b
+  where
+    a = do
+      (sy,si) <- symbol
+      spaces
+      o <- orientation
+      return (sy,si,o)
+    b = do
+      s <- identity
+      return (s,"",(0,0,0))
+
+seitzSymbol :: (Integral a, Read a) => Parser (SeitzSymbol a)
+seitzSymbol = do
+  char '{'
+  optionSpaces
+  (sy,si,o) <- matrixPart
+  optionSpaces
+  char '|'
+  optionSpaces
+  p <- number
+  spaces
+  q <- number
+  spaces
+  r <- number
+  optionSpaces
+  char '}'
+  return (sy,si,o,(p,q,r))
+
+toMatrix :: (Integral a,Read a) =>
+            [MatrixForPointGroupCorrespondingSymmetryElement a]
+          -> SeitzSymbol a
+          -> Maybe (Matrix (Ratio a))
+toMatrix tbl (sy,si,(o1,o2,o3),(p,q,r)) = build p q r <$> result
+  where
+    transformCoordinate (_,_,symbolLabel,sense,_,orientation,transformedCoordinate,_)
+      = ( (symbolLabel,sense,if null orientation then [0,0,0] else orientation), transformedCoordinate )
+    result = lookup (sy,si,[o1,o2,o3]) $ map transformCoordinate tbl
+    build p q r xyz = _W M.<|> _w M.<-> fromLists [[0,0,0,1]]
+      where
+        _W = submatrix 1 3 1 3 . fromXYZ $ xyz
+        _w = fromLists [[p],[q],[r]]
+
+toString :: (Integral a, Show a) => SeitzSymbol a -> String
+toString ("1",si,(o1,o2,o3),(p,q,r))
+  = "{ " ++ "1"
+  ++ " | "
+  ++ show (Slash p) ++ " " ++ show (Slash q) ++ " " ++ show (Slash r)
+  ++ " }"
+toString (sy,si,(o1,o2,o3),(p,q,r))
+  = "{ " ++ sy ++ si ++ " "
+  ++ show o1 ++ show o2 ++ show o3
+  ++ " | "
+  ++ show (Slash p) ++ " " ++ show (Slash q) ++ " " ++ show (Slash r)
+  ++ " }"
+
+toSeitzSymbol :: Integral a => Matrix (Ratio a) -> Maybe (SeitzSymbol a)
+toSeitzSymbol m = lookup w $ map tt properMatricesForPointGroup
+  where
+    getW = submatrix 1 3 1 3
+    getw = submatrix 1 3 4 4
+    w = getW m
+    p:q:r:[] = toList . getw $ m
+    tt (_,_,symbolLabel,sense,_,(o1:o2:o3:_),transformedCoordinate,_)
+      = (getW . fromXYZ $ transformedCoordinate, (symbolLabel,sense,(o1,o2,o3),(p,q,r)))
+    tt (_,_,symbolLabel,sense,_,[],transformedCoordinate,_)
+      = (getW . fromXYZ $ transformedCoordinate, (symbolLabel,sense,(0,0,0),(p,q,r)))
+
diff --git a/test/SetizSymbolSpec.hs b/test/SetizSymbolSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/SetizSymbolSpec.hs
@@ -0,0 +1,52 @@
+module SetizSymbolSpec where
+
+import Test.Hspec
+
+import Data.Matrix.SeitzSymbol
+import Data.Matrix.AsXYZ (fromXYZ,prettyXYZ)
+import Data.Matrix.SymmetryOperationsSymbols
+
+spec :: Spec
+spec = do
+
+   describe "Data.Matrix.SeitzSymbol" $ do
+      it "fromSeitzSymbol" $ do
+        prettyXYZ <$> fromSeitzSymbolS "{ 1 | 0 0 0 }"
+          `shouldBe` Right "x,y,z"
+        prettyXYZ <$> fromSeitzSymbolS "{ 2 010 | 1/2 1/2 1/2 }"
+          `shouldBe` Right "-x+1/2,y+1/2,-z+1/2"
+        prettyXYZ <$> fromSeitzSymbolS "{ 3+ 111 | 1/2 1/2 1/2 }"
+          `shouldBe` Right "z+1/2,x+1/2,y+1/2"
+        prettyXYZ <$> fromSeitzSymbolS "{ -3+ 111 | 1/2 1/2 1/2 }"
+          `shouldBe` Right "-z+1/2,-x+1/2,-y+1/2"
+        prettyXYZ <$> fromSeitzSymbolS "{ m 100 | 0 0 0 }"
+          `shouldBe`  Right "-x,y,z"
+        ((liftError . fromSeitzSymbolS) "{ 2 010 | 1/2 1/2 1/2 }" >>= fromMatrix)
+          `shouldBe` Right " 2 (0,1/2,0) 1/4,y,1/4"
+        ((liftError . fromSeitzSymbolS) "{ 3+ 111 | 1/2 1/2 1/2 }" >>= fromMatrix)
+          `shouldBe` Right " 3+(1/2,1/2,1/2) x,x,x"
+        ((liftError . fromSeitzSymbolS) "{ -3+ 111 | 1/2 1/2 1/2 }" >>= fromMatrix)
+          `shouldBe` Right "-3+ x,x,x; 1/4,1/4,1/4"
+        ((liftError . fromSeitzSymbolS) "{ m 100 | 0 0 0 }" >>= fromMatrix)
+          `shouldBe` Right " m  0,y,z"
+
+      it "fromSeitzSymbolH" $ do
+        prettyXYZ <$> fromSeitzSymbolHexS "{ m 100 | 0 0 0 }"
+          `shouldBe` Right "y-x,y,z"
+        prettyXYZ <$> fromSeitzSymbolHexS "{ m 120 | 0 0 0 }"
+          `shouldBe` Right "x-y,-y,z"
+        prettyXYZ <$> fromSeitzSymbolHexS "{ 2 100 | 0 0 0 }"
+          `shouldBe` Right "x-y,-y,-z"
+        ((liftError . fromSeitzSymbolHexS) "{ m 100 | 0 0 0 }" >>= fromMatrix)
+          `shouldBe` Right " m  x,2x,z"
+        ((liftError . fromSeitzSymbolHexS) "{ m 120 | 0 0 0 }" >>= fromMatrix)
+          `shouldBe` Right " m  x,0,z"
+        ((liftError . fromSeitzSymbolHexS) "{ 2 100 | 0 0 0 }" >>= fromMatrix)
+          `shouldBe` Right " 2  x,0,0"
+
+      it "toSeitzSymbol" $ do
+        (toSeitzSymbolS . fromXYZ $ "x,y,z")
+          `shouldBe` Just "{ 1 | 0 0 0 }"
+        (toSeitzSymbolS . fromXYZ $ "-x+1/2,y+1/2,-z+1/2")
+          `shouldBe` Just "{ 2 010 | 1/2 1/2 1/2 }"
+
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,2 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
+
diff --git a/test/doctests.hs b/test/doctests.hs
new file mode 100644
--- /dev/null
+++ b/test/doctests.hs
@@ -0,0 +1,8 @@
+module Main (main) where
+
+import Test.DocTest
+
+main :: IO ()
+main = doctest [
+--  "src/Data/Matrix/SeitzSymbol.hs"
+  ]
