diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,5 @@
+# Revision history for opench-meteo
+
+## 0.1.0.0  -- 2017-03-25
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2017, Hans Roland Senn
+
+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 Hans Roland Senn 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/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/opench-meteo.cabal b/opench-meteo.cabal
new file mode 100644
--- /dev/null
+++ b/opench-meteo.cabal
@@ -0,0 +1,32 @@
+-- Initial opench-meteo.cabal generated by cabal init.  For further 
+-- documentation, see http://haskell.org/cabal/users-guide/
+
+name:                opench-meteo
+version:             0.1.0.0
+synopsis:            A Haskell implementation of the Swiss Meteo Net data API
+description:         OpenData SMN is a REST API for <http://www.meteoswiss.admin.ch/home/measurement-and-forecasting-systems/land-based-stations/automatisches-messnetz.html SwissMetNet > data.
+                     The module Data.Meteo.Swiss contains the main documentation.
+homepage:            https://github.com/hansroland/opench
+license:             BSD3
+license-file:        LICENSE
+author:              Roland Senn
+maintainer:          rsx@bluewin.ch
+copyright:           Copyright by Roland Senn           
+category:            Data
+build-type:          Simple
+extra-source-files:  ChangeLog.md
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     Data.Meteo.Swiss
+  other-modules:       Data.Meteo.Swiss.Types
+                       , Data.Meteo.Swiss.Urls
+  other-extensions:    OverloadedStrings
+  build-depends:       base >=4.8 && < 4.10
+                       , aeson >=0.8 && <1.1
+                       , data-default >= 0.5 && < 0.8
+                       , text >=1.2 && <1.3
+                       , time >=1.5 && <1.7
+  hs-source-dirs:      src
+  default-language:    Haskell2010
+  ghc-options:         -Wall
diff --git a/src/Data/Meteo/Swiss.hs b/src/Data/Meteo/Swiss.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Meteo/Swiss.hs
@@ -0,0 +1,16 @@
+-- | A Haskell implementation of the Swiss Meteo Net data API
+--
+-- OpenData SMN is a REST API for <http://www.meteoswiss.admin.ch/home/measurement-and-forecasting-systems/land-based-stations/automatisches-messnetz.html SwissMetNet > data.
+-- It's developed in the open supporting the <http://opendata.ch/ OpenData.ch > initiative. 
+-- Free OpenData hosting is provided by <http://netcetera.com/ Netcetera > at <http://data.netcetera.com/smn >.
+--
+-- The actual data for 10 min intervals is provided by opendata.swiss, the Swiss open government data portal.
+
+module Data.Meteo.Swiss 
+  (
+    module Data.Meteo.Swiss.Types
+  , module Data.Meteo.Swiss.Urls
+  ) 
+  where
+import Data.Meteo.Swiss.Types
+import Data.Meteo.Swiss.Urls
diff --git a/src/Data/Meteo/Swiss/Types.hs b/src/Data/Meteo/Swiss/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Meteo/Swiss/Types.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Data types for the Swiss Meteo Net API
+module Data.Meteo.Swiss.Types
+ (
+ -- * Types
+   SmnRecord (..)
+ , SmnStation(..)
+ ) where
+
+import           Data.Aeson
+import qualified Data.Text as T
+import           Data.Time
+import           Data.Default
+import           Data.Aeson.Types (Parser) 
+import           Data.String (IsString)
+import           Control.Monad (mzero)
+
+-- | A Swiss Meteo Network data SmnRecord.
+-- It contains the meteo information of a 10 min interval of a Swiss meteo station.
+-- 
+-- /Note:/ All 'Text' fields may contain empty strings.
+data SmnRecord = SmnRecord 
+  { smnStation       :: Maybe SmnStation   -- ^  Info about the station
+  , smnCode          :: T.Text             -- ^ 3-char all upper-case station code,
+  , smnDateTime      :: Maybe UTCTime      -- ^ Time in UTC,
+  , smnTemperature   :: T.Text             -- ^ Air temperature 2 m above ground; current value,
+  , smnSunshine      :: T.Text             -- ^ Sunshine duration; ten minutes total,
+  , smnPrecipitation :: T.Text             -- ^ Precipitation; ten minutes total,
+  , smnWindDirection :: T.Text             -- ^ Wind direction; ten minutes mean,
+  , smnWindSpeed     :: T.Text             -- ^ Wind speed; ten minutes mean,
+  , smnQnhPressure   :: T.Text             -- ^ Pressure reduced to sea level according to standard atmosphere (QNH); current value,
+  , smnGustPeak      :: T.Text             -- ^ Gust peak (one second); maximum,
+  , smnHumidity      :: T.Text             -- ^ Relative air humidity 2 m above ground; current value,
+  , smnQfePressure   :: T.Text             -- ^ Pressure at station level (QFE); current value,
+  , smnQffPressure   :: T.Text             -- ^ Pressure reduced to sea level (QFF); current value
+  }
+ deriving Show
+
+instance FromJSON SmnRecord where 
+  parseJSON (Object v) = SmnRecord
+    <$> v .:? "station"
+    <*> v .:?! "code" 
+    <*> v .:? "dateTime"
+    <*> v .:?! "temperature"
+    <*> v .:?! "sunshine"
+    <*> v .:?! "precipitation"
+    <*> v .:?! "windDirection"
+    <*> v .:?! "windSpeed"
+    <*> v .:?! "qnhPressure"
+    <*> v .:?! "gustPeak"
+    <*> v .:?! "humidity"
+    <*> v .:?! "qfePressure"
+    <*> v .:?! "qffPressure"
+  parseJSON _ = mzero
+
+instance Default SmnRecord where
+  def = SmnRecord 
+    { smnStation = def
+    , smnCode = "" 
+    , smnDateTime = Nothing
+    , smnTemperature = ""
+    , smnSunshine = ""
+    , smnPrecipitation = ""
+    , smnWindDirection = ""
+    , smnWindSpeed = ""
+    , smnQnhPressure = ""
+    , smnGustPeak = ""
+    , smnHumidity = ""
+    , smnQfePressure = ""
+    , smnQffPressure = ""
+  }
+
+-- | A Swiss Meteo Network data station.
+--
+-- /Note:/ All 'Text' fields may contain empty strings.
+data SmnStation = SmnStation 
+  { staCode          :: T.Text         -- ^ 3-char all upper-case station code,
+  , staName          :: T.Text         -- ^  Original name in local language,
+  , staCh1903Y       :: Maybe Int      -- ^  CH1903 (Swiss grid) y-axis value,
+  , staCh1903X       :: Maybe Int      -- ^  CH1903 (Swiss grid) x-axis value,
+  , staLat           :: Maybe Double   -- ^  WGS84 latitude,
+  , staLng           :: Maybe Double   -- ^  WGS84 longitude,
+  , staElevation     :: Maybe Int      -- ^  meters above sea level
+  }
+ deriving Show
+
+instance FromJSON SmnStation where 
+  parseJSON (Object v) = SmnStation
+    <$> v .:?! "code"
+    <*> v .:?! "name"
+    <*> v .:? "ch1903Y"
+    <*> v .:? "ch1903X"
+    <*> v .:? "lat"
+    <*> v .:? "lng"
+    <*> v .:? "elevation"
+  parseJSON _ = mzero
+
+instance Default SmnStation where
+  def = SmnStation 
+    { staCode = ""
+    , staName = ""
+    , staCh1903Y = Nothing
+    , staCh1903X = Nothing
+    , staLat = Nothing
+    , staLng = Nothing
+    , staElevation = Nothing
+  }
+ 
+-- little helper combinator to parse and convert null values to empty Text strings.
+(.:?!) :: (Data.String.IsString a, FromJSON a) => Object -> T.Text -> Parser a
+(.:?!) v k = v .: k .!= ""
diff --git a/src/Data/Meteo/Swiss/Urls.hs b/src/Data/Meteo/Swiss/Urls.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Meteo/Swiss/Urls.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | URLs for the Swiss Meteo Net API
+module Data.Meteo.Swiss.Urls
+  (
+  -- * Functions that return URLs
+    urlDataAll
+  , urlDataStat
+  , urlDocuStat   
+  )
+where
+
+import qualified Data.Text as T
+import           Data.Monoid ((<>))
+
+-- | Return the URL to retrieve all meteo data from all stations for the last 10 minutes.
+urlDataAll :: T.Text
+urlDataAll = "http://opendata.netcetera.com:80/smn/smn/"
+
+-- | Return the URL to retrieve the meteo data for a given station for the last 10 minutes.
+urlDataStat :: T.Text    -- ^ 3-char all upper-case station code
+  -> T.Text
+urlDataStat stat = "http://opendata.netcetera.com:80/smn/smn/" <> stat
+
+-- | Return the URL to retrieve the documentation sheet for a given station
+urlDocuStat :: T.Text    -- ^ 3-char all upper-case station code 
+  -> T.Text
+urlDocuStat stat = "http://www.meteoschweiz.admin.ch/product/input/smn-stations/docs/" <> stat <> ".pdf"
