[Xfce4-commits] <mousepad:nick_0_3> Move in all the changes from the old git branch.

Nick Schermer nick at xfce.org
Wed Aug 12 18:04:01 CEST 2009


Updating branch refs/heads/nick_0_3
         to 375a246bf9f38733f368bfa05163734119b54168 (commit)
       from d7fce4e8e9890bee3cde1d8afa549b320ca0bb4c (commit)

commit 375a246bf9f38733f368bfa05163734119b54168
Author: Nick Schermer <nick at xfce.org>
Date:   Wed Aug 12 18:01:02 2009 +0200

    Move in all the changes from the old git branch.
    
    Because individual patches did not apply, this is one big
    commit the moving everything at once.

 ChangeLog                                   |    9 +
 Makefile.am                                 |    2 -
 MousepadHelp.in                             |    2 -
 TODO                                        |    1 +
 autogen.sh                                  |    3 -
 configure.in.in                             |    4 +-
 docs/Makefile.am                            |    4 +-
 docs/manual/C/Makefile.am                   |    2 -
 docs/manual/C/Mousepad.xml.in               |  199 +++++--
 docs/manual/C/images/Makefile.am            |   12 +-
 docs/manual/C/images/find-and-replace.png   |  Bin 0 -> 20777 bytes
 docs/manual/C/images/go-to.png              |  Bin 0 -> 9507 bytes
 docs/manual/C/images/main-window.png        |  Bin 0 -> 13955 bytes
 docs/manual/C/images/other-tab-size.png     |  Bin 0 -> 8168 bytes
 docs/manual/C/images/paste-from-history.png |  Bin 0 -> 9495 bytes
 docs/manual/C/images/tab-size-menu.png      |  Bin 0 -> 9130 bytes
 docs/manual/C/images/typeahead-search.png   |  Bin 0 -> 6724 bytes
 docs/manual/Makefile.am                     |    2 -
 icons/16x16/Makefile.am                     |    2 -
 icons/24x24/Makefile.am                     |    2 -
 icons/Makefile.am                           |    2 -
 icons/scalable/Makefile.am                  |    2 -
 mousepad/Makefile.am                        |  182 +++---
 mousepad/main.c                             |    5 +-
 mousepad/mousepad-application.c             |   27 +-
 mousepad/mousepad-application.h             |    1 -
 mousepad/mousepad-dbus-infos.xml            |    2 -
 mousepad/mousepad-dbus.c                    |   38 +-
 mousepad/mousepad-dbus.h                    |    1 -
 mousepad/mousepad-dialogs.c                 |    9 +-
 mousepad/mousepad-dialogs.h                 |    3 +-
 mousepad/mousepad-document.c                |   51 +-
 mousepad/mousepad-document.h                |    1 -
 mousepad/mousepad-encoding-dialog.c         |  340 +++++------
 mousepad/mousepad-encoding-dialog.h         |   13 +-
 mousepad/mousepad-encoding.c                |  201 ++++++
 mousepad/mousepad-encoding.h                |  125 ++++
 mousepad/mousepad-file.c                    |  721 +++++++++++++---------
 mousepad/mousepad-file.h                    |   28 +-
 mousepad/mousepad-preferences.c             |    7 +-
 mousepad/mousepad-preferences.h             |    1 -
 mousepad/mousepad-print.c                   |   17 +-
 mousepad/mousepad-print.h                   |    1 -
 mousepad/mousepad-private.h                 |   35 +-
 mousepad/mousepad-replace-dialog.c          |    9 +-
 mousepad/mousepad-replace-dialog.h          |    1 -
 mousepad/mousepad-search-bar.c              |   25 +-
 mousepad/mousepad-search-bar.h              |    1 -
 mousepad/mousepad-statusbar.c               |    9 +-
 mousepad/mousepad-statusbar.h               |    1 -
 mousepad/mousepad-undo.c                    |   53 +-
 mousepad/mousepad-undo.h                    |    1 -
 mousepad/mousepad-util.c                    |   77 ++--
 mousepad/mousepad-util.h                    |    1 -
 mousepad/mousepad-view.c                    |  103 ++--
 mousepad/mousepad-view.h                    |    1 -
 mousepad/mousepad-window-ui.xml             |    4 +-
 mousepad/mousepad-window.c                  |  889 ++++++++++++++-------------
 mousepad/mousepad-window.h                  |    7 +-
 59 files changed, 1888 insertions(+), 1351 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b864971..244a1da 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-03-xx	Nick Schermer <nick at xfce.org
+
+	* mousepad/mousepad-file.c: Use GMappedFile (mmap) for opening a
+	  document. Also improve the line ending detection and avoid
+	  a lot of gtk_text_buffer_insert() calls when opening unix or
+	  mac line-ended files.
+	* Some internal renaming.
+
+
 2008-03-10	Nick Schermer <nick at xfce.org>
 
 	* mousepad/mousepad-document.c: Swap the colors of readonly and
diff --git a/Makefile.am b/Makefile.am
index aafee93..e9d4098 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,3 @@
-# $Id$
-
 SUBDIRS =									\
 	icons									\
 	mousepad                                                        	\
diff --git a/MousepadHelp.in b/MousepadHelp.in
index 7da5051..bde651f 100644
--- a/MousepadHelp.in
+++ b/MousepadHelp.in
@@ -1,7 +1,5 @@
 #!/bin/sh
 #
-# $Id$
-#
 # Copyright (c) 2004-2006 Benedikt Meurer <benny at xfce.org>
 # Copyright (c) 2007      Nick Schermer <nick at xfce.org>
 #
diff --git a/TODO b/TODO
index 8c8887f..6976a23 100644
--- a/TODO
+++ b/TODO
@@ -40,3 +40,4 @@ Testing and polishing
 Feature
 =======
 - You'll never know. No promisses here...
+- GIO.
diff --git a/autogen.sh b/autogen.sh
index e8fcaae..852b2db 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,7 +1,4 @@
 #!/bin/sh
-#
-# $Id$
-#
 
 (type xdt-autogen) >/dev/null 2>&1 || {
   cat >&2 <<EOF
diff --git a/configure.in.in b/configure.in.in
index aba1fae..62c78ce 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -1,5 +1,3 @@
-dnl $Id$
-
 dnl ***************************
 dnl *** Version information ***
 dnl ***************************
@@ -24,7 +22,7 @@ AC_COPYRIGHT([Copyright (c) 2007-2008
 AC_INIT([Mousepad], [mousepad_version], [http://bugzilla.xfce.org/], [mousepad])
 AC_PREREQ([2.50])
 AC_CANONICAL_TARGET()
-AC_REVISION([$Id$])
+AC_REVISION([])
 
 dnl ***************************
 dnl *** Initialize automake ***
diff --git a/docs/Makefile.am b/docs/Makefile.am
index a936fe8..7511289 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -1,6 +1,4 @@
-# $Id$
-
-SUBDIRS =								\
+SUBDIRS = \
 	manual
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/docs/manual/C/Makefile.am b/docs/manual/C/Makefile.am
index c555c85..06db614 100644
--- a/docs/manual/C/Makefile.am
+++ b/docs/manual/C/Makefile.am
@@ -1,5 +1,3 @@
-# $Id$
-
 SUBDIRS =								\
 	images
 
diff --git a/docs/manual/C/Mousepad.xml.in b/docs/manual/C/Mousepad.xml.in
index e31cef3..fcd6ce3 100644
--- a/docs/manual/C/Mousepad.xml.in
+++ b/docs/manual/C/Mousepad.xml.in
@@ -51,17 +51,18 @@
       <title>Introduction</title>
 
       <para>
-        &application; is the default text editor for the Xfce Desktop Environment. It has been design to be a
-        lightweight editor you would use for basic file editing. Therefore &application; starts quickly, but
-        also has features like editing multiple documents, vertical selection, type-ahead search, full tab
-        drag and drop and much more.
+        &application; is the default text editor for the Xfce Desktop Environment. It has
+        been design to be a lightweight editor you would use for basic file editing.
+        Therefore &application; starts quickly, but also has features like editing
+        multiple documents, vertical selection, type-ahead search, full tab drag and drop
+        and much more.
       </para>
 
       <para>
-        &application; started as a fork of Leafpad to provide printing support using Xfprint, but as of version
-        0.3 is has been completely rewritten to add support for tabs and DBus. Although the rewrite added
-        a lot of new features, it is still as fast as the Leafpad based fork and therefore fits perfectly
-        in the Xfce philosophy.
+        &application; started as a fork of Leafpad to provide printing support using
+        Xfprint, but as of version 0.3 is has been completely rewritten to add support for
+        tabs and DBus. Although the rewrite added a lot of new features, it is still as
+        fast as the Leafpad based fork and therefore fits perfectly in the Xfce philosophy.
       </para>
     </sect2>
 
@@ -69,8 +70,8 @@
       <title>Terminology</title>
 
       <para>
-        There might be a couple of words in this manual that could be the source of misunderstanding. The table
-        below will clarify those words.
+        There might be a couple of words in this manual that could be the source of
+        misunderstanding. The table below will clarify those words.
       </para>
 
       <table frame="all">
@@ -101,84 +102,182 @@
     </sect2>
   </sect1>
 
-  <sect1 id="mousepad">
-    <title>Working With &application;</title>
-
-    <sect2 id="window">
-      <title>Main Window</title>
-
-      <sect3 id="menu-bar">
-        <title>Menu Bar</title>
-      </sect3>
+  <sect1 id="working-with-text">
+    <title>Working With Text</title>
 
-      <sect3 id="statusbar">
-        <title>Statsbar</title>
-      </sect3>
+    <sect2 id="keyboard-shortcuts">
+      <title>Keyboard Shortcuts</title>
     </sect2>
 
-    <sect2 id="navigation">
-      <title>Navigation</title>
+    <sect2 id="undo-and-redo">
+      <title>Undo and Redo</title>
 
-      <sect3 id="go-to-line">
-        <title>Go To Line</title>
-      </sect3>
-    </sect2>
+      <para>
 
-    <sect2 id="ordering-documents">
-      <title>Ordering Documents</title>
+      </para>
     </sect2>
 
-    <sect2 id="documents">
-      <title>Documents</title>
+    <sect2 id="copy-and-paste">
+      <title>Copy and Paste</title>
 
-      <sect3 id="new-documents">
-        <title>Creating New Documents</title>
-      </sect3>
+      <para>
+        &application; supports both the selection and primary clipboard. To paste
+        something from the seletion clipboard you can click with the middle mouse
+        button in the &application; window.
+      </para>
 
-      <sect3 id="opening-documents">
-        <title>Opening Documents</title>
-      </sect3>
+      <para>
+        The primary clipboard can be accessed by the <guimenuitem>Cut</guimenuitem>,
+        <guimenuitem>Copy</guimenuitem> and <guimenuitem>Paste</guimenuitem> menu
+        items in the <guimenu>Edit</guimenu> menu. The keyboard shortcuts mentioned
+        above also work.
+      </para>
 
-      <sect3 id="recent-documents">
-        <title>Recent Documents</title>
+      <sect3 id="paste-from-history">
+        <title>Paste from History</title>
+
+        <screenshot>
+          <mediaobject>
+            <imageobject>
+              <imagedata fileref="images/paste-from-history.png" format="PNG"/>
+            </imageobject>
+
+            <textobject>
+              <phrase>Paste from History</phrase>
+            </textobject>
+
+            <caption>
+              <para>Screenshot of the history menu</para>
+            </caption>
+          </mediaobject>
+        </screenshot>
+
+        <para>
+          Each time you copy text in &application;, the text is pushed onto a stack.
+          When you choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Paste Special
+          </guimenuitem><guimenuitem>Paste from History</guimenuitem></menuchoice> a
+          menu will appear below the carret with the last 10 clipboard items.
+        </para>
+
+        <para>
+          You can choose an item from the list by clicking it, using the arrow keys
+          and press enter or by pressing the numeric keyboard accelerator.
+        </para>
       </sect3>
-    </sect2>
-  </sect1>
 
-  <sect1 id="text">
-    <title>Working With Text</title>
+      <sect3 id="paste-as-column">
+        <title>Paste as Column</title>
 
-    <sect2 id="keyboard-shortcuts">
-      <title>Keyboard Shortcuts</title>
+        <para>
+          When the content in the primary clipboard contains multiple lines, you can paste
+          the content in the same column. &application; will then try  to paste each line
+          in the clipboard at the same x-coordinate. You can access this option by
+          choosing <menuchoice><guimenu>Edit</guimenu><guimenuitem>Paste Special
+          </guimenuitem><guimenuitem>Paste as Column</guimenuitem></menuchoice>.
+        </para>
+      </sect3>
     </sect2>
 
     <sect2 id="auto-indent">
       <title>Auto Indent</title>
+
     </sect2>
 
     <sect2 id="selections">
       <title>Selecting Text</title>
 
       <sect3 id="multi-and-column-selections">
-        <title>Multi- And Column-Selections</title>
+        <title>Column-Selections</title>
       </sect3>
 
       <sect3 id="indentation">
         <title>Indentation</title>
       </sect3>
-    </sect2>
 
-    <sect2 id="clipboard">
-      <title>Copy, Cut and Paste From The Clipboard</title>
+      <sect3 id="moving-selections">
+        <title>Moving Selections</title>
+      </sect3>
     </sect2>
 
     <sect2 id="search-and-replace">
       <title>Search And Replace</title>
+
+      <sect3 id="typeahead-search">
+        <title>Typeahead Search</title>
+
+        <screenshot>
+          <mediaobject>
+            <imageobject>
+              <imagedata fileref="images/typeahead-search.png" format="PNG"/>
+            </imageobject>
+
+            <textobject>
+              <phrase>Typeahead search bar</phrase>
+            </textobject>
+
+            <caption>
+              <para>Screenshot of the typeahead search bar</para>
+            </caption>
+          </mediaobject>
+        </screenshot>
+      </sect3>
+
+      <sect3 id="replace-dialog">
+        <title>Search and Replace Dialog</title>
+
+        <screenshot>
+          <mediaobject>
+            <imageobject>
+              <imagedata fileref="images/find-and-replace.png" format="PNG"/>
+            </imageobject>
+
+            <textobject>
+              <phrase>Find and Replace Dialog</phrase>
+            </textobject>
+
+            <caption>
+              <para>Screenshot of the find and replace dialog</para>
+            </caption>
+          </mediaobject>
+        </screenshot>
+      </sect3>
     </sect2>
 
     <sect2 id="tabs">
       <title>Tabs</title>
 
+        <screenshot>
+          <mediaobject>
+            <imageobject>
+              <imagedata fileref="images/tab-size-menu.png" format="PNG"/>
+            </imageobject>
+
+            <textobject>
+              <phrase>Tab Size menu</phrase>
+            </textobject>
+
+            <caption>
+              <para>Screenshot of the tabs size menu</para>
+            </caption>
+          </mediaobject>
+        </screenshot>
+
+        <screenshot>
+          <mediaobject>
+            <imageobject>
+              <imagedata fileref="images/other-tab-size.png" format="PNG"/>
+            </imageobject>
+
+            <textobject>
+              <phrase>Other tab size</phrase>
+            </textobject>
+
+            <caption>
+              <para>Screenshot of the other tab size dialog</para>
+            </caption>
+          </mediaobject>
+        </screenshot>
+
       <sect3 id="insert-spaces">
         <title>Insert Spaces</title>
       </sect3>
diff --git a/docs/manual/C/images/Makefile.am b/docs/manual/C/images/Makefile.am
index 0a63e5f..c329f2b 100644
--- a/docs/manual/C/images/Makefile.am
+++ b/docs/manual/C/images/Makefile.am
@@ -1,7 +1,13 @@
-# $Id$
-
 imagesdir = $(datadir)/doc/Mousepad/html/C/images
-images_DATA =
+images_DATA =								\
+	find-and-replace.png						\
+	go-to.png							\
+	main-window.png							\
+	Makefile.am							\
+	other-tab-size.png						\
+	paste-from-history.png						\
+	tab-size-menu.png						\
+	typeahead-search.png
 
 EXTRA_DIST = 								\
 	$(images_DATA)
diff --git a/docs/manual/C/images/find-and-replace.png b/docs/manual/C/images/find-and-replace.png
new file mode 100644
index 0000000..9e8648a
Binary files /dev/null and b/docs/manual/C/images/find-and-replace.png differ
diff --git a/docs/manual/C/images/go-to.png b/docs/manual/C/images/go-to.png
new file mode 100644
index 0000000..4fe1d3c
Binary files /dev/null and b/docs/manual/C/images/go-to.png differ
diff --git a/docs/manual/C/images/main-window.png b/docs/manual/C/images/main-window.png
new file mode 100644
index 0000000..2ac0a27
Binary files /dev/null and b/docs/manual/C/images/main-window.png differ
diff --git a/docs/manual/C/images/other-tab-size.png b/docs/manual/C/images/other-tab-size.png
new file mode 100644
index 0000000..651d095
Binary files /dev/null and b/docs/manual/C/images/other-tab-size.png differ
diff --git a/docs/manual/C/images/paste-from-history.png b/docs/manual/C/images/paste-from-history.png
new file mode 100644
index 0000000..dd2d757
Binary files /dev/null and b/docs/manual/C/images/paste-from-history.png differ
diff --git a/docs/manual/C/images/tab-size-menu.png b/docs/manual/C/images/tab-size-menu.png
new file mode 100644
index 0000000..942063c
Binary files /dev/null and b/docs/manual/C/images/tab-size-menu.png differ
diff --git a/docs/manual/C/images/typeahead-search.png b/docs/manual/C/images/typeahead-search.png
new file mode 100644
index 0000000..2fc6664
Binary files /dev/null and b/docs/manual/C/images/typeahead-search.png differ
diff --git a/docs/manual/Makefile.am b/docs/manual/Makefile.am
index d0ae330..817eaa6 100644
--- a/docs/manual/Makefile.am
+++ b/docs/manual/Makefile.am
@@ -1,5 +1,3 @@
-# $Id$
-
 SUBDIRS =								\
 	C
 
diff --git a/icons/16x16/Makefile.am b/icons/16x16/Makefile.am
index 6cedaf6..a8e5cb7 100644
--- a/icons/16x16/Makefile.am
+++ b/icons/16x16/Makefile.am
@@ -1,5 +1,3 @@
-# $Id$
-
 iconsdir = $(datadir)/icons/hicolor/16x16/apps
 icons_DATA =								\
 	Mousepad.png
diff --git a/icons/24x24/Makefile.am b/icons/24x24/Makefile.am
index 0a73503..c22ae68 100644
--- a/icons/24x24/Makefile.am
+++ b/icons/24x24/Makefile.am
@@ -1,5 +1,3 @@
-# $Id$
-
 iconsdir = $(datadir)/icons/hicolor/24x24/apps
 icons_DATA =								\
 	Mousepad.png
diff --git a/icons/Makefile.am b/icons/Makefile.am
index e6cdc99..21932ab 100644
--- a/icons/Makefile.am
+++ b/icons/Makefile.am
@@ -1,5 +1,3 @@
-# $Id$
-
 SUBDIRS =								\
 	16x16								\
 	24x24								\
diff --git a/icons/scalable/Makefile.am b/icons/scalable/Makefile.am
index b2a0019..2beabc7 100644
--- a/icons/scalable/Makefile.am
+++ b/icons/scalable/Makefile.am
@@ -1,5 +1,3 @@
-# $Id$
-
 iconsdir = $(datadir)/icons/hicolor/scalable/apps
 icons_DATA =								\
 	Mousepad.svg
diff --git a/mousepad/Makefile.am b/mousepad/Makefile.am
index ebf6361..4c46a67 100644
--- a/mousepad/Makefile.am
+++ b/mousepad/Makefile.am
@@ -1,137 +1,125 @@
-# $Id$
-
-INCLUDES =									\
-	-I$(top_builddir)							\
-	-I$(top_srcdir)								\
-	-DBINDIR=\"$(bindir)\"							\
-	-DDATADIR=\"$(datadir)\"						\
-	-DLIBDIR=\"$(libdir)\"							\
-	-DLIBEXECDIR=\"$(libexecdir)\"						\
-	-DG_LOG_DOMAIN=\"Mousepad\"						\
-	-DLIBEXECDIR=\"$(libexecdir)\"						\
-	-DPACKAGE_LOCALE_DIR=\"$(localedir)\"					\
-	-DG_DISABLE_DEPRECATED							\
-	-DGTK_DISABLE_DEPRECATED						\
-	-DGDK_DISABLE_DEPRECATED						\
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-DBINDIR=\"$(bindir)\" \
+	-DDATADIR=\"$(datadir)\" \
+	-DLIBDIR=\"$(libdir)\" \
+	-DLIBEXECDIR=\"$(libexecdir)\" \
+	-DG_LOG_DOMAIN=\"Mousepad\" \
+	-DLIBEXECDIR=\"$(libexecdir)\" \
+	-DPACKAGE_LOCALE_DIR=\"$(localedir)\" \
+	-DG_DISABLE_DEPRECATED \
+	-DGTK_DISABLE_DEPRECATED \
+	-DGDK_DISABLE_DEPRECATED \
+	-DG_DISABLE_SINGLE_INCLUDES \
+	-DPANGO_DISABLE_SINGLE_INCLUDES \
+	-DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES \
+	-DGTK_DISABLE_SINGLE_INCLUDES \
 	$(PLATFORM_CPPFLAGS)
 
-bin_PROGRAMS = 									\
+bin_PROGRAMS = \
 	mousepad
 
-mousepad_built_sources =							\
-	mousepad-marshal.c							\
+mousepad_built_sources = \
+	mousepad-marshal.c \
 	mousepad-marshal.h
 
-mousepad_SOURCES =								\
-	$(mousepad_built_sources)						\
-	$(mousepad_dbus_sources)						\
-	main.c									\
-	mousepad-application.c							\
-	mousepad-application.h							\
-	mousepad-dialogs.c							\
-	mousepad-dialogs.h							\
-	mousepad-document.c							\
-	mousepad-document.h							\
-	mousepad-encoding-dialog.c						\
-	mousepad-encoding-dialog.h						\
-	mousepad-file.c								\
-	mousepad-file.h								\
-	mousepad-preferences.c							\
-	mousepad-preferences.h							\
-	mousepad-print.c							\
-	mousepad-print.h							\
-	mousepad-private.h							\
-	mousepad-replace-dialog.c						\
-	mousepad-replace-dialog.h						\
-	mousepad-search-bar.c							\
-	mousepad-search-bar.h							\
-	mousepad-statusbar.c							\
-	mousepad-statusbar.h							\
-	mousepad-view.c								\
-	mousepad-view.h								\
-	mousepad-undo.c								\
-	mousepad-undo.h								\
-	mousepad-util.c								\
-	mousepad-util.h								\
-	mousepad-window.c							\
-	mousepad-window.h							\
+mousepad_SOURCES = \
+	$(mousepad_built_sources) \
+	$(mousepad_dbus_sources) \
+	main.c \
+	mousepad-application.c \
+	mousepad-application.h \
+	mousepad-dialogs.c \
+	mousepad-dialogs.h \
+	mousepad-document.c \
+	mousepad-document.h \
+	mousepad-encoding.c \
+	mousepad-encoding.h \
+	mousepad-encoding-dialog.c \
+	mousepad-encoding-dialog.h \
+	mousepad-file.c \
+	mousepad-file.h \
+	mousepad-preferences.c \
+	mousepad-preferences.h \
+	mousepad-print.c \
+	mousepad-print.h \
+	mousepad-private.h \
+	mousepad-replace-dialog.c \
+	mousepad-replace-dialog.h \
+	mousepad-search-bar.c \
+	mousepad-search-bar.h \
+	mousepad-statusbar.c \
+	mousepad-statusbar.h \
+	mousepad-view.c \
+	mousepad-view.h \
+	mousepad-undo.c \
+	mousepad-undo.h \
+	mousepad-util.c \
+	mousepad-util.h \
+	mousepad-window.c \
+	mousepad-window.h \
 	mousepad-window-ui.h
 
-mousepad_CFLAGS =								\
-	$(GLIB_CFLAGS)								\
-	$(GTK_CFLAGS)								\
-	$(GTHREAD_CFLAGS)							\
+mousepad_CFLAGS = \
+	$(GLIB_CFLAGS) \
+	$(GTK_CFLAGS) \
+	$(GTHREAD_CFLAGS) \
 	$(PLATFORM_CFLAGS)
 
-mousepad_LDFLAGS =								\
-	-no-undefined								\
+mousepad_LDFLAGS = \
+	-no-undefined \
 	$(PLATFORM_LDFLAGS)
 
-mousepad_LDADD =								\
-	$(GLIB_LIBS)								\
-	$(GTK_LIBS)								\
+mousepad_LDADD = \
+	$(GLIB_LIBS) \
+	$(GTK_LIBS)	\
 	$(GTHREAD_LIBS)
 
 if HAVE_DBUS
-mousepad_built_sources +=							\
+mousepad_built_sources +=	\
 	mousepad-dbus-infos.h
 
-mousepad_dbus_sources =								\
-	mousepad-dbus.c								\
+mousepad_dbus_sources = \
+	mousepad-dbus.c \
 	mousepad-dbus.h
 
-mousepad_CFLAGS +=								\
-	-DDBUS_API_SUBJECT_TO_CHANGE						\
+mousepad_CFLAGS += \
+	-DDBUS_API_SUBJECT_TO_CHANGE \
 	$(DBUS_CFLAGS)
 
-mousepad_LDADD +=								\
+mousepad_LDADD +=	\
 	$(DBUS_LIBS)
 endif
 
 if MAINTAINER_MODE
-CLEANFILES =									\
-	xgen-mmc								\
-	xgen-mmh
-
-DISTCLEANFILES =								\
-	$(mousepad_built_sources)                                       	\
-	stamp-mousepad-marshal.h						\
+DISTCLEANFILES = \
+	$(mousepad_built_sources) \
 	mousepad-window-ui.h
 
-BUILT_SOURCES =									\
-	$(mousepad_built_sources)                                       	\
+BUILT_SOURCES = \
+	$(mousepad_built_sources) \
 	mousepad-window-ui.h
 
 if HAVE_DBUS
-mousepad-dbus-infos.h: $(srcdir)/mousepad-dbus-infos.xml Makefile
-	dbus-binding-tool --prefix=mousepad_dbus_service --mode=glib-server $(srcdir)/mousepad-dbus-infos.xml > mousepad-dbus-infos.h
+mousepad-dbus-infos.h: mousepad-dbus-infos.xml Makefile
+	dbus-binding-tool --prefix=mousepad_dbus_service --mode=glib-server $< > $@
 endif
 
-mousepad-window-ui.h: Makefile $(srcdir)/mousepad-window-ui.xml
-	exo-csource --strip-comments --strip-content --static --name=mousepad_window_ui $(srcdir)/mousepad-window-ui.xml > mousepad-window-ui.h
-
-mousepad-marshal.h: stamp-mousepad-marshal.h
-	@true
+mousepad-window-ui.h: mousepad-window-ui.xml Makefile
+	exo-csource --strip-comments --strip-content --static --name=mousepad_window_ui $< > $@
 
-stamp-mousepad-marshal.h: mousepad-marshal.list Makefile
-	( cd $(srcdir) && glib-genmarshal \
-		--prefix=_mousepad_marshal \
-		--header mousepad-marshal.list ) >> xgen-mmh \
-	&& ( cmp -s xgen-mmh mousepad-marshal.h || cp xgen-mmh mousepad-marshal.h ) \
-	&& rm -f xgen-mmh \
-	&& echo timestamp > $(@F)
+mousepad-marshal.h: mousepad-marshal.list Makefile
+	glib-genmarshal --header --prefix=_mousepad_marshal $< > $@
 
 mousepad-marshal.c: mousepad-marshal.list Makefile
-	( cd $(srcdir) && glib-genmarshal \
-		--prefix=_mousepad_marshal \
-		--body mousepad-marshal.list ) >> xgen-mmc \
-	&& cp xgen-mmc mousepad-marshal.c \
-	&& rm -f xgen-mmc
+	echo "#include <mousepad/mousepad-marshal.h>" > $@ \
+	&& glib-genmarshal --body --prefix=_mousepad_marshal $< >> $@
 endif
 
-EXTRA_DIST =									\
-	mousepad-dbus-infos.xml							\
-	mousepad-marshal.list							\
+EXTRA_DIST = \
+	mousepad-dbus-infos.xml \
+	mousepad-marshal.list \
 	mousepad-window-ui.xml
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/mousepad/main.c b/mousepad/main.c
index 63d17a6..22e69eb 100644
--- a/mousepad/main.c
+++ b/mousepad/main.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -56,7 +55,7 @@ static const GOptionEntry option_entries[] =
 #endif
   { "version", 'v', 0, G_OPTION_ARG_NONE, &opt_version, N_("Print version information and exit"), NULL },
   { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL, NULL },
-  { NULL },
+  { NULL }
 };
 
 
@@ -90,7 +89,7 @@ main (gint argc, gchar **argv)
     g_thread_init (NULL);
 
   /* initialize gtk+ */
-  if (!gtk_init_with_args (&argc, &argv, _("[FILES...]"), (GOptionEntry *) option_entries, GETTEXT_PACKAGE, &error))
+  if (!gtk_init_with_args (&argc, &argv, _("[FILES...]"), (GOptionEntry *) option_entries, (gchar *) GETTEXT_PACKAGE, &error))
     {
       /* check if we have an error message */
       if (G_LIKELY (error == NULL))
diff --git a/mousepad/mousepad-application.c b/mousepad/mousepad-application.c
index 10e1250..cb7c778 100644
--- a/mousepad/mousepad-application.c
+++ b/mousepad/mousepad-application.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -27,8 +26,6 @@
 
 
 
-static void        mousepad_application_class_init                (MousepadApplicationClass  *klass);
-static void        mousepad_application_init                      (MousepadApplication       *application);
 static void        mousepad_application_finalize                  (GObject                   *object);
 static void        mousepad_application_window_destroyed          (GtkWidget                 *window,
                                                                    MousepadApplication        *application);
@@ -153,7 +150,7 @@ mousepad_application_get (void)
 gboolean
 mousepad_application_has_windows (MousepadApplication *application)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_APPLICATION (application), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_APPLICATION (application), FALSE);
 
   return (application->windows != NULL);
 }
@@ -164,9 +161,9 @@ static void
 mousepad_application_window_destroyed (GtkWidget           *window,
                                        MousepadApplication *application)
 {
-  _mousepad_return_if_fail (GTK_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
-  _mousepad_return_if_fail (g_slist_find (application->windows, window) != NULL);
+  mousepad_return_if_fail (GTK_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
+  mousepad_return_if_fail (g_slist_find (application->windows, window) != NULL);
 
   /* remove the window from the list */
   application->windows = g_slist_remove (application->windows, window);
@@ -182,9 +179,9 @@ void
 mousepad_application_take_window (MousepadApplication *application,
                                   GtkWindow           *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
-  _mousepad_return_if_fail (g_slist_find (application->windows, window) == NULL);
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
+  mousepad_return_if_fail (g_slist_find (application->windows, window) == NULL);
 
   /* connect to the "destroy" signal */
   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (mousepad_application_window_destroyed), application);
@@ -225,9 +222,9 @@ mousepad_application_new_window_with_document (MousepadWindow      *existing,
   GtkWidget *window;
   GdkScreen *screen;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (existing));
-  _mousepad_return_if_fail (document == NULL || MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (existing));
+  mousepad_return_if_fail (document == NULL || MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
 
   /* create a new window (signals added and already hooked up) */
   window = mousepad_application_create_window (application);
@@ -274,8 +271,8 @@ mousepad_application_new_window_with_files (MousepadApplication  *application,
   gboolean          succeed = FALSE;
   MousepadDocument *document;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
-  _mousepad_return_if_fail (screen == NULL || GDK_IS_SCREEN (screen));
+  mousepad_return_if_fail (MOUSEPAD_IS_APPLICATION (application));
+  mousepad_return_if_fail (screen == NULL || GDK_IS_SCREEN (screen));
 
   /* create a new window (signals added and already hooked up) */
   window = mousepad_application_create_window (application);
diff --git a/mousepad/mousepad-application.h b/mousepad/mousepad-application.h
index 9af3941..28e382c 100644
--- a/mousepad/mousepad-application.h
+++ b/mousepad/mousepad-application.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-dbus-infos.xml b/mousepad/mousepad-dbus-infos.xml
index c356bb9..3f0fab1 100644
--- a/mousepad/mousepad-dbus-infos.xml
+++ b/mousepad/mousepad-dbus-infos.xml
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!--
-  $Id$
-
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the Free
   Software Foundation; either version 2 of the License, or (at your option)
diff --git a/mousepad/mousepad-dbus.c b/mousepad/mousepad-dbus.c
index 9b6380c..8b7e769 100644
--- a/mousepad/mousepad-dbus.c
+++ b/mousepad/mousepad-dbus.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -41,13 +40,18 @@
 
 
 
-static void      mousepad_dbus_service_class_init    (MousepadDBusServiceClass  *klass);
-static void      mousepad_dbus_service_init          (MousepadDBusService       *dbus_service);
-static void      mousepad_dbus_service_finalize      (GObject                   *object);
-static gboolean  mousepad_dbus_service_launch_files  (MousepadDBusService       *dbus_service,
-                                                      const gchar               *working_directory,
-                                                      gchar                    **filenames,
-                                                      GError                   **error);
+static void      mousepad_dbus_service_finalize      (GObject              *object);
+static gboolean  mousepad_dbus_service_launch_files  (MousepadDBusService  *dbus_service,
+                                                      const gchar          *working_directory,
+                                                      gchar               **filenames,
+                                                      GError              **error);
+static gboolean  mousepad_dbus_service_terminate     (MousepadDBusService  *dbus_service,
+                                                      GError              **error);
+
+
+
+/* include the dbus glue generated by dbus-binding-tool */
+#include <mousepad/mousepad-dbus-infos.h>
 
 
 
@@ -72,8 +76,7 @@ G_DEFINE_TYPE (MousepadDBusService, mousepad_dbus_service, G_TYPE_OBJECT);
 static void
 mousepad_dbus_service_class_init (MousepadDBusServiceClass *klass)
 {
-  extern const DBusGObjectInfo  dbus_glib_mousepad_dbus_service_object_info;
-  GObjectClass                 *gobject_class;
+  GObjectClass *gobject_class;
 
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = mousepad_dbus_service_finalize;
@@ -154,8 +157,8 @@ mousepad_dbus_service_launch_files (MousepadDBusService  *dbus_service,
 {
   MousepadApplication *application;
 
-  _mousepad_return_val_if_fail (g_path_is_absolute (working_directory), FALSE);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (g_path_is_absolute (working_directory), FALSE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   /* open a mousepad window */
   application = mousepad_application_get ();
@@ -265,7 +268,7 @@ mousepad_dbus_client_terminate (GError **error)
 {
   DBusMessage *message;
 
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   /* generate the message */
   message = dbus_message_new_method_call (MOUSEPAD_DBUS_INTERFACE, MOUSEPAD_DBUS_PATH,
@@ -308,8 +311,8 @@ mousepad_dbus_client_launch_files (gchar       **filenames,
   guint        length = 0;
   gboolean     succeed;
 
-  _mousepad_return_val_if_fail (g_path_is_absolute (working_directory), FALSE);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (g_path_is_absolute (working_directory), FALSE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   /* get the length of the filesname string */
   if (filenames)
@@ -332,8 +335,3 @@ mousepad_dbus_client_launch_files (gchar       **filenames,
 
   return succeed;
 }
-
-
-
-/* include the dbus glue generated by dbus-binding-tool */
-#include <mousepad/mousepad-dbus-infos.h>
diff --git a/mousepad/mousepad-dbus.h b/mousepad/mousepad-dbus.h
index 6bc12dd..e38ec44 100644
--- a/mousepad/mousepad-dbus.h
+++ b/mousepad/mousepad-dbus.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-dialogs.c b/mousepad/mousepad-dialogs.c
index faa0c00..65fc9b9 100644
--- a/mousepad/mousepad-dialogs.c
+++ b/mousepad/mousepad-dialogs.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -32,7 +31,7 @@ mousepad_dialogs_show_about (GtkWindow *parent)
   {
     "Nick Schermer <nick at xfce.org>",
     "Erik Harrison <erikharrison at xfce.org>",
-    NULL,
+    NULL
   };
 
   /* show the dialog */
@@ -176,14 +175,14 @@ mousepad_dialogs_go_to_line_changed (GtkSpinButton *line_spin,
   GtkTextBuffer *buffer;
   GtkTextIter    iter;
 
-  _mousepad_return_if_fail (GTK_IS_SPIN_BUTTON (line_spin));
-  _mousepad_return_if_fail (GTK_IS_SPIN_BUTTON (col_spin));
+  mousepad_return_if_fail (GTK_IS_SPIN_BUTTON (line_spin));
+  mousepad_return_if_fail (GTK_IS_SPIN_BUTTON (col_spin));
 
   /* get the text buffer */
   buffer = mousepad_object_get_data (G_OBJECT (col_spin), "buffer");
 
   /* debug check */
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
 
   /* get iter at line */
   gtk_text_buffer_get_iter_at_line (buffer, &iter, gtk_spin_button_get_value_as_int (line_spin) - 1);
diff --git a/mousepad/mousepad-dialogs.h b/mousepad/mousepad-dialogs.h
index c97820f..cb01fd0 100644
--- a/mousepad/mousepad-dialogs.h
+++ b/mousepad/mousepad-dialogs.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -54,7 +53,7 @@ gint       mousepad_dialogs_other_tab_size      (GtkWindow     *parent,
                                                  gint           active_size);
 
 gboolean   mousepad_dialogs_go_to               (GtkWindow     *parent,
-                                                 GtkTextBuffer *buffer;);
+                                                 GtkTextBuffer *buffer);
 
 gboolean   mousepad_dialogs_clear_recent        (GtkWindow     *parent);
 
diff --git a/mousepad/mousepad-document.c b/mousepad/mousepad-document.c
index 770bf88..2e39044 100644
--- a/mousepad/mousepad-document.c
+++ b/mousepad/mousepad-document.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -44,8 +43,6 @@
 
 
 
-static void      mousepad_document_class_init              (MousepadDocumentClass  *klass);
-static void      mousepad_document_init                    (MousepadDocument       *document);
 static void      mousepad_document_finalize                (GObject                *object);
 static void      mousepad_document_notify_cursor_position  (GtkTextBuffer          *buffer,
                                                             GParamSpec             *pspec,
@@ -62,7 +59,7 @@ static void      mousepad_document_drag_data_received      (GtkWidget
                                                             gint                    y,
                                                             GtkSelectionData       *selection_data,
                                                             guint                   info,
-                                                            guint                   time,
+                                                            guint                   drag_time,
                                                             MousepadDocument       *document);
 static void      mousepad_document_filename_changed        (MousepadDocument       *document,
                                                             const gchar            *filename);
@@ -281,8 +278,8 @@ mousepad_document_notify_cursor_position (GtkTextBuffer    *buffer,
   gint        line, column, selection;
   gint        tab_size;
 
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* get the current iter position */
   gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer));
@@ -313,8 +310,8 @@ mousepad_document_notify_has_selection (GtkTextBuffer    *buffer,
   gint     selection;
   gboolean is_column_selection;
 
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* get length of the selection */
   selection = mousepad_view_get_selection_length (document->textview, &is_column_selection);
@@ -340,8 +337,8 @@ mousepad_document_notify_overwrite (GtkTextView      *textview,
 {
   gboolean overwrite;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (GTK_IS_TEXT_VIEW (textview));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (GTK_IS_TEXT_VIEW (textview));
 
   /* whether overwrite is enabled */
   overwrite = gtk_text_view_get_overwrite (textview);
@@ -359,14 +356,14 @@ mousepad_document_drag_data_received (GtkWidget        *widget,
                                       gint              y,
                                       GtkSelectionData *selection_data,
                                       guint             info,
-                                      guint             time,
+                                      guint             drag_time,
                                       MousepadDocument *document)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* emit the drag-data-received signal from the document when a tab or uri has been dropped */
   if (info == TARGET_TEXT_URI_LIST || info == TARGET_GTK_NOTEBOOK_TAB)
-    g_signal_emit_by_name (G_OBJECT (document), "drag-data-received", context, x, y, selection_data, info, time);
+    g_signal_emit_by_name (G_OBJECT (document), "drag-data-received", context, x, y, selection_data, info, drag_time);
 }
 
 
@@ -377,8 +374,8 @@ mousepad_document_filename_changed (MousepadDocument *document,
 {
   gchar *utf8_filename, *utf8_basename;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (filename != NULL);
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (filename != NULL);
 
   /* convert the title into a utf-8 valid version for display */
   utf8_filename = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
@@ -420,9 +417,9 @@ mousepad_document_label_color (MousepadDocument *document)
   GdkColor  red   = {0, 0xffff, 0x0000, 0x0000};
   GdkColor *color;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (document->buffer));
-  _mousepad_return_if_fail (MOUSEPAD_IS_FILE (document->file));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (document->buffer));
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (document->file));
 
   if (document->priv->label)
     {
@@ -433,7 +430,7 @@ mousepad_document_label_color (MousepadDocument *document)
         color = &green;
       else
         color = NULL;
-       
+
       /* update colors */
       gtk_widget_modify_fg (document->priv->label, GTK_STATE_NORMAL, color);
       gtk_widget_modify_fg (document->priv->label, GTK_STATE_ACTIVE, color);
@@ -446,7 +443,7 @@ void
 mousepad_document_set_overwrite (MousepadDocument *document,
                                  gboolean          overwrite)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   gtk_text_view_set_overwrite (GTK_TEXT_VIEW (document->textview), overwrite);
 }
@@ -457,7 +454,7 @@ void
 mousepad_document_set_word_wrap (MousepadDocument *document,
                                  gboolean          word_wrap)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* store the setting */
   document->priv->word_wrap = word_wrap;
@@ -475,7 +472,7 @@ mousepad_document_set_font (MousepadDocument *document,
 {
   PangoFontDescription *font_desc;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   if (G_LIKELY (font_name))
     {
@@ -491,7 +488,7 @@ mousepad_document_set_font (MousepadDocument *document,
 void
 mousepad_document_focus_textview (MousepadDocument *document)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* focus the textview */
   gtk_widget_grab_focus (GTK_WIDGET (document->textview));
@@ -502,7 +499,7 @@ mousepad_document_focus_textview (MousepadDocument *document)
 void
 mousepad_document_send_signals (MousepadDocument *document)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* re-send the cursor changed signal */
   mousepad_document_notify_cursor_position (document->buffer, NULL, document);
@@ -583,7 +580,7 @@ mousepad_document_get_basename (MousepadDocument *document)
 {
   static gint untitled_counter = 0;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), NULL);
 
   /* check if there is a filename set */
   if (document->priv->utf8_basename == NULL)
@@ -600,7 +597,7 @@ mousepad_document_get_basename (MousepadDocument *document)
 const gchar *
 mousepad_document_get_filename (MousepadDocument *document)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), NULL);
 
   return document->priv->utf8_filename;
 }
@@ -610,7 +607,7 @@ mousepad_document_get_filename (MousepadDocument *document)
 gboolean
 mousepad_document_get_word_wrap (MousepadDocument *document)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
 
   return document->priv->word_wrap;
 }
diff --git a/mousepad/mousepad-document.h b/mousepad/mousepad-document.h
index a35c7d0..2daff7f 100644
--- a/mousepad/mousepad-document.h
+++ b/mousepad/mousepad-document.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-encoding-dialog.c b/mousepad/mousepad-encoding-dialog.c
index ae965a6..953bfbd 100644
--- a/mousepad/mousepad-encoding-dialog.c
+++ b/mousepad/mousepad-encoding-dialog.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -23,22 +22,28 @@
 #include <string.h>
 #endif
 
+#include <glib.h>
+#include <glib/gstdio.h>
+
 #include <mousepad/mousepad-private.h>
 #include <mousepad/mousepad-document.h>
+#include <mousepad/mousepad-encoding.h>
 #include <mousepad/mousepad-encoding-dialog.h>
 #include <mousepad/mousepad-preferences.h>
 #include <mousepad/mousepad-util.h>
 
 
 
-static void     mousepad_encoding_dialog_class_init             (MousepadEncodingDialogClass *klass);
-static void     mousepad_encoding_dialog_init                   (MousepadEncodingDialog      *dialog);
 static void     mousepad_encoding_dialog_finalize               (GObject                     *object);
-static gboolean mousepad_encoding_dialog_test_encodings_idle    (gpointer                     user_data);
-static void     mousepad_encoding_dialog_test_encodings_destroy (gpointer                     user_data);
+static void     mousepad_encoding_dialog_response               (GtkDialog                   *dialog,
+                                                                 gint                         response_id);
+//~ static gboolean mousepad_encoding_dialog_test_encodings_idle    (gpointer                     user_data);
+//~ static void     mousepad_encoding_dialog_test_encodings_destroy (gpointer                     user_data);
 static void     mousepad_encoding_dialog_test_encodings         (MousepadEncodingDialog      *dialog);
+static void     mousepad_encoding_dialog_cancel_test_encodings  (GtkWidget                   *button,
+                                                                 MousepadEncodingDialog      *dialog);
 static void     mousepad_encoding_dialog_read_file              (MousepadEncodingDialog      *dialog,
-                                                                 const gchar                 *encoding);
+                                                                 MousepadEncoding encoding);
 static void     mousepad_encoding_dialog_button_toggled         (GtkWidget                   *button,
                                                                  MousepadEncodingDialog      *dialog);
 static void     mousepad_encoding_dialog_combo_changed          (GtkComboBox                 *combo,
@@ -50,7 +55,6 @@ enum
 {
   COLUMN_LABEL,
   COLUMN_ID,
-  COLUMN_UNPRINTABLE,
   N_COLUMNS
 };
 
@@ -67,20 +71,17 @@ struct _MousepadEncodingDialog
   MousepadDocument *document;
 
   /* encoding test idle id */
-  guint          encoding_id;
+  guint          timer_id;
 
-  /* encoding test position */
-  gint           encoding_n;
+  /* boolean to cancel the testing loop */
+  guint          cancel_testing : 1;
 
-  /* ok button */
+  /* dialog widget */
   GtkWidget     *button_ok;
-
-  /* error label and box */
+  GtkWidget     *button_cancel;
   GtkWidget     *error_box;
   GtkWidget     *error_label;
-
-  /* progressbar */
-  GtkWidget     *progress;
+  GtkWidget     *progress_bar;
 
   /* the three radio button */
   GtkWidget     *radio_utf8;
@@ -94,85 +95,6 @@ struct _MousepadEncodingDialog
 
 
 
-static const gchar *encodings[] =
-{
-"ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6",
-"ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11", "ISO-8859-13",
-"ISO-8859-14", "ISO-8859-15", "ISO-8859-16",
-
-"ARMSCII-8",
-"ASCII",
-"BIG5",
-"BIG5-HKSCS",
-"BIG5-HKSCS:1999",
-"BIG5-HKSCS:2001",
-"C99", "IBM850", "CP862", "CP866", "CP874", "CP932", "CP936", "CP949", "CP950",
-"CP1133", "CP1250", "CP1251", "CP1252", "CP1253", "CP1254", "CP1255", "CP1256", "CP1257", "CP1258",
-"EUC-CN",
-"EUC-JP",
-"EUC-KR",
-"EUC-TW",
-"GB18030",
-"GBK",
-"Georgian-Academy",
-"Georgian-PS",
-"HP-ROMAN8",
-"HZ",
-"ISO-2022-CN",
-"ISO-2022-CN-EXT",
-"ISO-2022-JP",
-"ISO-2022-JP-1",
-"ISO-2022-JP-2",
-"ISO-2022-KR",
-
-
-
-"JAVA",
-"JOHAB",
-"KOI8-R",
-"KOI8-RU",
-"KOI8-T",
-"KOI8-U",
-"MacArabic",
-"MacCentralEurope",
-"MacCroatian",
-"MacGreek",
-"MacHebrew",
-"MacIceland",
-"Macintosh",
-"MacMacRoman",
-"MacRomania",
-"MacThai",
-"MacTurkish",
-"MacUkraine",
-"MacCyrillic",
-"MuleLao-1",
-"NEXTSTEP",
-"PT154",
-"SHIFT_JIS",
-"TCVN",
-"TIS-620,",
-"UCS-2",
-"UCS-2-INTERNAL",
-"UCS-2BE",
-"UCS-2LE",
-"UCS-4",
-"UCS-4-INTERNAL",
-"UCS-4BE",
-"UCS-4LE",
-"UTF-16",
-"UTF-16BE",
-"UTF-16LE",
-"UTF-32",
-"UTF-32BE",
-"UTF-32LE",
-"UTF-7",
-"UTF-8",
-"VISCII"
-};
-
-
-
 G_DEFINE_TYPE (MousepadEncodingDialog, mousepad_encoding_dialog, GTK_TYPE_DIALOG);
 
 
@@ -180,10 +102,14 @@ G_DEFINE_TYPE (MousepadEncodingDialog, mousepad_encoding_dialog, GTK_TYPE_DIALOG
 static void
 mousepad_encoding_dialog_class_init (MousepadEncodingDialogClass *klass)
 {
-  GObjectClass *gobject_class;
+  GObjectClass   *gobject_class;
+  GtkDialogClass *gtkdialog_class;
 
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = mousepad_encoding_dialog_finalize;
+
+  gtkdialog_class = GTK_DIALOG_CLASS (klass);
+  gtkdialog_class->response = mousepad_encoding_dialog_response;
 }
 
 
@@ -236,7 +162,7 @@ mousepad_encoding_dialog_init (MousepadEncodingDialog *dialog)
   gtk_box_pack_start (GTK_BOX (hbox), dialog->radio_other, FALSE, FALSE, 0);
 
   /* create store */
-  dialog->store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
+  dialog->store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT);
 
   /* combobox with other charsets */
   dialog->combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (dialog->store));
@@ -249,10 +175,20 @@ mousepad_encoding_dialog_init (MousepadEncodingDialog *dialog)
   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (dialog->combo), cell, "text", COLUMN_LABEL, NULL);
 
   /* progress bar */
-  dialog->progress = gtk_progress_bar_new ();
-  gtk_box_pack_start (GTK_BOX (hbox), dialog->progress, TRUE, TRUE, 0);
-  gtk_progress_bar_set_text (GTK_PROGRESS_BAR (dialog->progress), "Testing encodings...");
-  gtk_widget_show (dialog->progress);
+  dialog->progress_bar = gtk_progress_bar_new ();
+  gtk_box_pack_start (GTK_BOX (hbox), dialog->progress_bar, TRUE, TRUE, 0);
+  gtk_progress_bar_set_text (GTK_PROGRESS_BAR (dialog->progress_bar), _("Checking encodings..."));
+  gtk_widget_show (dialog->progress_bar);
+
+  /* cancel button */
+  dialog->button_cancel = gtk_button_new ();
+  gtk_box_pack_start (GTK_BOX (hbox), dialog->button_cancel, FALSE, FALSE, 0);
+  g_signal_connect (G_OBJECT (dialog->button_cancel), "clicked", G_CALLBACK (mousepad_encoding_dialog_cancel_test_encodings), dialog);
+  gtk_widget_show (dialog->button_cancel);
+
+  icon = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_MENU);
+  gtk_container_add (GTK_CONTAINER (dialog->button_cancel), icon);
+  gtk_widget_show (icon);
 
   /* error box */
   dialog->error_box = gtk_hbox_new (FALSE, 6);
@@ -290,8 +226,8 @@ mousepad_encoding_dialog_finalize (GObject *object)
   MousepadEncodingDialog *dialog = MOUSEPAD_ENCODING_DIALOG (object);
 
   /* stop running timeout */
-  if (G_UNLIKELY (dialog->encoding_id))
-    g_source_remove (dialog->encoding_id);
+  if (G_UNLIKELY (dialog->timer_id))
+    g_source_remove (dialog->timer_id);
 
   /* clear and release store */
   gtk_list_store_clear (dialog->store);
@@ -302,89 +238,104 @@ mousepad_encoding_dialog_finalize (GObject *object)
 
 
 
+static void
+mousepad_encoding_dialog_response (GtkDialog *dialog,
+                                   gint       response_id)
+{
+  /* make sure we cancel encoding testing asap */
+  MOUSEPAD_ENCODING_DIALOG (dialog)->cancel_testing = TRUE;
+}
+
+
+
 static gboolean
 mousepad_encoding_dialog_test_encodings_idle (gpointer user_data)
 {
   MousepadEncodingDialog *dialog = MOUSEPAD_ENCODING_DIALOG (user_data);
-  gdouble                 fraction;
-  gint                    unprintable, value;
-  const gchar            *encoding;
-  GtkTreeIter             iter, needle;
+  const gchar            *filename;
+  GMappedFile            *mapped_file;
+  GError                 *error = NULL;
+  const gchar            *contents;
+  gsize                   length, written;
+  guint                   i, n;
+  gchar                  *encoded;
 
   GDK_THREADS_ENTER ();
 
-  /* calculate the status */
-  fraction = (dialog->encoding_n + 1.00) / G_N_ELEMENTS (encodings);
-
-  /* set progress bar */
-  gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (dialog->progress), fraction);
-
-  /* get the encoding */
-  encoding = encodings[dialog->encoding_n];
+  /* get the filename */
+  filename = mousepad_file_get_filename (dialog->document->file);
 
-  /* set an encoding */
-  unprintable = mousepad_file_test_encoding (dialog->document->file, encoding, NULL);
-
-  /* add the encoding to the combo box is the test succeed */
-  if (unprintable != -1)
+  /* check if the file exists */
+  if (filename && g_file_test (filename, G_FILE_TEST_EXISTS))
     {
-      /* get the first model iter, if there is one */
-      if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (dialog->store), &needle))
+      /* try to open the file */
+      mapped_file = g_mapped_file_new (filename, FALSE, &error);
+
+      if (G_LIKELY (mapped_file))
         {
-          for (;;)
-            {
-              /* get the column value */
-              gtk_tree_model_get (GTK_TREE_MODEL (dialog->store), &needle, COLUMN_UNPRINTABLE, &value, -1);
+          /* get the mapped file contents and length */
+          contents = g_mapped_file_get_contents (mapped_file);
+          length = g_mapped_file_get_length (mapped_file);
 
-              /* insert before the item with a higher number of unprintable characters */
-              if (value > unprintable)
+          if (G_LIKELY (contents && length > 0))
+            {
+              /* test all the encodings */
+              for (i = 0, n = 0; i < n_encoding_infos && !dialog->cancel_testing; i++)
                 {
-                  gtk_list_store_insert_before (dialog->store, &iter, &needle);
-
-                  break;
+                  /* set progress bar fraction */
+                  gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (dialog->progress_bar), (i + 1.00) / n_encoding_infos);
+
+                  /* try to convert the content */
+                  encoded = g_convert (contents, length, "UTF-8", encoding_infos[i].charset, NULL, &written, NULL);
+
+                  if (G_LIKELY (encoded))
+                    {
+                      /* glib uses a faster validator when the string is nul-terminated */
+                      if (G_LIKELY (written > 0 && encoded[written] == '\0'))
+                        written = -1;
+
+                      /* validate the encoded content */
+                      if (G_LIKELY (g_utf8_validate (encoded, written, NULL)))
+                        {
+                          /* insert in the store */
+                          gtk_list_store_insert_with_values (dialog->store, NULL, n++,
+                                                             COLUMN_LABEL, encoding_infos[i].charset,
+                                                             COLUMN_ID, encoding_infos[i].encoding, -1);
+                        }
+
+                      /* cleanup */
+                      g_free (encoded);
+                    }
+
+                  /* iterate the main loop to update the gui */
+                  while (gtk_events_pending ())
+                    gtk_main_iteration ();
                 }
-
-              /* leave when we reached the end of the tree */
-              if (gtk_tree_model_iter_next (GTK_TREE_MODEL (dialog->store), &needle) == FALSE)
-                goto append_to_list;
             }
-        }
-      else
-        {
-          append_to_list:
 
-          /* append to the list */
-          gtk_list_store_append (dialog->store, &iter);
+          /* close the mapped file */
+#if GLIB_CHECK_VERSION (2, 21, 0)
+          g_mapped_file_unref (mapped_file);
+#else
+          g_mapped_file_free (mapped_file);
+#endif
         }
-
-      /* set the column data */
-      gtk_list_store_set (dialog->store, &iter,
-                          COLUMN_LABEL, encoding,
-                          COLUMN_ID, dialog->encoding_n,
-                          COLUMN_UNPRINTABLE, unprintable,
-                          -1);
     }
 
-  /* advance offset */
-  dialog->encoding_n++;
-
-  /* show the widgets when we're done */
-  if (dialog->encoding_n == G_N_ELEMENTS (encodings))
-    {
-      /* select the first item */
-      gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->combo), 0);
+  /* hide progress bar and cancel button */
+  gtk_widget_hide (dialog->progress_bar);
+  gtk_widget_hide (dialog->button_cancel);
 
-      /* hide progress bar */
-      gtk_widget_hide (dialog->progress);
+  /* show the radio button and combo box */
+  gtk_widget_show (dialog->radio_other);
+  gtk_widget_show (dialog->combo);
 
-      /* show the radio button and combo box */
-      gtk_widget_show (dialog->radio_other);
-      gtk_widget_show (dialog->combo);
-    }
+  /* select the first item */
+  gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->combo), 0);
 
   GDK_THREADS_LEAVE ();
 
-  return (dialog->encoding_n < G_N_ELEMENTS (encodings));
+  return FALSE;
 }
 
 
@@ -392,7 +343,7 @@ mousepad_encoding_dialog_test_encodings_idle (gpointer user_data)
 static void
 mousepad_encoding_dialog_test_encodings_destroy (gpointer user_data)
 {
-  MOUSEPAD_ENCODING_DIALOG (user_data)->encoding_id = 0;
+  MOUSEPAD_ENCODING_DIALOG (user_data)->timer_id = 0;
 }
 
 
@@ -400,27 +351,37 @@ mousepad_encoding_dialog_test_encodings_destroy (gpointer user_data)
 static void
 mousepad_encoding_dialog_test_encodings (MousepadEncodingDialog *dialog)
 {
-  if (G_LIKELY (dialog->encoding_id == 0))
+  if (G_LIKELY (dialog->timer_id == 0))
     {
-      /* reset counter */
-      dialog->encoding_n = 0;
+      /* reset boolean */
+      dialog->cancel_testing = FALSE;
 
-      /* start new idle function */
-      dialog->encoding_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, mousepad_encoding_dialog_test_encodings_idle,
-                                             dialog, mousepad_encoding_dialog_test_encodings_destroy);
+      /* start a new idle function */
+      dialog->timer_id = g_idle_add_full (G_PRIORITY_LOW, mousepad_encoding_dialog_test_encodings_idle,
+                                          dialog, mousepad_encoding_dialog_test_encodings_destroy);
     }
 }
 
 
 
 static void
+mousepad_encoding_dialog_cancel_test_encodings (GtkWidget              *button,
+                                                MousepadEncodingDialog *dialog)
+{
+  /* cancel the testing loop */
+  dialog->cancel_testing = TRUE;
+}
+
+
+
+static void
 mousepad_encoding_dialog_read_file (MousepadEncodingDialog *dialog,
-                                    const gchar            *encoding)
+                                    MousepadEncoding        encoding)
 {
   GtkTextIter  start, end;
   GError      *error = NULL;
   gchar       *message;
-  gboolean     succeed;
+  gint         result;
 
   /* clear buffer */
   gtk_text_buffer_get_bounds (dialog->document->buffer, &start, &end);
@@ -430,12 +391,12 @@ mousepad_encoding_dialog_read_file (MousepadEncodingDialog *dialog,
   mousepad_file_set_encoding (dialog->document->file, encoding);
 
   /* try to open the file */
-  succeed = mousepad_file_open (dialog->document->file, &error);
+  result = mousepad_file_open (dialog->document->file, NULL, &error);
 
   /* set sensitivity of the ok button */
-  gtk_widget_set_sensitive (dialog->button_ok, succeed);
+  gtk_widget_set_sensitive (dialog->button_ok, result == 0);
 
-  if (succeed)
+  if (result == 0)
     {
       /* no error, hide the box */
       gtk_widget_hide (dialog->error_box);
@@ -465,8 +426,6 @@ static void
 mousepad_encoding_dialog_button_toggled (GtkWidget              *button,
                                          MousepadEncodingDialog *dialog)
 {
-  const gchar *system_charset;
-
   /* ignore inactive buttons */
   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
     {
@@ -476,15 +435,12 @@ mousepad_encoding_dialog_button_toggled (GtkWidget              *button,
       if (button == dialog->radio_utf8)
         {
           /* open the file */
-          mousepad_encoding_dialog_read_file (dialog, NULL);
+          mousepad_encoding_dialog_read_file (dialog, MOUSEPAD_ENCODING_UTF_8);
         }
       else if (button == dialog->radio_system)
         {
-          /* get the system charset */
-          g_get_charset (&system_charset);
-
           /* open the file */
-          mousepad_encoding_dialog_read_file (dialog, system_charset);
+          mousepad_encoding_dialog_read_file (dialog, mousepad_encoding_user ());
         }
       else
         {
@@ -510,7 +466,7 @@ mousepad_encoding_dialog_combo_changed (GtkComboBox            *combo,
       gtk_tree_model_get (GTK_TREE_MODEL (dialog->store), &iter, COLUMN_ID, &id, -1);
 
       /* open the file with other encoding */
-      mousepad_encoding_dialog_read_file (dialog, encodings[id]);
+      mousepad_encoding_dialog_read_file (dialog, id);
     }
 }
 
@@ -522,8 +478,8 @@ mousepad_encoding_dialog_new (GtkWindow    *parent,
 {
   MousepadEncodingDialog *dialog;
 
-  _mousepad_return_val_if_fail (GTK_IS_WINDOW (parent), NULL);
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), NULL);
+  mousepad_return_val_if_fail (GTK_IS_WINDOW (parent), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), NULL);
 
   /* create the dialog */
   dialog = g_object_new (MOUSEPAD_TYPE_ENCODING_DIALOG, NULL);
@@ -545,10 +501,20 @@ mousepad_encoding_dialog_new (GtkWindow    *parent,
 
 
 
-const gchar *
+MousepadEncoding
 mousepad_encoding_dialog_get_encoding (MousepadEncodingDialog *dialog)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_ENCODING_DIALOG (dialog), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_ENCODING_DIALOG (dialog), MOUSEPAD_ENCODING_NONE);
 
   return mousepad_file_get_encoding (dialog->document->file);
 }
+
+
+
+const gchar *
+mousepad_encoding_dialog_get_encoding_custom (MousepadEncodingDialog *dialog)
+{
+  mousepad_return_val_if_fail (MOUSEPAD_IS_ENCODING_DIALOG (dialog), NULL);
+
+  return NULL;
+}
diff --git a/mousepad/mousepad-encoding-dialog.h b/mousepad/mousepad-encoding-dialog.h
index a992491..ca4ee7f 100644
--- a/mousepad/mousepad-encoding-dialog.h
+++ b/mousepad/mousepad-encoding-dialog.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,6 +19,8 @@
 
 G_BEGIN_DECLS
 
+#include <mousepad/mousepad-encoding.h>
+
 #define MOUSEPAD_TYPE_ENCODING_DIALOG            (mousepad_encoding_dialog_get_type ())
 #define MOUSEPAD_ENCODING_DIALOG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), MOUSEPAD_TYPE_ENCODING_DIALOG, MousepadEncodingDialog))
 #define MOUSEPAD_ENCODING_DIALOG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), MOUSEPAD_TYPE_ENCODING_DIALOG, MousepadEncodingDialogClass))
@@ -30,12 +31,14 @@ G_BEGIN_DECLS
 typedef struct _MousepadEncodingDialogClass MousepadEncodingDialogClass;
 typedef struct _MousepadEncodingDialog      MousepadEncodingDialog;
 
-GType        mousepad_encoding_dialog_get_type     (void) G_GNUC_CONST;
+GType             mousepad_encoding_dialog_get_type            (void) G_GNUC_CONST;
+
+GtkWidget        *mousepad_encoding_dialog_new                 (GtkWindow              *parent,
+                                                                MousepadFile           *file);
 
-GtkWidget   *mousepad_encoding_dialog_new          (GtkWindow              *parent,
-                                                    MousepadFile           *file);
+MousepadEncoding  mousepad_encoding_dialog_get_encoding        (MousepadEncodingDialog *dialog);
 
-const gchar *mousepad_encoding_dialog_get_encoding (MousepadEncodingDialog *dialog);
+const gchar      *mousepad_encoding_dialog_get_encoding_custom (MousepadEncodingDialog *dialog);
 
 G_END_DECLS
 
diff --git a/mousepad/mousepad-encoding.c b/mousepad/mousepad-encoding.c
new file mode 100644
index 0000000..ac2f19a
--- /dev/null
+++ b/mousepad/mousepad-encoding.c
@@ -0,0 +1,201 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <glib.h>
+
+#include <mousepad/mousepad-private.h>
+#include <mousepad/mousepad-encoding.h>
+
+
+
+const MousepadEncodingInfo encoding_infos[] =
+{
+  /* west european */
+  { MOUSEPAD_ENCODING_ISO_8859_14,  "ISO-8859-14",      N_("Celtic") },
+  { MOUSEPAD_ENCODING_ISO_8859_7,   "ISO-8859-7",       N_("Greek") },
+  { MOUSEPAD_ENCODING_WINDOWS_1253, "WINDOWS-1253",     N_("Greek") },
+  { MOUSEPAD_ENCODING_ISO_8859_10,  "ISO-8859-10",      N_("Nordic") },
+  { MOUSEPAD_ENCODING_ISO_8859_3,   "ISO-8859-3",       N_("South European") },
+  { MOUSEPAD_ENCODING_IBM_850,      "IBM850",           N_("Western") },
+  { MOUSEPAD_ENCODING_ISO_8859_1,   "ISO-8859-1",       N_("Western") },
+  { MOUSEPAD_ENCODING_ISO_8859_15,  "ISO-8859-15",      N_("Western") },
+  { MOUSEPAD_ENCODING_WINDOWS_1252, "WINDOWS-1252",     N_("Western") },
+
+  /* east european */
+  { MOUSEPAD_ENCODING_ISO_8859_4,   "ISO-8859-4",       N_("Baltic") },
+  { MOUSEPAD_ENCODING_ISO_8859_13,  "ISO-8859-13",      N_("Baltic") },
+  { MOUSEPAD_ENCODING_WINDOWS_1257, "WINDOWS-1257",     N_("Baltic") },
+  { MOUSEPAD_ENCODING_IBM_852,      "IBM852",           N_("Central European") },
+  { MOUSEPAD_ENCODING_ISO_8859_2,   "ISO-8859-2",       N_("Central European") },
+  { MOUSEPAD_ENCODING_WINDOWS_1250, "WINDOWS-1250",     N_("Central European") },
+  { MOUSEPAD_ENCODING_IBM_855,      "IBM855",           N_("Cyrillic") },
+  { MOUSEPAD_ENCODING_ISO_8859_5,   "ISO-8859-5",       N_("Cyrillic") },
+  { MOUSEPAD_ENCODING_ISO_IR_111,   "ISO-IR-111",       N_("Cyrillic") },
+  { MOUSEPAD_ENCODING_KOI8_R,       "KOI8R",            N_("Cyrillic") },
+  { MOUSEPAD_ENCODING_WINDOWS_1251, "WINDOWS-1251",     N_("Cyrillic") },
+  { MOUSEPAD_ENCODING_CP_866,       "CP866",            N_("Cyrillic/Russian") },
+  { MOUSEPAD_ENCODING_KOI8_U,       "KOI8U",            N_("Cyrillic/Ukrainian") },
+  { MOUSEPAD_ENCODING_ISO_8859_16,  "ISO-8859-16",      N_("Romanian") },
+
+  /* middle eastern */
+  { MOUSEPAD_ENCODING_IBM_864,      "IBM864",           N_("Arabic") },
+  { MOUSEPAD_ENCODING_ISO_8859_6,   "ISO-8859-6",       N_("Arabic") },
+  { MOUSEPAD_ENCODING_WINDOWS_1256, "WINDOWS-1256",     N_("Arabic") },
+  { MOUSEPAD_ENCODING_IBM_862,      "IBM862",           N_("Hebrew") },
+  { MOUSEPAD_ENCODING_ISO_8859_8_I, "ISO-8859-8-I",     N_("Hebrew") },
+  { MOUSEPAD_ENCODING_WINDOWS_1255, "WINDOWS-1255",     N_("Hebrew") },
+  { MOUSEPAD_ENCODING_ISO_8859_8,   "ISO-8859-8",       N_("Hebrew Visual") },
+
+  /* asian */
+  { MOUSEPAD_ENCODING_ARMSCII_8,    "ARMSCII-8",        N_("Armenian") },
+  { MOUSEPAD_ENCODING_GEOSTD8,      "GEORGIAN-ACADEMY", N_("Georgian") },
+  { MOUSEPAD_ENCODING_TIS_620,      "TIS-620",          N_("Thai") },
+  { MOUSEPAD_ENCODING_IBM_857,      "IBM857",           N_("Turkish") },
+  { MOUSEPAD_ENCODING_WINDOWS_1254, "WINDOWS-1254",     N_("Turkish") },
+  { MOUSEPAD_ENCODING_ISO_8859_9,   "ISO-8859-9",       N_("Turkish") },
+  { MOUSEPAD_ENCODING_TCVN,         "TCVN",             N_("Vietnamese") },
+  { MOUSEPAD_ENCODING_VISCII,       "VISCII",           N_("Vietnamese") },
+  { MOUSEPAD_ENCODING_WINDOWS_1258, "WINDOWS-1258",     N_("Vietnamese") },
+
+  /* unicode */
+  { MOUSEPAD_ENCODING_UTF_7,        "UTF-7",            N_("Unicode") },
+  { MOUSEPAD_ENCODING_UTF_8,        "UTF-8",            N_("Unicode") },
+  { MOUSEPAD_ENCODING_UTF_16LE,     "UTF-16LE",         N_("Unicode") },
+  { MOUSEPAD_ENCODING_UTF_16BE,     "UTF-16BE",         N_("Unicode") },
+  { MOUSEPAD_ENCODING_UCS_2LE,      "UCS-2LE",          N_("Unicode") },
+  { MOUSEPAD_ENCODING_UCS_2BE,      "UCS-2BE",          N_("Unicode") },
+  { MOUSEPAD_ENCODING_UTF_32LE,     "UTF-32LE",         N_("Unicode") },
+  { MOUSEPAD_ENCODING_UTF_32BE,     "UTF-32BE",         N_("Unicode") },
+
+  /* east asian */
+  { MOUSEPAD_ENCODING_GB18030,      "GB18030",          N_("Chinese Simplified") },
+  { MOUSEPAD_ENCODING_GB2312,       "GB2312",           N_("Chinese Simplified") },
+  { MOUSEPAD_ENCODING_GBK,          "GBK",              N_("Chinese Simplified") },
+  { MOUSEPAD_ENCODING_HZ,           "HZ",               N_("Chinese Simplified") },
+  { MOUSEPAD_ENCODING_BIG5,         "BIG5",             N_("Chinese Traditional") },
+  { MOUSEPAD_ENCODING_BIG5_HKSCS,   "BIG5-HKSCS",       N_("Chinese Traditional") },
+  { MOUSEPAD_ENCODING_EUC_TW,       "EUC-TW",           N_("Chinese Traditional") },
+  { MOUSEPAD_ENCODING_EUC_JP,       "EUC-JP",           N_("Japanese") },
+  { MOUSEPAD_ENCODING_ISO_2022_JP,  "ISO-2022-JP",      N_("Japanese") },
+  { MOUSEPAD_ENCODING_SHIFT_JIS,    "SHIFT_JIS",        N_("Japanese") },
+  { MOUSEPAD_ENCODING_EUC_KR,       "EUC-KR",           N_("Korean") },
+  { MOUSEPAD_ENCODING_ISO_2022_KR,  "ISO-2022-KR",      N_("Korean") },
+  { MOUSEPAD_ENCODING_JOHAB,        "JOHAB",            N_("Korean") },
+  { MOUSEPAD_ENCODING_UHC,          "UHC",              N_("Korean") }
+};
+
+
+
+guint n_encoding_infos = G_N_ELEMENTS (encoding_infos);
+
+
+
+const gchar *
+mousepad_encoding_get_charset (MousepadEncoding encoding)
+{
+  guint i;
+
+  /* try to find and return the charset */
+  for (i = 0; i < G_N_ELEMENTS (encoding_infos); i++)
+    if (encoding_infos[i].encoding == encoding)
+      return encoding_infos[i].charset;
+
+  return NULL;
+}
+
+
+
+const gchar *
+mousepad_encoding_get_name (MousepadEncoding encoding)
+{
+  guint i;
+
+  /* try to find and return the translated name */
+  for (i = 0; i < G_N_ELEMENTS (encoding_infos); i++)
+    if (encoding_infos[i].encoding == encoding)
+      return _(encoding_infos[i].name);
+
+  return NULL;
+}
+
+
+
+MousepadEncoding
+mousepad_encoding_user (void)
+{
+  static MousepadEncoding  encoding = MOUSEPAD_ENCODING_NONE;
+  const gchar             *charset;
+
+  if (G_UNLIKELY (encoding == MOUSEPAD_ENCODING_NONE))
+    {
+      /* try to find the user charset */
+      if (g_get_charset (&charset) == FALSE)
+        encoding = mousepad_encoding_find (charset);
+
+      /* default to utf-8 */
+      if (G_LIKELY (encoding == MOUSEPAD_ENCODING_NONE))
+        encoding = MOUSEPAD_ENCODING_UTF_8;
+    }
+
+  return encoding;
+}
+
+
+
+MousepadEncoding
+mousepad_encoding_find (const gchar *charset)
+{
+  guint i;
+
+  /* check for invalid strings */
+  if (G_UNLIKELY (charset == NULL || *charset == '\0'))
+    return MOUSEPAD_ENCODING_NONE;
+
+  /* find the charset */
+  for (i = 0; i < G_N_ELEMENTS (encoding_infos); i++)
+    if (strcasecmp (encoding_infos[i].charset, charset) == 0)
+      return encoding_infos[i].encoding;
+
+  /* no encoding charset found */
+  return MOUSEPAD_ENCODING_NONE;
+}
+
+
+
+gboolean
+mousepad_encoding_is_unicode (MousepadEncoding encoding)
+{
+  const gchar *charset;
+
+  /* get the characterset name */
+  charset = mousepad_encoding_get_charset (encoding);
+
+  /* check for unicode charset */
+  if (charset != NULL && (strncmp (charset, "UTF", 3) == 0
+      || strncmp (charset, "UCS", 3) == 0))
+    return TRUE;
+
+  /* not an unicode charset */
+  return FALSE;
+}
diff --git a/mousepad/mousepad-encoding.h b/mousepad/mousepad-encoding.h
new file mode 100644
index 0000000..eee8528
--- /dev/null
+++ b/mousepad/mousepad-encoding.h
@@ -0,0 +1,125 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __MOUSEPAD_ENCODINGS_H__
+#define __MOUSEPAD_ENCODINGS_H__
+
+G_BEGIN_DECLS
+
+typedef enum   _MousepadEncoding     MousepadEncoding;
+typedef struct _MousepadEncodingInfo MousepadEncodingInfo;
+
+enum _MousepadEncoding
+{
+  MOUSEPAD_ENCODING_NONE,
+  MOUSEPAD_ENCODING_CUSTOM,
+
+  MOUSEPAD_ENCODING_ISO_8859_1,
+  MOUSEPAD_ENCODING_ISO_8859_2,
+  MOUSEPAD_ENCODING_ISO_8859_3,
+  MOUSEPAD_ENCODING_ISO_8859_4,
+  MOUSEPAD_ENCODING_ISO_8859_5,
+  MOUSEPAD_ENCODING_ISO_8859_6,
+  MOUSEPAD_ENCODING_ISO_8859_7,
+  MOUSEPAD_ENCODING_ISO_8859_8,
+  MOUSEPAD_ENCODING_ISO_8859_8_I,
+  MOUSEPAD_ENCODING_ISO_8859_9,
+  MOUSEPAD_ENCODING_ISO_8859_10,
+  MOUSEPAD_ENCODING_ISO_8859_13,
+  MOUSEPAD_ENCODING_ISO_8859_14,
+  MOUSEPAD_ENCODING_ISO_8859_15,
+  MOUSEPAD_ENCODING_ISO_8859_16,
+
+  MOUSEPAD_ENCODING_UTF_7,
+  MOUSEPAD_ENCODING_UTF_8,
+  MOUSEPAD_ENCODING_UTF_16LE,
+  MOUSEPAD_ENCODING_UTF_16BE,
+  MOUSEPAD_ENCODING_UCS_2LE,
+  MOUSEPAD_ENCODING_UCS_2BE,
+  MOUSEPAD_ENCODING_UTF_32LE,
+  MOUSEPAD_ENCODING_UTF_32BE,
+
+  MOUSEPAD_ENCODING_ARMSCII_8,
+  MOUSEPAD_ENCODING_BIG5,
+  MOUSEPAD_ENCODING_BIG5_HKSCS,
+  MOUSEPAD_ENCODING_CP_866,
+
+  MOUSEPAD_ENCODING_EUC_JP,
+  MOUSEPAD_ENCODING_EUC_KR,
+  MOUSEPAD_ENCODING_EUC_TW,
+
+  MOUSEPAD_ENCODING_GB18030,
+  MOUSEPAD_ENCODING_GB2312,
+  MOUSEPAD_ENCODING_GBK,
+  MOUSEPAD_ENCODING_GEOSTD8,
+  MOUSEPAD_ENCODING_HZ,
+
+  MOUSEPAD_ENCODING_IBM_850,
+  MOUSEPAD_ENCODING_IBM_852,
+  MOUSEPAD_ENCODING_IBM_855,
+  MOUSEPAD_ENCODING_IBM_857,
+  MOUSEPAD_ENCODING_IBM_862,
+  MOUSEPAD_ENCODING_IBM_864,
+
+  MOUSEPAD_ENCODING_ISO_2022_JP,
+  MOUSEPAD_ENCODING_ISO_2022_KR,
+  MOUSEPAD_ENCODING_ISO_IR_111,
+  MOUSEPAD_ENCODING_JOHAB,
+  MOUSEPAD_ENCODING_KOI8_R,
+  MOUSEPAD_ENCODING_KOI8_U,
+
+  MOUSEPAD_ENCODING_SHIFT_JIS,
+  MOUSEPAD_ENCODING_TCVN,
+  MOUSEPAD_ENCODING_TIS_620,
+  MOUSEPAD_ENCODING_UHC,
+  MOUSEPAD_ENCODING_VISCII,
+
+  MOUSEPAD_ENCODING_WINDOWS_1250,
+  MOUSEPAD_ENCODING_WINDOWS_1251,
+  MOUSEPAD_ENCODING_WINDOWS_1252,
+  MOUSEPAD_ENCODING_WINDOWS_1253,
+  MOUSEPAD_ENCODING_WINDOWS_1254,
+  MOUSEPAD_ENCODING_WINDOWS_1255,
+  MOUSEPAD_ENCODING_WINDOWS_1256,
+  MOUSEPAD_ENCODING_WINDOWS_1257,
+  MOUSEPAD_ENCODING_WINDOWS_1258
+};
+
+struct _MousepadEncodingInfo
+{
+  MousepadEncoding  encoding;
+  const gchar      *charset;
+  const gchar      *name;
+};
+
+
+extern const MousepadEncodingInfo encoding_infos[];
+
+extern guint                      n_encoding_infos;
+
+const gchar      *mousepad_encoding_get_charset (MousepadEncoding  encoding);
+
+const gchar      *mousepad_encoding_get_name    (MousepadEncoding  encoding);
+
+MousepadEncoding  mousepad_encoding_user        (void);
+
+MousepadEncoding  mousepad_encoding_find        (const gchar      *charset);
+
+gboolean          mousepad_encoding_is_unicode  (MousepadEncoding  encoding);
+
+G_END_DECLS
+
+#endif /* !__MOUSEPAD_ENCODINGS_H__ */
diff --git a/mousepad/mousepad-file.c b/mousepad/mousepad-file.c
index 81fec42..b45c980 100644
--- a/mousepad/mousepad-file.c
+++ b/mousepad/mousepad-file.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -19,9 +18,18 @@
 #include <config.h>
 #endif
 
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
 #ifdef HAVE_STRING_H
 #include <string.h>
 #endif
@@ -36,9 +44,6 @@
 #include <mousepad/mousepad-file.h>
 
 
-#define MAX_ENCODING_CHECK_CHARS       (10000)
-#define MOUSEPAD_GET_LINE_END_CHARS(a) ((a) == MOUSEPAD_LINE_END_DOS ? "\r\n\0" : ((a) == MOUSEPAD_LINE_END_MAC ? "\r\0" : "\n\0"))
-
 
 enum
 {
@@ -64,7 +69,7 @@ struct _MousepadFile
   gchar              *filename;
 
   /* encoding of the file */
-  gchar              *encoding;
+  MousepadEncoding    encoding;
 
   /* line ending of the file */
   MousepadLineEnding  line_ending;
@@ -74,12 +79,13 @@ struct _MousepadFile
 
   /* if file is read-only */
   guint               readonly : 1;
+
+  /* whether we write the bom at the start of the file */
+  guint               write_bom : 1;
 };
 
 
 
-static void  mousepad_file_class_init       (MousepadFileClass  *klass);
-static void  mousepad_file_init             (MousepadFile       *file);
 static void  mousepad_file_finalize         (GObject            *object);
 static void  mousepad_file_set_readonly     (MousepadFile       *file,
                                              gboolean            readonly);
@@ -120,7 +126,7 @@ mousepad_file_class_init (MousepadFileClass *klass)
                   0, NULL, NULL,
                   g_cclosure_marshal_VOID__BOOLEAN,
                   G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
-  
+
   file_signals[FILENAME_CHANGED] =
     g_signal_new (I_("filename-changed"),
                   G_TYPE_FROM_CLASS (gobject_class),
@@ -137,10 +143,15 @@ mousepad_file_init (MousepadFile *file)
 {
   /* initialize */
   file->filename    = NULL;
-  file->encoding    = NULL;
-  file->line_ending = MOUSEPAD_LINE_END_NONE;
+  file->encoding    = MOUSEPAD_ENCODING_UTF_8;
+#ifdef G_OS_WIN32
+  file->line_ending = MOUSEPAD_EOL_DOS;
+#else
+  file->line_ending = MOUSEPAD_EOL_UNIX;
+#endif
   file->readonly    = TRUE;
   file->mtime       = 0;
+  file->write_bom   = FALSE;
 }
 
 
@@ -152,7 +163,6 @@ mousepad_file_finalize (GObject *object)
 
   /* cleanup */
   g_free (file->filename);
-  g_free (file->encoding);
 
   /* release the reference from the buffer */
   g_object_unref (G_OBJECT (file->buffer));
@@ -166,16 +176,85 @@ static void
 mousepad_file_set_readonly (MousepadFile *file,
                             gboolean      readonly)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
-  
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
+
   if (G_LIKELY (file->readonly != readonly))
     {
       /* store new value */
       file->readonly = readonly;
-      
+
       /* emit signal */
       g_signal_emit (G_OBJECT (file), file_signals[READONLY_CHANGED], 0, readonly);
-    }  
+    }
+}
+
+
+
+static MousepadEncoding
+mousepad_file_encoding_read_bom (const gchar *contents,
+                                 gsize        length,
+                                 gsize       *bom_length)
+{
+  const guchar     *bom = (const guchar *) contents;
+  MousepadEncoding  encoding = MOUSEPAD_ENCODING_NONE;
+  gsize             bytes = 0;
+
+  mousepad_return_val_if_fail (contents != NULL && length > 0, MOUSEPAD_ENCODING_NONE);
+  mousepad_return_val_if_fail (contents != NULL && length > 0, MOUSEPAD_ENCODING_NONE);
+
+  switch (bom[0])
+    {
+      case 0xef:
+        if (length >= 3 && bom[1] == 0xbb && bom[2] == 0xbf)
+          {
+            bytes = 3;
+            encoding = MOUSEPAD_ENCODING_UTF_8;
+          }
+        break;
+
+      case 0x00:
+        if (length >= 4 && bom[1] == 0x00 && bom[2] == 0xfe && bom[3] == 0xff)
+          {
+            bytes = 4;
+            encoding = MOUSEPAD_ENCODING_UTF_32BE;
+          }
+        break;
+
+      case 0xff:
+        if (length >= 4 && bom[1] == 0xfe && bom[2] == 0x00 && bom[3] == 0x00)
+          {
+            bytes = 4;
+            encoding = MOUSEPAD_ENCODING_UTF_32LE;
+          }
+        else if (length >= 2 && bom[1] == 0xfe)
+          {
+            bytes = 2;
+            encoding = MOUSEPAD_ENCODING_UTF_16LE;
+          }
+        break;
+
+      case 0x2b:
+        if (length >= 4 && (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) &&
+            (bom[3] == 0x38 || bom[3] == 0x39 || bom[3] == 0x2b || bom[3] == 0x2f))
+          {
+            bytes = 4;
+            encoding = MOUSEPAD_ENCODING_UTF_7;
+          }
+        break;
+
+      case 0xfe:
+        if (length >= 2 && bom[1] == 0xff)
+          {
+            bytes = 2;
+            encoding = MOUSEPAD_ENCODING_UTF_16BE;
+          }
+        break;
+    }
+
+  if (bom_length)
+    *bom_length = bytes;
+
+  return encoding;
 }
 
 
@@ -185,7 +264,7 @@ mousepad_file_new (GtkTextBuffer *buffer)
 {
   MousepadFile *file;
 
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL);
 
   file = g_object_new (MOUSEPAD_TYPE_FILE, NULL);
 
@@ -201,7 +280,7 @@ void
 mousepad_file_set_filename (MousepadFile *file,
                             const gchar  *filename)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
 
   /* free the old filename */
   g_free (file->filename);
@@ -218,7 +297,7 @@ mousepad_file_set_filename (MousepadFile *file,
 const gchar *
 mousepad_file_get_filename (MousepadFile *file)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), NULL);
 
   return file->filename;
 }
@@ -228,7 +307,7 @@ mousepad_file_get_filename (MousepadFile *file)
 gchar *
 mousepad_file_get_uri (MousepadFile *file)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), NULL);
 
   return g_filename_to_uri (file->filename, NULL, NULL);
 }
@@ -236,26 +315,23 @@ mousepad_file_get_uri (MousepadFile *file)
 
 
 void
-mousepad_file_set_encoding (MousepadFile *file,
-                            const gchar  *encoding)
+mousepad_file_set_encoding (MousepadFile     *file,
+                            MousepadEncoding  encoding)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
-
-  /* cleanup */
-  g_free (file->encoding);
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
 
   /* set new encoding */
-  file->encoding = g_strdup (encoding);
+  file->encoding = encoding;
 }
 
 
 
-const gchar *
+MousepadEncoding
 mousepad_file_get_encoding (MousepadFile *file)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), MOUSEPAD_ENCODING_NONE);
 
-  return file->encoding ? file->encoding : "UTF-8";
+  return file->encoding;
 }
 
 
@@ -263,7 +339,7 @@ mousepad_file_get_encoding (MousepadFile *file)
 gboolean
 mousepad_file_get_read_only (MousepadFile *file)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
 
   return file->filename ? file->readonly : FALSE;
 }
@@ -271,10 +347,38 @@ mousepad_file_get_read_only (MousepadFile *file)
 
 
 void
+mousepad_file_set_write_bom (MousepadFile *file,
+                             gboolean      write_bom)
+{
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
+  mousepad_return_if_fail (mousepad_encoding_is_unicode (file->encoding));
+
+  /* set new value */
+  file->write_bom = write_bom;
+}
+
+
+
+gboolean
+mousepad_file_get_write_bom (MousepadFile *file,
+                             gboolean     *sensitive)
+{
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
+
+  /* return if we can write a bom */
+  if (G_LIKELY (sensitive))
+    *sensitive = mousepad_encoding_is_unicode (file->encoding);
+
+  return file->write_bom;
+}
+
+
+
+void
 mousepad_file_set_line_ending (MousepadFile       *file,
                                MousepadLineEnding  line_ending)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
 
   file->line_ending = line_ending;
 }
@@ -284,157 +388,227 @@ mousepad_file_set_line_ending (MousepadFile       *file,
 MousepadLineEnding
 mousepad_file_get_line_ending (MousepadFile *file)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), MOUSEPAD_LINE_END_NONE);
-
   return file->line_ending;
 }
 
 
 
-gboolean
+gint
 mousepad_file_open (MousepadFile  *file,
+                    const gchar   *template_filename,
                     GError       **error)
 {
-  GIOChannel  *channel;
-  GIOStatus    status;
-  gsize        length, terminator_pos;
-  gboolean     succeed = FALSE;
-  gchar       *string;
-  const gchar *line_term;
-  GtkTextIter  start, end;
-  struct stat  statb;
-
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (file->buffer), FALSE);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-  _mousepad_return_val_if_fail (file->filename != NULL, FALSE);
+  GMappedFile      *mapped_file;
+  const gchar      *filename;
+  gint              retval = ERROR_READING_FAILED;
+  gsize             length, written;
+  gsize             bom_length;
+  const gchar      *contents;
+  gchar            *encoded = NULL;
+  const gchar      *charset;
+  GtkTextIter       start_iter, end_iter;
+  struct stat       statb;
+  const gchar      *end, *n, *m;
+  MousepadEncoding  bom_encoding;
+
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (file->buffer), FALSE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (file->filename != NULL || template_filename != NULL, FALSE);
+
+  /* get the filename */
+  if (G_UNLIKELY (template_filename != NULL))
+    filename = template_filename;
+  else
+    filename = file->filename;
 
   /* check if the file exists, if not, it's a filename from the command line */
-  if (g_file_test (file->filename, G_FILE_TEST_EXISTS) == FALSE)
+  if (g_file_test (filename, G_FILE_TEST_EXISTS) == FALSE)
     {
       /* update readonly status */
       mousepad_file_set_readonly (file, FALSE);
 
-      return TRUE;
+      return 0;
     }
 
-  /* open the channel */
-  channel = g_io_channel_new_file (file->filename, "r", error);
+  /* try to open the file */
+  mapped_file = g_mapped_file_new (filename, FALSE, error);
 
-  if (G_LIKELY (channel))
+  if (G_LIKELY (mapped_file))
     {
-      /* freeze notifications */
-      g_object_freeze_notify (G_OBJECT (file->buffer));
+      /* get the mapped file contents and length */
+      contents = g_mapped_file_get_contents (mapped_file);
+      length = g_mapped_file_get_length (mapped_file);
 
-      /* set the encoding of the channel */
-      if (file->encoding != NULL)
+      if (G_LIKELY (contents != NULL && length > 0))
         {
-          /* set the encoding */
-          status = g_io_channel_set_encoding (channel, file->encoding, error);
+          /* detect if there is a bom with the encoding type */
+          bom_encoding = mousepad_file_encoding_read_bom (contents, length, &bom_length);
+          if (G_UNLIKELY (bom_encoding != MOUSEPAD_ENCODING_NONE))
+            {
+              /* we've found a valid bom at the start of the contents */
+              file->write_bom = TRUE;
 
-          if (G_UNLIKELY (status != G_IO_STATUS_NORMAL))
-            goto failed;
-        }
+              /* advance the contents offset and decrease length */
+              contents += bom_length;
+              length -= bom_length;
 
-      /* get the iter at the beginning of the document */
-      gtk_text_buffer_get_start_iter (file->buffer, &end);
+              /* set the detected encoding */
+              file->encoding = bom_encoding;
+            }
 
-      /* read the content of the file */
-      for (;;)
-        {
-          /* read the line */
-          status = g_io_channel_read_line (channel, &string, &length, &terminator_pos, error);
+          /* handle encoding and check for utf-8 valid text */
+          if (G_LIKELY (file->encoding == MOUSEPAD_ENCODING_UTF_8))
+            {
+              validate:
 
-          /* leave on problems */
-          if (G_UNLIKELY (status != G_IO_STATUS_NORMAL && status != G_IO_STATUS_EOF))
-            goto failed;
+              /* glib uses a faster validator when the string is nul-terminated */
+              if (G_LIKELY (length > 0 && contents[length] == '\0'))
+                length = -1;
 
-          if (G_LIKELY (string))
+              /* leave when the contents is not utf-8 valid */
+              if (g_utf8_validate (contents, length, &end) == FALSE)
+                {
+                  /* set return value */
+                  retval = ERROR_NOT_UTF8_VALID;
+
+                  /* set an error */
+                  g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+                               _("Invalid byte sequence in conversion input"));
+
+                  goto failed;
+                }
+            }
+          else
             {
-              /* detect the line ending of the file */
-              if (length != terminator_pos
-                  && file->line_ending == MOUSEPAD_LINE_END_NONE)
+              /* get the encoding charset */
+              charset = mousepad_encoding_get_charset (file->encoding);
+
+              /* convert the contents */
+              encoded = g_convert (contents, length, "UTF-8", charset, NULL, &written, error);
+
+              /* check if the string is utf-8 valid */
+              if (G_UNLIKELY (encoded == NULL))
                 {
-                  /* get the characters */
-                  line_term = string + terminator_pos;
-
-                  if (strcmp (line_term, "\n") == 0)
-                    file->line_ending = MOUSEPAD_LINE_END_UNIX;
-                  else if (strcmp (line_term, "\r") == 0)
-                    file->line_ending = MOUSEPAD_LINE_END_MAC;
-                  else if (strcmp (line_term, "\r\n") == 0)
-                    file->line_ending = MOUSEPAD_LINE_END_DOS;
-                  else
-                    g_warning (_("Unknown line ending detected (%s)"), line_term);
+                  /* set return value */
+                  retval = ERROR_CONVERTING_FAILED;
+
+                  goto failed;
                 }
 
-              /* make sure the string utf-8 valid */
-              if (G_UNLIKELY (g_utf8_validate (string, length, NULL) == FALSE))
+              /* set new values */
+              contents = encoded;
+              length = written;
+
+              /* validate the converted content */
+              goto validate;
+            }
+
+          /* detect the line ending, based on the first eol we match */
+          for (n = contents; n < end; n = g_utf8_next_char (n))
+            {
+              if (G_LIKELY (*n == '\n'))
                 {
-                  /* set an error */
-                  g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
-                               _("Converted string is not UTF-8 valid"));
+                  /* set unix line ending */
+                  file->line_ending = MOUSEPAD_EOL_UNIX;
 
-                  /* free string */
-                  g_free (string);
+                  break;
+                }
+              else if (*n == '\r')
+                {
+                  /* get next character */
+                  n = g_utf8_next_char (n);
 
-                  goto failed;
+                  /* set dos or mac line ending */
+                  file->line_ending = (*n == '\n') ? MOUSEPAD_EOL_DOS : MOUSEPAD_EOL_MAC;
+
+                  break;
                 }
+            }
 
-              /* insert the string in the buffer */
-              gtk_text_buffer_insert (file->buffer, &end, string, length);
+          /* get the iter at the beginning of the document */
+          gtk_text_buffer_get_start_iter (file->buffer, &start_iter);
 
-              /* cleanup */
-              g_free (string);
+          /* insert the file contents in the buffer (for documents with cr line ending) */
+          for (n = m = contents; n < end; n = g_utf8_next_char (n))
+            {
+              if (G_UNLIKELY (*n == '\r'))
+                {
+                  /* insert the text in the buffer */
+                  if (G_LIKELY (n - m > 0))
+                    gtk_text_buffer_insert (file->buffer, &start_iter, m, n - m);
+
+                  /* advance the offset */
+                  m = g_utf8_next_char (n);
+
+                  /* insert a new line when the document is not cr+lf */
+                  if (*m != '\n')
+                    gtk_text_buffer_insert (file->buffer, &start_iter, "\n", 1);
+                }
             }
 
-          /* break when we've reached the end of the file */
-          if (G_UNLIKELY (status == G_IO_STATUS_EOF))
-            break;
-        }
+          /* insert the remaining part, or everything for lf line ending */
+          if (G_LIKELY (n - m > 0))
+            gtk_text_buffer_insert (file->buffer, &start_iter, m, n - m);
 
-      /* done */
-      succeed = TRUE;
+          /* get the start iter */
+          gtk_text_buffer_get_start_iter (file->buffer, &start_iter);
 
-      /* get the start iter */
-      gtk_text_buffer_get_start_iter (file->buffer, &start);
+          /* set the cursor to the beginning of the document */
+          gtk_text_buffer_place_cursor (file->buffer, &start_iter);
+        }
 
-      /* set the cursor to the beginning of the document */
-      gtk_text_buffer_place_cursor (file->buffer, &start);
+      /* assume everything when file */
+      retval = 0;
 
-      /* get file status */
-      if (G_LIKELY (g_lstat (file->filename, &statb) == 0));
+      /* store the file status */
+      if (G_LIKELY (filename != template_filename))
         {
-          /* store the readonly mode */
-          mousepad_file_set_readonly (file, !((statb.st_mode & S_IWUSR) != 0));
+          if (G_LIKELY (g_stat (file->filename, &statb) == 0))
+            {
+              /* whether the file is readonly (ie. not writable by the user) */
+              mousepad_file_set_readonly (file, !((statb.st_mode & S_IWUSR) != 0));
 
-          /* store the file modification time */
-          file->mtime = statb.st_mtime;
+              /* store the file modification time */
+              file->mtime = statb.st_mtime;
+            }
+          else
+            {
+              /* set return value */
+              retval = ERROR_FILE_STATUS_FAILED;
+            }
+        }
+      else
+        {
+          /* this is a new document with content from a template */
+          file->mtime = 0;
+          mousepad_file_set_readonly (file, FALSE);
         }
 
       failed:
 
-      /* empty the buffer if we did not succeed */
-      if (G_UNLIKELY (succeed == FALSE))
+      /* make sure the buffer is empty if we did not succeed */
+      if (G_UNLIKELY (retval != 0))
         {
-          gtk_text_buffer_get_bounds (file->buffer, &start, &end);
-          gtk_text_buffer_delete (file->buffer, &start, &end);
+          gtk_text_buffer_get_bounds (file->buffer, &start_iter, &end_iter);
+          gtk_text_buffer_delete (file->buffer, &start_iter, &end_iter);
         }
 
-      /* this does not count as a modified buffer */
-      gtk_text_buffer_set_modified (file->buffer, FALSE);
-
-      /* thawn notifications */
-      g_object_thaw_notify (G_OBJECT (file->buffer));
+      /* cleanup */
+      g_free (encoded);
 
-      /* close the channel and flush the write buffer */
-      g_io_channel_shutdown (channel, TRUE, NULL);
+      /* close the mapped file */
+#if GLIB_CHECK_VERSION (2, 21, 0)
+      g_mapped_file_unref (mapped_file);
+#else
+      g_mapped_file_free (mapped_file);
+#endif
 
-      /* release the channel */
-      g_io_channel_unref (channel);
+      /* this does not count as a modified buffer */
+      gtk_text_buffer_set_modified (file->buffer, FALSE);
     }
 
-  return succeed;
+  return retval;
 }
 
 
@@ -443,99 +617,155 @@ gboolean
 mousepad_file_save (MousepadFile  *file,
                     GError       **error)
 {
-  GIOChannel  *channel;
-  GIOStatus    status;
-  gboolean     succeed = FALSE;
-  gchar       *slice;
-  const gchar *line_term;
-  GtkTextIter  start, end;
-  struct stat  statb;
-
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (file->buffer), FALSE);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-  _mousepad_return_val_if_fail (file->filename != NULL, FALSE);
-
-  /* open the channel. the file is created or truncated */
-  channel = g_io_channel_new_file (file->filename, "w", error);
-
-  if (G_LIKELY (channel))
+  gint          fd;
+  gboolean      succeed = FALSE;
+  gchar        *contents, *p;
+  gchar        *encoded;
+  const gchar  *charset;
+  GtkTextIter   start_iter, end_iter;
+  gint          l, m, length;
+  gsize         written;
+  struct stat   statb;
+  gchar       **chunks;
+
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (file->buffer), FALSE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (file->filename != NULL, FALSE);
+
+  /* open the file */
+  fd = g_open (file->filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+  if (G_LIKELY (fd != -1))
     {
-      /* set the encoding of the channel */
-      if (file->encoding != NULL)
+      /* get the buffer bounds */
+      gtk_text_buffer_get_bounds (file->buffer, &start_iter, &end_iter);
+
+      /* get the buffer contents */
+      contents = gtk_text_buffer_get_slice (file->buffer, &start_iter, &end_iter, TRUE);
+
+      if (G_LIKELY (contents))
         {
-          /* set the encoding */
-          status = g_io_channel_set_encoding (channel, file->encoding, error);
+          /* get the content length */
+          length = strlen (contents);
 
-          if (G_UNLIKELY (status != G_IO_STATUS_NORMAL))
-            goto failed;
-        }
+          /* handle line endings */
+          if (file->line_ending == MOUSEPAD_EOL_MAC)
+            {
+              /* replace the unix with a mac line ending */
+              for (p = contents; *p != '\0'; p++)
+                if (G_UNLIKELY (*p == '\n'))
+                  *p = '\r';
+            }
+          else if (file->line_ending == MOUSEPAD_EOL_DOS)
+            {
+              /* split the contents into chunks */
+              chunks = g_strsplit (contents, "\n", -1);
 
-      /* get the line ending characters we're going to use */
-      line_term = MOUSEPAD_GET_LINE_END_CHARS (file->line_ending);
+              /* cleanup */
+              g_free (contents);
 
-      /* get the start iter of the buffer */
-      gtk_text_buffer_get_start_iter (file->buffer, &start);
+              /* join the chunks with dos line endings in between */
+              contents = g_strjoinv ("\r\n", chunks);
 
-      /* walk the buffer */
-      do
-        {
-          /* set the end iter */
-          end = start;
+              /* cleanup */
+              g_strfreev (chunks);
 
-          /* insert the text if this line is not empty */
-          if (gtk_text_iter_ends_line (&start) == FALSE)
+              /* new contents length */
+              length = strlen (contents);
+            }
+
+          /* add and utf-8 bom at the start of the contents if needed */
+          if (file->write_bom && mousepad_encoding_is_unicode (file->encoding))
             {
-              /* move to the end of the line */
-              gtk_text_iter_forward_to_line_end (&end);
+              /* realloc the contents string */
+              contents = g_realloc (contents, length + 4);
 
-              /* get the test slice */
-              slice = gtk_text_buffer_get_slice (file->buffer, &start, &end, TRUE);
+              /* move the existing contents 3 bytes */
+              g_memmove (contents + 3, contents, length + 1);
 
-              /* write the file content */
-              status = g_io_channel_write_chars (channel, slice, -1, NULL, error);
+              /* write an utf-8 bom at the start of the contents */
+              contents[0] = (guchar) 0xef;
+              contents[1] = (guchar) 0xbb;
+              contents[2] = (guchar) 0xbf;
 
-              /* cleanup */
-              g_free (slice);
+              /* increase the length */
+              length += 3;
+            }
+
+          /* convert to the encoding if set */
+          if (G_UNLIKELY (file->encoding != MOUSEPAD_ENCODING_UTF_8))
+            {
+              /* get the charset */
+              charset = mousepad_encoding_get_charset (file->encoding);
+              if (G_UNLIKELY (charset == NULL))
+                goto failed;
+
+              /* convert the content to the user encoding */
+              encoded = g_convert (contents, length, charset, "UTF-8", NULL, &written, error);
 
-              /* leave when an error occured */
-              if (G_UNLIKELY (status != G_IO_STATUS_NORMAL))
+              /* return if nothing was encoded */
+              if (G_UNLIKELY (encoded == NULL))
                 goto failed;
+
+              /* cleanup */
+              g_free (contents);
+
+              /* set the new contents */
+              contents = encoded;
+              length = written;
             }
 
-          /* insert a new line if we haven't reached the end of the buffer */
-          if (gtk_text_iter_is_end (&end) == FALSE)
+          /* write the buffer to the file */
+          for (m = 0; m < length;)
             {
-              /* insert the new line */
-              status = g_io_channel_write_chars (channel, line_term, -1, NULL, error);
+              /* write */
+              l = write (fd, contents + m, length - m);
 
-              /* leave when an error occured */
-              if (G_UNLIKELY (status != G_IO_STATUS_NORMAL))
-                goto failed;
+              if (G_UNLIKELY (l < 0))
+                {
+                  /* just try again on EAGAIN/EINTR */
+                  if (G_LIKELY (errno != EAGAIN && errno != EINTR))
+                    {
+                      /* set an error */
+                      g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno), "%s", g_strerror (errno));
+
+                      /* bail out */
+                      goto failed;
+                    }
+                }
+              else
+                {
+                  /* advance the offset */
+                  m += l;
+                }
             }
-        }
-      while (gtk_text_iter_forward_line (&start));
 
-      /* everything seems to be ok */
-      succeed = TRUE;
+          /* set the new modification time */
+          if (G_LIKELY (fstat (fd, &statb) == 0))
+            file->mtime = statb.st_mtime;
 
-      /* set the new modification time */
-      if (G_LIKELY (g_lstat (file->filename, &statb) == 0))
-        file->mtime = statb.st_mtime;
+          /* everything has been saved */
+          gtk_text_buffer_set_modified (file->buffer, FALSE);
 
-      /* everything has been saved */
-      gtk_text_buffer_set_modified (file->buffer, FALSE);
+          /* we saved succesfully */
+          mousepad_file_set_readonly (file, FALSE);
 
-      /* we saved succesfully */
-      mousepad_file_set_readonly (file, FALSE);
+          /* everything went file */
+          succeed = TRUE;
 
-      failed:
+          failed:
 
-      /* close the channel and flush the write buffer */
-      g_io_channel_shutdown (channel, TRUE, error);
+          /* cleanup */
+          g_free (contents);
 
-      /* release the channel */
-      g_io_channel_unref (channel);
+          /* close the file */
+          close (fd);
+        }
+    }
+  else
+    {
+      /* set an error */
+      g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno), "%s", g_strerror (errno));
     }
 
   return succeed;
@@ -550,10 +780,10 @@ mousepad_file_reload (MousepadFile  *file,
   GtkTextIter start, end;
   gboolean    succeed = FALSE;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (file->buffer), FALSE);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-  _mousepad_return_val_if_fail (file->filename != NULL, FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), FALSE);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (file->buffer), FALSE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (file->filename != NULL, FALSE);
 
   /* simple test if the file has not been removed */
   if (G_UNLIKELY (g_file_test (file->filename, G_FILE_TEST_EXISTS) == FALSE))
@@ -570,7 +800,7 @@ mousepad_file_reload (MousepadFile  *file,
   gtk_text_buffer_delete (file->buffer, &start, &end);
 
   /* reload the file */
-  succeed = mousepad_file_open (file, error);
+  succeed = mousepad_file_open (file, NULL, error);
 
   return succeed;
 }
@@ -584,17 +814,17 @@ mousepad_file_get_externally_modified (MousepadFile  *file,
   struct stat statb;
   GFileError  error_code;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), TRUE);
-  _mousepad_return_val_if_fail (file->filename != NULL, TRUE);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), TRUE);
+  mousepad_return_val_if_fail (file->filename != NULL, TRUE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   /* check if our modification time differs from the current one */
-  if (G_LIKELY (g_lstat (file->filename, &statb) == 0))
+  if (G_LIKELY (g_stat (file->filename, &statb) == 0))
     return (file->mtime > 0 && statb.st_mtime != file->mtime);
-    
+
   /* get the error code */
   error_code = g_file_error_from_errno (errno);
-  
+
   /* file does not exists, nothing wrong with that */
   if (G_LIKELY (error_code == G_FILE_ERROR_NOENT))
     return FALSE;
@@ -605,80 +835,3 @@ mousepad_file_get_externally_modified (MousepadFile  *file,
 
   return TRUE;
 }
-
-
-
-gint
-mousepad_file_test_encoding (MousepadFile  *file,
-                             const gchar   *encoding,
-                             GError       **error)
-{
-  GIOChannel  *channel;
-  GIOStatus    status;
-  gunichar     c;
-  gint         unprintable = -1;
-  gint         counter = 0;
-
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_FILE (file), -1);
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (file->buffer), -1);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, -1);
-  _mousepad_return_val_if_fail (file->filename != NULL, -1);
-  _mousepad_return_val_if_fail (encoding != NULL, -1);
-
-  /* check if the file exists */
-  if (g_file_test (file->filename, G_FILE_TEST_EXISTS) == FALSE)
-    return -1;
-
-  /* open the channel */
-  channel = g_io_channel_new_file (file->filename, "r", error);
-
-  if (G_LIKELY (channel))
-    {
-      /* set the encoding of the channel */
-      status = g_io_channel_set_encoding (channel, encoding, error);
-
-      if (G_UNLIKELY (status != G_IO_STATUS_NORMAL))
-        goto failed;
-
-      /* set the counter */
-      unprintable = 0;
-
-      /* read the characters in the file and break on large files */
-      while (G_UNLIKELY (counter < MAX_ENCODING_CHECK_CHARS))
-        {
-          /* read a character */
-          status = g_io_channel_read_unichar (channel, &c, error);
-
-          /* leave on problems */
-          if (G_UNLIKELY (status != G_IO_STATUS_NORMAL && status != G_IO_STATUS_EOF))
-            {
-              /* reset counter */
-              unprintable = -1;
-
-              goto failed;
-            }
-
-          /* check if the character is unprintable, but not a soft hyphen */
-          if (G_UNLIKELY (g_unichar_isprint (c) == FALSE
-                          && g_unichar_break_type (c) != G_UNICODE_BREAK_AFTER))
-            unprintable++;
-
-          /* break when we've reached the end of the file */
-          if (G_UNLIKELY (status == G_IO_STATUS_EOF))
-            break;
-
-          /* increase counter */
-          counter++;
-        }
-
-      failed:
-
-      /* close the channel and flush the write buffer */
-      g_io_channel_shutdown (channel, TRUE, NULL);
-
-      /* release the channel */
-      g_io_channel_unref (channel);
-    }
-
-  return unprintable;
-}
diff --git a/mousepad/mousepad-file.h b/mousepad/mousepad-file.h
index 0f65a7f..18c5b6e 100644
--- a/mousepad/mousepad-file.h
+++ b/mousepad/mousepad-file.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,6 +19,8 @@
 
 G_BEGIN_DECLS
 
+#include <mousepad/mousepad-encoding.h>
+
 typedef struct _MousepadFileClass  MousepadFileClass;
 typedef struct _MousepadFile       MousepadFile;
 typedef enum   _MousepadLineEnding MousepadLineEnding;
@@ -33,10 +34,9 @@ typedef enum   _MousepadLineEnding MousepadLineEnding;
 
 enum _MousepadLineEnding
 {
-  MOUSEPAD_LINE_END_NONE,
-  MOUSEPAD_LINE_END_UNIX,
-  MOUSEPAD_LINE_END_MAC,
-  MOUSEPAD_LINE_END_DOS
+  MOUSEPAD_EOL_UNIX,
+  MOUSEPAD_EOL_MAC,
+  MOUSEPAD_EOL_DOS
 };
 
 GType               mousepad_file_get_type                 (void) G_GNUC_CONST;
@@ -51,18 +51,25 @@ const gchar        *mousepad_file_get_filename             (MousepadFile
 gchar              *mousepad_file_get_uri                  (MousepadFile        *file);
 
 void                mousepad_file_set_encoding             (MousepadFile        *file,
-                                                            const gchar         *encoding);
+                                                            MousepadEncoding     encoding);
 
-const gchar        *mousepad_file_get_encoding             (MousepadFile        *file);
+MousepadEncoding    mousepad_file_get_encoding             (MousepadFile        *file);
 
 gboolean            mousepad_file_get_read_only            (MousepadFile        *file);
 
+void                mousepad_file_set_write_bom            (MousepadFile        *file,
+                                                            gboolean             write_bom);
+
+gboolean            mousepad_file_get_write_bom            (MousepadFile        *file,
+                                                            gboolean            *sensitive);
+
 void                mousepad_file_set_line_ending          (MousepadFile        *file,
                                                             MousepadLineEnding   line_ending);
 
 MousepadLineEnding  mousepad_file_get_line_ending          (MousepadFile        *file);
 
-gboolean            mousepad_file_open                     (MousepadFile        *file,
+gint                mousepad_file_open                     (MousepadFile        *file,
+                                                            const gchar         *template_filename,
                                                             GError             **error);
 
 gboolean            mousepad_file_save                     (MousepadFile        *file,
@@ -73,11 +80,6 @@ gboolean            mousepad_file_reload                   (MousepadFile
 
 gboolean            mousepad_file_get_externally_modified  (MousepadFile        *file,
                                                             GError             **error);
-
-gint                mousepad_file_test_encoding            (MousepadFile        *file,
-                                                            const gchar         *encoding,
-                                                            GError             **error);
-
 G_END_DECLS
 
 #endif /* !__MOUSEPAD_FILE_H__ */
diff --git a/mousepad/mousepad-preferences.c b/mousepad/mousepad-preferences.c
index a6917b1..cbf1ec1 100644
--- a/mousepad/mousepad-preferences.c
+++ b/mousepad/mousepad-preferences.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -75,13 +74,11 @@ enum
   PROP_MISC_PATH_IN_TITLE,
   PROP_MISC_RECENT_MENU_ITEMS,
   PROP_MISC_REMEMBER_GEOMETRY,
-  N_PROPERTIES,
+  N_PROPERTIES
 };
 
 
 
-static void     mousepad_preferences_class_init         (MousepadPreferencesClass *klass);
-static void     mousepad_preferences_init               (MousepadPreferences      *preferences);
 static void     mousepad_preferences_finalize           (GObject                  *object);
 static void     mousepad_preferences_get_property       (GObject                  *object,
                                                          guint                     prop_id,
@@ -286,7 +283,7 @@ mousepad_preferences_class_init (MousepadPreferencesClass *klass)
                                    g_param_spec_int ("misc-recent-menu-items",
                                                      "MiscRecentMenuItems",
                                                      NULL,
-                                                     1, G_MAXINT, 10,
+                                                     1, 100, 10,
                                                      MOUSEPAD_PARAM_READWRITE));
 
   g_object_class_install_property (gobject_class,
diff --git a/mousepad/mousepad-preferences.h b/mousepad/mousepad-preferences.h
index d3161a0..31302b7 100644
--- a/mousepad/mousepad-preferences.h
+++ b/mousepad/mousepad-preferences.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-print.c b/mousepad/mousepad-print.c
index a86d465..04aa284 100644
--- a/mousepad/mousepad-print.c
+++ b/mousepad/mousepad-print.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -32,8 +31,6 @@
 
 
 
-static void           mousepad_print_class_init            (MousepadPrintClass      *klass);
-static void           mousepad_print_init                  (MousepadPrint           *print);
 static void           mousepad_print_finalize              (GObject                 *object);
 static void           mousepad_print_settings_load         (GtkPrintOperation       *operation);
 static void           mousepad_print_settings_save_foreach (const gchar             *key,
@@ -171,8 +168,8 @@ mousepad_print_settings_load (GtkPrintOperation *operation)
   PangoContext          *context;
   PangoFontDescription  *font_desc;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (print->document));
-  _mousepad_return_if_fail (GTK_IS_WIDGET (print->document->textview));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (print->document));
+  mousepad_return_if_fail (GTK_IS_WIDGET (print->document->textview));
 
   /* get the config file filename */
   filename = mousepad_util_get_save_location (MOUSEPAD_RC_RELPATH, FALSE);
@@ -843,11 +840,11 @@ mousepad_print_document_interactive (MousepadPrint     *print,
 {
   GtkPrintOperationResult result;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_PRINT (print), FALSE);
-  _mousepad_return_val_if_fail (GTK_IS_PRINT_OPERATION (print), FALSE);
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
-  _mousepad_return_val_if_fail (GTK_IS_WINDOW (parent), FALSE);
-  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_PRINT (print), FALSE);
+  mousepad_return_val_if_fail (GTK_IS_PRINT_OPERATION (print), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
+  mousepad_return_val_if_fail (GTK_IS_WINDOW (parent), FALSE);
+  mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   /* set the document */
   print->document = document;
diff --git a/mousepad/mousepad-print.h b/mousepad/mousepad-print.h
index 28011ae..3806d7b 100644
--- a/mousepad/mousepad-print.h
+++ b/mousepad/mousepad-print.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-private.h b/mousepad/mousepad-private.h
index f271186..4be50b1 100644
--- a/mousepad/mousepad-private.h
+++ b/mousepad/mousepad-private.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -25,6 +24,15 @@
 
 G_BEGIN_DECLS
 
+/* errors inside mousepad */
+enum
+{
+  ERROR_READING_FAILED     = -1,
+  ERROR_CONVERTING_FAILED  = -2,
+  ERROR_NOT_UTF8_VALID     = -3,
+  ERROR_FILE_STATUS_FAILED = -4
+};
+
 /* config file locations */
 #define MOUSEPAD_RC_RELPATH     ("Mousepad" G_DIR_SEPARATOR_S "mousepadrc")
 #define MOUSEPAD_ACCELS_RELPATH ("Mousepad" G_DIR_SEPARATOR_S "accels.scm")
@@ -45,24 +53,25 @@ G_BEGIN_DECLS
 
 /* support for canonical strings and quarks */
 #define I_(string)  (g_intern_static_string (string))
-#define QU_(string) (g_quark_from_static_string (string))
 
 /* convienient function for setting object data */
-#define mousepad_object_set_data(object,key,data)              (g_object_set_qdata ((object), QU_(key), (data)))
-#define mousepad_object_set_data_full(object,key,data,destroy) (g_object_set_qdata_full ((object), QU_(key), (data), (GDestroyNotify) (destroy)))
-#define mousepad_object_get_data(object,key)                   (g_object_get_qdata ((object), QU_(key)))
+#define mousepad_object_set_data(object,key,data)              (g_object_set_qdata ((object), \
+                                                                g_quark_from_static_string (key), (data)))
+#define mousepad_object_set_data_full(object,key,data,destroy) (g_object_set_qdata_full ((object), \
+                                                                g_quark_from_static_string (key), (data), (GDestroyNotify) (destroy)))
+#define mousepad_object_get_data(object,key)                   (g_object_get_qdata ((object), g_quark_try_string (key)))
 
 /* support macros for debugging */
 #ifndef NDEBUG
-#define _mousepad_assert(expr)                  g_assert (expr)
-#define _mousepad_assert_not_reached()          g_assert_not_reached ()
-#define _mousepad_return_if_fail(expr)          g_return_if_fail (expr)
-#define _mousepad_return_val_if_fail(expr, val) g_return_val_if_fail (expr, (val))
+#define mousepad_assert(expr)                  g_assert (expr)
+#define mousepad_assert_not_reached()          g_assert_not_reached ()
+#define mousepad_return_if_fail(expr)          g_return_if_fail (expr)
+#define mousepad_return_val_if_fail(expr, val) g_return_val_if_fail (expr, (val))
 #else
-#define _mousepad_assert(expr)                  G_STMT_START{ (void)0; }G_STMT_END
-#define _mousepad_assert_not_reached()          G_STMT_START{ (void)0; }G_STMT_END
-#define _mousepad_return_if_fail(expr)          G_STMT_START{ (void)0; }G_STMT_END
-#define _mousepad_return_val_if_fail(expr, val) G_STMT_START{ (void)0; }G_STMT_END
+#define mousepad_assert(expr)                  G_STMT_START{ (void)0; }G_STMT_END
+#define mousepad_assert_not_reached()          G_STMT_START{ (void)0; }G_STMT_END
+#define mousepad_return_if_fail(expr)          G_STMT_START{ (void)0; }G_STMT_END
+#define mousepad_return_val_if_fail(expr, val) G_STMT_START{ (void)0; }G_STMT_END
 #endif
 
 /* avoid trivial g_value_get_*() function calls */
diff --git a/mousepad/mousepad-replace-dialog.c b/mousepad/mousepad-replace-dialog.c
index aa6bb41..a3a171e 100644
--- a/mousepad/mousepad-replace-dialog.c
+++ b/mousepad/mousepad-replace-dialog.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -33,8 +32,6 @@
 
 
 
-static void                 mousepad_replace_dialog_class_init              (MousepadReplaceDialogClass *klass);
-static void                 mousepad_replace_dialog_init                    (MousepadReplaceDialog      *dialog);
 static void                 mousepad_replace_dialog_unrealize               (GtkWidget                  *widget);
 static void                 mousepad_replace_dialog_finalize                (GObject                    *object);
 static void                 mousepad_replace_dialog_response                (GtkWidget                  *widget,
@@ -299,8 +296,8 @@ mousepad_replace_dialog_unrealize (GtkWidget *widget)
   MousepadReplaceDialog *dialog = MOUSEPAD_REPLACE_DIALOG (widget);
   const gchar           *text;
 
-  _mousepad_return_if_fail (GTK_IS_ENTRY (dialog->replace_entry));
-  _mousepad_return_if_fail (GTK_IS_ENTRY (dialog->search_entry));
+  mousepad_return_if_fail (GTK_IS_ENTRY (dialog->replace_entry));
+  mousepad_return_if_fail (GTK_IS_ENTRY (dialog->search_entry));
 
   text = gtk_entry_get_text (GTK_ENTRY (dialog->search_entry));
   mousepad_replace_dialog_history_insert_text (text);
@@ -588,7 +585,7 @@ mousepad_replace_dialog_history_combo_box (GtkComboBox *combo_box)
 {
   GSList *li;
 
-  _mousepad_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
+  mousepad_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
 
   /* append the items from the history to the combobox */
   for (li = history_list; li != NULL; li = li->next)
diff --git a/mousepad/mousepad-replace-dialog.h b/mousepad/mousepad-replace-dialog.h
index b5cb629..b3e7d2f 100644
--- a/mousepad/mousepad-replace-dialog.h
+++ b/mousepad/mousepad-replace-dialog.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-search-bar.c b/mousepad/mousepad-search-bar.c
index 1b8ee15..4158d02 100644
--- a/mousepad/mousepad-search-bar.c
+++ b/mousepad/mousepad-search-bar.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -37,8 +36,6 @@
 
 
 
-static void      mousepad_search_bar_class_init                 (MousepadSearchBarClass  *klass);
-static void      mousepad_search_bar_init                       (MousepadSearchBar       *bar);
 static void      mousepad_search_bar_finalize                   (GObject                 *object);
 static void      mousepad_search_bar_find_string                (MousepadSearchBar       *bar,
                                                                  MousepadSearchFlags   flags);
@@ -61,7 +58,7 @@ enum
 {
   HIDE_BAR,
   SEARCH,
-  LAST_SIGNAL,
+  LAST_SIGNAL
 };
 
 struct _MousepadSearchBarClass
@@ -319,7 +316,7 @@ mousepad_search_bar_find_string (MousepadSearchBar   *bar,
 static void
 mousepad_search_bar_hide_clicked (MousepadSearchBar *bar)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
 
   /* emit the signal */
   g_signal_emit (G_OBJECT (bar), search_bar_signals[HIDE_BAR], 0);
@@ -352,7 +349,7 @@ mousepad_search_bar_highlight_toggled (GtkWidget         *button,
 {
   MousepadSearchFlags flags;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
 
   /* set the new state */
   bar->highlight_all = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (button));
@@ -385,7 +382,7 @@ mousepad_search_bar_match_case_toggled (GtkWidget         *button,
 {
   gboolean active;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
 
   /* get the state of the toggle button */
   active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
@@ -414,8 +411,8 @@ mousepad_search_bar_menuitem_toggled (GtkCheckMenuItem *item,
 {
   gboolean active;
 
-  _mousepad_return_if_fail (GTK_IS_CHECK_MENU_ITEM (item));
-  _mousepad_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
+  mousepad_return_if_fail (GTK_IS_CHECK_MENU_ITEM (item));
+  mousepad_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
 
   /* toggle the menubar item, he/she will send the signal */
   active = gtk_check_menu_item_get_active (item);
@@ -427,7 +424,7 @@ mousepad_search_bar_menuitem_toggled (GtkCheckMenuItem *item,
 static void
 mousepad_search_bar_highlight_schedule (MousepadSearchBar *bar)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
 
   /* stop a pending timeout */
   if (bar->highlight_id != 0)
@@ -489,7 +486,7 @@ mousepad_search_bar_entry (MousepadSearchBar *bar)
 void
 mousepad_search_bar_focus (MousepadSearchBar *bar)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
 
   /* focus the entry field */
   gtk_widget_grab_focus (bar->entry);
@@ -499,7 +496,7 @@ mousepad_search_bar_focus (MousepadSearchBar *bar)
 
   /* update the highlight */
   mousepad_search_bar_highlight_schedule (bar);
-  
+
   /* select the entire entry */
   gtk_editable_select_region (GTK_EDITABLE (bar->entry), 0, -1);
 }
@@ -511,7 +508,7 @@ mousepad_search_bar_find_next (MousepadSearchBar *bar)
 {
   MousepadSearchFlags flags;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
 
   /* set search flags */
   flags = MOUSEPAD_SEARCH_FLAGS_ITER_SEL_END
@@ -528,7 +525,7 @@ mousepad_search_bar_find_previous (MousepadSearchBar *bar)
 {
   MousepadSearchFlags flags;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (bar));
 
   /* set search flags */
   flags = MOUSEPAD_SEARCH_FLAGS_ITER_SEL_START
diff --git a/mousepad/mousepad-search-bar.h b/mousepad/mousepad-search-bar.h
index 8d80096..4dbfe11 100644
--- a/mousepad/mousepad-search-bar.h
+++ b/mousepad/mousepad-search-bar.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-statusbar.c b/mousepad/mousepad-statusbar.c
index 712bdd1..0321c3e 100644
--- a/mousepad/mousepad-statusbar.c
+++ b/mousepad/mousepad-statusbar.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -26,8 +25,6 @@
 
 
 
-static void              mousepad_statusbar_class_init                (MousepadStatusbarClass *klass);
-static void              mousepad_statusbar_init                      (MousepadStatusbar      *statusbar);
 static gboolean          mousepad_statusbar_overwrite_clicked         (GtkWidget              *widget,
                                                                        GdkEventButton         *event,
                                                                        MousepadStatusbar      *statusbar);
@@ -149,7 +146,7 @@ mousepad_statusbar_overwrite_clicked (GtkWidget         *widget,
                                       GdkEventButton    *event,
                                       MousepadStatusbar *statusbar)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_STATUSBAR (statusbar), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_STATUSBAR (statusbar), FALSE);
 
   /* only respond on the left button click */
   if (event->type != GDK_BUTTON_PRESS || event->button != 1)
@@ -174,7 +171,7 @@ mousepad_statusbar_set_cursor_position (MousepadStatusbar *statusbar,
 {
   gchar string[64];
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_STATUSBAR (statusbar));
+  mousepad_return_if_fail (MOUSEPAD_IS_STATUSBAR (statusbar));
 
   /* create printable string */
   if (G_UNLIKELY (selection > 0))
@@ -192,7 +189,7 @@ void
 mousepad_statusbar_set_overwrite (MousepadStatusbar *statusbar,
                                   gboolean           overwrite)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_STATUSBAR (statusbar));
+  mousepad_return_if_fail (MOUSEPAD_IS_STATUSBAR (statusbar));
 
   gtk_widget_set_sensitive (statusbar->overwrite, overwrite);
 
diff --git a/mousepad/mousepad-statusbar.h b/mousepad/mousepad-statusbar.h
index 28c7c59..c44b54e 100644
--- a/mousepad/mousepad-statusbar.h
+++ b/mousepad/mousepad-statusbar.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-undo.c b/mousepad/mousepad-undo.c
index 5b28e3b..ecea5cd 100644
--- a/mousepad/mousepad-undo.c
+++ b/mousepad/mousepad-undo.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -41,8 +40,6 @@ typedef enum   _MousepadUndoAction MousepadUndoAction;
 
 
 
-static void mousepad_undo_class_init               (MousepadUndoClass  *klass);
-static void mousepad_undo_init                     (MousepadUndo       *undo);
 static void mousepad_undo_finalize                 (GObject            *object);
 static void mousepad_undo_emit_signals             (MousepadUndo       *undo);
 static void mousepad_undo_step_free                (MousepadUndoStep   *step);
@@ -312,7 +309,7 @@ mousepad_undo_step (MousepadUndo *undo,
         {
           case INSERT:
             /* debug check */
-            _mousepad_return_if_fail (step->data == NULL);
+            mousepad_return_if_fail (step->data == NULL);
 
             /* get the end iter */
             gtk_text_buffer_get_iter_at_offset (undo->buffer, &end_iter, step->end);
@@ -326,7 +323,7 @@ mousepad_undo_step (MousepadUndo *undo,
 
           case DELETE:
             /* debug check */
-            _mousepad_return_if_fail (step->data != NULL);
+            mousepad_return_if_fail (step->data != NULL);
 
             /* insert the deleted text */
             gtk_text_buffer_insert (undo->buffer, &start_iter, step->data, -1);
@@ -337,7 +334,7 @@ mousepad_undo_step (MousepadUndo *undo,
             break;
 
           default:
-            _mousepad_assert_not_reached ();
+            mousepad_assert_not_reached ();
             break;
         }
 
@@ -383,7 +380,7 @@ mousepad_undo_clear_oldest_step (MousepadUndo *undo)
   MousepadUndoStep *step;
   gint              to_remove;
 
-  _mousepad_return_if_fail (undo->n_steps > MOUSEPAD_UNDO_MAX_STEPS);
+  mousepad_return_if_fail (undo->n_steps > MOUSEPAD_UNDO_MAX_STEPS);
 
   /* number of steps to remove */
   to_remove = undo->n_steps - MOUSEPAD_UNDO_MAX_STEPS;
@@ -420,7 +417,7 @@ mousepad_undo_clear_oldest_step (MousepadUndo *undo)
 static void
 mousepad_undo_cache_reset (MousepadUndo *undo)
 {
-  _mousepad_return_if_fail (undo->cache == NULL);
+  mousepad_return_if_fail (undo->cache == NULL);
 
   /* reset variables */
   undo->cache_start = undo->cache_end = -1;
@@ -440,7 +437,7 @@ mousepad_undo_cache_to_step (MousepadUndo *undo)
   if (G_LIKELY (undo->cache_start != undo->cache_end))
     {
       /* make sure the needle has been reset */
-      _mousepad_return_if_fail (undo->needle == undo->steps);
+      mousepad_return_if_fail (undo->needle == undo->steps);
 
       /* allocate slice */
       step = g_slice_new0 (MousepadUndoStep);
@@ -502,7 +499,7 @@ mousepad_undo_needle_reset (MousepadUndo *undo)
     }
 
   /* debug check */
-  _mousepad_return_if_fail (undo->needle == undo->steps);
+  mousepad_return_if_fail (undo->needle == undo->steps);
 }
 
 
@@ -630,8 +627,8 @@ mousepad_undo_buffer_insert (GtkTextBuffer *buffer,
 {
   gint start_pos, end_pos;
 
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
-  _mousepad_return_if_fail (buffer == undo->buffer);
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
+  mousepad_return_if_fail (buffer == undo->buffer);
 
   /* leave when locked */
   if (G_LIKELY (undo->locked == 0))
@@ -657,8 +654,8 @@ mousepad_undo_buffer_delete (GtkTextBuffer *buffer,
   gchar *text;
   gint   start_pos, end_pos;
 
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
-  _mousepad_return_if_fail (buffer == undo->buffer);
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
+  mousepad_return_if_fail (buffer == undo->buffer);
 
   /* no nothing when locked */
   if (G_LIKELY (undo->locked == 0))
@@ -686,8 +683,8 @@ static void
 mousepad_undo_buffer_begin_user_action (GtkTextBuffer *buffer,
                                         MousepadUndo  *undo)
 {
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
-  _mousepad_return_if_fail (buffer == undo->buffer);
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
+  mousepad_return_if_fail (buffer == undo->buffer);
 
   /* only reset the group counter when not locked */
   if (G_LIKELY (undo->locked == 0))
@@ -704,7 +701,7 @@ mousepad_undo_new (GtkTextBuffer *buffer)
 {
   MousepadUndo *undo;
 
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL);
 
   /* create the undo object */
   undo = g_object_new (MOUSEPAD_TYPE_UNDO, NULL);
@@ -727,7 +724,7 @@ mousepad_undo_clear (MousepadUndo *undo)
 {
   GList *li;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
+  mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
 
   /* lock to avoid updates */
   mousepad_undo_lock (undo);
@@ -758,7 +755,7 @@ mousepad_undo_clear (MousepadUndo *undo)
 void
 mousepad_undo_lock (MousepadUndo *undo)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
+  mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
 
   /* increase the lock count */
   undo->locked++;
@@ -769,8 +766,8 @@ mousepad_undo_lock (MousepadUndo *undo)
 void
 mousepad_undo_unlock (MousepadUndo *undo)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
-  _mousepad_return_if_fail (undo->locked > 0);
+  mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
+  mousepad_return_if_fail (undo->locked > 0);
 
   /* decrease the lock count */
   undo->locked--;
@@ -781,7 +778,7 @@ mousepad_undo_unlock (MousepadUndo *undo)
 void
 mousepad_undo_save_point (MousepadUndo *undo)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
+  mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
 
   /* reset the needle */
   mousepad_undo_needle_reset (undo);
@@ -798,7 +795,7 @@ mousepad_undo_save_point (MousepadUndo *undo)
 gboolean
 mousepad_undo_can_undo (MousepadUndo *undo)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_UNDO (undo), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_UNDO (undo), FALSE);
 
   return undo->can_undo;
 }
@@ -808,7 +805,7 @@ mousepad_undo_can_undo (MousepadUndo *undo)
 gboolean
 mousepad_undo_can_redo (MousepadUndo *undo)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_UNDO (undo), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_UNDO (undo), FALSE);
 
   return undo->can_redo;
 }
@@ -818,8 +815,8 @@ mousepad_undo_can_redo (MousepadUndo *undo)
 void
 mousepad_undo_do_undo (MousepadUndo *undo)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
-  _mousepad_return_if_fail (mousepad_undo_can_undo (undo));
+  mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
+  mousepad_return_if_fail (mousepad_undo_can_undo (undo));
 
   /* undo the last step */
   mousepad_undo_step (undo, FALSE);
@@ -830,8 +827,8 @@ mousepad_undo_do_undo (MousepadUndo *undo)
 void
 mousepad_undo_do_redo (MousepadUndo *undo)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
-  _mousepad_return_if_fail (mousepad_undo_can_redo (undo));
+  mousepad_return_if_fail (MOUSEPAD_IS_UNDO (undo));
+  mousepad_return_if_fail (mousepad_undo_can_redo (undo));
 
   /* redo the last undo-ed step */
   mousepad_undo_step (undo, TRUE);
diff --git a/mousepad/mousepad-undo.h b/mousepad/mousepad-undo.h
index 9a92d90..b096ef5 100644
--- a/mousepad/mousepad-undo.h
+++ b/mousepad/mousepad-undo.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-util.c b/mousepad/mousepad-util.c
index 16ff0dd..f9abdf6 100644
--- a/mousepad/mousepad-util.c
+++ b/mousepad/mousepad-util.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -28,7 +27,7 @@
 
 
 
-static inline gboolean
+static gboolean
 mousepad_util_iter_word_characters (const GtkTextIter *iter)
 {
   gunichar c;
@@ -150,7 +149,7 @@ mousepad_util_iter_backward_word_start (GtkTextIter *iter)
 gboolean
 mousepad_util_iter_forward_text_start (GtkTextIter *iter)
 {
-  _mousepad_return_val_if_fail (!mousepad_util_iter_inside_word (iter), FALSE);
+  mousepad_return_val_if_fail (!mousepad_util_iter_inside_word (iter), FALSE);
 
   /* keep until we hit text or a line end */
   while (g_unichar_isspace (gtk_text_iter_get_char (iter)))
@@ -167,7 +166,7 @@ mousepad_util_iter_backward_text_start (GtkTextIter *iter)
 {
   GtkTextIter prev = *iter;
 
-  _mousepad_return_val_if_fail (!mousepad_util_iter_inside_word (iter), FALSE);
+  mousepad_return_val_if_fail (!mousepad_util_iter_inside_word (iter), FALSE);
 
   while (!gtk_text_iter_starts_line (&prev) && gtk_text_iter_backward_char (&prev))
     {
@@ -253,7 +252,7 @@ mousepad_util_utf8_strcapital (const gchar *str)
   GString     *result;
   gboolean     upper = TRUE;
 
-  _mousepad_return_val_if_fail (g_utf8_validate (str, -1, NULL), NULL);
+  mousepad_return_val_if_fail (g_utf8_validate (str, -1, NULL), NULL);
 
   /* create a new string */
   result = g_string_sized_new (strlen (str));
@@ -308,7 +307,7 @@ mousepad_util_utf8_stropposite (const gchar *str)
   gchar       *buf;
   GString     *result;
 
-  _mousepad_return_val_if_fail (g_utf8_validate (str, -1, NULL), NULL);
+  mousepad_return_val_if_fail (g_utf8_validate (str, -1, NULL), NULL);
 
   /* create a new string */
   result = g_string_sized_new (strlen (str));
@@ -394,7 +393,7 @@ mousepad_util_entry_error (GtkWidget *widget,
   const GdkColor white = {0, 0xffff, 0xffff, 0xffff};
   gpointer       pointer;
 
-  _mousepad_return_if_fail (GTK_IS_WIDGET (widget));
+  mousepad_return_if_fail (GTK_IS_WIDGET (widget));
 
   /* get the current error state */
   pointer = mousepad_object_get_data (G_OBJECT (widget), "error-state");
@@ -480,8 +479,8 @@ mousepad_util_set_tooltip (GtkWidget   *widget,
 {
   static GtkTooltips *tooltips = NULL;
 
-  _mousepad_return_if_fail (GTK_IS_WIDGET (widget));
-  _mousepad_return_if_fail (string ? g_utf8_validate (string, -1, NULL) : TRUE);
+  mousepad_return_if_fail (GTK_IS_WIDGET (widget));
+  mousepad_return_if_fail (string ? g_utf8_validate (string, -1, NULL) : TRUE);
 
   /* allocate the shared tooltips on-demand */
   if (G_UNLIKELY (tooltips == NULL))
@@ -553,13 +552,13 @@ mousepad_util_get_save_location (const gchar *relpath,
 {
   gchar *filename, *dirname;
 
-  _mousepad_return_val_if_fail (g_get_user_config_dir () != NULL, NULL);
+  mousepad_return_val_if_fail (g_get_user_config_dir () != NULL, NULL);
 
   /* create the full filename */
   filename = g_build_filename (g_get_user_config_dir (), relpath, NULL);
 
   /* test if the file exists */
-  if (G_UNLIKELY (g_file_test (filename, G_FILE_TEST_IS_REGULAR) == FALSE))
+  if (G_UNLIKELY (g_file_test (filename, G_FILE_TEST_EXISTS) == FALSE))
     {
       if (create_parents)
         {
@@ -631,18 +630,18 @@ mousepad_util_save_key_file (GKeyFile    *keyfile,
 GType
 mousepad_util_search_flags_get_type (void)
 {
-	static GType type = G_TYPE_NONE;
+  static GType type = G_TYPE_NONE;
 
-	if (G_UNLIKELY (type == G_TYPE_NONE))
-	  {
-	    /* use empty values table */
-	    static const GFlagsValue values[] =
-	    {
+  if (G_UNLIKELY (type == G_TYPE_NONE))
+    {
+      /* use empty values table */
+      static const GFlagsValue values[] =
+      {
           { 0, NULL, NULL }
-	    };
+      };
 
-	    /* register the type */
-	    type = g_flags_register_static (I_("MousepadSearchFlags"), values);
+      /* register the type */
+      type = g_flags_register_static (I_("MousepadSearchFlags"), values);
       }
 
   return type;
@@ -665,9 +664,9 @@ mousepad_util_search_iter (const GtkTextIter   *start,
   gboolean     match_case, search_backwards, whole_word;
   guint        needle_offset = 0;
 
-  _mousepad_return_val_if_fail (start != NULL, FALSE);
-  _mousepad_return_val_if_fail (string != NULL, FALSE);
-  _mousepad_return_val_if_fail (limit != NULL, FALSE);
+  mousepad_return_val_if_fail (start != NULL, FALSE);
+  mousepad_return_val_if_fail (string != NULL, FALSE);
+  mousepad_return_val_if_fail (limit != NULL, FALSE);
 
   /* search properties */
   match_case       = (flags & MOUSEPAD_SEARCH_FLAGS_MATCH_CASE) != 0;
@@ -809,12 +808,12 @@ mousepad_util_search_get_iters (GtkTextBuffer       *buffer,
       else if (flags & (MOUSEPAD_SEARCH_FLAGS_ITER_AREA_END | MOUSEPAD_SEARCH_FLAGS_ITER_SEL_END))
         *iter = sel_end;
       else
-        _mousepad_assert_not_reached ();
+        mousepad_assert_not_reached ();
     }
   else
     {
       /* this should never happen */
-      _mousepad_assert_not_reached ();
+      mousepad_assert_not_reached ();
     }
 
   /* invert the start and end iter on backwards searching */
@@ -840,10 +839,10 @@ mousepad_util_highlight (GtkTextBuffer       *buffer,
   gboolean    found, cached = FALSE;
   gint        counter = 0;
 
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), -1);
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_TAG (tag), -1);
-  _mousepad_return_val_if_fail (string == NULL || g_utf8_validate (string, -1, NULL), -1);
-  _mousepad_return_val_if_fail ((flags & MOUSEPAD_SEARCH_FLAGS_DIR_BACKWARD) == 0, -1);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), -1);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_TAG (tag), -1);
+  mousepad_return_val_if_fail (string == NULL || g_utf8_validate (string, -1, NULL), -1);
+  mousepad_return_val_if_fail ((flags & MOUSEPAD_SEARCH_FLAGS_DIR_BACKWARD) == 0, -1);
 
   /* get the buffer bounds */
   gtk_text_buffer_get_bounds (buffer, &start, &end);
@@ -926,10 +925,10 @@ mousepad_util_search (GtkTextBuffer       *buffer,
   GtkTextIter  match_start, match_end;
   GtkTextMark *mark_start, *mark_iter, *mark_end, *mark_replace;
 
-  _mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), -1);
-  _mousepad_return_val_if_fail (string && g_utf8_validate (string, -1, NULL), -1);
-  _mousepad_return_val_if_fail (replace == NULL || g_utf8_validate (replace, -1, NULL), -1);
-  _mousepad_return_val_if_fail ((flags & MOUSEPAD_SEARCH_FLAGS_ACTION_HIGHTLIGHT) == 0, -1);
+  mousepad_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), -1);
+  mousepad_return_val_if_fail (string && g_utf8_validate (string, -1, NULL), -1);
+  mousepad_return_val_if_fail (replace == NULL || g_utf8_validate (replace, -1, NULL), -1);
+  mousepad_return_val_if_fail ((flags & MOUSEPAD_SEARCH_FLAGS_ACTION_HIGHTLIGHT) == 0, -1);
 
   /* freeze buffer notifications */
   g_object_freeze_notify (G_OBJECT (buffer));
@@ -976,7 +975,7 @@ mousepad_util_search (GtkTextBuffer       *buffer,
               gtk_text_buffer_select_range (buffer, &match_start, &match_end);
             }
           else if (flags & MOUSEPAD_SEARCH_FLAGS_ACTION_REPLACE)
-	        {
+          {
               /* create text mark */
               mark_replace = gtk_text_buffer_create_mark (buffer, NULL, &match_start, search_backwards);
 
@@ -1003,8 +1002,8 @@ mousepad_util_search (GtkTextBuffer       *buffer,
 
               /* search again */
               search_again = TRUE;
-	        }
-	      else if (flags & MOUSEPAD_SEARCH_FLAGS_ACTION_NONE)
+          }
+        else if (flags & MOUSEPAD_SEARCH_FLAGS_ACTION_NONE)
             {
               /* keep searching when requested */
               if (flags & MOUSEPAD_SEARCH_FLAGS_ENTIRE_AREA)
@@ -1013,10 +1012,10 @@ mousepad_util_search (GtkTextBuffer       *buffer,
               /* move iter */
               iter = match_end;
             }
-	      else
-	        {
+        else
+          {
               /* no valid action was defined */
-              _mousepad_assert_not_reached ();
+              mousepad_assert_not_reached ();
             }
 
           /* increase the counter */
diff --git a/mousepad/mousepad-util.h b/mousepad/mousepad-util.h
index 0fb9032..0aa6513 100644
--- a/mousepad/mousepad-util.h
+++ b/mousepad/mousepad-util.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-view.c b/mousepad/mousepad-view.c
index 99e3386..4e12fa6 100644
--- a/mousepad/mousepad-view.c
+++ b/mousepad/mousepad-view.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -37,8 +36,6 @@
 
 
 
-static void      mousepad_view_class_init                    (MousepadViewClass  *klass);
-static void      mousepad_view_init                          (MousepadView       *view);
 static void      mousepad_view_finalize                      (GObject            *object);
 static void      mousepad_view_style_set                     (GtkWidget          *widget,
                                                               GtkStyle           *previous_style);
@@ -568,14 +565,14 @@ mousepad_view_commit_handler (GtkIMContext *context,
                               const gchar  *str,
                               MousepadView *view)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (GTK_IS_IM_CONTEXT (context));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (GTK_IS_IM_CONTEXT (context));
 
   /* if there is a selection, insert this string there too */
   if (G_UNLIKELY (view->selection_marks != NULL))
     {
       /* debug check */
-      _mousepad_return_if_fail (gtk_text_view_get_editable (GTK_TEXT_VIEW (view)) == FALSE);
+      mousepad_return_if_fail (gtk_text_view_get_editable (GTK_TEXT_VIEW (view)) == FALSE);
 
       /* handle the text input for the multi selection */
       mousepad_view_selection_key_press_event (view, str, 0, 0);
@@ -720,11 +717,11 @@ mousepad_view_selection_key_press_event (MousepadView *view,
   GSList        *li;
   GtkTextBuffer *buffer;
 
-  _mousepad_return_if_fail (view->selection_marks != NULL);
-  _mousepad_return_if_fail (view->selection_start_x == -1);
-  _mousepad_return_if_fail (view->selection_end_x == -1);
-  _mousepad_return_if_fail ((keyval == 0 && text != NULL) || keyval != 0);
-  _mousepad_return_if_fail (g_slist_length (view->selection_marks) % 2 == 0);
+  mousepad_return_if_fail (view->selection_marks != NULL);
+  mousepad_return_if_fail (view->selection_start_x == -1);
+  mousepad_return_if_fail (view->selection_end_x == -1);
+  mousepad_return_if_fail ((keyval == 0 && text != NULL) || keyval != 0);
+  mousepad_return_if_fail (g_slist_length (view->selection_marks) % 2 == 0);
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -785,9 +782,9 @@ mousepad_view_selection_delete_content (MousepadView *view)
   GtkTextIter    start_iter, end_iter;
   GSList        *li;
 
-  _mousepad_return_if_fail (view->selection_marks != NULL);
-  _mousepad_return_if_fail (view->selection_length > 0);
-  _mousepad_return_if_fail (g_slist_length (view->selection_marks) % 2 == 0);
+  mousepad_return_if_fail (view->selection_marks != NULL);
+  mousepad_return_if_fail (view->selection_length > 0);
+  mousepad_return_if_fail (g_slist_length (view->selection_marks) % 2 == 0);
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -827,7 +824,7 @@ mousepad_view_selection_destroy (MousepadView *view)
   GSList        *li;
   GtkTextIter    start_iter, end_iter;
 
-  _mousepad_return_if_fail (view->selection_marks != NULL);
+  mousepad_return_if_fail (view->selection_marks != NULL);
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -887,8 +884,8 @@ mousepad_view_selection_draw (MousepadView *view,
   GtkTextMark   *start_mark, *end_mark;
   GSList        *li;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (view->selection_marks == NULL || g_slist_length (view->selection_marks) % 2 == 0);
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (view->selection_marks == NULL || g_slist_length (view->selection_marks) % 2 == 0);
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -1124,7 +1121,7 @@ mousepad_view_selection_string (MousepadView *view)
   GtkTextIter    start_iter, end_iter;
   GSList        *li;
 
-  _mousepad_return_val_if_fail (view->selection_marks == NULL || g_slist_length (view->selection_marks) % 2 == 0, NULL);
+  mousepad_return_val_if_fail (view->selection_marks == NULL || g_slist_length (view->selection_marks) % 2 == 0, NULL);
 
   /* create new string */
   string = g_string_new (NULL);
@@ -1279,7 +1276,7 @@ mousepad_view_indent_selection (MousepadView *view,
           || ((gtk_text_iter_starts_line (&start_iter) && gtk_text_iter_ends_line (&end_iter)) || force))
         {
           /* change indentation of each line */
-          for (i = start_line; i <= end_line; i++)
+          for (i = start_line; i <= end_line && i < G_MAXINT; i++)
             {
               /* get the iter of the line we're going to indent */
               gtk_text_buffer_get_iter_at_line (buffer, &start_iter, i);
@@ -1341,8 +1338,8 @@ mousepad_view_calculate_layout_width (GtkWidget *widget,
   gchar       *string;
   gint         width = -1;
 
-  _mousepad_return_val_if_fail (GTK_IS_WIDGET (widget), -1);
-  _mousepad_return_val_if_fail (length > 0, -1);
+  mousepad_return_val_if_fail (GTK_IS_WIDGET (widget), -1);
+  mousepad_return_val_if_fail (length > 0, -1);
 
   /* create character string */
   string = g_strnfill (length, fill_char);
@@ -1372,7 +1369,7 @@ mousepad_view_scroll_to_cursor (MousepadView *view)
 {
   GtkTextBuffer *buffer;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -1393,7 +1390,7 @@ mousepad_view_transpose_multi_selection (GtkTextBuffer *buffer,
   GSList      *strings = NULL;
   GtkTextIter  start_iter, end_iter;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* get the strings and delete the existing strings */
   for (li = view->selection_marks; li != NULL; li = li->next)
@@ -1498,7 +1495,7 @@ mousepad_view_transpose_lines (GtkTextBuffer *buffer,
   string = g_string_new (NULL);
 
   /* add the lines in reversed order to the string */
-  for (i = start_line; i <= end_line; i++)
+  for (i = start_line; i <= end_line && i < G_MAXINT; i++)
     {
       /* get start iter */
       gtk_text_buffer_get_iter_at_line (buffer, start_iter, i);
@@ -1621,7 +1618,7 @@ mousepad_view_transpose (MousepadView *view)
   GtkTextBuffer *buffer;
   GtkTextIter    sel_start, sel_end;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -1697,8 +1694,8 @@ mousepad_view_clipboard_cut (MousepadView *view)
   GtkTextBuffer *buffer;
   gchar         *string;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
 
   /* get the clipboard */
   clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), GDK_SELECTION_CLIPBOARD);
@@ -1742,8 +1739,8 @@ mousepad_view_clipboard_copy (MousepadView *view)
   GtkTextBuffer *buffer;
   gchar         *string;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
 
   /* get the clipboard */
   clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), GDK_SELECTION_CLIPBOARD);
@@ -1886,8 +1883,8 @@ mousepad_view_delete_selection (MousepadView *view)
 {
   GtkTextBuffer *buffer;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
 
   if (view->selection_marks != NULL)
     {
@@ -1918,7 +1915,7 @@ mousepad_view_select_all (MousepadView *view)
   GtkTextIter    start, end;
   GtkTextBuffer *buffer;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* cleanup our selection */
   if (view->selection_marks != NULL)
@@ -1943,8 +1940,8 @@ mousepad_view_change_selection (MousepadView *view)
   GtkTextIter    start_iter, end_iter;
   GdkRectangle   rect;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) != 0);
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) != 0);
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -2008,8 +2005,8 @@ mousepad_view_convert_selection_case (MousepadView *view,
   gint           offset = -1;
   GSList        *li = NULL;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (mousepad_view_get_selection_length (view, NULL) > 0);
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -2063,7 +2060,7 @@ mousepad_view_convert_selection_case (MousepadView *view,
                 break;
 
               default:
-                _mousepad_assert_not_reached ();
+                mousepad_assert_not_reached ();
                 break;
             }
 
@@ -2071,7 +2068,7 @@ mousepad_view_convert_selection_case (MousepadView *view,
           if (G_LIKELY (converted && strcmp (text, converted) != 0))
             {
               /* debug check */
-              _mousepad_return_if_fail (g_utf8_validate (converted, -1, NULL));
+              mousepad_return_if_fail (g_utf8_validate (converted, -1, NULL));
 
               /* delete old string */
               gtk_text_buffer_delete (buffer, &start_iter, &end_iter);
@@ -2128,7 +2125,7 @@ mousepad_view_convert_spaces_and_tabs (MousepadView *view,
   gint           start_offset = -1;
   gchar         *string;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -2293,7 +2290,7 @@ mousepad_view_strip_trailing_spaces (MousepadView *view)
   gint           start, end, i;
   gunichar       c;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -2365,7 +2362,7 @@ mousepad_view_move_selection (MousepadView *view,
   gchar         *text;
   gboolean       insert_eol;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -2488,7 +2485,7 @@ mousepad_view_duplicate (MousepadView *view)
   gboolean       has_selection;
   gboolean       insert_eol = FALSE;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* get the buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -2527,7 +2524,7 @@ void
 mousepad_view_indent (MousepadView *view,
                       gint          type)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* run a forced indent of the line(s) */
   mousepad_view_indent_selection (view, type == INCREASE_INDENT, TRUE);
@@ -2539,7 +2536,7 @@ void
 mousepad_view_set_line_numbers (MousepadView *view,
                                 gboolean      line_numbers)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   if (view->line_numbers != line_numbers)
     {
@@ -2559,7 +2556,7 @@ void
 mousepad_view_set_auto_indent (MousepadView *view,
                                gboolean      auto_indent)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* set the boolean */
   view->auto_indent = auto_indent;
@@ -2574,8 +2571,8 @@ mousepad_view_set_tab_size (MousepadView *view,
   PangoTabArray *tab_array;
   gint           layout_width;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
-  _mousepad_return_if_fail (GTK_IS_TEXT_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (GTK_IS_TEXT_VIEW (view));
 
   /* set the value */
   view->tab_size = tab_size;
@@ -2603,7 +2600,7 @@ void
 mousepad_view_set_insert_spaces (MousepadView *view,
                                  gboolean      insert_spaces)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (view));
 
   /* set boolean */
   view->insert_spaces = insert_spaces;
@@ -2620,7 +2617,7 @@ mousepad_view_get_selection_length (MousepadView *view,
   gint           sel_length = 0;
   gboolean       column_selection;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
 
   /* get the text buffer */
   buffer = mousepad_view_get_buffer (view);
@@ -2653,7 +2650,7 @@ mousepad_view_get_selection_length (MousepadView *view,
 gboolean
 mousepad_view_get_line_numbers (MousepadView *view)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
 
   return view->line_numbers;
 }
@@ -2663,7 +2660,7 @@ mousepad_view_get_line_numbers (MousepadView *view)
 gboolean
 mousepad_view_get_auto_indent (MousepadView *view)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
 
   return view->auto_indent;
 }
@@ -2673,7 +2670,7 @@ mousepad_view_get_auto_indent (MousepadView *view)
 gint
 mousepad_view_get_tab_size (MousepadView *view)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), -1);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), -1);
 
   return view->tab_size;
 }
@@ -2683,7 +2680,7 @@ mousepad_view_get_tab_size (MousepadView *view)
 gboolean
 mousepad_view_get_insert_spaces (MousepadView *view)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE);
 
   return view->insert_spaces;
 }
diff --git a/mousepad/mousepad-view.h b/mousepad/mousepad-view.h
index 3cb6b97..109f7f0 100644
--- a/mousepad/mousepad-view.h
+++ b/mousepad/mousepad-view.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/mousepad/mousepad-window-ui.xml b/mousepad/mousepad-window-ui.xml
index e271752..b6b6575 100644
--- a/mousepad/mousepad-window-ui.xml
+++ b/mousepad/mousepad-window-ui.xml
@@ -1,7 +1,5 @@
 <ui>
   <!--
-    $Id$
-
     This program is free software; you can redistribute it and/or modify it
     under the terms of the GNU General Public License as published by the Free
     Software Foundation; either version 2 of the License, or (at your option)
@@ -103,6 +101,8 @@
       <separator />
       <menuitem action="auto-indent" />
       <separator />
+      <menuitem action="write-bom" />
+      <separator />
       <menu action="tab-size-menu">
         <placeholder name="placeholder-tab-items" />
         <separator />
diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c
index 66ee859..1c284a1 100644
--- a/mousepad/mousepad-window.c
+++ b/mousepad/mousepad-window.c
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -54,7 +53,7 @@
 #define PASTE_HISTORY_MENU_LENGTH (30)
 
 #if GTK_CHECK_VERSION (2,12,0)
-static gpointer NOTEBOOK_GROUP = "Mousepad";
+static gconstpointer NOTEBOOK_GROUP = "Mousepad";
 #endif
 
 
@@ -63,14 +62,11 @@ enum
 {
   NEW_WINDOW,
   NEW_WINDOW_WITH_DOCUMENT,
-  LAST_SIGNAL,
+  LAST_SIGNAL
 };
 
 
 
-/* class functions */
-static void              mousepad_window_class_init                   (MousepadWindowClass    *klass);
-static void              mousepad_window_init                         (MousepadWindow         *window);
 static void              mousepad_window_dispose                      (GObject                *object);
 static void              mousepad_window_finalize                     (GObject                *object);
 static gboolean          mousepad_window_configure_event              (GtkWidget              *widget,
@@ -97,7 +93,7 @@ static void              mousepad_window_save_geometry_timer_destroy  (gpointer
 /* window functions */
 static gboolean          mousepad_window_open_file                    (MousepadWindow         *window,
                                                                        const gchar            *filename,
-                                                                       const gchar            *encoding);
+                                                                       MousepadEncoding        encoding);
 static gboolean          mousepad_window_close_document               (MousepadWindow         *window,
                                                                        MousepadDocument       *document);
 static void              mousepad_window_set_title                    (MousepadWindow         *window);
@@ -183,7 +179,7 @@ static void              mousepad_window_recent_manager_init          (MousepadW
 static gboolean          mousepad_window_recent_menu_idle             (gpointer                user_data);
 static void              mousepad_window_recent_menu_idle_destroy     (gpointer                user_data);
 static void              mousepad_window_recent_menu                  (MousepadWindow         *window);
-static const gchar      *mousepad_window_recent_get_encoding          (GtkRecentInfo          *info);
+static const gchar      *mousepad_window_recent_get_charset           (GtkRecentInfo          *info);
 static void              mousepad_window_recent_clear                 (MousepadWindow         *window);
 
 /* dnd */
@@ -193,7 +189,7 @@ static void              mousepad_window_drag_data_received           (GtkWidget
                                                                        gint                    y,
                                                                        GtkSelectionData       *selection_data,
                                                                        guint                   info,
-                                                                       guint                   time,
+                                                                       guint                   drag_time,
                                                                        MousepadWindow         *window);
 
 /* search bar */
@@ -312,6 +308,8 @@ static void              mousepad_window_action_line_numbers          (GtkToggle
                                                                        MousepadWindow         *window);
 static void              mousepad_window_action_word_wrap             (GtkToggleAction        *action,
                                                                        MousepadWindow         *window);
+static void              mousepad_window_action_write_bom             (GtkToggleAction        *action,
+                                                                       MousepadWindow         *window);
 static void              mousepad_window_action_auto_indent           (GtkToggleAction        *action,
                                                                        MousepadWindow         *window);
 static void              mousepad_window_action_tab_size              (GtkToggleAction        *action,
@@ -450,7 +448,7 @@ static const GtkActionEntry action_entries[] =
 
   { "help-menu", NULL, N_("_Help"), NULL, },
     { "contents", GTK_STOCK_HELP, N_ ("_Contents"), "F1", N_("Display the Mousepad user manual"), G_CALLBACK (mousepad_window_action_contents), },
-    { "about", GTK_STOCK_ABOUT, NULL, NULL, N_("About this application"), G_CALLBACK (mousepad_window_action_about), },
+    { "about", GTK_STOCK_ABOUT, NULL, NULL, N_("About this application"), G_CALLBACK (mousepad_window_action_about), }
 };
 
 static const GtkToggleActionEntry toggle_action_entries[] =
@@ -459,14 +457,15 @@ static const GtkToggleActionEntry toggle_action_entries[] =
   { "line-numbers", NULL, N_("Line N_umbers"), NULL, N_("Show line numbers"), G_CALLBACK (mousepad_window_action_line_numbers), FALSE, },
   { "auto-indent", NULL, N_("_Auto Indent"), NULL, N_("Auto indent a new line"), G_CALLBACK (mousepad_window_action_auto_indent), FALSE, },
   { "word-wrap", NULL, N_("_Word Wrap"), NULL, N_("Toggle breaking lines in between words"), G_CALLBACK (mousepad_window_action_word_wrap), FALSE, },
-  { "insert-spaces", NULL, N_("Insert _Spaces"), NULL, N_("Insert spaces when the tab button is pressed"), G_CALLBACK (mousepad_window_action_insert_spaces), FALSE, },
+  { "write-bom", NULL, N_("Write Unicode _BOM"), NULL, N_("Store the byte-order mark in the file"), G_CALLBACK (mousepad_window_action_write_bom), FALSE, },
+  { "insert-spaces", NULL, N_("Insert _Spaces"), NULL, N_("Insert spaces when the tab button is pressed"), G_CALLBACK (mousepad_window_action_insert_spaces), FALSE, }
 };
 
 static const GtkRadioActionEntry radio_action_entries[] =
 {
-  { "unix", NULL, N_("Unix (_LF)"), NULL, N_("Set the line ending of the document to Unix (LF)"), MOUSEPAD_LINE_END_UNIX, },
-  { "mac", NULL, N_("Mac (_CR)"), NULL, N_("Set the line ending of the document to Mac (CR)"), MOUSEPAD_LINE_END_MAC, },
-  { "dos", NULL, N_("DOS / Windows (C_R LF)"), NULL, N_("Set the line ending of the document to DOS / Windows (CR LF)"), MOUSEPAD_LINE_END_DOS, },
+  { "unix", NULL, N_("Unix (_LF)"), NULL, N_("Set the line ending of the document to Unix (LF)"), MOUSEPAD_EOL_UNIX, },
+  { "mac", NULL, N_("Mac (_CR)"), NULL, N_("Set the line ending of the document to Mac (CR)"), MOUSEPAD_EOL_MAC, },
+  { "dos", NULL, N_("DOS / Windows (C_R LF)"), NULL, N_("Set the line ending of the document to DOS / Windows (CR LF)"), MOUSEPAD_EOL_DOS, }
 };
 
 
@@ -658,7 +657,7 @@ mousepad_window_init (MousepadWindow *window)
 
   /* set the group id */
 #if GTK_CHECK_VERSION (2,12,0)
-  gtk_notebook_set_group (GTK_NOTEBOOK (window->notebook), NOTEBOOK_GROUP);
+  gtk_notebook_set_group (GTK_NOTEBOOK (window->notebook), (gpointer) NOTEBOOK_GROUP);
 #else
   gtk_notebook_set_group_id (GTK_NOTEBOOK (window->notebook), 1337);
 #endif
@@ -787,9 +786,9 @@ mousepad_window_connect_proxy (GtkUIManager   *manager,
                                GtkWidget      *proxy,
                                MousepadWindow *window)
 {
-  _mousepad_return_if_fail (GTK_IS_ACTION (action));
-  _mousepad_return_if_fail (GTK_IS_MENU_ITEM (proxy));
-  _mousepad_return_if_fail (GTK_IS_UI_MANAGER (manager));
+  mousepad_return_if_fail (GTK_IS_ACTION (action));
+  mousepad_return_if_fail (GTK_IS_MENU_ITEM (proxy));
+  mousepad_return_if_fail (GTK_IS_UI_MANAGER (manager));
 
   /* we want to get informed when the user hovers a menu item */
   g_signal_connect_closure (G_OBJECT (proxy), "select", window->menu_item_selected_closure, FALSE);
@@ -804,9 +803,9 @@ mousepad_window_disconnect_proxy (GtkUIManager   *manager,
                                   GtkWidget      *proxy,
                                   MousepadWindow *window)
 {
-  _mousepad_return_if_fail (GTK_IS_ACTION (action));
-  _mousepad_return_if_fail (GTK_IS_MENU_ITEM (proxy));
-  _mousepad_return_if_fail (GTK_IS_UI_MANAGER (manager));
+  mousepad_return_if_fail (GTK_IS_ACTION (action));
+  mousepad_return_if_fail (GTK_IS_MENU_ITEM (proxy));
+  mousepad_return_if_fail (GTK_IS_UI_MANAGER (manager));
 
   /* disconnect the signal from mousepad_window_connect_proxy() */
   g_signal_handlers_disconnect_matched (G_OBJECT (proxy), G_SIGNAL_MATCH_CLOSURE, 0, 0, window->menu_item_selected_closure, NULL, NULL);
@@ -827,7 +826,11 @@ mousepad_window_menu_item_selected (GtkWidget      *menu_item,
   if (G_LIKELY (window->statusbar != NULL))
     {
       /* get the action from the menu item */
+#if GTK_CHECK_VERSION (2, 16, 0)
+      action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (menu_item));
+#else
       action = gtk_widget_get_action (menu_item);
+#endif
       if (G_LIKELY (action))
         {
           /* read the tooltip from the action, if there is one */
@@ -922,24 +925,24 @@ mousepad_window_save_geometry_timer_destroy (gpointer user_data)
  * Mousepad Window Functions
  **/
 static gboolean
-mousepad_window_open_file (MousepadWindow *window,
-                           const gchar    *filename,
-                           const gchar    *encoding)
+mousepad_window_open_file (MousepadWindow   *window,
+                           const gchar      *filename,
+                           MousepadEncoding  encoding)
 {
   MousepadDocument *document;
   GError           *error = NULL;
-  gboolean          succeed = FALSE;
+  gint              result;
   gint              npages = 0, i;
   gint              response;
+  const gchar      *charset;
   const gchar      *opened_filename;
-  const gchar      *new_encoding;
   GtkWidget        *dialog;
   gboolean          encoding_from_recent = FALSE;
   gchar            *uri;
   GtkRecentInfo    *info;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
-  _mousepad_return_val_if_fail (filename != NULL && *filename != '\0', FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (filename != NULL && *filename != '\0', FALSE);
 
   /* check if the file is already openend */
   npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
@@ -948,7 +951,7 @@ mousepad_window_open_file (MousepadWindow *window,
       document = MOUSEPAD_DOCUMENT (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), i));
 
       /* debug check */
-      _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
+      mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
 
       if (G_LIKELY (document))
         {
@@ -979,107 +982,107 @@ mousepad_window_open_file (MousepadWindow *window,
   /* set the passed encoding */
   mousepad_file_set_encoding (document->file, encoding);
 
-  try_open_again:
+  retry:
 
   /* lock the undo manager */
   mousepad_undo_lock (document->undo);
 
   /* read the content into the buffer */
-  succeed = mousepad_file_open (document->file, &error);
+  result = mousepad_file_open (document->file, NULL, &error);
 
   /* release the lock */
   mousepad_undo_unlock (document->undo);
 
-  if (G_LIKELY (succeed))
+  switch (result)
     {
-      /* add the document to the notebook and connect some signals */
-      mousepad_window_add (window, document);
+      case 0:
+        /* add the document to the window */
+        mousepad_window_add (window, document);
 
-      /* add to the recent history */
-      mousepad_window_recent_add (window, document->file);
-    }
-  else if (error->domain == G_CONVERT_ERROR)
-    {
-      /* clear the error */
-      g_clear_error (&error);
+        /* insert in the recent history */
+        mousepad_window_recent_add (window, document->file);
+        break;
 
-      /* try to lookup the encoding from the recent history */
-      if (encoding_from_recent == FALSE)
-        {
-          /* don't try this again */
-          encoding_from_recent = TRUE;
+      case ERROR_CONVERTING_FAILED:
+      case ERROR_NOT_UTF8_VALID:
+        /* clear the error */
+        g_clear_error (&error);
 
-          /* build uri */
-          uri = g_filename_to_uri (filename, NULL, NULL);
-          if (G_LIKELY (uri != NULL))
-            {
-              /* try to lookup the recent item */
-              info = gtk_recent_manager_lookup_item (window->recent_manager, uri, NULL);
+        /* try to lookup the encoding from the recent history */
+        if (encoding_from_recent == FALSE)
+          {
+            /* we only try this once */
+            encoding_from_recent = TRUE;
 
-              /* cleanup */
-              g_free (uri);
+            /* build uri */
+            uri = g_filename_to_uri (filename, NULL, NULL);
+            if (G_LIKELY (uri))
+              {
+                /* try to lookup the recent item */
+                info = gtk_recent_manager_lookup_item (window->recent_manager, uri, NULL);
 
-              if (info)
-                {
-                  /* try to find the encoding */
-                  new_encoding = mousepad_window_recent_get_encoding (info);
+                /* cleanup */
+                g_free (uri);
 
-                  /* release */
-                  gtk_recent_info_unref (info);
+                if (info)
+                  {
+                    /* try to find the encoding */
+                    charset = mousepad_window_recent_get_charset (info);
 
-                  /* try again if the encoding looks usefull, else
-                   * fall-trough and open encoding dialog */
-                  if (G_LIKELY (new_encoding != NULL))
-                    {
-                      /* set encoding */
-                      mousepad_file_set_encoding (document->file, new_encoding);
+                    encoding = mousepad_encoding_find (charset);
 
-                      goto try_open_again;
-                    }
-                }
-            }
-        }
+                    /* set the new encoding */
+                    mousepad_file_set_encoding (document->file, encoding);
 
-      /* run the encoding dialog */
-      dialog = mousepad_encoding_dialog_new (GTK_WINDOW (window), document->file);
+                    /* release */
+                    gtk_recent_info_unref (info);
 
-      /* run the dialog */
-      response = gtk_dialog_run (GTK_DIALOG (dialog));
+                    /* try to open again with the last used encoding */
+                    if (G_LIKELY (encoding))
+                      goto retry;
+                  }
+              }
+          }
 
-      if (response == GTK_RESPONSE_OK)
-        {
-          /* set the new encoding */
-          new_encoding = mousepad_encoding_dialog_get_encoding (MOUSEPAD_ENCODING_DIALOG (dialog));
+        /* run the encoding dialog */
+        dialog = mousepad_encoding_dialog_new (GTK_WINDOW (window), document->file);
 
-          /* set encoding */
-          mousepad_file_set_encoding (document->file, new_encoding);
-        }
+        /* run the dialog */
+        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
-      /* destroy the dialog */
-      gtk_widget_destroy (dialog);
+        if (response == GTK_RESPONSE_OK)
+          {
+            /* set the new encoding */
+            encoding = mousepad_encoding_dialog_get_encoding (MOUSEPAD_ENCODING_DIALOG (dialog));
 
-      /* handle */
-      if (response == GTK_RESPONSE_OK)
-        goto try_open_again;
-      else
-        goto opening_failed;
-    }
-  else
-    {
-      opening_failed:
+            /* set encoding */
+            mousepad_file_set_encoding (document->file, encoding);
+          }
 
-      /* something went wrong, release the document */
-      g_object_unref (G_OBJECT (document));
+        /* destroy the dialog */
+        gtk_widget_destroy (dialog);
 
-      if (G_LIKELY (error))
-        {
-          /* show the warning */
-          mousepad_dialogs_show_error (GTK_WINDOW (window), error, _("Failed to open file"));
-          g_error_free (error);
-        }
+        /* handle */
+        if (response == GTK_RESPONSE_OK)
+          goto retry;
+
+      default:
+        /* something went wrong, release the document */
+        g_object_unref (G_OBJECT (document));
+
+        if (G_LIKELY (error))
+          {
+            /* show the warning */
+            mousepad_dialogs_show_error (GTK_WINDOW (window), error, _("Failed to open the document"));
+
+            /* cleanup */
+            g_error_free (error);
+          }
+
+        break;
     }
 
-  return succeed;
+  return (result == 0);
 }
 
 
@@ -1092,10 +1095,10 @@ mousepad_window_open_files (MousepadWindow  *window,
   guint  n;
   gchar *filename;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
-  _mousepad_return_val_if_fail (working_directory != NULL, FALSE);
-  _mousepad_return_val_if_fail (filenames != NULL, FALSE);
-  _mousepad_return_val_if_fail (*filenames != NULL, FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (working_directory != NULL, FALSE);
+  mousepad_return_val_if_fail (filenames != NULL, FALSE);
+  mousepad_return_val_if_fail (*filenames != NULL, FALSE);
 
   /* block menu updates */
   lock_menu_updates++;
@@ -1121,7 +1124,7 @@ mousepad_window_open_files (MousepadWindow  *window,
         }
 
       /* open a new tab with the file */
-      mousepad_window_open_file (window, filename ? filename : filenames[n], NULL);
+      mousepad_window_open_file (window, filename ? filename : filenames[n], MOUSEPAD_ENCODING_UTF_8);
 
       /* cleanup */
       g_free (filename);
@@ -1149,14 +1152,11 @@ mousepad_window_add (MousepadWindow   *window,
 {
   GtkWidget        *label;
   gint              page;
-  MousepadDocument *prev_active;
-
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (GTK_IS_NOTEBOOK (window->notebook));
+  MousepadDocument *prev_active = window->active;
 
-  /* get the active tab before we switch to the new one */
-  prev_active = window->active;
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (GTK_IS_NOTEBOOK (window->notebook));
 
   /* create the tab label */
   label = mousepad_document_get_tab_label (document);
@@ -1201,8 +1201,8 @@ mousepad_window_close_document (MousepadWindow   *window,
   gint     response;
   gboolean readonly;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE);
 
   /* check if the document has been modified */
   if (gtk_text_buffer_get_modified (document->buffer))
@@ -1256,8 +1256,8 @@ mousepad_window_set_title (MousepadWindow *window)
   gboolean          show_full_path;
   MousepadDocument *document = window->active;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* whether to show the full path */
   g_object_get (G_OBJECT (window->preferences), "misc-path-in-title", &show_full_path, NULL);
@@ -1294,8 +1294,8 @@ mousepad_window_notebook_switch_page (GtkNotebook     *notebook,
 {
   MousepadDocument *document;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (GTK_IS_NOTEBOOK (notebook));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (GTK_IS_NOTEBOOK (notebook));
 
   /* get the new active document */
   document = MOUSEPAD_DOCUMENT (gtk_notebook_get_nth_page (notebook, page_num));
@@ -1325,8 +1325,8 @@ mousepad_window_notebook_reordered (GtkNotebook     *notebook,
                                     guint            page_num,
                                     MousepadWindow  *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (page));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (page));
 
   /* update the go menu */
   mousepad_window_update_gomenu (window);
@@ -1344,8 +1344,8 @@ mousepad_window_notebook_added (GtkNotebook     *notebook,
   gboolean          always_show_tabs;
   gint              npages;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* connect signals to the document for this window */
   g_signal_connect (G_OBJECT (page), "close-tab", G_CALLBACK (mousepad_window_button_close_tab), window);
@@ -1383,9 +1383,9 @@ mousepad_window_notebook_removed (GtkNotebook     *notebook,
   gint              npages;
   MousepadDocument *document = MOUSEPAD_DOCUMENT (page);
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (GTK_IS_NOTEBOOK (notebook));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (GTK_IS_NOTEBOOK (notebook));
 
   /* disconnect the old document signals */
   g_signal_handlers_disconnect_by_func (G_OBJECT (page), mousepad_window_button_close_tab, window);
@@ -1457,7 +1457,7 @@ mousepad_window_notebook_button_press_event (GtkNotebook    *notebook,
   guint      page_num = 0;
   gint       x_root;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
 
   if (event->type == GDK_BUTTON_PRESS && (event->button == 3 || event->button == 2))
     {
@@ -1524,8 +1524,8 @@ mousepad_window_notebook_button_release_event (GtkNotebook    *notebook,
                                                GdkEventButton *event,
                                                MousepadWindow *window)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (window->active), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (window->active), FALSE);
 
   /* focus the active textview */
   mousepad_document_focus_textview (window->active);
@@ -1545,8 +1545,8 @@ mousepad_window_notebook_create_window (GtkNotebook    *notebook,
 {
   MousepadDocument *document;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), NULL);
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (page), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (page), NULL);
 
   /* only create new window when there are more then 2 tabs */
   if (gtk_notebook_get_n_pages (notebook) >= 2)
@@ -1579,7 +1579,7 @@ mousepad_window_notebook_create_window (GtkNotebook    *notebook,
 static void
 mousepad_window_modified_changed (MousepadWindow   *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   mousepad_window_set_title (window);
 }
@@ -1595,8 +1595,8 @@ mousepad_window_cursor_changed (MousepadDocument *document,
 {
 
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   if (window->statusbar)
     {
@@ -1612,15 +1612,17 @@ mousepad_window_selection_changed (MousepadDocument *document,
                                    gint              selection,
                                    MousepadWindow   *window)
 {
-  GtkAction *action;
-  gint       i;
+  GtkAction   *action;
+  guint        i;
+  const gchar *action_names1[] = { "tabs-to-spaces", "spaces-to-tabs", "duplicate", "strip-trailing" };
+  const gchar *action_names2[] = { "line-up", "line-down" };
+  const gchar *action_names3[] = { "cut", "copy", "delete", "lowercase", "uppercase", "titlecase", "opposite-case" };
 
   /* sensitivity of the change selection action */
   action = gtk_action_group_get_action (window->action_group, "change-selection");
   gtk_action_set_sensitive (action, selection != 0);
 
   /* actions that are unsensitive during a column selection */
-  const gchar *action_names1[] = { "tabs-to-spaces", "spaces-to-tabs", "duplicate", "strip-trailing" };
   for (i = 0; i < G_N_ELEMENTS (action_names1); i++)
     {
       action = gtk_action_group_get_action (window->action_group, action_names1[i]);
@@ -1628,7 +1630,6 @@ mousepad_window_selection_changed (MousepadDocument *document,
     }
 
   /* action that are only sensitive for normal selections */
-  const gchar *action_names2[] = { "line-up", "line-down" };
   for (i = 0; i < G_N_ELEMENTS (action_names2); i++)
     {
       action = gtk_action_group_get_action (window->action_group, action_names2[i]);
@@ -1636,7 +1637,6 @@ mousepad_window_selection_changed (MousepadDocument *document,
     }
 
   /* actions that are sensitive for all selections with content */
-  const gchar *action_names3[] = { "cut", "copy", "delete", "lowercase", "uppercase", "titlecase", "opposite-case" };
   for (i = 0; i < G_N_ELEMENTS (action_names3); i++)
     {
       action = gtk_action_group_get_action (window->action_group, action_names3[i]);
@@ -1651,8 +1651,8 @@ mousepad_window_overwrite_changed (MousepadDocument *document,
                                    gboolean          overwrite,
                                    MousepadWindow   *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
   /* set the new overwrite mode in the statusbar */
   if (window->statusbar)
@@ -1817,9 +1817,9 @@ mousepad_window_menu_templates (GtkWidget      *item,
   const gchar *homedir;
   gchar       *templates_path;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (GTK_IS_MENU_ITEM (item));
-  _mousepad_return_if_fail (gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)) == NULL);
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (GTK_IS_MENU_ITEM (item));
+  mousepad_return_if_fail (gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)) == NULL);
 
   /* schedule the idle build of the recent menu */
   mousepad_window_recent_menu (window);
@@ -1943,8 +1943,8 @@ mousepad_window_menu_tab_sizes_update (MousepadWindow *window)
   gchar     *name, *label = NULL;
   GtkAction *action;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* avoid menu actions */
   lock_menu_updates++;
@@ -1991,8 +1991,8 @@ static void
 mousepad_window_menu_textview_deactivate (GtkWidget   *menu,
                                           GtkTextView *textview)
 {
-  _mousepad_return_if_fail (GTK_IS_TEXT_VIEW (textview));
-  _mousepad_return_if_fail (textview->popup_menu == menu);
+  mousepad_return_if_fail (GTK_IS_TEXT_VIEW (textview));
+  mousepad_return_if_fail (textview->popup_menu == menu);
 
   /* disconnect this signal */
   g_signal_handlers_disconnect_by_func (G_OBJECT (menu), mousepad_window_menu_textview_deactivate, textview);
@@ -2010,11 +2010,11 @@ mousepad_window_menu_textview_popup (GtkTextView    *textview,
 {
   GtkWidget *menu;
 
-  _mousepad_return_if_fail (GTK_WIDGET (old_menu) == textview->popup_menu);
-  _mousepad_return_if_fail (GTK_IS_TEXT_VIEW (textview));
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
-  _mousepad_return_if_fail (GTK_IS_MENU (textview->popup_menu));
+  mousepad_return_if_fail (GTK_WIDGET (old_menu) == textview->popup_menu);
+  mousepad_return_if_fail (GTK_IS_TEXT_VIEW (textview));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (GTK_IS_MENU (textview->popup_menu));
 
   /* destroy origional menu */
   gtk_widget_destroy (textview->popup_menu);
@@ -2039,18 +2039,15 @@ mousepad_window_update_actions (MousepadWindow *window)
 {
   GtkAction          *action;
   GtkNotebook        *notebook = GTK_NOTEBOOK (window->notebook);
-  MousepadDocument   *document;
+  MousepadDocument   *document = window->active;
   gboolean            cycle_tabs;
   gint                n_pages;
   gint                page_num;
-  gboolean            active;
+  gboolean            active, sensitive;
   MousepadLineEnding  line_ending;
   const gchar        *action_name;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-
-  /* active document */
-  document = window->active;
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* update the actions for the active document */
   if (G_LIKELY (document))
@@ -2084,9 +2081,9 @@ mousepad_window_update_actions (MousepadWindow *window)
 
       /* line ending type */
       line_ending = mousepad_file_get_line_ending (document->file);
-      if (G_UNLIKELY (line_ending == MOUSEPAD_LINE_END_MAC))
+      if (G_UNLIKELY (line_ending == MOUSEPAD_EOL_MAC))
         action_name = "mac";
-      else if (G_UNLIKELY (line_ending == MOUSEPAD_LINE_END_DOS))
+      else if (G_UNLIKELY (line_ending == MOUSEPAD_EOL_DOS))
         action_name = "dos";
       else
         action_name = "unix";
@@ -2095,6 +2092,11 @@ mousepad_window_update_actions (MousepadWindow *window)
       action = gtk_action_group_get_action (window->action_group, action_name);
       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
 
+      /* write bom */
+      action = gtk_action_group_get_action (window->action_group, "write-bom");
+      gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), mousepad_file_get_write_bom (document->file, &sensitive));
+      gtk_action_set_sensitive (action, sensitive);
+
       /* toggle the document settings */
       active = mousepad_document_get_word_wrap (document);
       action = gtk_action_group_get_action (window->action_group, "word-wrap");
@@ -2138,15 +2140,15 @@ mousepad_window_update_gomenu_idle (gpointer user_data)
   MousepadWindow   *window;
   gint              npages;
   gint              n;
-  gchar            *name;
+  gchar             name[32];
   const gchar      *title;
   const gchar      *tooltip;
   gchar             accelerator[7];
-  GtkRadioAction   *action;
+  GtkAction        *action;
+  GtkRadioAction   *radio_action;
   GSList           *group = NULL;
-  GList            *actions, *li;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (user_data), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (user_data), FALSE);
 
   GDK_THREADS_ENTER ();
 
@@ -2161,12 +2163,15 @@ mousepad_window_update_gomenu_idle (gpointer user_data)
     {
       gtk_ui_manager_remove_ui (window->ui_manager, window->gomenu_merge_id);
 
-      /* drop all the previous actions from the action group */
-      actions = gtk_action_group_list_actions (window->action_group);
-      for (li = actions; li != NULL; li = li->next)
-        if (strncmp (gtk_action_get_name (li->data), "mousepad-tab-", 13) == 0)
-          gtk_action_group_remove_action (window->action_group, GTK_ACTION (li->data));
-      g_list_free (actions);
+      /* drop all the old recent items from the menu */
+      for (n = 0; n < 100 /* arbitrary */; n++)
+        {
+          g_snprintf (name, sizeof (name), "mousepad-tab-%d", n);
+          action = gtk_action_group_get_action (window->action_group, name);
+          if (G_UNLIKELY (action == NULL))
+            break;
+          gtk_action_group_remove_action (window->action_group, action);
+        }
     }
 
   /* create a new merge id */
@@ -2180,50 +2185,44 @@ mousepad_window_update_gomenu_idle (gpointer user_data)
       document = MOUSEPAD_DOCUMENT (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), n));
 
       /* create a new action name */
-      name = g_strdup_printf ("mousepad-tab-%d", n);
+      g_snprintf (name, sizeof (name), "mousepad-tab-%d", n);
 
       /* get the name and file name */
       title = mousepad_document_get_basename (document);
       tooltip = mousepad_document_get_filename (document);
 
       /* create the radio action */
-      action = gtk_radio_action_new (name, title, tooltip, NULL, n);
-      gtk_radio_action_set_group (action, group);
-      group = gtk_radio_action_get_group (action);
-      g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (mousepad_window_action_go_to_tab), window->notebook);
+      radio_action = gtk_radio_action_new (name, title, tooltip, NULL, n);
+      gtk_radio_action_set_group (radio_action, group);
+      group = gtk_radio_action_get_group (radio_action);
+      g_signal_connect (G_OBJECT (radio_action), "activate", G_CALLBACK (mousepad_window_action_go_to_tab), window->notebook);
 
       /* connect the action to the document to we can easily active it when the user switched from tab */
-      mousepad_object_set_data (G_OBJECT (document), "navigation-menu-action", action);
+      mousepad_object_set_data (G_OBJECT (document), "navigation-menu-action", radio_action);
 
       if (G_LIKELY (n < 9))
         {
           /* create an accelerator and add it to the menu */
           g_snprintf (accelerator, sizeof (accelerator), "<Alt>%d", n + 1);
-          gtk_action_group_add_action_with_accel (window->action_group, GTK_ACTION (action), accelerator);
+          gtk_action_group_add_action_with_accel (window->action_group, GTK_ACTION (radio_action), accelerator);
         }
       else
         /* add a menu item without accelerator */
-        gtk_action_group_add_action (window->action_group, GTK_ACTION (action));
+        gtk_action_group_add_action (window->action_group, GTK_ACTION (radio_action));
 
       /* select the active entry */
       if (gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook)) == n)
-        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (radio_action), TRUE);
 
       /* release the action */
-      g_object_unref (G_OBJECT (action));
+      g_object_unref (G_OBJECT (radio_action));
 
       /* add the action to the go menu */
       gtk_ui_manager_add_ui (window->ui_manager, window->gomenu_merge_id,
                              "/main-menu/navigation-menu/placeholder-file-items",
                              name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
-
-      /* cleanup */
-      g_free (name);
     }
 
-  /* make sure the ui is up2date to avoid flickering */
-  gtk_ui_manager_ensure_update (window->ui_manager);
-
   /* release our lock */
   lock_menu_updates--;
 
@@ -2237,7 +2236,7 @@ mousepad_window_update_gomenu_idle (gpointer user_data)
 static void
 mousepad_window_update_gomenu_idle_destroy (gpointer user_data)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (user_data));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (user_data));
 
   MOUSEPAD_WINDOW (user_data)->update_go_menu_id = 0;
 }
@@ -2247,7 +2246,7 @@ mousepad_window_update_gomenu_idle_destroy (gpointer user_data)
 static void
 mousepad_window_update_gomenu (MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* leave when we're updating multiple files or there is this an idle function pending */
   if (lock_menu_updates && window->update_go_menu_id != 0)
@@ -2269,21 +2268,25 @@ mousepad_window_recent_add (MousepadWindow *window,
 {
   GtkRecentData  info;
   gchar         *uri;
-  static gchar  *groups[] = { PACKAGE_NAME, NULL };
   gchar         *description;
+  const gchar   *charset;
+  static gchar  *groups[] = { (gchar *) PACKAGE_NAME, NULL };
+
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_FILE (file));
+  /* get the charset */
+  charset = mousepad_encoding_get_charset (mousepad_file_get_encoding (file));
 
   /* build description */
-  description = g_strdup_printf ("%s: %s", _("Encoding"), mousepad_file_get_encoding (file));
+  description = g_strdup_printf ("%s: %s", _("Charset"), charset);
 
   /* create the recent data */
   info.display_name = NULL;
-  info.description  = description;
-  info.mime_type    = "text/plain";
-  info.app_name     = PACKAGE_NAME;
-  info.app_exec     = PACKAGE " %u";
+  info.description  = (gchar *) description;
+  info.mime_type    = (gchar *) "text/plain";
+  info.app_name     = (gchar *) PACKAGE_NAME;
+  info.app_exec     = (gchar *) PACKAGE " %u";
   info.groups       = groups;
   info.is_private   = FALSE;
 
@@ -2337,15 +2340,16 @@ static gboolean
 mousepad_window_recent_menu_idle (gpointer user_data)
 {
   MousepadWindow *window = MOUSEPAD_WINDOW (user_data);
-  GList          *items, *li, *actions;
+  GList          *items, *li;
   GList          *filtered = NULL;
   GtkRecentInfo  *info;
   const gchar    *uri;
   const gchar    *display_name;
-  gchar          *tooltip, *name, *label;
+  gchar          *tooltip, *label;
   gchar          *filename, *filename_utf8;
   GtkAction      *action;
-  gint            n;
+  gchar           name[32];
+  gint            n, i;
 
   GDK_THREADS_ENTER ();
 
@@ -2354,12 +2358,15 @@ mousepad_window_recent_menu_idle (gpointer user_data)
       /* unmerge the ui controls from the previous update */
       gtk_ui_manager_remove_ui (window->ui_manager, window->recent_merge_id);
 
-      /* drop all the previous actions from the action group */
-      actions = gtk_action_group_list_actions (window->action_group);
-      for (li = actions; li != NULL; li = li->next)
-        if (strncmp (gtk_action_get_name (li->data), "recent-info-", 12) == 0)
-          gtk_action_group_remove_action (window->action_group, li->data);
-      g_list_free (actions);
+      /* drop all the old recent items from the menu */
+      for (i = 1; i < 100 /* arbitrary */; i++)
+        {
+          g_snprintf (name, sizeof (name), "recent-info-%d", i);
+          action = gtk_action_group_get_action (window->action_group, name);
+          if (G_UNLIKELY (action == NULL))
+            break;
+          gtk_action_group_remove_action (window->action_group, action);
+        }
     }
 
   /* create a new merge id */
@@ -2398,7 +2405,7 @@ mousepad_window_recent_menu_idle (gpointer user_data)
       if (filename && g_file_test (filename, G_FILE_TEST_EXISTS))
         {
           /* create the action name */
-          name = g_strdup_printf ("recent-info-%d", n);
+          g_snprintf (name, sizeof (name), "recent-info-%d", n);
 
           /* get the name of the item and escape the underscores */
           display_name = gtk_recent_info_get_display_name (info);
@@ -2431,9 +2438,6 @@ mousepad_window_recent_menu_idle (gpointer user_data)
                                  "/main-menu/file-menu/recent-menu/placeholder-recent-items",
                                  name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
 
-          /* cleanup */
-          g_free (name);
-
           /* decrease counter */
           n--;
         }
@@ -2461,9 +2465,6 @@ mousepad_window_recent_menu_idle (gpointer user_data)
   g_list_free (items);
   g_list_free (filtered);
 
-  /* make sure the ui is up2date to avoid flickering */
-  gtk_ui_manager_ensure_update (window->ui_manager);
-
   GDK_THREADS_LEAVE ();
 
   /* stop the idle function */
@@ -2483,7 +2484,7 @@ mousepad_window_recent_menu_idle_destroy (gpointer user_data)
 static void
 mousepad_window_recent_menu (MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* leave when we're updating multiple files or there is this an idle function pending */
   if (lock_menu_updates > 0 || window->update_recent_menu_id != 0)
@@ -2497,25 +2498,25 @@ mousepad_window_recent_menu (MousepadWindow *window)
 
 
 static const gchar *
-mousepad_window_recent_get_encoding (GtkRecentInfo *info)
+mousepad_window_recent_get_charset (GtkRecentInfo *info)
 {
   const gchar *description;
-  const gchar *encoding = NULL;
-  gint         offset;
+  const gchar *charset = NULL;
+  guint        offset;
 
   /* get the description */
   description = gtk_recent_info_get_description (info);
   if (G_LIKELY (description))
     {
       /* get the offset length: 'Encoding: ' */
-      offset = strlen (_("Encoding")) + 2;
+      offset = strlen (_("Charset")) + 2;
 
       /* check if the encoding string looks valid, if so, set it */
       if (G_LIKELY (strlen (description) > offset))
-        encoding = description + offset;
+        charset = description + offset;
     }
 
-  return encoding;
+  return charset;
 }
 
 
@@ -2575,7 +2576,7 @@ mousepad_window_drag_data_received (GtkWidget        *widget,
                                     gint              y,
                                     GtkSelectionData *selection_data,
                                     guint             info,
-                                    guint             time,
+                                    guint             drag_time,
                                     MousepadWindow   *window)
 {
   gchar     **uris;
@@ -2584,8 +2585,8 @@ mousepad_window_drag_data_received (GtkWidget        *widget,
   GtkWidget  *child, *label;
   gint        i, n_pages;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
 
   /* we only accept text/uri-list drops with format 8 and atleast one byte of data */
   if (info == TARGET_TEXT_URI_LIST && selection_data->format == 8 && selection_data->length > 0)
@@ -2604,7 +2605,7 @@ mousepad_window_drag_data_received (GtkWidget        *widget,
       g_strfreev (uris);
 
       /* finish the drag (copy) */
-      gtk_drag_finish (context, TRUE, FALSE, time);
+      gtk_drag_finish (context, TRUE, FALSE, drag_time);
     }
   else if (info == TARGET_GTK_NOTEBOOK_TAB)
     {
@@ -2615,7 +2616,7 @@ mousepad_window_drag_data_received (GtkWidget        *widget,
       document = (GtkWidget **) selection_data->data;
 
       /* check */
-      _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (*document));
+      mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (*document));
 
       /* take a reference on the document before we remove it */
       g_object_ref (G_OBJECT (*document));
@@ -2648,7 +2649,7 @@ mousepad_window_drag_data_received (GtkWidget        *widget,
       g_object_unref (G_OBJECT (*document));
 
       /* finish the drag (move) */
-      gtk_drag_finish (context, TRUE, TRUE, time);
+      gtk_drag_finish (context, TRUE, TRUE, drag_time);
     }
 }
 
@@ -2667,7 +2668,7 @@ mousepad_window_search (MousepadWindow      *window,
   gint       npages, i;
   GtkWidget *document;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), -1);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), -1);
 
   if (flags & MOUSEPAD_SEARCH_FLAGS_ACTION_HIGHTLIGHT)
     {
@@ -2701,7 +2702,7 @@ mousepad_window_search (MousepadWindow      *window,
   else
     {
       /* should never be reaches */
-      _mousepad_assert_not_reached ();
+      mousepad_assert_not_reached ();
     }
 
   return nmatches;
@@ -2717,9 +2718,9 @@ mousepad_window_hide_search_bar (MousepadWindow *window)
 {
   MousepadSearchFlags flags;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
-  _mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (window->search_bar));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_SEARCH_BAR (window->search_bar));
 
   /* setup flags */
   flags = MOUSEPAD_SEARCH_FLAGS_ACTION_HIGHTLIGHT
@@ -2747,7 +2748,7 @@ mousepad_window_paste_history_add (MousepadWindow *window)
   gchar        *text;
   GSList       *li;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* get the current clipboard text */
   clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD);
@@ -2768,8 +2769,8 @@ mousepad_window_paste_history_add (MousepadWindow *window)
       /* add to the list */
       clipboard_history = g_slist_prepend (clipboard_history, text);
 
-      /* get the 9th item from the list and remove it if it exists */
-      li = g_slist_nth (clipboard_history, 9);
+      /* get the 10th item from the list and remove it if it exists */
+      li = g_slist_nth (clipboard_history, 10);
       if (li != NULL)
         {
           /* cleanup */
@@ -2800,10 +2801,10 @@ mousepad_window_paste_history_menu_position (GtkMenu  *menu,
   GdkRectangle      location;
   gint              iter_x, iter_y;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (GTK_IS_TEXT_VIEW (document->textview));
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (document->buffer));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (GTK_IS_TEXT_VIEW (document->textview));
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (document->buffer));
 
   /* get the root coordinates of the texview widget */
   gdk_window_get_origin (gtk_text_view_get_window (GTK_TEXT_VIEW (document->textview), GTK_TEXT_WINDOW_TEXT), x, y);
@@ -2832,10 +2833,10 @@ mousepad_window_paste_history_activate (GtkMenuItem    *item,
 {
   const gchar *text;
 
-  _mousepad_return_if_fail (GTK_IS_MENU_ITEM (item));
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
-  _mousepad_return_if_fail (MOUSEPAD_IS_VIEW (window->active->textview));
+  mousepad_return_if_fail (GTK_IS_MENU_ITEM (item));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_VIEW (window->active->textview));
 
   /* get the menu item text */
   text = mousepad_object_get_data (G_OBJECT (item), "history-pointer");
@@ -2924,7 +2925,7 @@ mousepad_window_paste_history_menu (MousepadWindow *window)
   gchar         mnemonic[4];
   gint          n;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), NULL);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), NULL);
 
   /* create new menu and set the screen */
   menu = gtk_menu_new ();
@@ -3002,8 +3003,8 @@ mousepad_window_button_close_tab (MousepadDocument *document,
 {
   gint page_num;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* switch to the tab we're going to close */
   page_num = gtk_notebook_page_num (GTK_NOTEBOOK (window->notebook), GTK_WIDGET (document));
@@ -3019,7 +3020,7 @@ static gboolean
 mousepad_window_delete_event (MousepadWindow *window,
                               GdkEvent       *event)
 {
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
 
   /* try to close the window */
   mousepad_window_action_close_window (NULL, window);
@@ -3043,7 +3044,7 @@ mousepad_window_action_new (GtkAction      *action,
 {
   MousepadDocument *document;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* create new document */
   document = mousepad_document_new ();
@@ -3058,7 +3059,7 @@ static void
 mousepad_window_action_new_window (GtkAction      *action,
                                    MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* emit the new window signal */
   g_signal_emit (G_OBJECT (window), window_signals[NEW_WINDOW], 0);
@@ -3071,75 +3072,74 @@ mousepad_window_action_new_from_template (GtkMenuItem    *item,
                                           MousepadWindow *window)
 {
   const gchar      *filename;
-  gchar            *contents;
   GError           *error = NULL;
-  gboolean          succeed;
-  gsize             length;
+  gint              result;
   MousepadDocument *document;
-  GtkTextIter       iter;
+  const gchar      *message;
+
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (GTK_IS_MENU_ITEM (item));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (GTK_IS_MENU_ITEM (item));
 
   /* get the filename from the menu item */
   filename = mousepad_object_get_data (G_OBJECT (item), "filename");
 
   /* test if the file exists */
-  if (G_LIKELY (filename && g_file_test (filename, G_FILE_TEST_IS_REGULAR)))
+  if (G_LIKELY (filename))
     {
-      /* get the content of the template */
-      succeed = g_file_get_contents (filename, &contents, &length, &error);
-      if (G_LIKELY (succeed))
-        {
-          /* check if the template is utf-8 valid */
-          succeed = g_utf8_validate (contents, length, NULL);
-          if (G_LIKELY (succeed))
-            {
-              /* create new document */
-              document = mousepad_document_new ();
+      /* create new document */
+      document = mousepad_document_new ();
 
-              /* lock the undo manager */
-              mousepad_undo_lock (document->undo);
+      /* sink floating object */
+      g_object_ref_sink (G_OBJECT (document));
 
-              /* set the template content */
-              gtk_text_buffer_set_text (document->buffer, contents, length);
+      /* lock the undo manager */
+      mousepad_undo_lock (document->undo);
 
-              /* move iter to the start of the document */
-              gtk_text_buffer_get_start_iter (document->buffer, &iter);
-              gtk_text_buffer_place_cursor (document->buffer, &iter);
+      /* try to load the template into the buffer */
+      result = mousepad_file_open (document->file, filename, &error);
 
-              /* buffer is not modified */
-              gtk_text_buffer_set_modified (document->buffer, FALSE);
+      /* release the lock */
+      mousepad_undo_unlock (document->undo);
 
-              /* release the lock */
-              mousepad_undo_unlock (document->undo);
+      /* handle the result */
+      if (G_LIKELY (result == 0))
+        {
+          /* no errors, insert the document */
+          mousepad_window_add (window, document);
+        }
+      else
+        {
+          /* release the document */
+          g_object_unref (G_OBJECT (document));
 
-              /* add the document to the window */
-              mousepad_window_add (window, document);
-            }
-          else
+          /* handle the error */
+          switch (result)
             {
-              /* set and error */
-              g_set_error (&error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
-                           _("The template is not UTF-8 valid"));
+              case ERROR_NOT_UTF8_VALID:
+              case ERROR_CONVERTING_FAILED:
+                /* set error message */
+                message = _("Templates should be UTF-8 valid");
+                break;
+
+              case ERROR_READING_FAILED:
+                /* destroy the menu item */
+                gtk_widget_destroy (GTK_WIDGET (item));
+
+                /* set error message */
+                message = _("Reading the template failed, the menu item has been removed");
+                break;
+
+              default:
+                /* set error message */
+                message = _("Loading the template failed");
+                break;
             }
 
-          /* cleanup */
-          g_free (contents);
-        }
-
-      if (G_UNLIKELY (succeed == FALSE))
-        {
-          /* show an error */
-          mousepad_dialogs_show_error (GTK_WINDOW (window), error, _("Failed to open new file from a template"));
-          g_error_free (error);
+          /* show the error */
+          mousepad_dialogs_show_error (GTK_WINDOW (window), error, message);
         }
     }
-  else
-    {
-      /* destroy the menu item */
-      gtk_widget_destroy (GTK_WIDGET (item));
-    }
 }
 
 
@@ -3149,11 +3149,12 @@ mousepad_window_action_open (GtkAction      *action,
                              MousepadWindow *window)
 {
   GtkWidget   *chooser;
+  GtkWidget    *hbox, *label, *combobox;
   const gchar *filename;
   GSList      *filenames, *li;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* create new file chooser dialog */
   chooser = gtk_file_chooser_dialog_new (_("Open File"),
@@ -3166,6 +3167,22 @@ mousepad_window_action_open (GtkAction      *action,
   gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), TRUE);
   gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
 
+  /* encoding selector */
+  hbox = gtk_hbox_new (FALSE, 6);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+  gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (chooser), hbox);
+  gtk_widget_show (hbox);
+
+  label = gtk_label_new_with_mnemonic ("_Encoding:");
+  gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+  gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+  gtk_widget_show (label);
+
+  combobox = gtk_combo_box_new ();
+  gtk_box_pack_start (GTK_BOX (hbox), combobox, FALSE, FALSE, 0);
+  gtk_label_set_mnemonic_widget (GTK_LABEL (label), combobox);
+  gtk_widget_show (combobox);
+
   /* select the active document in the file chooser */
   filename = mousepad_file_get_filename (window->active->file);
   if (filename && g_file_test (filename, G_FILE_TEST_EXISTS))
@@ -3187,7 +3204,7 @@ mousepad_window_action_open (GtkAction      *action,
       for (li = filenames; li != NULL; li = li->next)
         {
           /* open the file */
-          mousepad_window_open_file (window, li->data, NULL);
+          mousepad_window_open_file (window, li->data, MOUSEPAD_ENCODING_UTF_8);
 
           /* cleanup */
           g_free (li->data);
@@ -3214,15 +3231,15 @@ static void
 mousepad_window_action_open_recent (GtkAction      *action,
                                     MousepadWindow *window)
 {
-  const gchar   *uri;
-  const gchar   *encoding;
-  GError        *error = NULL;
-  gchar         *filename;
-  gboolean       succeed = FALSE;
-  GtkRecentInfo *info;
+  const gchar      *uri, *charset;
+  MousepadEncoding  encoding;
+  GError           *error = NULL;
+  gchar            *filename;
+  gboolean          succeed = FALSE;
+  GtkRecentInfo    *info;
 
-  _mousepad_return_if_fail (GTK_IS_ACTION (action));
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (GTK_IS_ACTION (action));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* get the info */
   info = mousepad_object_get_data (G_OBJECT (action), "gtk-recent-info");
@@ -3240,8 +3257,11 @@ mousepad_window_action_open_recent (GtkAction      *action,
           /* open the file in a new tab if it exists */
           if (g_file_test (filename, G_FILE_TEST_EXISTS))
             {
-              /* try to get the encoding from the recent description */
-              encoding = mousepad_window_recent_get_encoding (info);
+              /* try to get the charset from the description */
+              charset = mousepad_window_recent_get_charset (info);
+
+              /* lookup the encoding */
+              encoding = mousepad_encoding_find (charset);
 
               /* try to open the file */
               succeed = mousepad_window_open_file (window, filename, encoding);
@@ -3276,7 +3296,7 @@ static void
 mousepad_window_action_clear_recent (GtkAction      *action,
                                      MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* ask the user if he or she really want to clear the history */
   if (mousepad_dialogs_clear_recent (GTK_WINDOW (window)))
@@ -3307,8 +3327,8 @@ mousepad_window_action_save (GtkAction      *action,
   gboolean          modified;
   gint              response;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (window->active), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (window->active), FALSE);
 
   if (mousepad_file_get_filename (document->file) == NULL)
     {
@@ -3383,8 +3403,8 @@ mousepad_window_action_save_as (GtkAction      *action,
   GtkWidget        *dialog;
   gboolean          succeed = FALSE;
 
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
-  _mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (window->active), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
+  mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (window->active), FALSE);
 
   /* create the dialog */
   dialog = gtk_file_chooser_dialog_new (_("Save As"),
@@ -3435,15 +3455,15 @@ static void
 mousepad_window_action_save_all (GtkAction      *action,
                                  MousepadWindow *window)
 {
-  guint             i, current;
+  gint              i, current;
   gint              page_num;
   MousepadDocument *document;
   GSList           *li, *documents = NULL;
   gboolean          succeed = TRUE;
   GError           *error = NULL;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* get the current active tab */
   current = gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook));
@@ -3455,7 +3475,7 @@ mousepad_window_action_save_all (GtkAction      *action,
       document = MOUSEPAD_DOCUMENT (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), i));
 
       /* debug check */
-      _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+      mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
       /* continue if the document is not modified */
       if (!gtk_text_buffer_get_modified (document->buffer))
@@ -3543,8 +3563,8 @@ mousepad_window_action_revert (GtkAction      *action,
   gint              response;
   gboolean          succeed;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* ask the user if he really wants to do this when the file is modified */
   if (gtk_text_buffer_get_modified (document->buffer))
@@ -3565,7 +3585,7 @@ mousepad_window_action_revert (GtkAction      *action,
         }
 
       /* small check for debug builds */
-      _mousepad_return_if_fail (response == MOUSEPAD_RESPONSE_REVERT);
+      mousepad_return_if_fail (response == MOUSEPAD_RESPONSE_REVERT);
     }
 
   /* lock the undo manager */
@@ -3598,8 +3618,8 @@ mousepad_window_action_print (GtkAction      *action,
   GError           *error = NULL;
   gboolean          succeed;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* create new print operation */
   print = mousepad_print_new ();
@@ -3624,8 +3644,8 @@ static void
 mousepad_window_action_detach (GtkAction      *action,
                                MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
 #if GTK_CHECK_VERSION (2,12,0)
   /* invoke function without cooridinates */
@@ -3657,8 +3677,8 @@ static void
 mousepad_window_action_close (GtkAction      *action,
                               MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* close active document */
   mousepad_window_close_document (window, window->active);
@@ -3673,8 +3693,8 @@ mousepad_window_action_close_window (GtkAction      *action,
   gint       npages, i;
   GtkWidget *document;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* get the number of page in the notebook */
   npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook)) - 1;
@@ -3689,7 +3709,7 @@ mousepad_window_action_close_window (GtkAction      *action,
       document = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), i);
 
       /* check for debug builds */
-      _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+      mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
       /* focus the tab we're going to close */
       gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), i);
@@ -3718,8 +3738,8 @@ static void
 mousepad_window_action_undo (GtkAction      *action,
                              MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* undo */
   mousepad_undo_do_undo (window->active->undo);
@@ -3734,8 +3754,8 @@ static void
 mousepad_window_action_redo (GtkAction      *action,
                              MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* redo */
   mousepad_undo_do_redo (window->active->undo);
@@ -3752,8 +3772,8 @@ mousepad_window_action_cut (GtkAction      *action,
 {
   GtkEditable *entry;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* get searchbar entry */
   entry = mousepad_search_bar_entry (MOUSEPAD_SEARCH_BAR (window->search_bar));
@@ -3776,8 +3796,8 @@ mousepad_window_action_copy (GtkAction      *action,
 {
   GtkEditable *entry;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* get searchbar entry */
   entry = mousepad_search_bar_entry (MOUSEPAD_SEARCH_BAR (window->search_bar));
@@ -3800,8 +3820,8 @@ mousepad_window_action_paste (GtkAction      *action,
 {
   GtkEditable *entry;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* get searchbar entry */
   entry = mousepad_search_bar_entry (MOUSEPAD_SEARCH_BAR (window->search_bar));
@@ -3821,8 +3841,8 @@ mousepad_window_action_paste_history (GtkAction      *action,
 {
   GtkWidget *menu;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* get the history menu */
   menu = mousepad_window_paste_history_menu (window);
@@ -3842,8 +3862,8 @@ static void
 mousepad_window_action_paste_column (GtkAction      *action,
                                      MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* paste the clipboard into a column */
   mousepad_view_clipboard_paste (window->active->textview, NULL, TRUE);
@@ -3857,8 +3877,8 @@ mousepad_window_action_delete (GtkAction      *action,
 {
   GtkEditable *entry;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* get searchbar entry */
   entry = mousepad_search_bar_entry (MOUSEPAD_SEARCH_BAR (window->search_bar));
@@ -3876,8 +3896,8 @@ static void
 mousepad_window_action_select_all (GtkAction      *action,
                                    MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* select everything in the document */
   mousepad_view_select_all (window->active->textview);
@@ -3889,8 +3909,8 @@ static void
 mousepad_window_action_change_selection (GtkAction      *action,
                                          MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* change the selection */
   mousepad_view_change_selection (window->active->textview);
@@ -3902,8 +3922,8 @@ static void
 mousepad_window_action_find (GtkAction      *action,
                              MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* create a new search bar is needed */
   if (window->search_bar == NULL)
@@ -3930,8 +3950,8 @@ static void
 mousepad_window_action_find_next (GtkAction      *action,
                                   MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* find the next occurence */
   if (G_LIKELY (window->search_bar != NULL))
@@ -3944,8 +3964,8 @@ static void
 mousepad_window_action_find_previous (GtkAction      *action,
                                       MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* find the previous occurence */
   if (G_LIKELY (window->search_bar != NULL))
@@ -3956,9 +3976,9 @@ mousepad_window_action_find_previous (GtkAction      *action,
 static void
 mousepad_window_action_replace_switch_page (MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_REPLACE_DIALOG (window->replace_dialog));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_REPLACE_DIALOG (window->replace_dialog));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* page switched */
   mousepad_replace_dialog_page_switched (MOUSEPAD_REPLACE_DIALOG (window->replace_dialog));
@@ -3968,7 +3988,7 @@ mousepad_window_action_replace_switch_page (MousepadWindow *window)
 static void
 mousepad_window_action_replace_destroy (MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* disconnect tab switch signal */
   g_signal_handlers_disconnect_by_func (G_OBJECT (window->notebook), mousepad_window_action_replace_switch_page, window);
@@ -3982,8 +4002,8 @@ static void
 mousepad_window_action_replace (GtkAction      *action,
                                 MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   if (window->replace_dialog == NULL)
     {
@@ -4016,10 +4036,10 @@ mousepad_window_action_select_font (GtkAction      *action,
   GtkWidget        *dialog;
   MousepadDocument *document;
   gchar            *font_name;
-  guint             i;
+  gint              i;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   dialog = gtk_font_selection_dialog_new (_("Choose Mousepad Font"));
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
@@ -4048,7 +4068,7 @@ mousepad_window_action_select_font (GtkAction      *action,
           document = MOUSEPAD_DOCUMENT (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), i));
 
           /* debug check */
-          _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
+          mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document));
 
           /* set the font */
           mousepad_document_set_font (document, font_name);
@@ -4071,8 +4091,8 @@ static void
 mousepad_window_action_statusbar_overwrite (MousepadWindow *window,
                                             gboolean        overwrite)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* set the new overwrite mode */
   mousepad_document_set_overwrite (window->active, overwrite);
@@ -4086,7 +4106,7 @@ mousepad_window_action_statusbar (GtkToggleAction *action,
 {
   gboolean show_statusbar;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* whether we show the statusbar */
   show_statusbar = gtk_toggle_action_get_active (action);
@@ -4113,7 +4133,7 @@ mousepad_window_action_statusbar (GtkToggleAction *action,
       if (window->active)
         {
           /* debug check */
-          _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+          mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
           /* ask document to resend the cursor status signals */
           mousepad_document_send_signals (window->active);
@@ -4130,8 +4150,8 @@ static void
 mousepad_window_action_lowercase (GtkAction      *action,
                                   MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* convert selection to lowercase */
   mousepad_view_convert_selection_case (window->active->textview, LOWERCASE);
@@ -4143,8 +4163,8 @@ static void
 mousepad_window_action_uppercase (GtkAction      *action,
                                   MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* convert selection to uppercase */
   mousepad_view_convert_selection_case (window->active->textview, UPPERCASE);
@@ -4156,8 +4176,8 @@ static void
 mousepad_window_action_titlecase (GtkAction      *action,
                                   MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* convert selection to titlecase */
   mousepad_view_convert_selection_case (window->active->textview, TITLECASE);
@@ -4169,8 +4189,8 @@ static void
 mousepad_window_action_opposite_case (GtkAction      *action,
                                       MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* convert selection to opposite case */
   mousepad_view_convert_selection_case (window->active->textview, OPPOSITE_CASE);
@@ -4182,8 +4202,8 @@ static void
 mousepad_window_action_tabs_to_spaces (GtkAction      *action,
                                        MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* convert tabs to spaces */
   mousepad_view_convert_spaces_and_tabs (window->active->textview, TABS_TO_SPACES);
@@ -4195,8 +4215,8 @@ static void
 mousepad_window_action_spaces_to_tabs (GtkAction      *action,
                                        MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* convert spaces to tabs */
   mousepad_view_convert_spaces_and_tabs (window->active->textview, SPACES_TO_TABS);
@@ -4208,8 +4228,8 @@ static void
 mousepad_window_action_strip_trailing_spaces (GtkAction      *action,
                                               MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* convert spaces to tabs */
   mousepad_view_strip_trailing_spaces (window->active->textview);
@@ -4221,8 +4241,8 @@ static void
 mousepad_window_action_transpose (GtkAction      *action,
                                   MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* transpose */
   mousepad_view_transpose (window->active->textview);
@@ -4234,8 +4254,8 @@ static void
 mousepad_window_action_move_line_up (GtkAction      *action,
                                      MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* move the selection on line up */
   mousepad_view_move_selection (window->active->textview, MOVE_LINE_UP);
@@ -4247,8 +4267,8 @@ static void
 mousepad_window_action_move_line_down (GtkAction      *action,
                                        MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* move the selection on line down */
   mousepad_view_move_selection (window->active->textview, MOVE_LINE_DOWN);
@@ -4260,8 +4280,8 @@ static void
 mousepad_window_action_duplicate (GtkAction      *action,
                                   MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* dupplicate */
   mousepad_view_duplicate (window->active->textview);
@@ -4273,8 +4293,8 @@ static void
 mousepad_window_action_increase_indent (GtkAction      *action,
                                         MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* increase the indent */
   mousepad_view_indent (window->active->textview, INCREASE_INDENT);
@@ -4286,8 +4306,8 @@ static void
 mousepad_window_action_decrease_indent (GtkAction      *action,
                                         MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* decrease the indent */
   mousepad_view_indent (window->active->textview, DECREASE_INDENT);
@@ -4301,8 +4321,8 @@ mousepad_window_action_line_numbers (GtkToggleAction *action,
 {
   gboolean active;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* leave when menu updates are locked */
   if (lock_menu_updates == 0)
@@ -4326,8 +4346,8 @@ mousepad_window_action_word_wrap (GtkToggleAction *action,
 {
   gboolean active;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* leave when menu updates are locked */
   if (lock_menu_updates == 0)
@@ -4346,13 +4366,38 @@ mousepad_window_action_word_wrap (GtkToggleAction *action,
 
 
 static void
+mousepad_window_action_write_bom (GtkToggleAction *action,
+                                  MousepadWindow  *window)
+{
+  gboolean active;
+
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+
+  /* leave when menu updates are locked */
+  if (lock_menu_updates == 0)
+    {
+      /* get the current state */
+      active = gtk_toggle_action_get_active (action);
+
+      /* set new value */
+      mousepad_file_set_write_bom (window->active->file, active);
+
+      /* make buffer as modified to show the user the change is not saved */
+      gtk_text_buffer_set_modified (window->active->buffer, TRUE);
+    }
+}
+
+
+
+static void
 mousepad_window_action_auto_indent (GtkToggleAction *action,
                                     MousepadWindow  *window)
 {
   gboolean active;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* leave when menu updates are locked */
   if (lock_menu_updates == 0)
@@ -4376,12 +4421,12 @@ mousepad_window_action_tab_size (GtkToggleAction *action,
 {
   gboolean tab_size;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* leave when menu updates are locked */
   if (lock_menu_updates == 0 && gtk_toggle_action_get_active (action))
     {
-      _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+      mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
       /* get the tab size */
       tab_size = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
@@ -4415,8 +4460,8 @@ mousepad_window_action_insert_spaces (GtkToggleAction *action,
 {
   gboolean insert_spaces;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
 
   /* leave when menu updates are locked */
   if (lock_menu_updates == 0)
@@ -4441,10 +4486,10 @@ mousepad_window_action_line_ending (GtkRadioAction *action,
 {
   MousepadLineEnding eol;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
-  _mousepad_return_if_fail (MOUSEPAD_IS_FILE (window->active->file));
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (window->active->buffer));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (MOUSEPAD_IS_FILE (window->active->file));
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (window->active->buffer));
 
   /* leave when menu updates are locked */
   if (lock_menu_updates == 0)
@@ -4470,7 +4515,7 @@ mousepad_window_action_prev_tab (GtkAction      *action,
   gint page_num;
   gint n_pages;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* get notebook info */
   page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook));
@@ -4489,7 +4534,7 @@ mousepad_window_action_next_tab (GtkAction      *action,
   gint page_num;
   gint n_pages;
 
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* get notebook info */
   page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook));
@@ -4507,9 +4552,9 @@ mousepad_window_action_go_to_tab (GtkRadioAction *action,
 {
   gint page;
 
-  _mousepad_return_if_fail (GTK_IS_NOTEBOOK (notebook));
-  _mousepad_return_if_fail (GTK_IS_RADIO_ACTION (action));
-  _mousepad_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
+  mousepad_return_if_fail (GTK_IS_NOTEBOOK (notebook));
+  mousepad_return_if_fail (GTK_IS_RADIO_ACTION (action));
+  mousepad_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
 
   /* leave when the menu is locked or this is not the active radio button */
   if (lock_menu_updates == 0
@@ -4529,9 +4574,9 @@ static void
 mousepad_window_action_go_to_position (GtkAction      *action,
                                        MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
-  _mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
-  _mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (window->active->buffer));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+  mousepad_return_if_fail (GTK_IS_TEXT_BUFFER (window->active->buffer));
 
   /* run jump dialog */
   if (mousepad_dialogs_go_to (GTK_WINDOW (window), window->active->buffer))
@@ -4547,7 +4592,7 @@ static void
 mousepad_window_action_contents (GtkAction      *action,
                                  MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* show help */
   mousepad_dialogs_show_help (GTK_WINDOW (window), NULL, NULL);
@@ -4559,7 +4604,7 @@ static void
 mousepad_window_action_about (GtkAction      *action,
                               MousepadWindow *window)
 {
-  _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+  mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
 
   /* show about dialog */
   mousepad_dialogs_show_about (GTK_WINDOW (window));
diff --git a/mousepad/mousepad-window.h b/mousepad/mousepad-window.h
index 9a7204d..cf68bc4 100644
--- a/mousepad/mousepad-window.h
+++ b/mousepad/mousepad-window.h
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -32,13 +31,13 @@ G_BEGIN_DECLS
 enum
 {
   TARGET_TEXT_URI_LIST,
-  TARGET_GTK_NOTEBOOK_TAB,
+  TARGET_GTK_NOTEBOOK_TAB
 };
 
 static const GtkTargetEntry drop_targets[] =
 {
-  { "text/uri-list", 0, TARGET_TEXT_URI_LIST },
-  { "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, TARGET_GTK_NOTEBOOK_TAB },
+  { (gchar *) "text/uri-list", 0, TARGET_TEXT_URI_LIST },
+  { (gchar *) "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, TARGET_GTK_NOTEBOOK_TAB }
 };
 
 typedef struct _MousepadWindowClass MousepadWindowClass;



More information about the Xfce4-commits mailing list