diff --git a/COPYING b/COPYING
new file mode 100644
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+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 this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. 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 not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the 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
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library 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 2.1 of the License, or (at your option) any later version.
+
+    This library 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 this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/Graphics/UI/Gtk/ImageView.hs b/Graphics/UI/Gtk/ImageView.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget ImageView
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView (
+    module Graphics.UI.Gtk.ImageView.Enums,
+    module Graphics.UI.Gtk.ImageView.ImageView,
+    module Graphics.UI.Gtk.ImageView.AnimView,
+    module Graphics.UI.Gtk.ImageView.IImageTool,
+    module Graphics.UI.Gtk.ImageView.ImageNav,
+    module Graphics.UI.Gtk.ImageView.ImageScrollWin,
+    module Graphics.UI.Gtk.ImageView.ImageToolDragger,
+    module Graphics.UI.Gtk.ImageView.ImageToolSelector,
+    module Graphics.UI.Gtk.ImageView.Zooms,
+    ) where
+
+import Graphics.UI.Gtk.ImageView.Enums              
+import Graphics.UI.Gtk.ImageView.ImageView              
+import Graphics.UI.Gtk.ImageView.AnimView
+import Graphics.UI.Gtk.ImageView.IImageTool
+import Graphics.UI.Gtk.ImageView.ImageNav
+import Graphics.UI.Gtk.ImageView.ImageScrollWin
+import Graphics.UI.Gtk.ImageView.ImageToolDragger
+import Graphics.UI.Gtk.ImageView.ImageToolSelector
+import Graphics.UI.Gtk.ImageView.Zooms
diff --git a/Graphics/UI/Gtk/ImageView/AnimView.chs b/Graphics/UI/Gtk/ImageView/AnimView.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/AnimView.chs
@@ -0,0 +1,137 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget AnimView
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.AnimView (
+-- * Details
+-- | 'AnimView' subclasses 'ImageView'. It has the same look and feel as its parent but is also capable
+-- of displaying GIF animations.
+
+-- * Tyeps  
+   AnimView,
+   AnimViewClass,
+
+-- * Methods
+   animViewNew,
+   animViewGetAnim,
+   animViewSetAnim,
+   animViewSetIsPlaying,
+   animViewGetIsPlaying,
+   animViewStep,
+
+-- * Signals
+   step,
+   toggleRunning,
+) where
+
+import Control.Monad	(liftM)
+import Data.Maybe    (fromMaybe)
+
+import Graphics.UI.Gtk.Abstract.Object	(makeNewObject)
+import Graphics.UI.Gtk.ImageView.Enums
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{#import Graphics.UI.Gtk.ImageView.Signals#}
+{#import Graphics.UI.Gtk.ImageView.Types#}
+{#import System.Glib.Properties#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Creates a new 'AnimView' with default values. The default values are:
+-- 
+-- * anim : 'Nothing'
+-- * @isPlaying@ : 'False'
+animViewNew = 
+  makeNewObject mkAnimView $
+  liftM (castPtr :: Ptr Widget -> Ptr AnimView) $
+  {# call unsafe gtk_anim_view_new #}
+
+-- | Returns the current animation of the view.
+animViewGetAnim :: AnimViewClass view => view 
+                -> IO PixbufAnimation -- ^ returns the current animation 
+animViewGetAnim view =
+  makeNewGObject mkPixbufAnimation $
+  {#call gtk_anim_view_get_anim #}
+    (toAnimView view)
+
+-- | Sets the pixbuf animation to play, or 'Nothing' to not play any animation.
+-- 
+-- If the animation is a static image or only has one frame, then the static image will be displayed
+-- instead. If more frames are loaded into the animation, then 'AnimView' will automatically animate
+-- to those frames.
+-- 
+-- The effect of this method is analoguous to 'imageViewSetPixbuf'. Fit mode is reset to
+-- 'FitSizeIfLarger' so that the whole area of the animation fits in the view. Three signals are
+-- emitted, first the 'ImageView' will emit 'zoomChanged' and then 'pixbufChanged', second,
+-- 'AnimView' itself will emit 'animChanged'.
+-- 
+-- The default pixbuf animation is 'Nothing'.
+animViewSetAnim :: AnimViewClass view => view
+                -> Maybe PixbufAnimation -- ^ @anim@  A pixbuf animation to play. 
+                -> IO ()
+animViewSetAnim view anim = 
+    {#call gtk_anim_view_set_anim #}
+      (toAnimView view)
+      (fromMaybe (PixbufAnimation nullForeignPtr) anim)
+
+-- | Sets whether the animation should play or not. If there is no current animation this method does not
+-- have any effect.
+animViewSetIsPlaying :: AnimViewClass view => view
+                     -> Bool -- ^ @playing@ 'True' to play the animation, 'False' otherwise 
+                     -> IO ()
+animViewSetIsPlaying view playing =
+  {#call gtk_anim_view_set_is_playing #}
+    (toAnimView view)
+    (fromBool playing)
+
+-- | Returns whether the animation is playing or not. If there is no current animation, this method will
+-- always returns 'False'.
+animViewGetIsPlaying :: AnimViewClass view => view
+                     -> IO Bool -- ^ returns 'True' if an animation is playing, 'False' otherwise. 
+animViewGetIsPlaying view =
+  liftM toBool $
+  {#call gtk_anim_view_get_is_playing #}
+      (toAnimView view)
+    
+-- | Steps the animation one frame forward. If the animation is playing it will be stopped. Will it wrap
+-- around if the animation is at its last frame?
+animViewStep :: AnimViewClass view => view -> IO ()
+animViewStep view =
+  {#call gtk_anim_view_step #}
+      (toAnimView view)
+
+-- | Steps the animation one frame forward. If the animation is playing it will first be stopped. 'step'
+-- is a keybinding signal emitted when GDK_j is pressed on the widget and should not be used by clients
+-- of this library.
+step :: AnimViewClass view => Signal view (IO ())
+step = Signal (connect_NONE__NONE "step")
+
+-- | Stops the animation if it was playing or resumes it, if it was playing. 'toggleRunning' is a
+-- keybinding signal emitted when GDK_p is pressed on the widget and should not be used by clients of
+-- this library.
+toggleRunning :: AnimViewClass view => Signal view (IO ())
+toggleRunning = Signal (connect_NONE__NONE "toggle-running")
+
diff --git a/Graphics/UI/Gtk/ImageView/Enums.chs b/Graphics/UI/Gtk/ImageView/Enums.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/Enums.chs
@@ -0,0 +1,41 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget ImageView
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.Enums (
+-- * Enums
+    ImageTransp (..),
+    HotspotType (..),
+) where
+
+import Control.Monad	(liftM)
+
+import System.Glib.FFI
+import System.Glib.Flags
+
+{# context lib="gtk" prefix="gtk" #}
+
+{# enum ImageTransp {underscoreToCase} deriving(Eq,Bounded,Show,Read) #}
+
+{# enum HotspotType {underscoreToCase} deriving(Eq,Bounded,Show,Read) #}
diff --git a/Graphics/UI/Gtk/ImageView/IImageTool.chs b/Graphics/UI/Gtk/ImageView/IImageTool.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/IImageTool.chs
@@ -0,0 +1,81 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget IImageTool
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.IImageTool (
+-- * Details
+-- | 'IImageTool' is an interface that defines how 'ImageView' interacts with objects that acts as
+-- tools. 'ImageView' delegates many of its most important tasks (such as drawing) to its tool which
+-- carries out all the hard work. The 'ImageView' package comes with two tools; 'ImageToolDragger'
+-- and 'ImageToolSelector', but by implementing your own tool it is possible to extend 'ImageView' to
+-- do stuff its author (thats me) didn't imagine.
+-- 
+-- 'ImageView' uses 'ImageToolDragger' by default, as that tool is he most generally useful
+-- one. However, it is trivial to make it use another tool.
+
+-- * Types
+   IImageTool,
+   IImageToolClass,
+
+-- * Methods
+   iimageToolPixbufChanged,
+) where
+
+import Control.Monad	(liftM)
+import Data.Maybe    (fromMaybe)
+
+import Graphics.UI.Gtk.Abstract.Object	(makeNewObject)
+import Graphics.UI.Gtk.ImageView.Enums
+import Graphics.UI.Gtk.Abstract.Widget	(Rectangle(..))
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{#import Graphics.UI.Gtk.ImageView.Signals#}
+{#import Graphics.UI.Gtk.ImageView.Types#}
+{#import System.Glib.Properties#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Indiate to the tool that either a part of, or the whole pixbuf that the image view shows has
+-- changed. This method is called by the view whenever its pixbuf or its tool changes. That is, when
+-- any of the following methods are used:
+-- 
+--   * 'imageViewSetPixbuf'
+-- 
+-- If the @resetFit@ parameter is 'True', it means that a new pixbuf has been loaded into the view. rect
+-- is a rectangle in image space coordinates that indicates which rectangular region of the pixbufs
+-- pixels that is modified. If rect is 'Nothing', then all of the pixbuf has changed. See also
+-- 'pixbufChanged'.
+iimageToolPixbufChanged :: IImageToolClass tool => tool
+                        -> Bool -- ^ @resetFit@ whether the view is resetting its fit mode or not 
+                        -> Maybe Rectangle -- ^ @rect@      rectangle containing the changed area or 'Nothing'     
+                        -> IO ()
+iimageToolPixbufChanged tool resetFit rect =
+  maybeWith with rect $ \rectPtr -> 
+  {#call gtk_iimage_tool_pixbuf_changed #}
+    (toIImageTool tool)
+    (fromBool resetFit)
+    (castPtr rectPtr)
+
diff --git a/Graphics/UI/Gtk/ImageView/ImageNav.chs b/Graphics/UI/Gtk/ImageView/ImageNav.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/ImageNav.chs
@@ -0,0 +1,103 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget ImageNav
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.ImageNav (
+-- * Details
+-- | 'ImageNav' is a popup window that shows a downscaled preview of the pixbuf that 'ImageView' is
+-- showing. The user can drag around a rectangle which indicates the current view of the image.
+-- 
+-- This class is used by 'ImageScrollWin' itself. It is probably not very useful for clients of this
+-- library.
+-- 
+-- 'ImageNav' has the same keybindings that 'ImageView' has. All keypresses that it receives are
+-- passed along to the view.
+
+-- * Types
+   ImageNav,
+   ImageNavClass,
+
+-- * Methods
+   imageNavNew,
+   imageNavGetPixbuf,
+   imageNavGrab,
+   imageNavRelease,
+   imageNavShowAndGrab,
+) where
+
+import Control.Monad	(liftM)
+import Data.Maybe    (fromMaybe)
+
+import Graphics.UI.Gtk.Abstract.Object	(makeNewObject)
+import Graphics.UI.Gtk.ImageView.Enums
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{#import Graphics.UI.Gtk.ImageView.Signals#}
+{#import Graphics.UI.Gtk.ImageView.Types#}
+{#import System.Glib.Properties#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Creates a new 'ImageNav' for showing thumbnails of the view.
+imageNavNew :: ImageViewClass view => view -> IO ImageNav
+imageNavNew view = 
+  makeNewObject mkImageNav $
+  liftM (castPtr :: Ptr Widget -> Ptr ImageNav) $
+  {# call unsafe gtk_image_nav_new #}
+    (toImageView view)
+
+-- | Returns the downscaled pixbuf of the views pixbuf that this 'ImageNav' shows, or 'Nothing' if that
+-- pixbuf has not been created yet.
+imageNavGetPixbuf :: ImageNavClass nav => nav
+                  -> IO (Maybe Pixbuf) -- ^ returns the pixbuf in the navigation area this image navigator shows, or 'Nothing' if none exist.
+imageNavGetPixbuf nav = 
+  maybeNull (makeNewGObject mkPixbuf) $
+  {#call gtk_image_nav_get_pixbuf #}
+    (toImageNav nav)
+
+-- |
+imageNavGrab :: ImageNavClass nav => nav -> IO ()
+imageNavGrab nav =
+  {#call gtk_image_nav_grab #}
+    (toImageNav nav)
+
+-- |
+imageNavRelease :: ImageNavClass nav => nav -> IO ()
+imageNavRelease nav =
+  {#call gtk_image_nav_release #}
+    (toImageNav nav)
+
+-- | Show the 'ImageNav' centered around the point (@centerX@, @centerY@) and grab mouse and keyboard
+-- events. The grab continues until a button release event is received which causes the widget to hide.
+imageNavShowAndGrab :: ImageNavClass nav => nav 
+                    -> Int -- ^ @centerX@ x coordinate of center position 
+                    -> Int -- ^ @centerY@ y coordinate of center position 
+                    -> IO ()
+imageNavShowAndGrab nav centerX centerY =
+  {#call gtk_image_nav_show_and_grab #}
+    (toImageNav nav)
+    (fromIntegral centerX)
+    (fromIntegral centerY)
diff --git a/Graphics/UI/Gtk/ImageView/ImageScrollWin.chs b/Graphics/UI/Gtk/ImageView/ImageScrollWin.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/ImageScrollWin.chs
@@ -0,0 +1,65 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget ImageScrollWin
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.ImageScrollWin (
+-- * Details
+-- | 'ImageScrollWin' provides a widget similar in appearance to 'ScrollableWindow' that is more
+-- suitable for displaying 'ImageView''s.
+
+-- * Types  
+   ImageScrollWin,
+   ImageScrollWinClass,
+
+-- * Methods
+   imageScrollWinNew,
+) where
+
+import Control.Monad	(liftM)
+import Data.Maybe    (fromMaybe)
+
+import Graphics.UI.Gtk.Abstract.Object	(makeNewObject)
+import Graphics.UI.Gtk.ImageView.Enums
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{#import Graphics.UI.Gtk.ImageView.Signals#}
+{#import Graphics.UI.Gtk.ImageView.Types#}
+{#import System.Glib.Properties#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Creates a new 'ImageScrollWin' containing the 'ImageView'.
+-- 
+-- The widget is built using four subwidgets arranged inside a 'Table' with two columns and two
+-- rows. Two scrollbars, one navigator button (the decorations) and one 'ImageView'.
+-- 
+-- When the 'ImageView' fits inside the window, the decorations are hidden.
+imageScrollWinNew :: ImageViewClass view => view -> IO ImageScrollWin
+imageScrollWinNew view = 
+  makeNewObject mkImageScrollWin $
+  liftM (castPtr :: Ptr Widget -> Ptr ImageScrollWin) $
+  {# call unsafe gtk_image_scroll_win_new #}
+    (toImageView view)
diff --git a/Graphics/UI/Gtk/ImageView/ImageToolDragger.chs b/Graphics/UI/Gtk/ImageView/ImageToolDragger.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/ImageToolDragger.chs
@@ -0,0 +1,58 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget ImageToolDragger
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.ImageToolDragger (
+-- * Details
+-- | 'ImageToolDragger' is the default image tool for 'ImageView'. Its only feature is that it can drag
+-- the image around.
+
+-- * Types  
+   ImageToolDragger,
+   ImageToolDraggerClass,
+
+-- * Methods
+) where
+import Control.Monad	(liftM)
+import Data.Maybe    (fromMaybe)
+
+import Graphics.UI.Gtk.Abstract.Object	(makeNewObject)
+import Graphics.UI.Gtk.ImageView.Enums
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{#import Graphics.UI.Gtk.ImageView.Signals#}
+{#import Graphics.UI.Gtk.ImageView.Types#}
+{#import System.Glib.Properties#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Creates and returns a new dragger tool.
+imageToolDraggerNew :: ImageViewClass view => view -> IO ImageToolDragger
+imageToolDraggerNew view = 
+  makeNewGObject mkImageToolDragger $
+  liftM (castPtr :: Ptr IImageTool -> Ptr ImageToolDragger) $
+  {# call unsafe gtk_image_tool_dragger_new #}
+    (toImageView view)
diff --git a/Graphics/UI/Gtk/ImageView/ImageToolSelector.chs b/Graphics/UI/Gtk/ImageView/ImageToolSelector.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/ImageToolSelector.chs
@@ -0,0 +1,124 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget ImageToolSelector
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.ImageToolSelector (
+-- * Details
+-- | 'ImageToolSelector' is a tool for selecting areas of an image. It is useful for cropping an image,
+-- for example. The tool is an implementor of the 'IImageTool' inteface which means that it can be
+-- plugged into a 'ImageView' by using the 'imageViewSetTool' method.
+-- 
+-- 'ImageToolSelector' changes the default display of the 'ImageView'. It darkens down the unselected
+-- region of the image which provides a nice effect and makes it clearer what part of the image that is
+-- currently selected. Unfortunately, this effect is somewhat incompatible with how 'ImageNav' behaves
+-- because that widget will show the image without darkening it.
+-- 
+-- The tool also changes the default behaviour of the mouse. When a 'ImageToolSelector' is set on a
+-- 'ImageView', mouse presses do not "grab" the image and you cannot scroll by dragging. Instead mouse
+-- presses and dragging is used to resize and move the selection rectangle. When the mouse drags the
+-- selection rectangle to the border of the widget, the view autoscrolls which is a convenient way for
+-- a user to position the selection.
+-- 
+-- Please note that 'ImageToolSelector' draws the image in two layers. One darkened and the selection
+-- rectangle in normal luminosity. Because it uses two draw operations instead one one like
+-- 'ImageToolDragger' does, it is significantly slower than that tool. Therefore, it makes sense for a
+-- user of this library to set the interpolation to 'InterpNearest' when using this tool to ensure
+-- that performance is acceptable to the users of the program.
+
+-- * Types  
+   ImageToolSelector,
+   ImageToolSelectorClass,
+
+-- * Methods
+   imageToolSelectorNew,
+   imageToolSelectorGetSelection,
+   imageToolSelectorSetSelection,
+
+-- * Signals
+   selectionChanged,
+) where
+
+import Control.Monad	(liftM)
+import Data.Maybe    (fromMaybe)
+
+import Graphics.UI.Gtk.Abstract.Object	(makeNewObject)
+import Graphics.UI.Gtk.ImageView.Enums
+import Graphics.UI.Gtk.Abstract.Widget	(Rectangle(..))
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{#import Graphics.UI.Gtk.ImageView.Signals#}
+{#import Graphics.UI.Gtk.ImageView.Types#}
+{#import System.Glib.Properties#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Creates a new selector tool for the specified view with default values. The default values are:
+-- 
+-- * selection : (0, 0) - [0, 0]
+imageToolSelectorNew :: ImageViewClass view => view -> IO ImageToolSelector
+imageToolSelectorNew view = 
+  makeNewGObject mkImageToolSelector $
+  liftM (castPtr :: Ptr IImageTool -> Ptr ImageToolSelector) $
+  {# call unsafe gtk_image_tool_selector_new #}
+    (toImageView view)
+
+-- | Fills in rect with the current selection rectangle. If either the width or the height of rect is
+-- zero, then nothing is selected and the selection should be considered inactive. See
+-- 'selectionChanged' for an example.
+imageToolSelectorGetSelection :: ImageToolSelectorClass selector => selector -> IO Rectangle
+imageToolSelectorGetSelection selector =
+    alloca $ \rPtr -> do
+      {#call gtk_image_tool_selector_get_selection #}
+        (toImageToolSelector selector)
+        (castPtr rPtr)
+      peek rPtr
+
+-- | Sets the selection rectangle for the tool. Setting this attribute will cause the widget to
+-- immediately repaint itself if its view is realized.
+-- 
+-- This method does nothing under the following circumstances:
+-- 
+--   * If the views pixbuf is 'Nothing'.  
+--   * If rect is wider or taller than the size of the pixbuf 
+--   * If rect equals the current selection rectangle.
+-- 
+-- If the selection falls outside the pixbufs area, its position is moved so that it is within the
+-- pixbuf.
+-- 
+-- Calling this method causes the 'selectionChanged' signal to be emitted.
+-- 
+-- The default selection is (0,0) - [0,0].
+imageToolSelectorSetSelection :: ImageToolSelectorClass selector => selector -> Rectangle -> IO ()
+imageToolSelectorSetSelection selector rect =
+  with rect $ \ rectPtr -> 
+  {#call gtk_image_tool_selector_set_selection #}
+    (toImageToolSelector selector)
+    (castPtr rectPtr)
+
+-- | The 'selectionChanged' signal is emitted when the selection rectangle on the selector is moved or
+-- resized. It is inteded to be used by applications that wants to print status information.
+selectionChanged :: ImageToolSelectorClass selector => Signal selector (IO ())
+selectionChanged = Signal (connect_NONE__NONE "selection-changed")
diff --git a/Graphics/UI/Gtk/ImageView/ImageView.chs b/Graphics/UI/Gtk/ImageView/ImageView.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/ImageView.chs
@@ -0,0 +1,504 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget ImageView
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.ImageView (
+-- * Details
+-- | 'ImageView' is a full-featured general purpose image viewer widget for GTK. It provides a
+-- scrollable, zoomable pane in which a pixbuf can be displayed.
+
+-- * Types  
+   ImageView,
+   ImageViewClass,
+
+-- * Methods
+   imageViewNew,
+   imageViewGetViewport,
+   imageViewGetDrawRect,
+   imageViewGetCheckColors,
+   imageViewImageToWidgetRect,
+   imageViewSetOffset,
+   imageViewSetTransp,
+   imageViewGetFitting,
+   imageViewSetFitting,
+   imageViewGetPixbuf,
+   imageViewSetPixbuf,
+   imageViewGetZoom,
+   imageViewSetZoom,
+   imageViewSetBlackBg,
+   imageViewGetBlackBg,
+   imageViewSetShowFrame,
+   imageViewGetShowFrame,
+   imageViewSetInterpolation,
+   imageViewGetInterpolation,
+   imageViewSetShowCursor,
+   imageViewGetShowCursor,
+   imageViewSetTool,
+   imageViewGetTool,
+   imageViewZoomIn,
+   imageViewZoomOut,
+   imageViewDamagePixels,
+   imageViewLibraryVersion,
+
+-- * Signals
+   mouseWheelScroll,
+   pixbufChanged,
+   scroll,
+   setFitting,
+   setScrollAdjustments,
+   setZoom,
+   zoomChanged,
+   zoomIn,
+   zoomOut,
+) where
+
+import Control.Monad	(liftM)
+import Control.Monad.Reader ( runReaderT )
+import Data.Maybe    (fromMaybe)
+
+import Graphics.UI.Gtk.Abstract.Object	(makeNewObject)
+import Graphics.UI.Gtk.ImageView.Enums
+import Graphics.UI.Gtk.Abstract.Widget	(Rectangle(..))
+import Graphics.UI.Gtk.Gdk.Pixbuf (InterpType (..))
+import Graphics.UI.Gtk.Abstract.Range (ScrollType (..))
+import Graphics.UI.Gtk.Gdk.EventM (ScrollDirection (..))
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{#import Graphics.UI.Gtk.ImageView.Signals#}
+{#import Graphics.UI.Gtk.ImageView.Types#}
+{#import System.Glib.Properties#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Creates a new image view with default values. The default values are:
+-- 
+-- * black bg : 'False' 
+-- * fitting : 'True' 
+-- * image tool : a 'ImageToolDragger' instance 
+-- * interpolation mode : 'InterpBilinear' 
+-- * offset : (0, 0) * pixbuf : 'Nothing' 
+-- * show cursor: 'True' 
+-- * show frame : 'True' 
+-- * transp : 'ImageTranspGrid' 
+-- * zoom : 1.0
+imageViewNew :: IO ImageView
+imageViewNew = 
+  makeNewObject mkImageView $
+  liftM (castPtr :: Ptr Widget -> Ptr ImageView) $
+  {# call unsafe gtk_image_view_new #}
+
+-- | Fills in the rectangle with the current viewport. If pixbuf is 'Nothing', there is no viewport, rect is
+-- left untouched and 'False' is returned. If the view is not allocated, the rectangles coordinates are
+-- set to the views offset and its width and height to zero.
+-- 
+-- The current viewport is defined as the rectangle, in zoomspace coordinates as the area of the loaded
+-- pixbuf the 'ImageView' is currently showing.
+imageViewGetViewport :: ImageViewClass view => view 
+                     -> IO (Maybe Rectangle)
+imageViewGetViewport view =
+  alloca $ \rPtr -> do
+    success <- liftM toBool $
+              {#call gtk_image_view_get_viewport #}
+                (toImageView view)
+                (castPtr rPtr)
+    if success
+       then liftM Just $ peek rPtr
+       else return Nothing
+
+-- | Get the rectangle in the widget where the pixbuf is painted.
+-- 
+-- For example, if the widgets allocated size is 100, 100 and the pixbufs size is 50, 50 and the zoom
+-- factor is 1.0, then the pixbuf will be drawn centered on the widget. rect will then be
+-- (25,25)-[50,50].
+-- 
+-- If the view is not allocated, then the rectangle will be set to (0,0)-[0,0] and 'True' is returned.
+-- 
+-- This method is useful when converting from widget to image or zoom space coordinates.
+imageViewGetDrawRect :: ImageViewClass view => view
+                     -> IO (Maybe Rectangle)
+imageViewGetDrawRect view = 
+  alloca $ \rPtr -> do
+    success <- liftM toBool $
+              {#call gtk_image_view_get_draw_rect #}
+                (toImageView view)
+                (castPtr rPtr)
+    if success
+       then liftM Just $ peek rPtr
+       else return Nothing
+
+-- | Reads the two colors used to draw transparent parts of images with an alpha channel. Note that if
+-- the transp setting of the view is 'ImageTranspBackground' or 'ImageTranspColor', then both
+-- colors will be equal.
+imageViewGetCheckColors :: ImageViewClass view => view
+                        -> IO (Int, Int)
+imageViewGetCheckColors view =
+  alloca $ \xPtr ->
+  alloca $ \yPtr -> do
+  {# call unsafe gtk_image_view_get_check_colors #}
+    (toImageView view)
+    xPtr
+    yPtr
+  x <- peek xPtr
+  y <- peek yPtr
+  return (fromIntegral x, fromIntegral y)
+
+-- | Convert a rectangle in image space coordinates to widget space coordinates. If the view is not
+-- realized, or if it contains no pixbuf, then the conversion was unsuccessful, 'False' is returned and
+-- @rectOut@ is left unmodified.
+-- 
+-- The size of @rectOut@ is rounded up. For example, if the zoom factor is 0.25 and the width of the
+-- input rectangle is 2, then its with in widget space coordinates is 0.5 which is rounded up to 1.
+-- 
+-- Note that this function may return a rectangle that is not visible on the widget.
+imageViewImageToWidgetRect :: ImageViewClass view => view
+                           -> Rectangle -- ^ @rectIn@  a 'Rectangle' in image space coordinates to convert        
+                           -> Rectangle -- ^ @rectOut@ a 'Rectangle' to fill in with the widget space coordinates 
+                           -> IO Bool -- ^ returns  'True' if the conversion was successful, 'False' otherwise      
+imageViewImageToWidgetRect view rectIn rectOut = 
+  with rectIn $ \ rectInPtr -> 
+  with rectOut $ \ rectOutPtr -> 
+  liftM toBool $
+  {#call gtk_image_view_image_to_widget_rect #}
+    (toImageView view)
+    (castPtr rectInPtr)
+    (castPtr rectOutPtr)
+  
+-- | Sets the offset of where in the image the 'ImageView' should begin displaying image data.
+-- 
+-- The offset is clamped so that it will never cause the 'ImageView' to display pixels outside the
+-- pixbuf. Setting this attribute causes the widget to repaint itself if it is realized.
+-- 
+-- If invalidate is 'True', the views entire area will be invalidated instead of redrawn immediately. The
+-- view is then queued for redraw, which means that additional operations can be performed on it before
+-- it is redrawn.
+-- 
+-- The difference can sometimes be important like when you are overlaying data and get flicker or
+-- artifacts when setting the offset. If that happens, setting invalidate to 'True' could fix the
+-- problem. See the source code to 'ImageToolSelector' for an example.
+-- 
+-- Normally, invalidate should always be 'False' because it is much faster to repaint immedately than
+-- invalidating.
+imageViewSetOffset :: ImageViewClass view => view
+                   -> Double -- ^ @x@          X-component of the offset in zoom space coordinates.  
+                   -> Double -- ^ @y@          Y-component of the offset in zoom space coordinates.  
+                   -> Bool -- ^ @invalidate@ whether to invalidate the view or redraw immediately. 
+                   -> IO ()
+imageViewSetOffset view x y invalidate = 
+  {#call gtk_image_view_set_offset #}
+    (toImageView view)
+    (realToFrac x)
+    (realToFrac y)
+    (fromBool invalidate)
+
+-- | Sets how the view should draw transparent parts of images with an alpha channel. If transp is
+-- 'ImageTranspColor', the specified color will be used. Otherwise the @transpColor@ argument is
+-- ignored. If it is 'ImageTranspBackground', the background color of the widget will be used. If
+-- it is 'ImageTranspGrid', then a grid with light and dark gray boxes will be drawn on the
+-- transparent parts.
+-- 
+-- Calling this method causes the widget to immediately repaint. It also causes the 'pixbufChanged'
+-- signal to be emitted. This is done so that other widgets (such as 'ImageNav') will have a chance to
+-- render a view of the pixbuf with the new transparency settings.
+-- 
+-- The default values are:
+-- 
+--   * transp : 'ImageTranspGrid' 
+--   * @transpColor@ : 0x000000
+imageViewSetTransp :: ImageViewClass view => view
+                   -> ImageTransp -- ^ @transp@       The transparency type to use when drawing transparent images.
+                   -> Int -- ^ @transpColor@ Color to use when drawing transparent images.                
+                   -> IO ()
+imageViewSetTransp view transp transpColor =
+  {#call gtk_image_view_set_transp #}
+    (toImageView view)
+    ((fromIntegral . fromEnum) transp)
+    (fromIntegral transpColor)
+
+-- | Returns the fitting setting of the view.
+imageViewGetFitting :: ImageViewClass view => view 
+                    -> IO Bool -- ^ returns 'True' if the view is fitting the image, 'False' otherwise. 
+imageViewGetFitting view =
+  liftM toBool $
+  {#call gtk_image_view_get_fitting #}
+    (toImageView view)
+
+-- | Sets whether to fit or not. If 'True', then the view will adapt the zoom so that the whole pixbuf is
+-- visible.
+-- 
+-- Setting the fitting causes the widget to immediately repaint itself.
+-- 
+-- Fitting is by default 'True'.
+imageViewSetFitting :: ImageViewClass view => view
+                    -> Bool -- ^ @fitting@ whether to fit the image or not 
+                    -> IO ()
+imageViewSetFitting view fitting =
+  {#call gtk_image_view_set_fitting #}
+    (toImageView view)
+    (fromBool fitting)
+
+-- | Returns the pixbuf this view shows.
+imageViewGetPixbuf :: ImageViewClass view => view
+                   -> IO Pixbuf -- ^ returns The pixbuf this view shows. 
+imageViewGetPixbuf view =
+  makeNewGObject mkPixbuf $
+  {#call gtk_image_view_get_pixbuf #}
+    (toImageView view)  
+
+-- | Sets the pixbuf to display, or 'Nothing' to not display any pixbuf. Normally, @resetFit@ should be 'True'
+-- which enables fitting.  Which means that, initially, the whole pixbuf will be shown.
+-- 
+-- Sometimes, the fit mode should not be reset. For example, if 'ImageView' is showing an animation,
+-- it would be bad to reset the fit mode for each new frame. The parameter should then be 'False' which
+-- leaves the fit mode of the view untouched.
+-- 
+-- This method should not be used if merely the contents of the pixbuf has changed. See
+-- 'imageViewDamagePixels' for that.
+-- 
+-- If @resetFit@ is 'True', the 'zoomChanged' signal is emitted, otherwise not. The 'pixbufChanged'
+-- signal is also emitted.
+-- 
+-- The default pixbuf is 'Nothing'.
+imageViewSetPixbuf :: ImageViewClass view => view
+                   -> Maybe Pixbuf -- ^ @pixbuf@    The pixbuf to display or 'Nothing'
+                   -> Bool -- ^ @resetFit@ Whether to reset fitting or not. 
+                   -> IO ()
+imageViewSetPixbuf view pixbuf resetFit = 
+    {#call gtk_image_view_set_pixbuf #}
+    (toImageView view)      
+    (fromMaybe (Pixbuf nullForeignPtr) pixbuf)
+    (fromBool resetFit)
+
+-- | Get the current zoom factor of the view.
+imageViewGetZoom :: ImageViewClass view => view
+                 -> IO Double -- ^ returns the current zoom factor 
+imageViewGetZoom view =
+  liftM realToFrac $
+  {#call gtk_image_view_get_zoom #}
+    (toImageView view)
+
+-- | Sets the zoom of the view.
+-- 
+-- Fitting is always disabled after this method has run. The 'zoomChanged' signal is unconditionally
+-- emitted.
+-- 
+-- The default value is 1.0.
+imageViewSetZoom :: ImageViewClass view => view
+                 -> Double -- ^ @zoom@ the new zoom factor 
+                 -> IO ()
+imageViewSetZoom view zoom =
+  {#call gtk_image_view_set_zoom #}
+    (toImageView view)
+    (realToFrac zoom)
+
+-- | If 'True', the view uses a black background. If 'False', the view uses the default (normally gray)
+-- background.
+-- 
+-- The default value is 'False'.
+imageViewSetBlackBg :: ImageViewClass view => view
+                    -> Bool -- ^ @blackBg@ Whether to use a black background or not. 
+                    -> IO ()
+imageViewSetBlackBg view blackBg =
+  {#call gtk_image_view_set_black_bg #}
+    (toImageView view)  
+    (fromBool blackBg)
+
+-- | Returns whether the view renders the widget on a black background or not.
+imageViewGetBlackBg :: ImageViewClass view => view
+                    -> IO Bool  -- ^ returns 'True' if a black background is used, otherwise 'False'. 
+imageViewGetBlackBg view =
+  liftM toBool $
+  {#call gtk_image_view_get_black_bg #}
+    (toImageView view)
+
+-- | Sets whether to draw a frame around the image or not. When 'True', a one pixel wide frame is shown
+-- around the image. Setting this attribute causes the widget to immediately repaint itself.
+-- 
+-- The default value is 'True'.
+imageViewSetShowFrame :: ImageViewClass view => view 
+                      -> Bool -- ^ @showFrame@ whether to show a frame around the pixbuf or not 
+                      -> IO ()
+imageViewSetShowFrame view showFrame =
+  {#call gtk_image_view_set_show_frame #}
+    (toImageView view)  
+    (fromBool showFrame)
+
+-- | Returns whether a one pixel frame is drawn around the pixbuf or not.
+imageViewGetShowFrame :: ImageViewClass view => view
+                      -> IO Bool
+imageViewGetShowFrame view =
+  liftM toBool $
+  {#call gtk_image_view_get_show_frame #}
+    (toImageView view)  
+
+-- | Sets the interpolation mode of how the view. 'InterpHyper' is the slowest, but produces the best
+-- results.  'InterpNearest' is the fastest, but provides bad rendering quality. 'InterpBilinear'
+-- is a good compromise.
+-- 
+-- Setting the interpolation mode causes the widget to immediately repaint itself.
+-- 
+-- The default interpolation mode is 'InterpBilinear'.
+imageViewSetInterpolation :: ImageViewClass view => view
+                          -> InterpType -- ^ @interp@ The interpolation to use. One of 'InterpNearest', 'InterpBilinear' and 'InterpHyper'.
+                          -> IO ()
+imageViewSetInterpolation view interp =
+  {#call gtk_image_view_set_interpolation #}
+    (toImageView view)  
+    ((fromIntegral . fromEnum) interp)
+
+-- | Returns the current interpolation mode of the view.
+imageViewGetInterpolation :: ImageViewClass view => view
+                          -> IO InterpType
+imageViewGetInterpolation view =
+  liftM (toEnum . fromIntegral) $
+  {#call gtk_image_view_get_interpolation #}
+    (toImageView view)
+
+-- | Sets whether to show the mouse cursor when the mouse is over the widget or not. Hiding the cursor is
+-- useful when the widget is fullscreened.
+-- 
+-- The default value is 'True'.
+imageViewSetShowCursor :: ImageViewClass view => view
+                       -> Bool -- ^ @showCursor@ whether to show the cursor or not 
+                       -> IO ()
+imageViewSetShowCursor view showCursor =
+  {#call gtk_image_view_set_show_cursor #}
+    (toImageView view)
+    (fromBool showCursor)
+
+-- | Returns whether to show the mouse cursor when the mouse is over the widget or not.
+imageViewGetShowCursor :: ImageViewClass view => view
+                       -> IO Bool -- ^ returns 'True' if the cursor is shown, otherwise 'False'. 
+imageViewGetShowCursor view =
+  liftM toBool $
+  {#call gtk_image_view_get_show_cursor #}
+    (toImageView view)
+
+-- | Set the image tool to use. If the new tool is the same as the current tool, then nothing will be
+-- done. Otherwise 'iimageToolPixbufChanged' is called so that the tool has a chance to generate
+-- initial data for the pixbuf.
+-- 
+-- Setting the tool causes the widget to immediately repaint itself.
+-- 
+-- The default image tool is a 'ImageToolDragger' instance. See also 'IImageTool'.
+imageViewSetTool :: ImageViewClass view => view
+                 -> IImageTool -- ^ @tool@ The image tool to usek (must not be 'Nothing') 
+                 -> IO ()
+imageViewSetTool view tool =
+  {#call gtk_image_view_set_tool #}
+    (toImageView view)    
+    tool
+
+-- | Gets the image tool 'ImageView' uses for rendering and handling input events.
+imageViewGetTool :: ImageViewClass view => view
+                 -> IO IImageTool
+imageViewGetTool view =
+  makeNewGObject mkIImageTool $
+  {#call gtk_image_view_get_tool #}
+    (toImageView view)
+
+-- | Zoom in the view one step. Calling this method causes the widget to immediately repaint itself.
+imageViewZoomIn :: ImageViewClass view => view -> IO ()
+imageViewZoomIn view =
+  {#call gtk_image_view_zoom_in #}
+    (toImageView view)
+
+-- | Zoom out the view one step. Calling this method causes the widget to immediately repaint itself.
+imageViewZoomOut :: ImageViewClass view => view -> IO ()
+imageViewZoomOut view =
+  {#call gtk_image_view_zoom_out #}
+    (toImageView view)
+
+-- | Mark the pixels in the rectangle as damaged. That the pixels are damaged, means that they have been
+-- modified and that the view must redraw them to ensure that the visible part of the image corresponds
+-- to the pixels in that image. Calling this method emits the 'pixbufChanged' signal.
+-- 
+-- This method must be used when modifying the image data:
+-- 
+--     // Drawing something cool in the area 20,20 - 60,60 here...  ...  // And force an update
+--     'imageViewDamagePixels (View, &(Gdkrectangle){20, 20, 60, 60})';
+-- 
+-- If the whole pixbuf has been modified then rect should be 'Nothing' to indicate that a total update is
+-- needed.
+-- | See also 'imageViewSetPixbuf'.
+imageViewDamagePixels :: ImageViewClass view => view
+                      -> Maybe Rectangle -- ^ @rect@ rectangle in image space coordinates to mark as damaged or 'Nothing', to mark the whole pixbuf as damaged.
+                      -> IO ()
+imageViewDamagePixels view rect =
+    maybeWith with rect $ \rectPtr ->
+    {#call gtk_image_view_damage_pixels #}
+      (toImageView view)
+      (castPtr rectPtr)
+
+-- | Returns a string with the format "major.minor.micro" which denotes the runtime version of
+-- 'ImageView' being used.
+imageViewLibraryVersion :: IO String
+imageViewLibraryVersion = 
+  {#call gtk_image_view_library_version #}
+  >>= peekUTFString
+
+-- | The 'mouseWheelScroll' signal is emitted when the mouse wheel is scrolled on the view and
+-- 'ControlMask' is not held down.
+mouseWheelScroll :: ImageViewClass view => Signal view (ScrollDirection -> IO ())
+mouseWheelScroll = Signal (connect_ENUM__NONE "mouse-wheel-scroll")
+
+-- | The 'pixbufChanged' signal is emitted when the pixbuf the image view shows is changed and when its
+-- image data is changed.  Listening to this signal is useful if you, for example, have a label that
+-- displays the width and height of the pixbuf in the view.
+pixbufChanged :: ImageViewClass view => Signal view (IO ())
+pixbufChanged = Signal (connect_NONE__NONE "pixbuf-changed")
+
+-- | The 'scroll' signal is a keybinding signal emitted when a key is used to scroll the view. The signal
+-- should not be used by clients of this library.
+scroll :: ImageViewClass view => Signal view (ScrollType -> ScrollType -> IO ())
+scroll = Signal (connect_ENUM_ENUM__NONE "scroll")
+
+-- |
+setFitting :: ImageViewClass view => Signal view (Int -> IO ())
+setFitting = Signal (connect_INT__NONE "set-fitting")
+
+-- |
+setScrollAdjustments :: ImageViewClass view => Signal view (Adjustment -> Adjustment -> IO ())
+setScrollAdjustments = Signal (connect_OBJECT_OBJECT__NONE "set-scroll-adjustments")
+
+-- | The 'setZoom' signal is a keybinding signal emitted when GDK_1, GDK_2 or GDK_3 is pressed on the
+-- widget which causes the zoom to be set to 100%, 200% or 300%. The signal should not be used by
+-- clients of this library.
+setZoom :: ImageViewClass view => Signal view (Double -> IO ())
+setZoom = Signal (connect_DOUBLE__NONE "set-zoom")
+
+-- | The 'zoomChanged' signal is emitted when the zoom factor of the view changes. Listening to this
+-- signal is useful if, for example, you have a label that displays the zoom factor of the view. Use
+-- 'imageViewGetZoom' to retrieve the value.
+zoomChanged :: ImageViewClass view => Signal view (IO ())
+zoomChanged = Signal (connect_NONE__NONE "zoom-changed")
+
+-- | 
+zoomIn :: ImageViewClass view => Signal view (IO ())
+zoomIn = Signal (connect_NONE__NONE "zoom-in")
+
+-- | 
+zoomOut :: ImageViewClass view => Signal view (IO ())
+zoomOut = Signal (connect_NONE__NONE "zoom-out")
diff --git a/Graphics/UI/Gtk/ImageView/Signals.chs b/Graphics/UI/Gtk/ImageView/Signals.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/Signals.chs
@@ -0,0 +1,142 @@
+{-# OPTIONS_HADDOCK hide #-}
+-- -*-haskell-*-
+-- -------------------- automatically generated file - do not edit ------------
+--  Callback installers for the GIMP Toolkit (GTK) Binding for Haskell
+--
+--  Author : Axel Simon
+--
+--  Created: 1 July 2000
+--
+--  Copyright (C) 2000-2005 Axel Simon
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- #hide
+
+-- These functions are used to connect signals to widgets. They are auto-
+-- matically created through HookGenerator.hs which takes a list of possible
+-- function signatures that are included in the GTK sources (gtkmarshal.list).
+--
+-- The object system in the second version of GTK is based on GObject from
+-- GLIB. This base class is rather primitive in that it only implements
+-- ref and unref methods (and others that are not interesting to us). If
+-- the marshall list mentions OBJECT it refers to an instance of this 
+-- GObject which is automatically wrapped with a ref and unref call.
+-- Structures which are not derived from GObject have to be passed as
+-- BOXED which gives the signal connect function a possibility to do the
+-- conversion into a proper ForeignPtr type. In special cases the signal
+-- connect function use a PTR type which will then be mangled in the
+-- user function directly. The latter is needed if a signal delivers a
+-- pointer to a string and its length in a separate integer.
+--
+module Graphics.UI.Gtk.ImageView.Signals (
+  module System.Glib.Signals,
+
+  connect_ENUM__NONE,
+  connect_NONE__NONE,
+  connect_DOUBLE__NONE,
+  connect_INT__NONE,
+  connect_OBJECT_OBJECT__NONE,
+  connect_ENUM_ENUM__NONE,
+  
+  ) where
+
+import Control.Monad	(liftM)
+
+import System.Glib.FFI
+import System.Glib.UTFString   (peekUTFString)
+import System.Glib.GError      (failOnGError)
+{#import System.Glib.Signals#}
+{#import System.Glib.GObject#} 
+
+
+{#context lib="gtk" prefix="gtk" #}
+
+
+-- Here are the generators that turn a Haskell function into
+-- a C function pointer. The fist Argument is always the widget,
+-- the last one is the user g_pointer. Both are ignored.
+
+
+connect_ENUM__NONE :: 
+  (Enum a, GObjectClass obj) => SignalName ->
+  ConnectAfter -> obj ->
+  (a -> IO ()) ->
+  IO (ConnectId obj)
+connect_ENUM__NONE signal after obj user =
+  connectGeneric signal after obj action
+  where action :: Ptr GObject -> Int -> IO ()
+        action _ enum1 =
+          failOnGError $
+          user (toEnum enum1)
+
+connect_NONE__NONE :: 
+  GObjectClass obj => SignalName ->
+  ConnectAfter -> obj ->
+  (IO ()) ->
+  IO (ConnectId obj)
+connect_NONE__NONE signal after obj user =
+  connectGeneric signal after obj action
+  where action :: Ptr GObject -> IO ()
+        action _ =
+          failOnGError $
+          user
+
+connect_DOUBLE__NONE :: 
+  GObjectClass obj => SignalName ->
+  ConnectAfter -> obj ->
+  (Double -> IO ()) ->
+  IO (ConnectId obj)
+connect_DOUBLE__NONE signal after obj user =
+  connectGeneric signal after obj action
+  where action :: Ptr GObject -> Double -> IO ()
+        action _ double1 =
+          failOnGError $
+          user double1
+
+connect_INT__NONE :: 
+  GObjectClass obj => SignalName ->
+  ConnectAfter -> obj ->
+  (Int -> IO ()) ->
+  IO (ConnectId obj)
+connect_INT__NONE signal after obj user =
+  connectGeneric signal after obj action
+  where action :: Ptr GObject -> Int -> IO ()
+        action _ int1 =
+          failOnGError $
+          user int1
+
+connect_OBJECT_OBJECT__NONE :: 
+  (GObjectClass a', GObjectClass b', GObjectClass obj) => SignalName ->
+  ConnectAfter -> obj ->
+  (a' -> b' -> IO ()) ->
+  IO (ConnectId obj)
+connect_OBJECT_OBJECT__NONE signal after obj user =
+  connectGeneric signal after obj action
+  where action :: Ptr GObject -> Ptr GObject -> Ptr GObject -> IO ()
+        action _ obj1 obj2 =
+          failOnGError $
+          makeNewGObject (GObject, objectUnref) (return obj2) >>= \obj2' ->
+          makeNewGObject (GObject, objectUnref) (return obj1) >>= \obj1' ->
+          user (unsafeCastGObject obj1') (unsafeCastGObject obj2')
+
+connect_ENUM_ENUM__NONE :: 
+  (Enum a, Enum b, GObjectClass obj) => SignalName ->
+  ConnectAfter -> obj ->
+  (a -> b -> IO ()) ->
+  IO (ConnectId obj)
+connect_ENUM_ENUM__NONE signal after obj user =
+  connectGeneric signal after obj action
+  where action :: Ptr GObject -> Int -> Int -> IO ()
+        action _ enum1 enum2 =
+          failOnGError $
+          user (toEnum enum1) (toEnum enum2)
+
diff --git a/Graphics/UI/Gtk/ImageView/Types.chs b/Graphics/UI/Gtk/ImageView/Types.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/Types.chs
@@ -0,0 +1,262 @@
+{-# OPTIONS_HADDOCK hide #-}
+-- -*-haskell-*-
+-- -------------------- automatically generated file - do not edit ----------
+--  Object hierarchy for the GIMP Toolkit (GTK) Binding for Haskell
+--
+--  Author : Axel Simon
+--
+--  Copyright (C) 2001-2005 Axel Simon
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- #hide
+
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+-- This file reflects the Gtk+ object hierarchy in terms of Haskell classes.
+--
+-- Note: the mk... functions were originally meant to simply be an alias
+-- for the constructor. However, in order to communicate the destructor
+-- of an object to objectNew, the mk... functions are now a tuple containing
+-- Haskell constructor and the destructor function pointer. This hack avoids
+-- changing all modules that simply pass mk... to objectNew.
+--
+module Graphics.UI.Gtk.ImageView.Types (
+
+  module Graphics.UI.GtkInternals,
+  ImageToolDragger(ImageToolDragger), ImageToolDraggerClass,
+  toImageToolDragger, 
+  mkImageToolDragger, unImageToolDragger,
+  castToImageToolDragger, gTypeImageToolDragger,
+  ImageToolSelector(ImageToolSelector), ImageToolSelectorClass,
+  toImageToolSelector, 
+  mkImageToolSelector, unImageToolSelector,
+  castToImageToolSelector, gTypeImageToolSelector,
+  ImageView(ImageView), ImageViewClass,
+  toImageView, 
+  mkImageView, unImageView,
+  castToImageView, gTypeImageView,
+  AnimView(AnimView), AnimViewClass,
+  toAnimView, 
+  mkAnimView, unAnimView,
+  castToAnimView, gTypeAnimView,
+  ImageNav(ImageNav), ImageNavClass,
+  toImageNav, 
+  mkImageNav, unImageNav,
+  castToImageNav, gTypeImageNav,
+  ImageScrollWin(ImageScrollWin), ImageScrollWinClass,
+  toImageScrollWin, 
+  mkImageScrollWin, unImageScrollWin,
+  castToImageScrollWin, gTypeImageScrollWin,
+  IImageTool(IImageTool), IImageToolClass,
+  toIImageTool, 
+  mkIImageTool, unIImageTool,
+  castToIImageTool, gTypeIImageTool
+  ) where
+
+import Foreign.ForeignPtr (ForeignPtr, castForeignPtr, unsafeForeignPtrToPtr)
+import Foreign.C.Types    (CULong, CUInt)
+import System.Glib.GType	(GType, typeInstanceIsA)
+{#import Graphics.UI.GtkInternals#}
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- The usage of foreignPtrToPtr should be safe as the evaluation will only be
+-- forced if the object is used afterwards
+--
+castTo :: (GObjectClass obj, GObjectClass obj') => GType -> String
+                                                -> (obj -> obj')
+castTo gtype objTypeName obj =
+  case toGObject obj of
+    gobj@(GObject objFPtr)
+      | typeInstanceIsA ((unsafeForeignPtrToPtr.castForeignPtr) objFPtr) gtype
+                  -> unsafeCastGObject gobj
+      | otherwise -> error $ "Cannot cast object to " ++ objTypeName
+
+
+-- *********************************************************** ImageToolDragger
+
+{#pointer *ImageToolDragger foreign newtype #} deriving (Eq,Ord)
+
+mkImageToolDragger = (ImageToolDragger, objectUnrefFromMainloop)
+unImageToolDragger (ImageToolDragger o) = o
+
+class GObjectClass o => ImageToolDraggerClass o
+toImageToolDragger :: ImageToolDraggerClass o => o -> ImageToolDragger
+toImageToolDragger = unsafeCastGObject . toGObject
+
+instance ImageToolDraggerClass ImageToolDragger
+instance GObjectClass ImageToolDragger where
+  toGObject = GObject . castForeignPtr . unImageToolDragger
+  unsafeCastGObject = ImageToolDragger . castForeignPtr . unGObject
+
+castToImageToolDragger :: GObjectClass obj => obj -> ImageToolDragger
+castToImageToolDragger = castTo gTypeImageToolDragger "ImageToolDragger"
+
+gTypeImageToolDragger :: GType
+gTypeImageToolDragger =
+  {# call fun unsafe gtk_image_tool_dragger_get_type #}
+
+-- ********************************************************** ImageToolSelector
+
+{#pointer *ImageToolSelector foreign newtype #} deriving (Eq,Ord)
+
+mkImageToolSelector = (ImageToolSelector, objectUnrefFromMainloop)
+unImageToolSelector (ImageToolSelector o) = o
+
+class GObjectClass o => ImageToolSelectorClass o
+toImageToolSelector :: ImageToolSelectorClass o => o -> ImageToolSelector
+toImageToolSelector = unsafeCastGObject . toGObject
+
+instance ImageToolSelectorClass ImageToolSelector
+instance GObjectClass ImageToolSelector where
+  toGObject = GObject . castForeignPtr . unImageToolSelector
+  unsafeCastGObject = ImageToolSelector . castForeignPtr . unGObject
+
+castToImageToolSelector :: GObjectClass obj => obj -> ImageToolSelector
+castToImageToolSelector = castTo gTypeImageToolSelector "ImageToolSelector"
+
+gTypeImageToolSelector :: GType
+gTypeImageToolSelector =
+  {# call fun unsafe gtk_image_tool_selector_get_type #}
+
+-- ****************************************************************** ImageView
+
+{#pointer *ImageView foreign newtype #} deriving (Eq,Ord)
+
+mkImageView = (ImageView, objectUnrefFromMainloop)
+unImageView (ImageView o) = o
+
+class WidgetClass o => ImageViewClass o
+toImageView :: ImageViewClass o => o -> ImageView
+toImageView = unsafeCastGObject . toGObject
+
+instance ImageViewClass ImageView
+instance WidgetClass ImageView
+instance ObjectClass ImageView
+instance GObjectClass ImageView where
+  toGObject = GObject . castForeignPtr . unImageView
+  unsafeCastGObject = ImageView . castForeignPtr . unGObject
+
+castToImageView :: GObjectClass obj => obj -> ImageView
+castToImageView = castTo gTypeImageView "ImageView"
+
+gTypeImageView :: GType
+gTypeImageView =
+  {# call fun unsafe gtk_image_view_get_type #}
+
+-- ******************************************************************* AnimView
+
+{#pointer *AnimView foreign newtype #} deriving (Eq,Ord)
+
+mkAnimView = (AnimView, objectUnrefFromMainloop)
+unAnimView (AnimView o) = o
+
+class ImageViewClass o => AnimViewClass o
+toAnimView :: AnimViewClass o => o -> AnimView
+toAnimView = unsafeCastGObject . toGObject
+
+instance AnimViewClass AnimView
+instance ImageViewClass AnimView
+instance WidgetClass AnimView
+instance ObjectClass AnimView
+instance GObjectClass AnimView where
+  toGObject = GObject . castForeignPtr . unAnimView
+  unsafeCastGObject = AnimView . castForeignPtr . unGObject
+
+castToAnimView :: GObjectClass obj => obj -> AnimView
+castToAnimView = castTo gTypeAnimView "AnimView"
+
+gTypeAnimView :: GType
+gTypeAnimView =
+  {# call fun unsafe gtk_anim_view_get_type #}
+
+-- ******************************************************************* ImageNav
+
+{#pointer *ImageNav foreign newtype #} deriving (Eq,Ord)
+
+mkImageNav = (ImageNav, objectUnrefFromMainloop)
+unImageNav (ImageNav o) = o
+
+class WindowClass o => ImageNavClass o
+toImageNav :: ImageNavClass o => o -> ImageNav
+toImageNav = unsafeCastGObject . toGObject
+
+instance ImageNavClass ImageNav
+instance WindowClass ImageNav
+instance BinClass ImageNav
+instance ContainerClass ImageNav
+instance WidgetClass ImageNav
+instance ObjectClass ImageNav
+instance GObjectClass ImageNav where
+  toGObject = GObject . castForeignPtr . unImageNav
+  unsafeCastGObject = ImageNav . castForeignPtr . unGObject
+
+castToImageNav :: GObjectClass obj => obj -> ImageNav
+castToImageNav = castTo gTypeImageNav "ImageNav"
+
+gTypeImageNav :: GType
+gTypeImageNav =
+  {# call fun unsafe gtk_image_nav_get_type #}
+
+-- ************************************************************* ImageScrollWin
+
+{#pointer *ImageScrollWin foreign newtype #} deriving (Eq,Ord)
+
+mkImageScrollWin = (ImageScrollWin, objectUnrefFromMainloop)
+unImageScrollWin (ImageScrollWin o) = o
+
+class TableClass o => ImageScrollWinClass o
+toImageScrollWin :: ImageScrollWinClass o => o -> ImageScrollWin
+toImageScrollWin = unsafeCastGObject . toGObject
+
+instance ImageScrollWinClass ImageScrollWin
+instance TableClass ImageScrollWin
+instance ContainerClass ImageScrollWin
+instance WidgetClass ImageScrollWin
+instance ObjectClass ImageScrollWin
+instance GObjectClass ImageScrollWin where
+  toGObject = GObject . castForeignPtr . unImageScrollWin
+  unsafeCastGObject = ImageScrollWin . castForeignPtr . unGObject
+
+castToImageScrollWin :: GObjectClass obj => obj -> ImageScrollWin
+castToImageScrollWin = castTo gTypeImageScrollWin "ImageScrollWin"
+
+gTypeImageScrollWin :: GType
+gTypeImageScrollWin =
+  {# call fun unsafe gtk_image_scroll_win_get_type #}
+
+-- ***************************************************************** IImageTool
+
+{#pointer *IImageTool foreign newtype #} deriving (Eq,Ord)
+
+mkIImageTool = (IImageTool, objectUnrefFromMainloop)
+unIImageTool (IImageTool o) = o
+
+class GObjectClass o => IImageToolClass o
+toIImageTool :: IImageToolClass o => o -> IImageTool
+toIImageTool = unsafeCastGObject . toGObject
+
+instance IImageToolClass IImageTool
+instance GObjectClass IImageTool where
+  toGObject = GObject . castForeignPtr . unIImageTool
+  unsafeCastGObject = IImageTool . castForeignPtr . unGObject
+
+castToIImageTool :: GObjectClass obj => obj -> IImageTool
+castToIImageTool = castTo gTypeIImageTool "IImageTool"
+
+gTypeIImageTool :: GType
+gTypeIImageTool =
+  {# call fun unsafe gtk_iimage_tool_get_type #}
+
diff --git a/Graphics/UI/Gtk/ImageView/Zooms.chs b/Graphics/UI/Gtk/ImageView/Zooms.chs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/Gtk/ImageView/Zooms.chs
@@ -0,0 +1,81 @@
+{-# LANGUAGE CPP #-}
+-- -*-haskell-*-
+--  GIMP Toolkit (GTK) Widget Zooms
+--
+--  Author : Andy Stewart
+--
+--  Created: 19 Aug 2010
+--
+--  Copyright (C) 2010 Andy Stewart
+--
+--  This library 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 2.1 of the License, or (at your option) any later version.
+--
+--  This library 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.
+--
+-- |
+-- Maintainer  : gtk2hs-users@lists.sourceforge.net
+-- Stability   : provisional
+-- Portability : portable (depends on GHC)
+--
+module Graphics.UI.Gtk.ImageView.Zooms (
+-- * Details
+-- | 'ImageView' uses a discrete amount of zoom factors for determining which zoom to set. Using these
+-- functions, it is possible to retrieve information and manipulate a zoom factor.
+
+-- * Methods  
+   zoomsGetZoomIn,
+   zoomsGetZoomOut,
+   zoomsGetMinZoom,
+   zoomsGetMaxZoom,
+   zoomsClampZoom,
+) where
+
+import Control.Monad	(liftM)
+
+import System.Glib.Attributes
+import System.Glib.FFI
+import System.Glib.UTFString
+
+{# context lib="gtk" prefix="gtk" #}
+
+-- | Returns the zoom factor that is one step larger than the supplied zoom factor.
+zoomsGetZoomIn :: Double -- ^ @zoom@    A zoom factor.                                              
+               -> IO Double -- ^ returns a zoom factor that is one step larger than the supplied one 
+zoomsGetZoomIn zoom = 
+  liftM realToFrac $
+  {#call gtk_zooms_get_zoom_in #}
+    (realToFrac zoom)
+
+-- | Returns the zoom factor that is one step smaller than the supplied zoom factor.
+zoomsGetZoomOut :: Double  -- ^ @zoom@    a zoom factor                                                 
+                -> IO Double  -- ^ returns a zoom factor that is one step smaller than the supplied one. 
+zoomsGetZoomOut zoom =
+  liftM realToFrac $
+  {#call gtk_zooms_get_zoom_out #}
+    (realToFrac zoom)
+
+-- | Returns the minimum allowed zoom factor.
+zoomsGetMinZoom :: IO Double  -- ^ returns The minimal zoom factor. 
+zoomsGetMinZoom =
+  liftM realToFrac $
+  {#call gtk_zooms_get_min_zoom #}
+
+-- | Returns the maximum allowed zoom factor.
+zoomsGetMaxZoom :: IO Double  -- ^ returns The maximal zoom factor. 
+zoomsGetMaxZoom =
+  liftM realToFrac $
+  {#call gtk_zooms_get_max_zoom #}
+
+-- | Returns the zoom factor clamped to the minumum and maximum allowed value.
+zoomsClampZoom :: Double -- ^ @zoom@    A zoom factor                                       
+               -> IO Double  -- ^ returns The zoom factor clamped to the interval [min, max]. 
+zoomsClampZoom zoom =
+  liftM realToFrac $
+  {#call gtk_zooms_clamp_zoom #}
+    (realToFrac zoom)
diff --git a/Gtk2HsSetup.hs b/Gtk2HsSetup.hs
new file mode 100644
--- /dev/null
+++ b/Gtk2HsSetup.hs
@@ -0,0 +1,486 @@
+{-# LANGUAGE CPP #-}
+
+#define CABAL_VERSION_ENCODE(major, minor, micro) (     \
+          ((major) * 10000)                             \
+        + ((minor) *   100)                             \
+        + ((micro) *     1))
+
+#define CABAL_VERSION_CHECK(major,minor,micro)    \
+        (CABAL_VERSION >= CABAL_VERSION_ENCODE(major,minor,micro))
+
+-- now, this is bad, but Cabal doesn't seem to actually pass any information about
+-- its version to CPP, so guess the version depending on the version of GHC
+#ifdef CABAL_VERSION_MINOR
+#ifndef CABAL_VERSION_MAJOR
+#define CABAL_VERSION_MAJOR 1
+#endif
+#ifndef CABAL_VERSION_MICRO
+#define CABAL_VERSION_MICRO 0
+#endif
+#define CABAL_VERSION CABAL_VERSION_ENCODE(     \
+        CABAL_VERSION_MAJOR,                    \
+        CABAL_VERSION_MINOR,                    \
+        CABAL_VERSION_MICRO)
+#else
+#warning Setup.hs is guessing the version of Cabal. If compilation of Setup.hs fails use -DCABAL_VERSION_MINOR=x for Cabal version 1.x.0 when building (prefixed by --ghc-option= when using the 'cabal' command)
+#if (__GLASGOW_HASKELL__ >= 612)
+#define CABAL_VERSION CABAL_VERSION_ENCODE(1,8,0)
+#else
+#define CABAL_VERSION CABAL_VERSION_ENCODE(1,6,0)
+#endif
+#endif
+
+-- | Build a Gtk2hs package.
+--
+module Gtk2HsSetup ( gtk2hsUserHooks, getPkgConfigPackages ) where
+
+import Distribution.Simple
+import Distribution.Simple.PreProcess
+import Distribution.InstalledPackageInfo ( importDirs,
+                                           showInstalledPackageInfo,
+                                           libraryDirs,
+                                           extraLibraries,
+                                           extraGHCiLibraries )
+import Distribution.Simple.PackageIndex (
+#if CABAL_VERSION_CHECK(1,8,0)
+  lookupInstalledPackageId
+#else
+  lookupPackageId
+#endif
+  )
+import Distribution.PackageDescription as PD ( PackageDescription(..),
+                                               updatePackageDescription,
+                                               BuildInfo(..),
+                                               emptyBuildInfo, allBuildInfo,
+                                               Library(..),
+                                               libModules, hasLibs)
+import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..),
+                                           InstallDirs(..),
+#if CABAL_VERSION_CHECK(1,8,0)
+                                           componentPackageDeps,
+#else
+                                           packageDeps,
+#endif
+                                           absoluteInstallDirs)
+import Distribution.Simple.Compiler  ( Compiler(..) )
+import Distribution.Simple.Program (
+  Program(..), ConfiguredProgram(..),
+  rawSystemProgramConf, rawSystemProgramStdoutConf,
+  c2hsProgram, pkgConfigProgram, requireProgram, ghcPkgProgram,
+  simpleProgram, lookupProgram, rawSystemProgramStdout, ProgArg)
+import Distribution.ModuleName ( ModuleName, components, toFilePath )
+import Distribution.Simple.Utils
+import Distribution.Simple.Setup (CopyFlags(..), InstallFlags(..), CopyDest(..),
+                                  defaultCopyFlags, ConfigFlags(configVerbosity),
+                                  fromFlag, toFlag, RegisterFlags(..), flagToMaybe,
+                                  fromFlagOrDefault, defaultRegisterFlags)
+import Distribution.Simple.BuildPaths ( autogenModulesDir )
+import Distribution.Simple.Install ( install )
+#if CABAL_VERSION_CHECK(1,8,0)
+import Distribution.Simple.Register ( generateRegistrationInfo, registerPackage )
+#else
+import qualified Distribution.Simple.Register as Register ( register )
+#endif
+import Distribution.Text ( simpleParse, display )
+import System.FilePath
+import System.Directory ( doesFileExist )
+import Distribution.Version (Version(..))
+import Distribution.Verbosity
+import Control.Monad (when, unless, filterM)
+import Data.Maybe ( isJust, isNothing, fromMaybe, maybeToList )
+import Data.List (isPrefixOf, isSuffixOf, nub)
+import Data.Char (isAlpha)
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+import Control.Applicative ((<$>))
+import System.Directory (getDirectoryContents, doesDirectoryExist)
+
+-- the name of the c2hs pre-compiled header file
+precompFile = "precompchs.bin"
+
+gtk2hsUserHooks = simpleUserHooks {
+    hookedPrograms = [typeGenProgram, signalGenProgram, c2hsLocal],
+    hookedPreProcessors = [("chs", ourC2hs)],
+    confHook = \pd cf ->
+      confHook simpleUserHooks pd cf >>= return . adjustLocalBuildInfo,
+    postConf = \args cf pd lbi -> do
+      genSynthezisedFiles (fromFlag (configVerbosity cf)) pd lbi
+      postConf simpleUserHooks args cf pd lbi,
+    buildHook = \pd lbi uh bf -> fixDeps pd >>= \pd ->
+                                 (buildHook simpleUserHooks) pd lbi uh bf,
+    copyHook = \pd lbi uh flags -> (copyHook simpleUserHooks) pd lbi uh flags >>
+      installCHI pd lbi (fromFlag (copyVerbosity flags)) (fromFlag (copyDest flags)),
+    instHook = \pd lbi uh flags ->
+#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
+      installHook pd lbi uh flags >>
+      installCHI pd lbi (fromFlag (installVerbosity flags)) NoCopyDest,
+    regHook = registerHook
+#else
+      instHook simpleUserHooks pd lbi uh flags >>
+      installCHI pd lbi (fromFlag (installVerbosity flags)) NoCopyDest
+#endif
+  }
+
+------------------------------------------------------------------------------
+-- Lots of stuff for windows ghci support
+------------------------------------------------------------------------------
+
+getDlls :: [FilePath] -> IO [FilePath]
+getDlls dirs = filter ((== ".dll") . takeExtension) . concat <$>
+    mapM getDirectoryContents dirs
+
+fixLibs :: [FilePath] -> [String] -> [String]
+fixLibs dlls = concatMap $ \ lib ->
+    case filter (("lib" ++ lib) `isPrefixOf`) dlls of
+                dll:_ -> [dropExtension dll]
+                _     -> if lib == "z" then [] else [lib]
+
+-- The following code is a big copy-and-paste job from the sources of
+-- Cabal 1.8 just to be able to fix a field in the package file. Yuck.
+
+#if CABAL_VERSION_CHECK(1,8,0)
+        
+installHook :: PackageDescription -> LocalBuildInfo
+                   -> UserHooks -> InstallFlags -> IO ()
+installHook pkg_descr localbuildinfo _ flags = do
+  let copyFlags = defaultCopyFlags {
+                      copyDistPref   = installDistPref flags,
+                      copyDest       = toFlag NoCopyDest,
+                      copyVerbosity  = installVerbosity flags
+                  }
+  install pkg_descr localbuildinfo copyFlags
+  let registerFlags = defaultRegisterFlags {
+                          regDistPref  = installDistPref flags,
+                          regInPlace   = installInPlace flags,
+                          regPackageDB = installPackageDB flags,
+                          regVerbosity = installVerbosity flags
+                      }
+  when (hasLibs pkg_descr) $ register pkg_descr localbuildinfo registerFlags
+
+registerHook :: PackageDescription -> LocalBuildInfo
+        -> UserHooks -> RegisterFlags -> IO ()
+registerHook pkg_descr localbuildinfo _ flags =
+    if hasLibs pkg_descr
+    then register pkg_descr localbuildinfo flags
+    else setupMessage verbosity
+           "Package contains no library to register:" (packageId pkg_descr)
+  where verbosity = fromFlag (regVerbosity flags)
+
+register :: PackageDescription -> LocalBuildInfo
+         -> RegisterFlags -- ^Install in the user's database?; verbose
+         -> IO ()
+register pkg@PackageDescription { library       = Just lib  }
+         lbi@LocalBuildInfo     { libraryConfig = Just clbi } regFlags
+  = do
+
+    installedPkgInfoRaw <- generateRegistrationInfo
+                           verbosity pkg lib lbi clbi inplace distPref
+
+    dllsInScope <- getSearchPath >>= (filterM doesDirectoryExist) >>= getDlls
+    let libs = fixLibs dllsInScope (extraLibraries installedPkgInfoRaw)
+        installedPkgInfo = installedPkgInfoRaw {
+                                extraGHCiLibraries = libs }
+
+     -- Three different modes:
+    case () of
+     _ | modeGenerateRegFile   -> die "Generate Reg File not supported"
+       | modeGenerateRegScript -> die "Generate Reg Script not supported"
+       | otherwise             -> registerPackage verbosity
+                                    installedPkgInfo pkg lbi inplace packageDb
+
+  where
+    modeGenerateRegFile = isJust (flagToMaybe (regGenPkgConf regFlags))
+    modeGenerateRegScript = fromFlag (regGenScript regFlags)
+    inplace   = fromFlag (regInPlace regFlags)
+    packageDb = case flagToMaybe (regPackageDB regFlags) of
+                    Just db -> db
+                    Nothing -> registrationPackageDB (withPackageDB lbi)
+    distPref  = fromFlag (regDistPref regFlags)
+    verbosity = fromFlag (regVerbosity regFlags)
+
+register _ _ regFlags = notice verbosity "No package to register"
+  where
+    verbosity = fromFlag (regVerbosity regFlags)
+
+#else
+installHook :: PackageDescription -> LocalBuildInfo
+                   -> UserHooks -> InstallFlags -> IO ()
+installHook pkg_descr localbuildinfo _ flags = do
+  let copyFlags = defaultCopyFlags {
+                      copyDistPref   = installDistPref flags,
+                      copyInPlace    = installInPlace flags,
+                      copyUseWrapper = installUseWrapper flags,
+                      copyDest       = toFlag NoCopyDest,
+                      copyVerbosity  = installVerbosity flags
+                  }
+  install pkg_descr localbuildinfo copyFlags
+  let registerFlags = defaultRegisterFlags {
+                          regDistPref  = installDistPref flags,
+                          regInPlace   = installInPlace flags,
+                          regPackageDB = installPackageDB flags,
+                          regVerbosity = installVerbosity flags
+                      }
+  when (hasLibs pkg_descr) $ register pkg_descr localbuildinfo registerFlags
+
+registerHook :: PackageDescription -> LocalBuildInfo
+        -> UserHooks -> RegisterFlags -> IO ()
+registerHook pkg_descr localbuildinfo _ flags =
+    if hasLibs pkg_descr
+    then register pkg_descr localbuildinfo flags
+    else setupMessage verbosity
+           "Package contains no library to register:" (packageId pkg_descr)
+  where verbosity = fromFlag (regVerbosity flags)
+
+register :: PackageDescription -> LocalBuildInfo
+         -> RegisterFlags -- ^Install in the user's database?; verbose
+         -> IO ()
+register pkg_descr lbi regFlags = do
+  let verbosity = fromFlag (regVerbosity regFlags)
+  warn verbosity "Cannot register ghci libraries with Cabal 1.6 (need 1.8)."
+  Register.register pkg_descr lbi regFlags
+  
+#endif
+
+------------------------------------------------------------------------------
+-- This is a hack for Cabal-1.8, It is not needed in Cabal-1.9.1 or later
+------------------------------------------------------------------------------
+
+adjustLocalBuildInfo :: LocalBuildInfo -> LocalBuildInfo
+adjustLocalBuildInfo lbi =
+  let extra = (Just libBi, [])
+      libBi = emptyBuildInfo { includeDirs = [ autogenModulesDir lbi
+                                             , buildDir lbi ] }
+   in lbi { localPkgDescr = updatePackageDescription extra (localPkgDescr lbi) }
+
+------------------------------------------------------------------------------
+-- Processing .chs files with our local c2hs.
+------------------------------------------------------------------------------
+
+ourC2hs :: BuildInfo -> LocalBuildInfo -> PreProcessor
+ourC2hs bi lbi = PreProcessor {
+  platformIndependent = False,
+  runPreProcessor = runC2HS bi lbi
+}
+
+runC2HS :: BuildInfo -> LocalBuildInfo ->
+           (FilePath, FilePath) -> (FilePath, FilePath) -> Verbosity -> IO ()
+runC2HS bi lbi (inDir, inFile)  (outDir, outFile) verbosity = do
+  -- have the header file name if we don't have the precompiled header yet
+  header <- case lookup "x-c2hs-header" (customFieldsBI bi) of
+    Just h -> return h
+    Nothing -> die ("Need x-c2hs-Header definition in the .cabal Library section "++
+                    "that sets the C header file to process .chs.pp files.")
+
+  -- c2hs will output files in out dir, removing any leading path of the input file.
+  -- Thus, append the dir of the input file to the output dir.
+  let (outFileDir, newOutFile) = splitFileName outFile
+  let newOutDir = outDir </> outFileDir
+  -- additional .chi files might be needed that other packages have installed;
+  -- we assume that these are installed in the same place as .hi files
+  let chiDirs = [ dir |
+#if CABAL_VERSION_CHECK(1,8,0)
+                  ipi <- maybe [] (map fst . componentPackageDeps) (libraryConfig lbi),
+                  dir <- maybe [] importDirs (lookupInstalledPackageId (installedPkgs lbi) ipi) ]
+#else
+                  ipi <- packageDeps lbi,
+                  dir <- maybe [] importDirs (lookupPackageId (installedPkgs lbi) ipi) ]
+#endif
+  rawSystemProgramConf verbosity c2hsLocal (withPrograms lbi) $
+       map ("--include=" ++) (outDir:chiDirs)
+    ++ ["--cppopts=" ++ opt | opt <- getCppOptions bi lbi]
+    ++ ["--output-dir=" ++ newOutDir,
+        "--output=" ++ newOutFile,
+        "--precomp=" ++ buildDir lbi </> precompFile,
+        header, inDir </> inFile]
+
+getCppOptions :: BuildInfo -> LocalBuildInfo -> [String]
+getCppOptions bi lbi
+    = nub $
+      ["-I" ++ dir | dir <- PD.includeDirs bi]
+   ++ [opt | opt@('-':c:_) <- (PD.cppOptions bi ++ PD.ccOptions bi), c `elem` "DIU"]
+
+installCHI :: PackageDescription -- ^information from the .cabal file
+        -> LocalBuildInfo -- ^information from the configure step
+        -> Verbosity -> CopyDest -- ^flags sent to copy or install
+        -> IO ()
+installCHI pkg@PD.PackageDescription { library = Just lib } lbi verbosity copydest = do
+  let InstallDirs { libdir = libPref } = absoluteInstallDirs pkg lbi copydest
+  -- cannot use the recommended 'findModuleFiles' since it fails if there exists
+  -- a modules that does not have a .chi file
+  mFiles <- mapM (findFileWithExtension' ["chi"] [buildDir lbi])
+                 (map toFilePath
+#if CABAL_VERSION_CHECK(1,8,0)
+                   (PD.libModules lib)
+#else
+                   (PD.libModules pkg)
+#endif
+                 )
+  let files = [ f | Just f <- mFiles ]
+#if CABAL_VERSION_CHECK(1,8,0)
+  installOrdinaryFiles verbosity libPref files
+#else
+  copyFiles verbosity libPref files
+#endif
+
+  
+installCHI _ _ _ _ = return ()
+
+------------------------------------------------------------------------------
+-- Generating the type hierarchy and signal callback .hs files.
+------------------------------------------------------------------------------
+
+typeGenProgram :: Program
+typeGenProgram = (simpleProgram "gtk2hsTypeGen")
+
+signalGenProgram :: Program
+signalGenProgram = (simpleProgram "gtk2hsHookGenerator")
+
+c2hsLocal :: Program
+c2hsLocal = (simpleProgram "gtk2hsC2hs")
+
+genSynthezisedFiles :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
+genSynthezisedFiles verb pd lbi = do
+
+  cPkgs <- getPkgConfigPackages verb lbi pd
+
+  let xList = maybe [] (customFieldsBI . libBuildInfo) (library pd)
+              ++customFieldsPD pd
+      typeOpts :: String -> [ProgArg]
+      typeOpts tag = concat [ map (\val -> '-':'-':drop (length tag) field++'=':val) (words content)
+                            | (field,content) <- xList,
+                              tag `isPrefixOf` field,
+                              field /= (tag++"file")]
+              ++ [ "--tag=" ++ tag
+                 | PackageIdentifier name (Version (major:minor:_) _) <- cPkgs
+                 , let name' = filter isAlpha (display name)
+                 , tag <- name'
+                        : [ name' ++ "-" ++ show major ++ "." ++ show digit
+                          | digit <- [0,2..minor] ]
+                 ]
+
+      signalsOpts :: [ProgArg]
+      signalsOpts = concat [ map (\val -> '-':'-':drop 10 field++'=':val) (words content)
+                        | (field,content) <- xList,
+                          "x-signals-" `isPrefixOf` field,
+                          field /= "x-signals-file"]
+
+      genFile :: Program -> [ProgArg] -> FilePath -> IO ()
+      genFile prog args outFile = do
+         res <- rawSystemProgramStdoutConf verb prog (withPrograms lbi) args
+         rewriteFile outFile res
+
+  (flip mapM_) (filter (\(tag,_) -> "x-types-" `isPrefixOf` tag && "file" `isSuffixOf` tag) xList) $
+    \(fileTag, f) -> do
+      let tag = reverse (drop 4 (reverse fileTag))
+      info verb ("Ensuring that class hierarchy in "++f++" is up-to-date.")
+      genFile typeGenProgram (typeOpts tag) f
+
+  case lookup "x-signals-file" xList of
+    Nothing -> return ()
+    Just f -> do
+      info verb ("Ensuring that callback hooks in "++f++" are up-to-date.")
+      genFile signalGenProgram signalsOpts f
+
+--FIXME: Cabal should tell us the selected pkg-config package versions in the
+--       LocalBuildInfo or equivalent.
+--       In the mean time, ask pkg-config again.
+
+getPkgConfigPackages :: Verbosity -> LocalBuildInfo -> PackageDescription -> IO [PackageId]
+getPkgConfigPackages verbosity lbi pkg =
+  sequence
+    [ do version <- pkgconfig ["--modversion", display pkgname]
+         case simpleParse version of
+           Nothing -> die $ "parsing output of pkg-config --modversion failed"
+           Just v  -> return (PackageIdentifier pkgname v)
+    | Dependency pkgname _ <- concatMap pkgconfigDepends (allBuildInfo pkg) ]
+  where
+    pkgconfig = rawSystemProgramStdoutConf verbosity
+                  pkgConfigProgram (withPrograms lbi)
+
+------------------------------------------------------------------------------
+-- Dependency calculation amongst .chs files.
+------------------------------------------------------------------------------
+
+-- Given all files of the package, find those that end in .chs and extract the
+-- .chs files they depend upon. Then return the PackageDescription with these
+-- files rearranged so that they are built in a sequence that files that are
+-- needed by other files are built first.
+fixDeps :: PackageDescription -> IO PackageDescription
+fixDeps pd@PD.PackageDescription {
+          PD.library = Just lib@PD.Library {
+            PD.exposedModules = expMods,
+            PD.libBuildInfo = bi@PD.BuildInfo {
+              PD.hsSourceDirs = srcDirs,
+              PD.otherModules = othMods
+            }}} = do
+  let findModule m = findFileWithExtension [".chs.pp",".chs"] srcDirs
+                       (joinPath (components m))
+  mExpFiles <- mapM findModule expMods
+  mOthFiles <- mapM findModule othMods
+
+  -- tag all exposed files with True so we throw an error if we need to build
+  -- an exposed module before an internal modules (we cannot express this)
+  let modDeps = zipWith (ModDep True []) expMods mExpFiles++
+                zipWith (ModDep False []) othMods mOthFiles
+  modDeps <- mapM extractDeps modDeps
+  let (expMods, othMods) = span mdExposed $ sortTopological modDeps
+      badOther = map (fromMaybe "<no file>" . mdLocation) $
+                 filter (not . mdExposed) expMods
+  unless (null badOther) $
+    die ("internal chs modules "++intercalate "," badOther++
+         " depend on exposed chs modules; cabal needs to build internal modules first")
+  return pd { PD.library = Just lib {
+    PD.exposedModules = map mdOriginal expMods,
+    PD.libBuildInfo = bi { PD.otherModules = map mdOriginal othMods }
+  }}
+
+data ModDep = ModDep {
+  mdExposed :: Bool,
+  mdRequires :: [ModuleName],
+  mdOriginal :: ModuleName,
+  mdLocation :: Maybe FilePath
+}
+
+instance Show ModDep where
+  show x = show (mdLocation x)
+
+instance Eq ModDep where
+  ModDep { mdOriginal = m1 } == ModDep { mdOriginal = m2 } = m1==m2
+instance Ord ModDep where
+  compare ModDep { mdOriginal = m1 } ModDep { mdOriginal = m2 } = compare m1 m2
+
+-- Extract the dependencies of this file. This is intentionally rather naive as it
+-- ignores CPP conditionals. We just require everything which means that the
+-- existance of a .chs module may not depend on some CPP condition.  
+extractDeps :: ModDep -> IO ModDep
+extractDeps md@ModDep { mdLocation = Nothing } = return md
+extractDeps md@ModDep { mdLocation = Just f } = withUTF8FileContents f $ \con -> do
+  let findImports acc (('{':'#':xs):xxs) = case (dropWhile ((==) ' ') xs) of
+        ('i':'m':'p':'o':'r':'t':' ':ys) ->
+          case simpleParse (takeWhile ((/=) '#') ys) of
+            Just m -> findImports (m:acc) xxs 
+            Nothing -> die ("cannot parse chs import in "++f++":\n"++
+                            "offending line is {#"++xs)
+         -- no more imports after the first non-import hook
+        _ -> return acc
+      findImports acc (_:xxs) = findImports acc xxs
+      findImports acc [] = return acc
+  mods <- findImports [] (lines con)
+  return md { mdRequires = mods }
+
+-- Find a total order of the set of modules that are partially sorted by their
+-- dependencies on each other. The function returns the sorted list of modules
+-- together with a list of modules that are required but not supplied by this
+-- in the input set of modules.
+sortTopological :: [ModDep] -> [ModDep]
+sortTopological ms = reverse $ fst $ foldl visit ([], S.empty) (map mdOriginal ms)
+  where
+  set = M.fromList (map (\m -> (mdOriginal m, m)) ms)
+  visit (out,visited) m
+    | m `S.member` visited = (out,visited)
+    | otherwise = case m `M.lookup` set of
+        Nothing -> (out, m `S.insert` visited)
+        Just md -> (md:out', visited')
+          where
+            (out',visited') = foldl visit (out, m `S.insert` visited) (mdRequires md)
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,7 @@
+-- Setup file for a Gtk2Hs module. Contains only adjustments specific to this module,
+-- all Gtk2Hs-specific boilerplate is stored in Gtk2HsSetup.hs which should be kept
+-- identical across all modules.
+import Gtk2HsSetup ( gtk2hsUserHooks )
+import Distribution.Simple ( defaultMainWithHooks )
+
+main = defaultMainWithHooks gtk2hsUserHooks
diff --git a/demo/ImageViewer.hs b/demo/ImageViewer.hs
new file mode 100644
--- /dev/null
+++ b/demo/ImageViewer.hs
@@ -0,0 +1,50 @@
+-- | WebKit browser demo.
+--  Author      :  Andy Stewart
+--  Copyright   :  (c) 2010 Andy Stewart <lazycat.manatee@gmail.com>
+
+-- | This simple image viewer base on GtkImageView
+--
+-- Usage:
+--      imageviewer filepath
+--
+module Main where
+
+import Graphics.UI.Gtk
+import Graphics.UI.Gtk.ImageView
+import System.Environment 
+
+main = do
+  -- Get program arguments.
+  args <- getArgs
+  case args of
+    -- Display help
+    ["--help"] -> 
+       putStrLn $ "Welcome to Gtk2hs Image Viewer demo. :)\n\n" ++ 
+                  "Usage: imageviewer filepath\n\n" ++
+                  "  -- Gtk2hs Team"
+    -- Start program.
+    [path] -> viewer path
+    _      -> putStrLn "Usage: imageviewer filepath"
+
+viewer path = do
+  initGUI
+  win <- windowNew
+  win `onDestroy` mainQuit
+  windowSetDefaultSize win 600 400
+  windowSetPosition win WinPosCenter
+
+  view <- imageViewNew
+  scrollWin1 <- imageScrollWinNew view -- use ImageView.ScrollWin instead ScrolledWindow in GTK
+  pixbuf <- pixbufNewFromFile path
+  imageViewSetPixbuf view (Just pixbuf) True
+  win `containerAdd` scrollWin1
+
+  -- Zoom out image.
+  imageViewZoomOut view
+
+  -- Show navigator window.
+  nav <- imageNavNew view
+  imageNavShowAndGrab nav 1000 800
+
+  widgetShowAll win
+  mainGUI
diff --git a/demo/Makefile b/demo/Makefile
new file mode 100644
--- /dev/null
+++ b/demo/Makefile
@@ -0,0 +1,11 @@
+
+PROG  = imageviewer
+SOURCES = ImageViewer.hs
+
+$(PROG) : $(SOURCES)
+	$(HC) --make $< -o $@ $(HCFLAGS)
+
+clean:
+	rm -f $(SOURCES:.hs=.hi) $(SOURCES:.hs=.o) $(PROG)
+
+HC=ghc
diff --git a/gtkimageview.cabal b/gtkimageview.cabal
new file mode 100644
--- /dev/null
+++ b/gtkimageview.cabal
@@ -0,0 +1,77 @@
+Name:           gtkimageview
+Version:        0.11.1
+License:        LGPL-2.1
+License-file:   COPYING
+Copyright:      (c) 2001-2010 The Gtk2Hs Team
+Author:         Andy Stewart
+Maintainer:     gtk2hs-users@sourceforge.net
+Build-Type:     Custom
+Cabal-Version:  >= 1.6.0
+Stability:      provisional
+homepage:       http://www.haskell.org/gtk2hs/
+bug-reports:    http://hackage.haskell.org/trac/gtk2hs/
+Synopsis:       Binding to the GtkImageView library.
+Description:    GtkImageView is a simple image viewer widget for GTK+. Similar to the
+                image viewer panes in gThumb or Eye of Gnome. It makes writing image
+                viewing and editing applications easy. Among its features are:
+                
+                * Mouse and keyboard zooming.
+                * Scrolling and dragging.
+                * Adjustable interpolation.
+                * Fullscreen mode.
+                * GIF animation support.
+                * Ability to make selections.
+                * Extensible using a tool system.
+
+Category:       Graphics
+Tested-With:    GHC == 6.12.1
+Extra-Source-Files: gtkimageview.h
+                    Gtk2HsSetup.hs
+                    marshal.list
+					hierarchy.list
+
+Data-Dir:		demo
+Data-Files:		ImageViewer.hs
+                Makefile
+				
+x-Types-File:       Graphics/UI/Gtk/ImageView/Types.chs
+x-Types-Tag:        gtkimageview
+x-Types-ModName:    Graphics.UI.Gtk.ImageView.Types
+x-Types-Forward:    *Graphics.UI.GtkInternals
+x-Types-Destructor: objectUnrefFromMainloop
+x-Types-Hierarchy:  hierarchy.list
+
+Source-Repository head
+  type:         darcs
+  location:     http://code.haskell.org/gtkimageview/
+  
+Library
+        build-depends:  base >= 4 && < 5, array, containers, haskell98, mtl,
+                        glib  >= 0.11 && < 0.12, 
+                        gtk   >= 0.11 && < 0.12
+						
+        build-tools:    gtk2hsC2hs, gtk2hsHookGenerator, gtk2hsTypeGen
+						
+        exposed-modules:
+          Graphics.UI.Gtk.ImageView
+          Graphics.UI.Gtk.ImageView.ImageView
+          Graphics.UI.Gtk.ImageView.AnimView
+          Graphics.UI.Gtk.ImageView.IImageTool
+          Graphics.UI.Gtk.ImageView.ImageNav
+          Graphics.UI.Gtk.ImageView.ImageScrollWin
+          Graphics.UI.Gtk.ImageView.ImageToolDragger
+          Graphics.UI.Gtk.ImageView.ImageToolSelector
+          Graphics.UI.Gtk.ImageView.Zooms
+          Graphics.UI.Gtk.ImageView.Enums
+        other-modules:
+          Graphics.UI.Gtk.ImageView.Types		  
+          Graphics.UI.Gtk.ImageView.Signals
+		  
+        extensions:     ForeignFunctionInterface
+
+        x-Signals-File:  Graphics/UI/Gtk/ImageView/Signals.chs
+        x-Signals-Modname: Graphics.UI.Gtk.ImageView.Signals
+        x-Signals-Types: marshal.list
+		
+        x-c2hs-Header:  gtkimageview.h
+        pkgconfig-depends: gtkimageview >= 1.6.1
diff --git a/gtkimageview.h b/gtkimageview.h
new file mode 100644
--- /dev/null
+++ b/gtkimageview.h
@@ -0,0 +1,8 @@
+#include <gtkimageview/gtkimageview.h>
+#include <gtkimageview/gtkanimview.h>
+#include <gtkimageview/gtkimagenav.h>
+#include <gtkimageview/gtkimagescrollwin.h>
+#include <gtkimageview/gtkimagetooldragger.h>
+#include <gtkimageview/gtkimagetoolselector.h>
+#include <gtkimageview/gtkzooms.h>
+
diff --git a/hierarchy.list b/hierarchy.list
new file mode 100644
--- /dev/null
+++ b/hierarchy.list
@@ -0,0 +1,357 @@
+# This list is the result of a copy-and-paste from the GtkObject hierarchy
+# html documentation. Deprecated widgets are uncommented. Some additional
+# object have been defined at the end of the copied list.
+
+# The Gtk prefix of every object is removed, the other prefixes are
+# kept.  The indentation implies the object hierarchy. In case the
+# type query function cannot be derived from the name or the type name
+# is different, an alternative name and type query function can be
+# specified by appending 'as typename, <query_func>'.  In case this
+# function is not specified, the <name> is converted to
+# gtk_<name'>_get_type where <name'> is <name> where each upperscore
+# letter is converted to an underscore and lowerletter. The underscore
+# is omitted if an upperscore letter preceeded: GtkHButtonBox ->
+# gtk_hbutton_box_get_type. The generation of a type can be
+# conditional by appending 'if <tag>'. Such types are only produces if
+# --tag=<tag> is given on the command line of TypeGenerator.
+
+
+    GObject 
+	    GtkImageToolDragger as ImageToolDragger, gtk_image_tool_dragger_get_type if gtkimageview
+	    GtkImageToolSelector as ImageToolSelector, gtk_image_tool_selector_get_type if gtkimageview
+		GtkSourceGutter if gtksourceview2
+		GtkSourceUndoManager if gtksourceview2
+		GtkSourceCompletionProvider if gtksourceview2
+		GtkSourceCompletionProposal if gtksourceview2
+		GtkSourceCompletionContext if gtksourceview2
+		GtkSourceCompletionItem if gtksourceview2
+        GdkDrawable 
+            GdkWindow		as DrawWindow, gdk_window_object_get_type
+#            GdkDrawableImplX11
+#                GdkWindowImplX11
+            GdkPixmap
+            GdkGLPixmap		if gtkglext
+            GdkGLWindow		if gtkglext
+        GdkColormap
+	GdkScreen		if gtk-2.2
+	GdkDisplay		if gtk-2.2
+	GdkVisual
+	GdkDevice
+        GtkSettings
+        GtkTextBuffer
+            GtkSourceBuffer	if sourceview
+            GtkSourceBuffer	if gtksourceview2
+        GtkTextTag
+            GtkSourceTag	if sourceview
+        GtkTextTagTable
+            GtkSourceTagTable	if sourceview
+        GtkStyle
+	GtkRcStyle
+        GdkDragContext
+        GdkPixbuf
+	GdkPixbufAnimation
+	    GdkPixbufSimpleAnim
+	GdkPixbufAnimationIter
+        GtkTextChildAnchor
+        GtkTextMark
+	    GtkSourceMarker	if sourceview
+            GtkSourceMark       if gtksourceview2
+        GtkObject
+		    GtkSourceCompletion if gtksourceview2
+            GtkWidget
+			    GtkImageView	if gtkimageview
+				    GtkAnimView	if gtkimageview
+                GtkMisc
+                    GtkLabel
+                        GtkAccelLabel
+                        GtkTipsQuery	if deprecated
+                    GtkArrow
+                    GtkImage
+                GtkContainer
+                    WebKitWebView as WebView, webkit_web_view_get_type            if webkit 
+                    GtkBin
+                        GtkAlignment
+                        GtkFrame
+                            GtkAspectFrame
+                        GtkButton
+                            GtkToggleButton
+                                GtkCheckButton
+                                    GtkRadioButton
+                            GtkColorButton		if gtk-2.4
+                            GtkFontButton		if gtk-2.4
+                            GtkOptionMenu		if deprecated
+                        GtkItem
+                            GtkMenuItem
+                                GtkCheckMenuItem
+                                    GtkRadioMenuItem
+                                GtkTearoffMenuItem
+                                GtkImageMenuItem
+                                GtkSeparatorMenuItem
+                            GtkListItem			if deprecated
+#			    GtkTreeItem
+                        GtkWindow
+							GtkImageNav if gtkimageview
+							GtkSourceCompletionInfo if gtksourceview2
+                            GtkDialog
+			    	GtkAboutDialog		if gtk-2.6
+                                GtkColorSelectionDialog
+                                GtkFileSelection
+				GtkFileChooserDialog	if gtk-2.4
+                                GtkFontSelectionDialog
+                                GtkInputDialog
+                                GtkMessageDialog
+                            GtkPlug	if plugNsocket
+                        GtkEventBox
+                        GtkHandleBox
+                        GtkScrolledWindow
+                        GtkViewport
+			GtkExpander			if gtk-2.4
+			GtkComboBox			if gtk-2.4
+			    GtkComboBoxEntry		if gtk-2.4
+			GtkToolItem			if gtk-2.4
+			    GtkToolButton		if gtk-2.4
+				GtkMenuToolButton	if gtk-2.6
+				GtkToggleToolButton	if gtk-2.4
+				    GtkRadioToolButton	if gtk-2.4
+			    GtkSeparatorToolItem	if gtk-2.4
+			GtkMozEmbed		if mozembed
+			VteTerminal as Terminal if vte
+                    GtkBox
+                        GtkButtonBox
+                            GtkHButtonBox
+                            GtkVButtonBox
+                        GtkVBox
+                            GtkColorSelection
+                            GtkFontSelection
+			    GtkFileChooserWidget	if gtk-2.4
+                        GtkHBox
+                            GtkCombo	if deprecated
+                            GtkFileChooserButton	if gtk-2.6
+                            GtkStatusbar
+                    GtkCList		if deprecated
+                        GtkCTree	if deprecated
+                    GtkFixed
+                    GtkPaned
+                        GtkHPaned
+                        GtkVPaned
+                    GtkIconView		if gtk-2.6
+                    GtkLayout
+                    GtkList		if deprecated
+                    GtkMenuShell
+                        GtkMenu
+                        GtkMenuBar
+                    GtkNotebook
+#                    GtkPacker
+                    GtkSocket		if plugNsocket
+                    GtkTable
+					    GtkImageScrollWin if gtkimageview
+                    GtkTextView
+                        GtkSourceView	if sourceview
+                        GtkSourceView	if gtksourceview2
+                    GtkToolbar
+                    GtkTreeView
+                GtkCalendar
+                GtkCellView		if gtk-2.6
+		GtkDrawingArea
+                GtkEntry
+                    GtkSpinButton
+                GtkRuler
+                    GtkHRuler
+                    GtkVRuler
+                GtkRange
+                    GtkScale
+                        GtkHScale
+                        GtkVScale
+                    GtkScrollbar
+                        GtkHScrollbar
+                        GtkVScrollbar
+                GtkSeparator
+                    GtkHSeparator
+                    GtkVSeparator
+                GtkInvisible
+#                GtkOldEditable
+#                    GtkText
+                GtkPreview		if deprecated
+# Progress is deprecated, ProgressBar contains everything necessary
+#                GtkProgress
+                GtkProgressBar
+            GtkAdjustment
+            GtkIMContext
+                GtkIMMulticontext
+            GtkItemFactory		if deprecated
+            GtkTooltips
+			
+# These object were added by hand because they do not show up in the hierarchy
+# chart.
+# These are derived from GtkObject:
+	    GtkTreeViewColumn
+	    GtkCellRenderer
+		GtkCellRendererPixbuf
+		GtkCellRendererText
+		    GtkCellRendererCombo	if gtk-2.6
+		GtkCellRendererToggle
+		GtkCellRendererProgress	if gtk-2.6
+	    GtkFileFilter		if gtk-2.4
+            GtkBuilder if gtk-2.12
+# These are actually interfaces, but all objects that implement it are at
+# least GObjects.
+	GtkCellLayout			if gtk-2.4
+	GtkTreeSortable			if gtk-2.4
+	GtkTooltip				if gtk-2.12
+# These are derived from GObject:
+  	GtkStatusIcon                   if gtk-2.10
+        GtkTreeSelection
+        GtkTreeModel
+            GtkTreeStore
+            GtkListStore
+	GtkTreeModelSort
+	GtkTreeModelFilter		if gtk-2.4
+	GtkIconFactory
+	GtkIconTheme
+	GtkSizeGroup
+	GtkClipboard			if gtk-2.2
+	GtkAccelGroup
+	GtkAccelMap			if gtk-2.4
+	GtkEntryCompletion		if gtk-2.4
+	GtkAction			if gtk-2.4
+	    GtkToggleAction		if gtk-2.4
+		GtkRadioAction		if gtk-2.4
+	GtkActionGroup			if gtk-2.4
+	GtkUIManager			if gtk-2.4
+	GtkWindowGroup
+        GtkSourceLanguage		if sourceview
+        GtkSourceLanguage		if gtksourceview2
+        GtkSourceLanguagesManager	if sourceview
+        GtkSourceLanguageManager	if gtksourceview2
+	GladeXML			as GladeXML, glade_xml_get_type if libglade
+	GConfClient			as GConf if gconf
+# These ones are actualy interfaces, but interface implementations are GObjects
+	GtkEditable
+	GtkSourceStyle			as SourceStyleObject if gtksourceview2
+	GtkSourceStyleScheme		if sourceview
+	GtkSourceStyleScheme		if gtksourceview2
+	GtkSourceStyleSchemeManager	if gtksourceview2
+	GtkFileChooser			if gtk-2.4
+## This now became a GObject in version 2:
+	GdkGC				as GC, gdk_gc_get_type
+## These are Pango structures
+	PangoContext		as PangoContext, pango_context_get_type if pango
+	PangoLayout		as PangoLayoutRaw, pango_layout_get_type if pango
+	PangoFont		as Font, pango_font_get_type if pango
+	PangoFontFamily		as FontFamily, pango_font_family_get_type if pango
+	PangoFontFace		as FontFace, pango_font_face_get_type if pango
+	PangoFontMap		as FontMap, pango_font_face_get_type if pango
+	PangoFontset		as FontSet, pango_fontset_get_type if pango
+## This type is only available for PANGO_ENABLE_BACKEND compiled source
+##	    PangoFontsetSimple	as FontSetSimple, pango_fontset_simple_get_type
+
+## GtkGlExt classes
+	GdkGLContext		if gtkglext
+	GdkGLConfig		if gtkglext
+	GdkGLDrawable		if gtkglext
+
+## GnomeVFS classes
+	GnomeVFSVolume		as Volume, gnome_vfs_volume_get_type if gnomevfs
+	GnomeVFSDrive		as Drive, gnome_vfs_drive_get_type if gnomevfs
+	GnomeVFSVolumeMonitor	as VolumeMonitor, gnome_vfs_volume_monitor_get_type if gnomevfs
+
+## GIO classes
+# Note on all the "as" clauses: the prefix G is unfortunate since it leads
+# to two consecutive upper case letters which are not translated with an
+# underscore each (e.g. GConf -> gconf, GtkHButtonBox -> gtk_hbutton_box).
+#        GUnixMountMonitor		as UnixMountMonitor, g_unix_mount_monitor_get_type if gio
+        GOutputStream			as OutputStream, g_output_stream_get_type if gio
+            GFilterOutputStream		as FilterOutputStream, g_filter_output_stream_get_type if gio
+                GDataOutputStream	as DataOutputStream, g_data_output_stream_get_type if gio
+                GBufferedOutputStream   as BufferedOutputStream, g_buffered_output_stream_get_type if gio
+#            GUnixOutputStream		as UnixOutputStream, g_unix_output_stream_get_type if gio
+            GFileOutputStream           as FileOutputStream, g_file_output_stream_get_type if gio
+            GMemoryOutputStream		as MemoryOutputStream, g_memory_output_stream_get_type if gio
+        GInputStream			as InputStream, g_input_stream_get_type if gio
+#            GUnixInputStream		as UnixInputStream, g_unix_input_stream_get_type if gio
+            GMemoryInputStream		as MemoryInputStream, g_memory_input_stream_get_type if gio
+            GFilterInputStream		as FilterInputStream, g_filter_input_stream_get_type if gio
+                GBufferedInputStream	as BufferedInputStream, g_buffered_input_stream_get_type if gio
+                    GDataInputStream	as DataInputStream, g_data_input_stream_get_type if gio
+            GFileInputStream		as FileInputStream, g_file_input_stream_get_type if gio
+#        GDesktopAppInfo			as DesktopAppInfo, g_desktop_app_info_get_type if gio
+        GFileMonitor			as FileMonitor, g_file_monitor_get_type if gio
+        GVfs				as Vfs, g_vfs_get_type if gio
+        GMountOperation			as MountOperation, g_mount_operation_get_type if gio
+        GThemedIcon			as ThemedIcon, g_themed_icon_get_type if gio
+        GEmblem			as Emblem, g_emblem_get_type if gio
+        GEmblemedIcon			as EmblemedIcon, g_emblemed_icon_get_type if gio
+        GFileEnumerator			as FileEnumerator, g_file_enumerator_get_type if gio
+        GFilenameCompleter		as FilenameCompleter, g_filename_completer_get_type if gio
+        GFileIcon			as FileIcon, g_file_icon_get_type if gio
+        GVolumeMonitor			as VolumeMonitor, g_volume_monitor_get_type if gio
+        GCancellable			as Cancellable, g_cancellable_get_type if gio
+        GSimpleAsyncResult		as SimpleAsyncResult, g_async_result_get_type if gio
+        GFileInfo			as FileInfo, g_file_info_get_type if gio
+		GAppLaunchContext   as AppLaunchContext, g_app_launch_context_get_type if gio
+## these are actually GInterfaces
+        GIcon				as Icon, g_icon_get_type if gio
+        GSeekable			as Seekable, g_seekable_get_type if gio
+        GAppInfo			as AppInfo, g_app_info_get_type if gio
+        GVolume				as Volume, g_volume_get_type if gio
+        GAsyncResult			as AsyncResult, g_async_result_get_type if gio
+        GLoadableIcon			as LoadableIcon, g_loadable_icon_get_type if gio
+        GDrive				as Drive, g_drive_get_type if gio
+        GFile				noEq as File, g_file_get_type if gio
+        GMount				as Mount, g_mount_get_type if gio
+		
+## GStreamer classes
+	GstObject			as Object,		gst_object_get_type			if gstreamer
+	    GstPad			as Pad,			gst_pad_get_type			if gstreamer
+	        GstGhostPad		as GhostPad,		gst_ghost_pad_get_type			if gstreamer
+	    GstPluginFeature		as PluginFeature,	gst_plugin_feature_get_type		if gstreamer
+	        GstElementFactory	as ElementFactory,	gst_element_factory_get_type		if gstreamer
+	        GstTypeFindFactory	as TypeFindFactory,	gst_type_find_factory_get_type		if gstreamer
+	        GstIndexFactory		as IndexFactory,	gst_index_factory_get_type		if gstreamer
+	    GstElement			as Element,		gst_element_get_type			if gstreamer
+	        GstBin			as Bin,			gst_bin_get_type			if gstreamer
+	            GstPipeline		as Pipeline,		gst_pipeline_get_type			if gstreamer
+	        GstImplementsInterface  as ImplementsInterface, gst_implements_interface_get_type	if gstreamer
+	        GstTagSetter            as TagSetter,           gst_tag_setter_get_type			if gstreamer
+                GstBaseSrc              as BaseSrc,             gst_base_src_get_type			if gstreamer
+                    GstPushSrc          as PushSrc,             gst_push_src_get_type                   if gstreamer
+                GstBaseSink             as BaseSink,            gst_base_sink_get_type                  if gstreamer
+                GstBaseTransform        as BaseTransform,       gst_base_transform_get_type             if gstreamer
+	    GstPlugin			as Plugin,		gst_plugin_get_type			if gstreamer
+	    GstRegistry			as Registry,		gst_registry_get_type			if gstreamer
+	    GstBus			as Bus,			gst_bus_get_type			if gstreamer
+	    GstClock			as Clock,		gst_clock_get_type			if gstreamer
+	        GstAudioClock		as AudioClock,		gst_audio_clock_get_type		if gstreamer
+	        GstSystemClock		as SystemClock,		gst_system_clock_get_type		if gstreamer
+                GstNetClientClock       as NetClientClock,      gst_net_client_clock_get_type           if gstreamer
+	    GstIndex			as Index,		gst_index_get_type			if gstreamer
+	    GstPadTemplate		as PadTemplate,		gst_pad_template_get_type		if gstreamer
+	    GstTask			as Task,		gst_task_get_type			if gstreamer
+	    GstXML			as XML,			gst_xml_get_type			if gstreamer
+	    GstChildProxy               as ChildProxy,          gst_child_proxy_get_type		if gstreamer
+            GstCollectPads              as CollectPads,         gst_collect_pads_get_type               if gstreamer
+## these are actually GInterfaces
+	GstURIHandler                   as URIHandler,          gst_uri_handler_get_type		if gstreamer
+        GstAdapter                      as Adapter,             gst_adapter_get_type                    if gstreamer
+        GstController                   as Controller,          gst_controller_get_type                 if gstreamer
+
+        WebKitWebFrame as WebFrame, webkit_web_frame_get_type          if webkit 
+        WebKitWebSettings as WebSettings, webkit_web_settings_get_type    if webkit
+        WebKitNetworkRequest as NetworkRequest, webkit_network_request_get_type  if webkit
+        WebKitNetworkResponse as NetworkResponse, webkit_network_response_get_type    if webkit
+        WebKitDownload as Download, webkit_download_get_type  if webkit
+        WebKitWebBackForwardList as WebBackForwardList, webkit_web_back_forward_list_get_type if webkit
+        WebKitWebHistoryItem as WebHistoryItem, webkit_web_history_item_get_type if webkit
+        WebKitWebInspector as WebInspector, webkit_web_inspector_get_type if webkit
+        WebKitHitTestResult as HitTestResult, webkit_hit_test_result_get_type if webkit
+        WebKitSecurityOrigin as SecurityOrigin, webkit_security_origin_get_type if webkit
+        WebKitSoupAuthDialog as SoupAuthDialog, webkit_soup_auth_dialog_get_type if webkit
+        WebKitWebDatabase as WebDatabase, webkit_web_database_get_type if webkit
+        WebKitWebDataSource as WebDataSource, webkit_web_data_source_get_type if webkit
+        WebKitWebNavigationAction as WebNavigationAction, webkit_web_navigation_action_get_type if webkit
+        WebKitWebPolicyDecision as WebPolicyDecision, webkit_web_policy_decision_get_type if webkit
+        WebKitWebResource as WebResource, webkit_web_resource_get_type if webkit
+        WebKitWebWindowFeatures as WebWindowFeatures, webkit_web_window_features_get_type if webkit
+
+## these are actually GInterfaces for GtkImageView
+	GtkIImageTool as IImageTool, gtk_iimage_tool_get_type if gtkimageview
diff --git a/marshal.list b/marshal.list
new file mode 100644
--- /dev/null
+++ b/marshal.list
@@ -0,0 +1,51 @@
+# see glib-genmarshal(1) for a detailed description of the file format,
+# possible parameter types are:
+#   VOID        indicates   no   return   type,  or  no  extra
+#               parameters. if VOID is used as  the  parameter
+#               list, no additional parameters may be present.
+#   BOOLEAN     for boolean types (gboolean)
+#   CHAR        for signed char types (gchar)
+#   UCHAR       for unsigned char types (guchar)
+#   INT         for signed integer types (gint)
+#   UINT        for unsigned integer types (guint)
+#   LONG        for signed long integer types (glong)
+#   ULONG       for unsigned long integer types (gulong)
+#   ENUM        for enumeration types (gint)
+#   FLAGS       for flag enumeration types (guint)
+#   FLOAT       for single-precision float types (gfloat)
+#   DOUBLE      for double-precision float types (gdouble)
+#   STRING      for string types (gchar*)
+#   BOXED       for boxed (anonymous but reference counted) types (GBoxed*)
+#   POINTER     for anonymous pointer types (gpointer)
+#   NONE        deprecated alias for VOID
+#   BOOL        deprecated alias for BOOLEAN
+
+#
+# One discrepancy from Gtk+ is that for signals that may pass NULL for an object
+# reference, the Haskell signal should be passed a 'Maybe GObject'.
+# We therefore have two variants that are marshalled as a maybe type:
+#
+#   OBJECT      for GObject or derived types (GObject*)
+#   MOBJECT      for GObject or derived types (GObject*) that may be NULL
+
+# Furthermore, some objects needs to be destroyed synchronously from the main loop of
+# Gtk rather than during GC. These objects need to be marshalled using TOBJECT (for thread-safe
+# object). It doesn't hurt to use TOBJECT for an object that doesn't need it, except for the
+# some performance. As a rule of thumb, use TOBJECT for all libraries that build on package
+# 'gtk' and use OBJECT for all packages that only need packages 'glib', 'pango', 'cairo',
+# 'gio'. Again both variants exist. Note that the same names will be generated for OBJECT and
+# TOBJECT, so you have to remove the OBJECT handler if you need both.
+#
+#   TOBJECT      for GObject or derived types (GObject*)
+#   MTOBJECT      for GObject or derived types (GObject*) that may be NULL
+
+# If you add a new signal type, please check that it actually works!
+# If it is a Boxed type check that the reference counting is right.
+
+NONE:ENUM
+NONE:NONE
+NONE:DOUBLE
+NONE:INT
+NONE:OBJECT,OBJECT
+NONE:ENUM
+NONE:ENUM,ENUM
