diff --git a/IBus.hs b/IBus.hs
new file mode 100644
--- /dev/null
+++ b/IBus.hs
@@ -0,0 +1,32 @@
+{-
+    Copyright 2016 Markus Ongyerth
+
+    This file is part of ibus-hs.
+
+    Monky is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Monky is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public License
+    along with Monky.  If not, see <http://www.gnu.org/licenses/>.
+-}
+module IBus
+where
+
+import Data.Maybe (fromJust)
+
+import DBus (parseAddress)
+import DBus.Client (connect, Client)
+
+import IBus.Internal
+
+type IBusClient = Client
+
+iBusConnect :: IO IBusClient
+iBusConnect = connect . fromJust . parseAddress =<< getIBusAddress
diff --git a/IBus/EngineDesc.hs b/IBus/EngineDesc.hs
new file mode 100644
--- /dev/null
+++ b/IBus/EngineDesc.hs
@@ -0,0 +1,114 @@
+{-
+    Copyright 2016 Markus Ongyerth
+
+    This file is part of ibus-hs.
+
+    Monky is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Monky is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public License
+    along with Monky.  If not, see <http://www.gnu.org/licenses/>.
+-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module IBus.EngineDesc
+  ( IBusEngineDesc (..)
+  , getIBusEngine
+  , subscribeToEngine
+  )
+where
+
+import Control.Monad (join)
+import Data.Maybe (fromJust)
+import Data.Word (Word32)
+import DBus
+import DBus.Client
+import IBus
+
+type SignalH = SignalHandler
+
+-- |The Datatype for an IBus Engine description
+data IBusEngineDesc
+  = IBusEngineDesc
+  { engineName :: String
+  , engineLongName :: String
+  , engineDescription :: String
+  , engineLanguage :: String
+  , engineLicense :: String
+  , engineAuthor :: String
+  , engineIcon :: String
+  , engineLayout :: String
+  , engineRank :: Int
+  , engineHotkeys :: String
+  , engineSymbol :: String
+  , engineSetup :: String
+  , engineLayoutVar :: String
+  , engineLayoutOpt :: String
+  , engineVersion :: String
+  , engineDomain :: String
+  , engineIconKey :: String
+  } deriving (Eq, Show)
+
+getBody :: MethodReturn -> Variant
+getBody = fromJust . join . fmap fromVariant . fromVariant . head . methodReturnBody
+
+replyToEngineDesc :: MethodReturn -> Maybe IBusEngineDesc
+replyToEngineDesc m = do
+  let [name, _, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17] = structureItems . fromJust . fromVariant . getBody $m
+  a1 <- fromVariant v1 :: Maybe String
+  a2 <- fromVariant v2 :: Maybe String
+  a3 <- fromVariant v3 :: Maybe String
+  a4 <- fromVariant v4 :: Maybe String
+  a5 <- fromVariant v5 :: Maybe String
+  a6 <- fromVariant v6 :: Maybe String
+  a7 <- fromVariant v7 :: Maybe String
+  a8 <- fromVariant v8 :: Maybe String
+  a9 <- fromVariant v9 :: Maybe Word32
+  a10 <- fromVariant v10 :: Maybe String
+  a11 <- fromVariant v11 :: Maybe String
+  a12 <- fromVariant v12 :: Maybe String
+  a13 <- fromVariant v13 :: Maybe String
+  a14 <- fromVariant v14 :: Maybe String
+  a15 <- fromVariant v15 :: Maybe String
+  a16 <- fromVariant v16 :: Maybe String
+  a17 <- fromVariant v17 :: Maybe String
+  if (fromJust $fromVariant name :: String) == "IBusEngineDesc"
+    then return (IBusEngineDesc a1 a2 a3 a4 a5 a6 a7 a8 (fromIntegral a9) a10 a11 a12 a13 a14 a15 a16 a17)
+    else Nothing
+
+-- |Get the Global IBus engine from the bus
+getIBusEngine :: IBusClient -> IO IBusEngineDesc
+getIBusEngine client = fmap (fromJust . replyToEngineDesc) $
+  call_ client (methodCall "/org/freedesktop/IBus" "org.freedesktop.DBus.Properties" "Get")
+        { methodCallDestination = Just "org.freedesktop.IBus"
+        , methodCallBody = 
+          [ toVariant ("org.freedesktop.IBus" :: String)
+          , toVariant ("GlobalEngine" :: String)
+          ]
+        }
+
+
+getNewOrder :: Signal -> Maybe [String]
+getNewOrder s = do
+  [section, option] <- sequence . map fromVariant . init . signalBody $s:: Maybe [String]
+  vars' <- fromVariant . last . signalBody $s
+  vars <- fromVariant vars' :: Maybe [String]
+  if section == "general" && option == "engines_order"
+    then return vars
+    else Nothing
+
+
+subscribeToEngine :: Client -> ([String] -> IO ()) -> IO SignalH
+subscribeToEngine client f =
+  addMatch client
+    (matchAny {matchPath = Just "/org/freedesktop/IBus/Config"})
+    (\s -> case getNewOrder s of
+      Just x -> f x
+      Nothing -> return ())
diff --git a/IBus/Internal.hs b/IBus/Internal.hs
new file mode 100644
--- /dev/null
+++ b/IBus/Internal.hs
@@ -0,0 +1,78 @@
+{-
+    Copyright 2016 Markus Ongyerth
+
+    This file is part of ibus-hs.
+
+    Monky is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Monky is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public License
+    along with Monky.  If not, see <http://www.gnu.org/licenses/>.
+-}
+{-# LANGUAGE CPP #-}
+module IBus.Internal
+where
+
+
+#if MIN_VERSION_base(4,8,0)
+#else
+import Control.Applicative ((<$>))
+#endif
+
+import System.Environment.XDG.BaseDir (getUserConfigDir)
+import System.Directory (doesFileExist)
+import System.Environment (lookupEnv)
+import Data.List (isPrefixOf)
+import Data.Maybe (fromMaybe)
+
+
+getIBusLocalId :: IO String
+getIBusLocalId = do
+  var <- doesFileExist "/var/lib/dbus/machine-id"
+  if var
+    then init <$> readFile "/var/lib/dbus/machine-id"
+    else do
+      etc <- doesFileExist "/etc/machine-id"
+      if etc
+        then init <$> readFile "/etc/machine-id"
+        else return "machine-id"
+
+
+getIBusSocketPath :: IO String
+getIBusSocketPath = do
+  path <- lookupEnv "IBUS_ADDRESS_FILE"
+  case path of
+    Just x -> return x
+    Nothing -> getPath
+  where
+    getPath :: IO String
+    getPath = do
+      disp <- fromMaybe ":0.0" <$> lookupEnv "DISPLAY"
+      ibusId <- getIBusLocalId
+      let hn = takeWhile (/= ':') disp
+      let host = if hn == [] then "unix" else hn
+      let dpn = takeWhile (/= '.') . tail . dropWhile (/= ':') $disp
+      let fname = ibusId ++ ('-':host) ++ ('-':dpn)
+      cfgD <- getUserConfigDir "ibus/bus/"
+      return (cfgD ++ fname)
+
+
+getIBusAddress :: IO String
+getIBusAddress = do
+  env <- lookupEnv "IBUS_ADDRESS"
+  case env of
+    Just x -> return x
+    Nothing -> do
+      content <- fmap lines . readFile =<< getIBusSocketPath
+      let file = tail . dropWhile (/= '=') .  head . filter ("IBUS_ADDRESS=" `isPrefixOf`) $content
+      -- TODO add the check for running process the original library does
+      --pid <- dropWhile (/= '=') <$> head . filter ("IBUS_DAEMON_PID=" `isPrefixPof`) $content
+      return file
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,165 @@
+                  GNU LESSER 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.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
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/ibus-hs.cabal b/ibus-hs.cabal
new file mode 100644
--- /dev/null
+++ b/ibus-hs.cabal
@@ -0,0 +1,66 @@
+-- Initial monky.cabal generated by cabal init.  For further documentation,
+--  see http://haskell.org/cabal/users-guide/
+
+-- The name of the package.
+name:                ibus-hs
+
+-- The package version.  See the Haskell package versioning policy (PVP)
+-- for standards guiding when and how versions should be incremented.
+-- http://www.haskell.org/haskellwiki/Package_versioning_policy
+-- PVP summary:      +-+------- breaking API changes
+--                   | | +----- non-breaking API additions
+--                   | | | +--- code changes with no API change
+version:             0.0.0.1
+
+-- The ABOVE LINE has to stay AS IS (except for version changes) for the
+-- template to work properly
+
+-- A short (one-line) description of the package.
+-- synopsis:
+
+-- A longer description of the package.
+-- description:
+
+-- The license under which the package is released.
+license:             LGPL-3
+
+-- The file containing the license text.
+license-file:        LICENSE
+
+-- The package author(s).
+author:              Ongy
+
+-- An email address to which users can send suggestions, bug reports, and
+-- patches.
+maintainer:          ongy@ongy.net
+Synopsis: A simple uncomplete ibus api
+Homepage: https://github.com/Ongy/ibus-hs
+description: This is very incomplete. If you need more feel free to contact me.
+-- A copyright notice.
+-- copyright:
+
+category:            System
+
+build-type:          Simple
+
+-- Extra files to be distributed with the package, such as examples or a
+-- README.
+-- extra-source-files:
+
+-- Constraint on the version of Cabal needed to build this package.
+cabal-version:       >=1.10
+
+source-repository head
+  type: git
+  location: https://github.com/Ongy/ibus-hs
+
+library
+  exposed-modules: IBus IBus.EngineDesc
+  other-modules: IBus.Internal
+  
+  build-depends:       base >=4.6.0.1 && <5, dbus, directory, xdg-basedir
+  build-depends:       unix
+
+  ghc-options:         -Wall
+  extra-libraries:     
+  default-language:    Haskell2010
