diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Daniel YU (c) 2019
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Daniel YU nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1 @@
+# salak-yaml
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/salak-yaml.cabal b/salak-yaml.cabal
new file mode 100644
--- /dev/null
+++ b/salak-yaml.cabal
@@ -0,0 +1,51 @@
+cabal-version: 1.12
+name: salak-yaml
+version: 0.2.7
+license: BSD3
+license-file: LICENSE
+copyright: (c) 2018 Daniel YU
+maintainer: Daniel YU <leptonyu@gmail.com>
+author: Daniel YU
+homepage: https://github.com/leptonyu/salak#readme
+synopsis: Configuration Loader for yaml
+category: Library, Configuration
+build-type: Simple
+extra-source-files:
+    README.md
+    test/salak.yml
+
+library
+    exposed-modules:
+        Salak.Load.Yaml
+    hs-source-dirs: src
+    other-modules:
+        Paths_salak_yaml
+    default-language: Haskell2010
+    build-depends:
+        aeson >=1.4.2.0 && <1.5,
+        base >=4.10 && <5,
+        mtl >=2.2.2 && <2.3,
+        salak ==0.2.7,
+        unordered-containers >=0.2.9.0 && <0.3,
+        vector >=0.12.0.2 && <0.13,
+        yaml >=0.11.0.0 && <0.12
+
+test-suite spec
+    type: exitcode-stdio-1.0
+    main-is: Spec.hs
+    hs-source-dirs: test src
+    other-modules:
+        Salak.Load.Yaml
+        Paths_salak_yaml
+    default-language: Haskell2010
+    build-depends:
+        QuickCheck >=2.12.6.1 && <2.14,
+        aeson >=1.4.2.0 && <1.5,
+        base >=4.10 && <5,
+        hspec ==2.*,
+        mtl >=2.2.2 && <2.3,
+        salak ==0.2.7,
+        text >=1.2.3.1 && <1.3,
+        unordered-containers >=0.2.9.0 && <0.3,
+        vector >=0.12.0.2 && <0.13,
+        yaml >=0.11.0.0 && <0.12
diff --git a/src/Salak/Load/Yaml.hs b/src/Salak/Load/Yaml.hs
new file mode 100644
--- /dev/null
+++ b/src/Salak/Load/Yaml.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE TupleSections #-}
+module Salak.Load.Yaml where
+
+import           Control.Monad.IO.Class (MonadIO, liftIO)
+import           Control.Monad.State
+import qualified Data.Aeson             as A
+import qualified Data.HashMap.Strict    as HM
+import qualified Data.Vector            as V
+import qualified Data.Yaml              as Y
+import           Salak
+import           Salak.Load
+
+loadJSON :: Reload -> A.Value -> SourcePack -> SourcePack
+loadJSON name v sp = loadFile name sp $ go v
+  where
+    go (A.Object m) i s = foldl (g2 i) (return s) $ g3 <$> HM.toList m
+    go (A.Array  m) i s = foldl (g2 i) (return s) $ zip (g4 <$> [0..]) $ V.toList m
+    go (A.String m) i s = return $ insertSource (VStr  i m) s
+    go (A.Number m) i s = return $ insertSource (VNum  i m) s
+    go (A.Bool   m) i s = return $ insertSource (VBool i m) s
+    go A.Null       _ s = return s
+    g2 i ms (k, v') = ms >>= updateSources k (go v' i)
+    g3 (k,x) = (simpleSelectors k, x)
+    g4 i     = [SNum i]
+
+loadYaml :: MonadIO m => FilePath -> SourcePackT m ()
+loadYaml file = do
+  v <- liftIO $ Y.decodeFileEither file
+  modify $ \sp -> case v of
+    Left  e -> addErr' (show e) sp
+    Right a -> loadJSON (defReload file $ loadYaml file) a sp
+
+data YAML = YAML
+
+instance HasLoad YAML where
+  loaders _ = (, loadYaml) <$> ["yaml", "yml"]
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DataKinds           #-}
+{-# LANGUAGE DeriveGeneric       #-}
+{-# LANGUAGE FlexibleContexts    #-}
+{-# LANGUAGE OverloadedStrings   #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Main where
+
+import           Control.Monad.Reader
+import           Control.Monad.Writer
+import           Data.Either
+import           Data.List            (intercalate)
+import           Data.Text            (Text, pack, unpack)
+import           GHC.Generics
+import           Salak
+import           Salak.Load.Yaml
+import           Test.Hspec
+import           Test.QuickCheck
+
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "Salak.Yaml"  jsonProperty
+
+newtype SKey = SKey { unKey :: Text } deriving Show
+
+instance Arbitrary SKey where
+  arbitrary = do
+    key <- choose (1,20)
+    vs  <- vectorOf key $ do
+      k <- choose (1,20)
+      v <- vectorOf k $ choose ('a','z')
+      b <- choose (0,10) :: Gen Int
+      if b > 0 then return v else do
+        x <- choose (0,10) :: Gen Int
+        return (v ++ "[" ++ show x ++ "]")
+    return (SKey $ pack $ intercalate "." vs)
+
+data Conf = Conf
+  { name :: String
+  , age  :: Int
+  , male :: Bool
+  , det  :: SubConf
+  } deriving (Eq, Show, Generic)
+
+data SubConf = SubConf
+  { hello :: String } deriving (Eq, Show, Generic)
+
+instance FromProp SubConf where
+  fromProp = SubConf <$> "hello" .?= "yyy"
+
+instance FromProp Conf
+
+jsonProperty = do
+  context "load json" $ do
+    it "salak.yml" $ do
+      loadAndRunSalak (loadYaml "test/salak.yml") $ do
+        as <- require "array"
+        cf <- require "me.icymint.conf"
+        lift $ do
+          as      `shouldBe` ["a","b","d","c" :: String]
+          name cf `shouldBe` "daniel"
+          age  cf `shouldBe` 18
+          male cf `shouldBe` True
+          det  cf `shouldBe` SubConf "abc"
+
+
+
+
+
diff --git a/test/salak.yml b/test/salak.yml
new file mode 100644
--- /dev/null
+++ b/test/salak.yml
@@ -0,0 +1,14 @@
+array:
+  - a
+  - b
+  - d
+  - c
+hello:
+  world
+
+me.icymint.conf:
+  name: daniel
+  age: 18
+  male: yes
+  det:
+    hello: abc
