diff --git a/.DS_Store b/.DS_Store
new file mode 100644
Binary files /dev/null and b/.DS_Store differ
diff --git a/._.DS_Store b/._.DS_Store
new file mode 100644
Binary files /dev/null and b/._.DS_Store differ
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Author name here (c) 2017
+
+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 Author name here 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,27 @@
+# SERVIETTE - SQL JSON API 
+  Library for generating SQL queries from JSON. 
+  Send the json in the expected format and receive raw sql string.
+### Why ?
+- Why not ?
+
+### Expected JSON format
+````
+{
+	"format":1,
+    "action":"SELECT",
+    "selectName": "users",
+    "joinTables":[
+    	  {"tablename":"addresses","field":"userid","operator":"=","withTable":"users", "withField":"id"},
+          {"tablename":"posts","field":"userid","operator":"=","withTable":"users", "withField":"id"}
+    	],
+    "whereCondition":[
+          {"whereTableName":"users","whereField":"id", "whereOperator":">", "whereFieldValue": 1}
+      ]
+}
+````
+
+If `format` is set to 1 you will get raw sql string back, something like this:
+`````
+
+`````
+
diff --git a/serviette.cabal b/serviette.cabal
new file mode 100644
--- /dev/null
+++ b/serviette.cabal
@@ -0,0 +1,35 @@
+name:                serviette
+version:             0.1.0.0
+synopsis:            JSON to Sql raw string or db result in json format
+description:         Use json to query the database and receive results
+homepage:            https://github.com/v0d1ch/serviette#readme
+license:             BSD3
+license-file:        LICENSE
+author:              Sasa Bogicevic 
+maintainer:          brutallesale@gmail.com
+copyright:           2017 Sasa Bogicevic
+category:            Web
+build-type:          Simple
+extra-source-files:  README.md
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Serviette
+                     , ApiDataTypes
+  build-depends:       base >= 4.7 && < 5
+                     , aeson
+                     , bytestring                    >= 0.9        && < 0.11
+                     , text                          >= 0.11       && < 2.0
+                     , generic-deriving
+                     , protolude
+
+
+
+  default-language:    Haskell2010
+
+
+
+source-repository head
+  type:     git
+  location: https://github.com/v0d1ch/serviette
diff --git a/src/ApiDataTypes.hs b/src/ApiDataTypes.hs
new file mode 100644
--- /dev/null
+++ b/src/ApiDataTypes.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards   #-}
+
+-- | This provides types that represent sql query structure
+module ApiDataTypes where
+
+import           Control.Applicative
+import           Control.Monad
+import           Data.Aeson
+import           Data.Aeson.Types
+import           Data.Text           as T
+import           Generics.Deriving
+
+-- | Type declaration
+
+-- | Represents db table name
+data TableName = TableName Text
+  deriving (Show, Generic)
+
+-- | Represents db table column name
+data ColumnName = ColumnName Text
+  deriving (Show, Generic)
+
+-- | Represents operator (=, >, <, like, not like etc.)
+data Operator = Operator Text
+  deriving(Show, Generic)
+
+-- | Represents the main action for the sql query (SELECT,INSERT, UPDATE, DELETE)
+data Action = Action Text
+  deriving (Show, Generic)
+-- | Represents return format (for now this is only raw sql string)
+data Format = Format
+  { getFormat :: Int
+  } deriving (Show, Eq)
+
+-- | Represents Date field value
+type DateVal = Text
+
+-- | Represents field value which can be integer, string or date
+data FieldValue = IntField Int | TextField Text | DateField DateVal deriving (Show, Generic)
+
+-- | Represents join table for the sql query
+data JoinTable = JoinTable
+  { tablename          :: TableName
+  , field              :: ColumnName
+  , operator           :: Operator
+  , withTable          :: TableName
+  , withField          :: ColumnName
+  , whereConditionJoin :: Text
+  } deriving (Show, Generic)
+
+-- | Represents main where condition
+data WhereCondition = WhereCondition
+  { whereTableName  :: TableName
+  , whereField      :: ColumnName
+  , whereOperator   :: Operator
+  , whereFieldValue :: FieldValue
+  } deriving (Show, Generic)
+
+-- | Represents intermediate type for receiving json
+data SqlQuery = SqlQuery
+  { format         :: Int
+  , action         :: Action
+  , selectName     :: TableName
+  , joinTables     :: [JoinTable]
+  , whereCondition :: [WhereCondition]
+  } deriving (Show, Generic)
+
+-- | Represents type that is the result of the json "computation"
+data SqlResultQuery = SqlResultQuery
+  { getAction         :: Action
+  , getSelectTable    :: TableName
+  , getJoins          :: [JoinTable]
+  , getWhereCondition :: [WhereCondition]
+  } deriving (Show, Generic)
+
+
+-- | Instances
+
+-- | Json instance for TableName
+instance FromJSON TableName
+
+-- | Json instance for TableName
+instance ToJSON TableName
+
+-- | aeson instance for Action
+instance FromJSON Action
+
+-- | aeson instance for Action
+instance ToJSON Action
+
+-- | aeson instance for Operator
+instance FromJSON Operator
+
+-- | aeson instance for Operator
+instance ToJSON Operator
+
+-- | aeson instance for JoinTable
+instance FromJSON  JoinTable
+
+-- | aeson instance for JoinTable
+instance ToJSON  JoinTable
+
+-- | aeson instance for ColumnName
+instance FromJSON  ColumnName
+
+-- | aeson instance for ColumnName
+instance ToJSON ColumnName
+
+-- | aeson instance for SqlQuery
+instance FromJSON SqlQuery
+
+-- | aeson instance for SqlQuery
+instance ToJSON SqlQuery
+
+-- | aeson instance for SqlResultQuery
+instance FromJSON SqlResultQuery
+
+-- | aeson instance for SqlResultQuery
+instance ToJSON SqlResultQuery
+
+-- | aeson instance for FieldValue
+instance FromJSON FieldValue
+
+-- | aeson instance for FieldValue
+instance ToJSON FieldValue
+
+-- | aeson instance for WhereCondition
+instance ToJSON   WhereCondition
+
+-- | aeson instance for WhereCondition
+instance FromJSON WhereCondition where
+    parseJSON (Object v)
+        =  WhereCondition
+        <$> v .: "whereTableName"
+        <*> v .: "whereField"
+        <*> v .: "whereOperator"
+        <*> (   IntField  <$> (v .: "whereFieldValue")
+            <|> TextField <$> (v .: "whereFieldValue")
+            <|> DateField <$> (v .: "whereFieldValue")
+
+            )
+    parseJSON _  = mzero
diff --git a/src/Serviette.hs b/src/Serviette.hs
new file mode 100644
--- /dev/null
+++ b/src/Serviette.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE OverloadedStrings #-}
+-- | Define functions needed for Json to Text manipulation
+-- current version supports only raw sql string result
+-- next version will implement database query result in the json format
+-- as well as errors in the json structure if any
+
+module Serviette (SqlQuery, SqlResultQuery, rawSqlStr) where
+
+import           ApiDataTypes
+import           Data.Text    hiding (concat, map)
+
+
+-- | Various Getters
+
+-- | Extracts the action and appends space
+extractAction :: Action -> Text
+extractAction (Action t) = append t  " "
+
+-- | Extracts table name to Text
+extractTableName :: TableName -> Text
+extractTableName (TableName t) = t
+
+-- | Extracts table column name to Text
+extractColumnName :: ColumnName -> Text
+extractColumnName (ColumnName t) = t
+
+-- | Extracts Operator to Text
+extractOperator :: Operator -> Text
+extractOperator (Operator t) = t
+
+-- | Fetches the Action from SqlQuery
+getActionArg :: SqlQuery -> Action
+getActionArg q = action q
+
+-- | Gets the main table that Action is performed on
+getSelectTableArg :: SqlQuery -> TableName
+getSelectTableArg q = selectName q
+
+-- | Retrieves the join list from the SqlQuery
+getJoinTableArg :: SqlQuery -> [JoinTable]
+getJoinTableArg q =  joinTables q
+
+-- | Gets the where condition list
+getWhereConditionArg :: SqlQuery -> [WhereCondition]
+getWhereConditionArg q =  whereCondition q
+
+-- | Retrieves the result Format
+getFormatArg :: SqlQuery -> Int
+getFormatArg q =  getFormat $ Format $ format q
+
+-- | Formats the join table list
+formatJoinStr :: JoinTable -> Text
+formatJoinStr j = Prelude.foldl append "" (" join " : [(extractTableName $ tablename j) , " on " , (extractColumnName $ field j) , " " ,(extractOperator $ operator j) , " " , (extractTableName $ withTable j)  , "." , (extractColumnName $ withField j), " " ])
+
+-- | Fetches field value depending on field type
+formatFieldValue :: FieldValue -> String
+formatFieldValue a =
+  case a of
+    IntField x  -> show x
+    TextField x -> show x
+    DateField x -> show x
+
+-- | Formats WhereCondition to Text
+formatWhereConditionStr :: WhereCondition -> Text
+formatWhereConditionStr j = Prelude.foldl append " " (" where " : [ (extractTableName $ whereTableName j), "." , (extractColumnName $ whereField j) , " " ,(extractOperator $ whereOperator j) , " " , (pack $ formatFieldValue $ whereFieldValue j)])
+
+
+-- | Creates final SqlResultQuery type
+formatToSqlResultQueryType sql = SqlResultQuery (getActionArg sql) (getSelectTableArg sql) (getJoinTableArg sql) (getWhereConditionArg sql)
+
+-- | Returns raw sql query string
+rawSqlStr :: SqlQuery -> Text
+rawSqlStr s =
+  Prelude.foldl append "" [(extractAction $ getAction sql) ,(extractTableName $ getSelectTable sql) , joins , whereConditions ]
+  where joins = Prelude.foldl append "" $ fmap formatJoinStr $ getJoins sql
+        whereConditions = Prelude.foldl append "" $ fmap formatWhereConditionStr $ getWhereCondition sql
+        sql = formatToSqlResultQueryType s
