diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,101 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, 
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/app/Main.hs b/app/Main.hs
new file mode 100644
--- /dev/null
+++ b/app/Main.hs
@@ -0,0 +1,43 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Main where
+  import Lib
+  import System.IO
+  import Graphics.Rendering.Chart
+  import Graphics.Rendering.Chart.Backend.Cairo
+  import Control.Lens
+  import Data.Default.Class
+  import Data.Colour.SRGB
+  import Data.Colour
+
+  main :: IO ()
+  main = do
+    putStrLn "dy/dx = "
+    math <- getLine
+    putStrLn "range - format: (lower, upper): "
+    (lower, upper) :: (Int, Int) <- read <$> getLine
+    putStrLn "estimation size: "
+    s <- read <$> getLine
+
+    let pts = points (lower, upper)
+        field = slopeField math pts s
+
+    let chart = toRenderable layout
+          where
+            color = opaque (sRGB 0.3 0.3 1)
+
+            layout = layout_title .~ "slope field"
+                   $ layout_plots .~ [vectors]
+                   $ def
+
+            vectors = plotVectorField
+                    $ plot_vectors_values .~ field
+                    $ plot_vectors_scale .~ 1
+                    $ plot_vectors_grid .~ []
+                    $ plot_vectors_style . vector_head_style . point_color .~ color
+                    $ plot_vectors_style . vector_line_style . line_color .~ color
+                    $ def
+
+    renderableToFile def "slope-field.png" chart
+    putStrLn "created file slope-field.png"
+    return ()
diff --git a/slope-field.cabal b/slope-field.cabal
new file mode 100644
--- /dev/null
+++ b/slope-field.cabal
@@ -0,0 +1,39 @@
+name:                slope-field
+version:             0.1.0.1
+synopsis:            Visualize mathematical function's slope fields
+description:         Visualize mathematical function's slope fields
+homepage:            https://github.com/mdibaiee/slope-field
+license:             GPL-3
+license-file:        LICENSE
+author:              Mahdi Dibaiee
+maintainer:          mdibaiee@aol.com
+copyright:           2016 Mahdi Dibaiee
+category:            Web
+build-type:          Simple
+-- extra-source-files:
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Lib
+  build-depends:       base >= 4.7 && < 5
+                     , mathexpr >= 0.3.0.0
+                     , data-default-class
+  default-language:    Haskell2010
+
+executable slope-field
+  hs-source-dirs:      app
+  main-is:             Main.hs
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
+  build-depends:       base
+                     , slope-field
+                     , Chart
+                     , Chart-cairo
+                     , lens
+                     , data-default-class
+                     , colour
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/mdibaiee/slope-field
diff --git a/src/Lib.hs b/src/Lib.hs
new file mode 100644
--- /dev/null
+++ b/src/Lib.hs
@@ -0,0 +1,26 @@
+module Lib
+    ( points
+    , slopeField
+    ) where
+      import Numeric.MathExpr
+      import Data.Default.Class
+
+      type Range = (Int, Int)
+
+      points :: Range -> [(Double, Double)]
+      points (lower, upper) =
+        let range = [lower..upper]
+        in [ (fromIntegral x, fromIntegral y) | x <- range, y <- range ]
+
+      slopeField :: String -> [(Double, Double)] -> Double -> [((Double, Double), (Double, Double))]
+      slopeField math pts diff =
+        let d x y = evaluate def math [("x", x), ("y", y)]
+            half = diff / 2
+            res = map (\(x, y) -> ((x - half, y), (half, d x y * diff))) pts
+            inf = 1/0
+            noinf = filter (\((x0, y0), (x, y)) -> x < inf && y < inf && x > -inf && y > -inf) res
+            (minx, miny) = head pts
+            (maxx, maxy) = last pts
+            limitX = min maxx . max minx
+            limitY = min maxy . max miny
+        in map (\((x0, y0), (x1, y1)) -> ((limitX x0, limitY y0), (limitX x1, limitY y1))) noinf
