 app/Makefile.am               |   8 +-
 app/actions/file-actions.c    |   7 +
 app/actions/file-commands.c   |  17 +
 app/actions/file-commands.h   |   2 +
 app/core/Makefile.am          |  12 +
 app/core/gimpimage-metadata.c | 463 +++++++++++++++++++++
 app/core/gimpimage-metadata.h |  85 ++++
 app/dialogs/Makefile.am       |   6 +
 app/dialogs/metadata-dialog.c | 210 ++++++++++
 app/dialogs/metadata-dialog.h |  51 +++
 app/file/Makefile.am          |   8 +
 app/file/file-open.c          |  37 ++
 app/file/file-save.c          |  27 ++
 app/ui/Makefile.am            |   6 +
 app/ui/metadata.ui            | 916 ++++++++++++++++++++++++++++++++++++++++++
 app/widgets/gimphelp-ids.h    |   2 +
 configure.ac                  |  23 ++
 17 files changed, 1879 insertions(+), 1 deletion(-)

diff --git a/app/Makefile.am b/app/Makefile.am
index e559433..e506ac6 100644
--- a/app/Makefile.am
+++ b/app/Makefile.am
@@ -30,6 +30,7 @@ SUBDIRS = \
 	actions		\
 	menus		\
 	gui		\
+	ui		\
 	.		\
 	tests
 
@@ -157,8 +158,8 @@ gimpconsoleldadd = \
 	pdb/libapppdb.a			\
 	plug-in/libappplug-in.a		\
 	vectors/libappvectors.a		\
-	core/libappcore.a		\
 	file/libappfile.a		\
+	core/libappcore.a		\
 	text/libapptext.a		\
 	paint/libapppaint.a		\
 	operations/libappoperations.a	\
@@ -180,6 +181,11 @@ gimpconsoleldadd = \
 	$(INTLLIBS)			\
 	$(RT_LIBS)
 
+if HAVE_LIBGEXIV2
+gimpconsoleldadd += \
+  $(GEXIV2_LIBS)
+endif
+
 gimp_@GIMP_APP_VERSION@_LDFLAGS = \
 	$(AM_LDFLAGS)		\
 	$(win32_ldflags)	\
diff --git a/app/actions/file-actions.c b/app/actions/file-actions.c
index 45185a2..0c1c5d3 100644
--- a/app/actions/file-actions.c
+++ b/app/actions/file-actions.c
@@ -108,6 +108,12 @@ static const GimpActionEntry file_actions[] =
     G_CALLBACK (file_close_all_cmd_callback),
     GIMP_HELP_FILE_CLOSE_ALL },
 
+  { "file-show-metadata", NULL,
+    NC_("file-action", "Show Metadata"), NULL,
+    NC_("file-action", "Show metadata of image"),
+    G_CALLBACK (file_show_metadata_cmd_callback),
+    GIMP_HELP_FILE_SHOW_METADATA },
+
   { "file-quit", GTK_STOCK_QUIT,
     NC_("file-action", "_Quit"), "<primary>Q",
     NC_("file-action", "Quit the GNU Image Manipulation Program"),
@@ -280,6 +286,7 @@ file_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("file-save-as",         drawable);
   SET_SENSITIVE ("file-save-a-copy",     drawable);
   SET_SENSITIVE ("file-revert",          image && (gimp_image_get_uri (image) || source));
+  SET_SENSITIVE ("file-show-metadata",   image);
   SET_SENSITIVE ("file-export-to",       drawable);
   SET_VISIBLE   ("file-export-to",       ! show_overwrite);
   SET_SENSITIVE ("file-overwrite",       show_overwrite);
diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c
index bdd4fdc..1d7c9df 100644
--- a/app/actions/file-commands.c
+++ b/app/actions/file-commands.c
@@ -53,6 +53,7 @@
 #include "display/gimpdisplay-foreach.h"
 
 #include "dialogs/file-save-dialog.h"
+#include "dialogs/metadata-dialog.h"
 
 #include "actions.h"
 #include "file-commands.h"
@@ -478,6 +479,22 @@ file_close_all_cmd_callback (GtkAction *action,
 }
 
 void
+file_show_metadata_cmd_callback (GtkAction *action,
+                                 gpointer   data)
+{
+  Gimp        *gimp;
+  GtkWidget   *widget;
+  GimpImage   *image;
+  return_if_no_gimp (gimp, data);
+  return_if_no_widget (widget, data);
+
+  image = action_data_get_image (data);
+
+  metadata_dialog_show (gimp, image);
+
+}
+
+void
 file_quit_cmd_callback (GtkAction *action,
                         gpointer   data)
 {
diff --git a/app/actions/file-commands.h b/app/actions/file-commands.h
index 95ef997..b6b93de 100644
--- a/app/actions/file-commands.h
+++ b/app/actions/file-commands.h
@@ -37,6 +37,8 @@ void   file_create_template_cmd_callback (GtkAction   *action,
 
 void   file_revert_cmd_callback          (GtkAction   *action,
                                           gpointer     data);
+void   file_show_metadata_cmd_callback   (GtkAction   *action,
+                                          gpointer     data);
 void   file_close_all_cmd_callback       (GtkAction   *action,
                                           gpointer     data);
 void   file_quit_cmd_callback            (GtkAction   *action,
diff --git a/app/core/Makefile.am b/app/core/Makefile.am
index df5435b..49631a3 100644
--- a/app/core/Makefile.am
+++ b/app/core/Makefile.am
@@ -12,6 +12,11 @@ AM_CPPFLAGS = \
 	$(GDK_PIXBUF_CFLAGS)				\
 	-I$(includedir)
 
+if HAVE_LIBGEXIV2
+AM_CPPFLAGS += \
+  $(GEXIV2_CFLAGS)
+endif
+
 noinst_LIBRARIES = libappcore.a
 
 libappcore_a_sources = \
@@ -380,6 +385,13 @@ libappcore_a_extra_sources = \
 
 libappcore_a_SOURCES = $(libappcore_a_built_sources) $(libappcore_a_sources)
 
+if HAVE_LIBGEXIV2
+libappcore_a_SOURCES += \
+  gimpimage-metadata.c \
+  gimpimage-metadata.h
+endif
+
+
 EXTRA_DIST = \
 	$(libappcore_a_extra_sources)
 
diff --git a/app/core/gimpimage-metadata.c b/app/core/gimpimage-metadata.c
new file mode 100644
index 0000000..d1afb88
--- /dev/null
+++ b/app/core/gimpimage-metadata.c
@@ -0,0 +1,463 @@
+/*
+ * treeview.c - Application for testing builder file.
+ *
+ * Compile with:
+ *  gcc -o metatest.exe metatest.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-export-2.0)
+ */
+
+#include <string.h>
+#include "gimpimage-metadata.h"
+
+TagInfo *gimp_image_metadata_get_tag                 (char *tagline);
+gint     gimp_image_metadata_gexiv2_types_get_typeid (const gchar *type);
+gint     gimp_image_metadata_length                  (gchar *testline, gchar *delim);
+
+const struct TypeTable type_table[TYPES] = {
+  {"Invalid",     0 },
+  {"Byte",        1 },
+  {"Ascii",       2 },
+  {"Short",       3 },
+  {"Long",        4 },
+  {"Rational",    5 },
+  {"SByte",       6 },
+  {"Undefined",   7 },
+  {"SShort",      8 },
+  {"SLong",       9 },
+  {"SRational",  10 },
+  {"Float",      11 },
+  {"Double",     12 },
+  {"Ifd",        13 },
+  {"String",     14 },
+  {"Date",       15 },
+  {"Time",       16 },
+  {"Comment",    17 },
+  {"Directory",  18 },
+  {"XmpText",    19 },
+  {"XmpAlt",     20 },
+  {"XmpBag",     21 },
+  {"XmpSeq",     22 },
+  {"LangAlt",    23 }
+};
+
+/*
+ * reads metadata from a file
+ */
+GExiv2Metadata  *
+gimp_image_metadata_get_from_file (gchar *filename)
+{
+  GError         **error     = NULL;
+  GExiv2Metadata  *meta;
+
+  if ( gexiv2_initialize ())
+    {
+      meta = gexiv2_metadata_new ();
+
+      if (! gexiv2_metadata_open_path (meta, filename, error))
+        {
+#ifdef GIMP_CONFIG_DEBUG
+          g_printerr ( "Error occured while loading metadata!\n" );
+          g_printerr ( "Message: %s\n", error->message );
+#endif
+          return NULL;
+        }
+    }
+  return meta;
+}
+
+/*
+ * saves metadata to a file
+ */
+void
+gimp_image_metadata_save_to_file (gchar          *filename,
+                                  GExiv2Metadata *metadata)
+{
+  GError  *error = NULL;
+
+  if(metadata && filename)
+    {
+      if (! gexiv2_metadata_save_file (metadata, filename, &error))
+        {
+#ifdef GIMP_CONFIG_DEBUG
+    g_printerr ( "Error occured while saving metadata!\n" );
+    g_printerr ( "Message: %s\n", error->message );
+#endif
+        }
+    }
+
+}
+
+/*
+ * makes a GString from GExiv2Metadata
+ * this is neccessary, because it it not possible to
+ * store a binary as a parasite
+ */
+GString *
+gimp_image_metadata_get_metadata_data (GExiv2Metadata *metadata)
+{
+  gchar       **exif_data;
+  gchar       **iptc_data;
+  gchar       **xmp_data;
+  GString      *buffer;
+  gchar        *valstr;
+  gchar        *value;
+  gchar        *value_utf;
+  int           i;
+
+  buffer = g_string_new (NULL);
+
+    if (gexiv2_metadata_get_supports_exif (metadata))
+      {
+        exif_data = gexiv2_metadata_get_exif_tags (metadata);
+
+        i = 0;
+        while (exif_data[i] != NULL)
+          {
+            valstr = gexiv2_metadata_get_tag_string (metadata, exif_data[i]);
+            value = gexiv2_metadata_get_tag_interpreted_string (metadata, exif_data[i]);
+            value_utf = g_locale_to_utf8 (value, strlen (value), NULL, NULL, NULL);
+
+            g_string_append_printf (buffer, "%s#%s#%s#%s\v", exif_data[i], gexiv2_metadata_get_tag_type (exif_data[i]), valstr, value_utf);
+            i++;
+          }
+      }
+
+    if (gexiv2_metadata_get_supports_iptc (metadata))
+      {
+        iptc_data = gexiv2_metadata_get_iptc_tags (metadata);
+
+        i = 0;
+        while (iptc_data[i] != NULL)
+          {
+            valstr = gexiv2_metadata_get_tag_string (metadata, iptc_data[i]);
+            value = gexiv2_metadata_get_tag_interpreted_string (metadata, iptc_data[i]);
+            value_utf = g_locale_to_utf8 (value, strlen (value), NULL, NULL, NULL);
+
+            g_string_append_printf (buffer, "%s#%s#%s#%s\v", iptc_data[i], gexiv2_metadata_get_tag_type (iptc_data[i]), valstr, value_utf);
+            i++;
+          }
+      }
+
+    if (gexiv2_metadata_get_supports_xmp(metadata))
+      {
+        xmp_data = gexiv2_metadata_get_xmp_tags (metadata);
+
+        i = 0;
+        while (xmp_data[i] != NULL)
+          {
+            valstr = gexiv2_metadata_get_tag_string (metadata, xmp_data[i]);
+            value = gexiv2_metadata_get_tag_interpreted_string (metadata, xmp_data[i]);
+            value_utf = g_locale_to_utf8 (value, strlen (value), NULL, NULL, NULL);
+
+            g_string_append_printf (buffer, "%s#%s#%s#%s\v", xmp_data[i], gexiv2_metadata_get_tag_type (xmp_data[i]), valstr, value_utf);
+            i++;
+          }
+      }
+
+    return buffer;
+}
+
+/*
+ * fills a GExiv2Metadata structure with values from the string
+ * representation of all metadata
+ * This is called by file-save.c
+ * There are no tests about sensefulness
+ */
+GExiv2Metadata *
+gimp_image_metadata_create_metadata (GExiv2Metadata *metadata, gchar *metastring)
+{
+  gchar   line_delim[] = "\v";
+  gchar   tag_delim[]  = "#";
+  gchar **metadata_tags;
+  gchar **tagline;
+  gint    i;
+
+  if (metadata == NULL || metastring == NULL)
+    return NULL;
+
+  metadata_tags = g_strsplit (metastring, line_delim, -1);
+
+  i = 0;
+
+  while (metadata_tags[i] != NULL)
+    {
+      if (gimp_image_metadata_length (metadata_tags[i], tag_delim) >= 3)
+        {
+          tagline = g_strsplit (metadata_tags[i], tag_delim, -1);
+          if(tagline[0] != NULL)
+            {
+              g_printerr ("create tag: %s (%s): %s\n", tagline[0], tagline[1], tagline[2]);
+              if (!gexiv2_metadata_has_tag (metadata, tagline[0]))
+                {
+                  if (! g_str_has_prefix (tagline[0], "Xmp.xmpMM.History"))
+                    {
+                      if(! gexiv2_metadata_set_tag_string (metadata, tagline[0], tagline[2]))
+                        {
+                          g_printerr ("create tag: %s (%s): %s\n", tagline[0], tagline[1], tagline[2]);
+                        }
+                    }
+                }
+            }
+        }
+      i++;
+    }
+
+  g_strfreev (metadata_tags);
+  g_strfreev (tagline);
+
+  return metadata;
+}
+
+/*
+ * NOT USED - FIXME
+ * There are too few ways to store metadata in GExiv2
+ * only string, long and multiple are supported
+ */
+void
+gimp_image_metadata_set_tag (GExiv2Metadata *metadata, gchar *tag, gchar *type, gchar *value)
+{
+
+  if (!g_strcmp0 (type, "Ascii")     ||
+      !g_strcmp0 (type, "Undefined") ||
+      !g_strcmp0 (type, "Invalid")   ||
+      !g_strcmp0 (type, "String")    ||
+      !g_strcmp0 (type, "Comment")   ||
+      !g_strcmp0 (type, "Directory") ||
+      !g_strcmp0 (type, "Byte")      ||
+      !g_strcmp0 (type, "SByte")     ||
+      !g_strcmp0 (type, "LangAlt")   ||
+      !g_strcmp0 (type, "Ifd")    ||
+      !g_strcmp0 (type, "XmpAlt")    ||
+      !g_strcmp0 (type, "XmpSeq")    ||
+      !g_strcmp0 (type, "XmpText"))
+    {
+      gexiv2_metadata_set_tag_string (metadata, tag, value);
+    }
+  else if (!g_strcmp0 (type, "Short") ||
+      !g_strcmp0 (type, "SShort"))
+    {
+      gexiv2_metadata_set_tag_long (metadata, tag, strtol (value, NULL, 10));
+    }
+  else if (!g_strcmp0 (type, "Long")  ||
+      !g_strcmp0 (type, "SLong"))
+    {
+      gexiv2_metadata_set_tag_long (metadata, tag, strtol (value, NULL, 10));
+    }
+  else if (!g_strcmp0 (type, "Float"))
+    {
+      gexiv2_metadata_set_tag_string (metadata, tag, value);
+    }
+  else if (!g_strcmp0 (type, "Double"))
+    {
+      gexiv2_metadata_set_tag_string (metadata, tag, value);
+    }
+  else if (!g_strcmp0 (type, "Date"))
+    {
+      gexiv2_metadata_set_tag_string (metadata, tag, value);
+    }
+  else if (!g_strcmp0 (type, "Time"))
+    {
+      gexiv2_metadata_set_tag_string (metadata, tag, value);
+    }
+  else if (!g_strcmp0 (type, "Rational")  ||
+      !g_strcmp0 (type, "SRational"))
+    {
+      gexiv2_metadata_set_tag_string (metadata, tag, value);
+    }
+  else if (!g_strcmp0 (type, "XmpBag"))
+    {
+      gexiv2_metadata_set_tag_string (metadata, tag, value);
+    }
+
+}
+
+/*
+ * fills a TagInfo structure with values
+ */
+TagInfo *
+gimp_image_metadata_get_tag (char *tagline)
+{
+  gchar      tag_delim[]  = "#";
+  gchar    **tags;
+  TagInfo   *tag_info = g_new (TagInfo, 1);
+  gint a;
+
+  a = gimp_image_metadata_length (tagline, tag_delim);
+
+  if (a >= 3)
+    {
+      tags = g_strsplit (tagline, tag_delim, -1);
+
+
+      tag_info->tag = g_strdup (tags[0]);
+      tag_info->type = g_strdup (tags[1]);
+      tag_info->value = g_strdup (tags[2]);
+      tag_info->interpreted_value = g_strdup (tags[3]);
+
+      g_strfreev (tags);
+    }
+
+  return tag_info;
+}
+
+/*
+ * creates a TagInfo - GSList from all metadata
+ */
+GSList *
+gimp_image_metadata_get_taginfo (gchar *metastring)
+{
+  gchar    line_delim[] = "\v";
+  gchar  **metadata_tags;
+  gint     i;
+  TagInfo *taginfo;
+  GSList  *tag_list = NULL;
+
+  metadata_tags = g_strsplit (metastring, line_delim, -1);
+
+  i = 0;
+
+  while (metadata_tags[i] != NULL)
+    {
+      if (metadata_tags[i] != NULL)
+        {
+          taginfo = gimp_image_metadata_get_tag (metadata_tags[i]);
+          tag_list = g_slist_prepend (tag_list, taginfo);
+        }
+      i++;
+    }
+
+  g_strfreev (metadata_tags);
+
+  return g_slist_reverse (tag_list);
+}
+
+/*
+ * gets IPTC value from string representation of metadata (the parasite)
+ */
+gchar *
+gimp_image_metadata_get_iptc_value (gchar *metastring, gchar *tag)
+{
+  gchar   line_delim[] = "\v";
+  gchar   tag_delim[]  = "#";
+  gchar **metadata_tags;
+  gchar **tagline;
+  gint    i;
+
+  if (metastring == NULL || tag == NULL)
+    return NULL;
+
+  metadata_tags = g_strsplit (metastring, line_delim, -1);
+
+  i = 0;
+
+  while (metadata_tags[i] != NULL)
+    {
+      if (gimp_image_metadata_length (metadata_tags[i], tag_delim) >= 3)
+        {
+          tagline = g_strsplit (metadata_tags[i], tag_delim, -1);
+          if (! g_strcmp0 (tagline[0], tag))
+            return tagline[2];
+        }
+      i++;
+    }
+  return NULL;
+}
+
+/*
+ * sets string value in string representation of metadata (the parasite)
+ */
+gchar *
+gimp_image_metadata_set_tag_value_string (gchar *metastring, gchar *tag, gchar *value)
+{
+  gchar      line_delim[] = "\v";
+  gchar      tag_delim[]  = "#";
+  gchar    **metadata_tags;
+  GString   *buffer;
+  gchar    **tagline;
+  gint       i;
+
+  if (metastring == NULL || tag == NULL)
+    return NULL;
+
+  buffer = g_string_new (NULL);
+
+  metadata_tags = g_strsplit (metastring, line_delim, -1);
+
+  i = 0;
+
+  while (metadata_tags[i] != NULL)
+    {
+      if (gimp_image_metadata_length (metadata_tags[i], tag_delim) >= 3)
+        {
+          tagline = g_strsplit (metadata_tags[i], tag_delim, -1);
+          if (! g_strcmp0 (tagline[0], tag))
+            {
+              g_printerr ("set tag: %s: %s\n", tagline[0], value);
+              if (value && g_strcmp0 (value, ""))
+                {
+                  g_string_append_printf (buffer, "%s#%s#%s#%s\v",
+                                          tagline[0], tagline[1],
+                                          value,
+                                          value);
+                }
+            }
+          else
+            {
+              g_string_append_printf (buffer, "%s\v", metadata_tags[i]);
+            }
+        }
+      i++;
+    }
+  return buffer->str;
+}
+
+/*
+ * get comment
+ */
+gchar *
+gimp_image_metadata_get_comment (GExiv2Metadata *metadata)
+{
+  return gexiv2_metadata_get_comment (metadata);
+}
+
+/*
+ * set comment
+ */
+void
+gimp_image_metadata_set_comment (GExiv2Metadata *metadata, const gchar *comment)
+{
+  gexiv2_metadata_set_comment (metadata, comment);
+}
+
+gint
+gimp_image_metadata_gexiv2_types_get_typeid (const gchar *type)
+{
+  gint i;
+  for (i = 0; i < TYPES; i++)
+    {
+      if(!g_strcmp0(type, type_table[i].type_name))
+        return i;
+    }
+
+  return -1;
+}
+
+gint
+gimp_image_metadata_length (gchar *testline, gchar *delim)
+{
+  gchar     *delim_test;
+  gint       i;
+  gint       sum;
+
+  delim_test = g_strdup (testline);
+
+  sum =0;
+
+  for (i=0; i < strlen (delim_test); i++)
+    {
+      if (delim_test[i] == delim[0])
+        sum++;
+    }
+
+  g_free (delim_test);
+  return sum;
+}
diff --git a/app/core/gimpimage-metadata.h b/app/core/gimpimage-metadata.h
new file mode 100644
index 0000000..e77f470
--- /dev/null
+++ b/app/core/gimpimage-metadata.h
@@ -0,0 +1,85 @@
+/*
+ * metadata.h
+ *
+ *  Created on: 17.08.2013
+ *      Author: kuhse
+ */
+
+#ifndef METADATA_H_
+#define METADATA_H_
+
+#include <gexiv2/gexiv2.h>
+
+#define TYPES 24
+
+GExiv2Metadata  *gimp_image_metadata_get_from_file       (gchar *filename);
+void             gimp_image_metadata_save_to_file        (gchar *filename,
+                                                          GExiv2Metadata *metadata);
+
+GString         *gimp_image_metadata_get_metadata_data   (GExiv2Metadata *metadata);
+GExiv2Metadata  *gimp_image_metadata_create_metadata     (GExiv2Metadata *metadata,
+                                                          gchar          *metastring);
+
+void             gimp_image_metadata_set_tag             (GExiv2Metadata *metadata,
+                                                          gchar *tag,
+                                                          gchar *type,
+                                                          gchar *value);
+
+GSList          *gimp_image_metadata_get_taginfo         (gchar *metastring);
+gchar           *gimp_image_metadata_get_iptc_value      (gchar *metastring,
+                                                          gchar *tag);
+
+gchar           *gimp_image_metadata_set_tag_value_string      (gchar *metastring,
+                                                          gchar *tag,
+                                                          gchar *value);
+
+gchar           *gimp_image_metadata_get_comment         (GExiv2Metadata *metadata);
+void             gimp_image_metadata_set_comment         (GExiv2Metadata *metadata,
+                                                          const gchar *comment);
+typedef struct _TagInfo TagInfo;
+
+struct _TagInfo
+{
+  gchar *tag;
+  gchar *type;
+  gchar *value;
+  gchar *interpreted_value;
+};
+
+struct TypeTable
+{
+  const gchar *type_name;
+  gint        type_id;
+};
+
+typedef struct
+{
+  gchar * tag;
+  gchar * mode;
+}iptc_tag;
+
+static const iptc_tag const iptc_tags[] =
+{
+  {"Iptc.Application2.Byline",                  "single"},
+  {"Iptc.Application2.BylineTitle",             "single"},
+  {"Iptc.Application2.Caption",                 "multi"},
+  {"Iptc.Application2.Category",                "single"},
+  {"Iptc.Application2.City",                    "single"},
+  {"Iptc.Application2.Copyright",               "single"},
+  {"Iptc.Application2.CountryName",             "single"},
+  {"Iptc.Application2.Credit",                  "single"},
+  {"Iptc.Application2.DateCreated",             "single"},
+  {"Iptc.Application2.Headline",                "multi"},
+  {"Iptc.Application2.Keywords",                "multi"},
+  {"Iptc.Application2.ObjectName",              "single"},
+  {"Iptc.Application2.ProvinceState",           "single"},
+  {"Iptc.Application2.Source",                  "single"},
+  {"Iptc.Application2.SpecialInstructions",     "multi"},
+  {"Iptc.Application2.SubLocation",             "single"},
+  {"Iptc.Application2.SuppCategory",            "multi"},
+  {"Iptc.Application2.TransmissionReference",   "single"},
+  {"Iptc.Application2.Urgency",                 "single"},
+  {"Iptc.Application2.Writer",                  "single"}
+};
+
+#endif /* METADATA_H_ */
diff --git a/app/dialogs/Makefile.am b/app/dialogs/Makefile.am
index 63fdb64..b10aa58 100644
--- a/app/dialogs/Makefile.am
+++ b/app/dialogs/Makefile.am
@@ -97,6 +97,12 @@ libappdialogs_a_built_sources = \
 libappdialogs_a_SOURCES = \
 	$(libappdialogs_a_built_sources) $(libappdialogs_a_sources)
 
+if HAVE_LIBGEXIV2
+libappdialogs_a_SOURCES += \
+	metadata-dialog.c			\
+	metadata-dialog.h
+endif
+
 EXTRA_DIST = \
 	authors.xsl
 
diff --git a/app/dialogs/metadata-dialog.c b/app/dialogs/metadata-dialog.c
new file mode 100644
index 0000000..b5f8f05
--- /dev/null
+++ b/app/dialogs/metadata-dialog.c
@@ -0,0 +1,210 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <gegl.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "dialogs-types.h"
+
+#include "gegl/gimp-babl.h"
+
+#include "core/gimp.h"
+#include "core/gimpimage.h"
+
+#include "core/gimpimage-metadata.h"
+
+#include "widgets/gimphelp-ids.h"
+
+#include "metadata-dialog.h"
+
+#include "gimp-intl.h"
+
+
+/*  local function prototypes  */
+static void   metadata_dialog_get_metadata  (GimpImage *image,
+                                             GtkBuilder *builder);
+
+static void   metadata_dialog_response      (GtkWidget *dialog,
+                                             guint      response_id,
+                                             Gimp      *gimp);
+
+static void   metadata_dialog_iptc_callback (GtkWidget *dialog,
+                                             BuildHandler *handler);
+/*  public functions  */
+
+GtkWidget *
+metadata_dialog_show (Gimp *gimp, GimpImage *image)
+{
+  GError       *error = NULL;
+  GtkWidget    *dialog;
+  BuildHandler *handler;
+  GtkWidget    *metadata_vbox;
+  GtkWidget    *content_area;
+  GtkButton    *write_button;
+  gchar        *ui_file = NULL;
+
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+
+  handler = g_new0 (BuildHandler, 1);
+
+  handler->builder = gtk_builder_new();
+
+  handler->image = image;
+
+
+  ui_file = g_build_filename (gimp_data_directory (),"ui/metadata.ui", NULL);
+  if( ! gtk_builder_add_from_file( handler->builder, ui_file, &error ) )
+    {
+      g_print( "Error occured while loading UI file!\n" );
+      g_print( "Message: %s\n", error->message );
+      return NULL;
+    }
+
+  metadata_vbox = GTK_WIDGET( gtk_builder_get_object( handler->builder, "metadata_vbox" ) );
+  gtk_widget_set_size_request (metadata_vbox, 500, 600);
+
+  dialog = gimp_dialog_new (_("Metadata"),
+                            "gimp-metadata-dialog",
+                            NULL, 0,
+                            gimp_standard_help_func,
+                            GIMP_HELP_METADATA_DIALOG,
+
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+
+                            NULL);
+
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+                                           GTK_RESPONSE_CLOSE,
+                                           -1);
+
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (metadata_dialog_response),
+                    gimp);
+
+  content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+  gtk_box_pack_start( GTK_BOX( content_area ), metadata_vbox, TRUE, TRUE, 0 );
+
+  write_button = GTK_BUTTON (gtk_builder_get_object (handler->builder, "iptc_write_button"));
+
+  g_signal_connect(G_OBJECT(write_button), "clicked",
+                   G_CALLBACK(metadata_dialog_iptc_callback),
+                   handler);
+
+  metadata_dialog_get_metadata (image, handler->builder);
+  gtk_widget_show (dialog);
+  return dialog;
+}
+
+static void
+metadata_dialog_get_metadata (GimpImage *image, GtkBuilder *builder)
+{
+  const GimpParasite   *parasite;
+  GtkWidget     *widget;
+  GtkListStore  *exif_list_store;
+  GtkListStore  *xmp_list_store;
+  GtkTreeIter    iter;
+  GtkEntry      *entry_widget;
+  GtkTextView   *textview_widget;
+  GtkTextBuffer *text_view_buffer;
+  gchar         *buffer;
+  GSList        *tag_list;
+  GSList        *list;
+  TagInfo       *tag_info;
+  gchar         *value_utf;
+
+  exif_list_store = GTK_LIST_STORE (gtk_builder_get_object ( builder, "exifliststore" ));
+  xmp_list_store = GTK_LIST_STORE (gtk_builder_get_object ( builder, "xmpliststore" ));
+
+  parasite = gimp_image_parasite_find (image, "file-metadata");
+  buffer = (gchar *) gimp_parasite_data (parasite);
+
+  if (parasite && buffer)
+    {
+      tag_list = gimp_image_metadata_get_taginfo (buffer);
+
+      for (list = tag_list; list; list = list->next)
+        {
+          tag_info = (TagInfo *)list->data;
+
+          if(g_str_has_prefix (tag_info->tag, EXIF_PREFIX))
+            {
+              gtk_list_store_append(exif_list_store, &iter);
+              value_utf = g_locale_to_utf8 (tag_info->interpreted_value, strlen (tag_info->interpreted_value), NULL, NULL, NULL);
+              gtk_list_store_set (exif_list_store, &iter,
+                                  C_EXIF_TAG, tag_info->tag,
+                                  C_EXIF_VALUE, value_utf,
+                                  -1);
+
+            }
+          else if(g_str_has_prefix (tag_info->tag, XMP_PREFIX))
+            {
+              gtk_list_store_append(xmp_list_store, &iter);
+              value_utf = g_locale_to_utf8 (tag_info->interpreted_value, strlen (tag_info->interpreted_value), NULL, NULL, NULL);
+              gtk_list_store_set (xmp_list_store, &iter,
+                                  C_EXIF_TAG, tag_info->tag,
+                                  C_EXIF_VALUE, value_utf,
+                                  -1);
+
+            }
+          else if(g_str_has_prefix (tag_info->tag, IPTC_PREFIX))
+            {
+              widget = GTK_WIDGET( gtk_builder_get_object( builder, tag_info->tag) );
+              value_utf = g_locale_to_utf8 (tag_info->interpreted_value, strlen (tag_info->interpreted_value), NULL, NULL, NULL);
+              if (GTK_IS_ENTRY (widget))
+                {
+                  entry_widget = GTK_ENTRY (widget);
+                  gtk_entry_set_text (entry_widget, value_utf);
+                }
+              else if (GTK_IS_TEXT_VIEW (widget))
+                {
+                  textview_widget = GTK_TEXT_VIEW (widget);
+                  text_view_buffer = gtk_text_view_get_buffer (textview_widget);
+                  gtk_text_buffer_set_text (text_view_buffer, value_utf, strlen (value_utf));
+                }
+            }
+        }
+    }
+
+}
+
+static void
+metadata_dialog_iptc_callback (GtkWidget *dialog, BuildHandler *handler)
+{
+  g_print( "called back\n" );
+
+}
+
+/*  private functions  */
+
+static void
+metadata_dialog_response (GtkWidget *dialog,
+                          guint      response_id,
+                          Gimp      *gimp)
+{
+  switch (response_id)
+    {
+    default:
+      gtk_widget_destroy (dialog);
+      break;
+    }
+}
diff --git a/app/dialogs/metadata-dialog.h b/app/dialogs/metadata-dialog.h
new file mode 100644
index 0000000..7c7319c
--- /dev/null
+++ b/app/dialogs/metadata-dialog.h
@@ -0,0 +1,51 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __INPUT_DEVICES_DIALOG_H__
+#define __INPUT_DEVICES_DIALOG_H__
+
+#define EXIF_PREFIX "Exif."
+#define IPTC_PREFIX "Iptc."
+#define XMP_PREFIX  "Xmp."
+
+enum
+{
+  C_XMP_TAG = 0,
+  C_XMP_VALUE,
+  NUM_XMP_COLS
+};
+
+enum
+{
+  C_EXIF_TAG = 0,
+  C_EXIF_VALUE,
+  NUM_EXIF_COLS
+};
+
+typedef struct _BuildHandler BuildHandler;
+
+struct _BuildHandler
+{
+  GimpImage  *image;
+  GtkBuilder *builder;
+};
+
+
+GtkWidget * metadata_dialog_show (Gimp *gimp, GimpImage *image);
+
+
+#endif /* __INPUT_DEVICES_DIALOG_H__ */
diff --git a/app/file/Makefile.am b/app/file/Makefile.am
index 19db33b..2f49eeb 100644
--- a/app/file/Makefile.am
+++ b/app/file/Makefile.am
@@ -8,8 +8,16 @@ AM_CPPFLAGS = \
 	-I$(top_srcdir)/app		\
 	$(GEGL_CFLAGS)			\
 	$(GDK_PIXBUF_CFLAGS)		\
+	$(GTK_CFLAGS)			\
+  $(GEXIV2_CFLAGS)
 	-I$(includedir)
 
+if HAVE_LIBGEXIV2
+AM_CPPFLAGS += \
+	$(GTK_CFLAGS)	\
+  $(GEXIV2_CFLAGS)
+endif
+
 noinst_LIBRARIES = libappfile.a
 
 libappfile_a_SOURCES = \
diff --git a/app/file/file-open.c b/app/file/file-open.c
index 14c1d24..05258dd 100644
--- a/app/file/file-open.c
+++ b/app/file/file-open.c
@@ -74,6 +74,10 @@
 
 #include "gimp-intl.h"
 
+#if defined (HAVE_LIBGEXIV2)
+#include <gexiv2/gexiv2.h>
+#include "core/gimpimage-metadata.h"
+#endif /* HAVE_LIBGEXIV2 */
 
 static void     file_open_sanitize_image       (GimpImage                 *image,
                                                 gboolean                   as_new);
@@ -507,7 +511,40 @@ file_open_with_proc_and_display (Gimp                *gimp,
                 }
             }
         }
+#if defined (HAVE_LIBGEXIV2)
+        {
+          gchar          *filename;
+          GExiv2Metadata *metadata;
+          GimpParasite   *parasite;
+          GString        *metadata_tags;
+
+          filename = file_utils_filename_from_uri (uri);
+
+          metadata = gimp_image_metadata_get_from_file (filename);
+
+          g_free (filename);
+
+          if (metadata)
+            {
+              metadata_tags = gimp_image_metadata_get_metadata_data (metadata);
+
+              parasite = gimp_parasite_new ("file-metadata",
+                                            GIMP_PARASITE_PERSISTENT,
+                                            metadata_tags->len+1,
+                                            metadata_tags->str);
+
+#ifdef GIMP_CONFIG_DEBUG
 
+              g_printerr ("Metadata:\n%s\n",
+                          g_strdelimit (metadata_tags->str, "\v", '\n'));
+#endif /* GIMP_UNSTABLE */
+
+              gimp_image_parasite_attach (image, parasite);
+              gimp_parasite_free (parasite);
+              gexiv2_metadata_free (metadata);
+            }
+        }
+#endif /* HAVE_LIBGEXIV2 */
       /*  announce that we opened this image  */
       gimp_image_opened (image->gimp, uri);
     }
diff --git a/app/file/file-save.c b/app/file/file-save.c
index 360f97a..db32739 100644
--- a/app/file/file-save.c
+++ b/app/file/file-save.c
@@ -65,6 +65,11 @@
 
 #include "gimp-intl.h"
 
+#if defined (HAVE_LIBGEXIV2)
+#include <gexiv2/gexiv2.h>
+#include "core/gimpimage-metadata.h"
+#endif /* HAVE_LIBGEXIV2 */
+
 
 /*  public functions  */
 
@@ -221,6 +226,28 @@ file_save (Gimp                *gimp,
       if (GIMP_PROCEDURE (file_proc)->proc_type == GIMP_INTERNAL)
         gimp_imagefile_save_thumbnail (imagefile, file_proc->mime_type, image,
                                        NULL);
+#if defined (HAVE_LIBGEXIV2)
+        {
+          GExiv2Metadata      *metadata = NULL;
+          const GimpParasite  *parasite;
+          gchar               *buffer;
+
+          metadata = gimp_image_metadata_get_from_file (filename);
+
+          if (metadata)
+            {
+              parasite = gimp_image_parasite_find (image, "file-metadata");
+              buffer = (gchar *) gimp_parasite_data (parasite);
+              buffer = gimp_image_metadata_set_tag_value_string (buffer, "Exif.Image.Software", "Gimp version 2.9.1");
+              metadata = gimp_image_metadata_create_metadata (metadata, buffer);
+
+              gimp_image_metadata_save_to_file (filename, metadata);
+
+              gexiv2_metadata_free (metadata);
+            }
+        }
+#endif /* HAVE_LIBGEXIV2 */
+
     }
   else if (status != GIMP_PDB_CANCEL)
     {
diff --git a/app/ui/Makefile.am b/app/ui/Makefile.am
new file mode 100644
index 0000000..e600051
--- /dev/null
+++ b/app/ui/Makefile.am
@@ -0,0 +1,6 @@
+ui_datadir = $(gimpdatadir)/ui
+
+ui_data_DATA = \
+	metadata.ui
+
+EXTRA_DIST = $(ui_data_DATA)
diff --git a/app/ui/metadata.ui b/app/ui/metadata.ui
new file mode 100644
index 0000000..766840e
--- /dev/null
+++ b/app/ui/metadata.ui
@@ -0,0 +1,916 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkListStore" id="xmpliststore">
+    <columns>
+      <!-- column-name c_xmp_tag -->
+      <column type="gchararray"/>
+      <!-- column-name c_xmp_value -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="exifliststore">
+    <columns>
+      <!-- column-name c_exif_tag -->
+      <column type="gchararray"/>
+      <!-- column-name c_exif_value -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkVBox" id="metadata_vbox">
+    <property name="visible">True</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkNotebook" id="metadata_notebook">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="scrollable">True</property>
+        <property name="tab_hborder">4</property>
+        <property name="homogeneous">True</property>
+        <child>
+          <object class="GtkScrolledWindow" id="exif_scroll">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child>
+              <object class="GtkViewport" id="exif_viewport">
+                <property name="visible">True</property>
+                <property name="resize_mode">queue</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkTreeView" id="exiftreeview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="model">exifliststore</property>
+                    <property name="headers_clickable">False</property>
+                    <property name="search_column">0</property>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="exif_tag_column">
+                        <property name="resizable">True</property>
+                        <property name="spacing">3</property>
+                        <property name="title">EXIF Tag</property>
+                        <child>
+                          <object class="GtkCellRendererText" id="exif_tag_cell_renderer"/>
+                          <attributes>
+                            <attribute name="text">0</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="exif_value_column">
+                        <property name="resizable">True</property>
+                        <property name="spacing">3</property>
+                        <property name="title">Value</property>
+                        <child>
+                          <object class="GtkCellRendererText" id="exif_value_cell_renderer"/>
+                          <attributes>
+                            <attribute name="text">1</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="exif">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">EXIF</property>
+          </object>
+          <packing>
+            <property name="tab_expand">True</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="xmp_scroll">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child>
+              <object class="GtkViewport" id="xmp_viewport">
+                <property name="visible">True</property>
+                <property name="resize_mode">queue</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkTreeView" id="xmptreeview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="model">xmpliststore</property>
+                    <property name="headers_clickable">False</property>
+                    <property name="search_column">0</property>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="xmp_tag_column">
+                        <property name="resizable">True</property>
+                        <property name="spacing">3</property>
+                        <property name="title">XMP Tag</property>
+                        <child>
+                          <object class="GtkCellRendererText" id="xmp_tag_cell_renderer"/>
+                          <attributes>
+                            <attribute name="text">0</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="xmp_value_column">
+                        <property name="resizable">True</property>
+                        <property name="spacing">3</property>
+                        <property name="title">Value</property>
+                        <child>
+                          <object class="GtkCellRendererText" id="xmp_value_cell_renderer"/>
+                          <attributes>
+                            <attribute name="text">1</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="xmp">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">XMP</property>
+          </object>
+          <packing>
+            <property name="position">1</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="iptc_vbox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">2</property>
+            <child>
+              <object class="GtkNotebook" id="iptc_notebook">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <child>
+                  <object class="GtkScrolledWindow" id="iptc_desc_scroll">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkViewport" id="iptc_desc_viewport">
+                        <property name="visible">True</property>
+                        <property name="resize_mode">queue</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkTable" id="desctable">
+                            <property name="visible">True</property>
+                            <property name="n_rows">8</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">3</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_title">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Title</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_author">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Author</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_authortitle">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Authortitle</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_copyright">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Copyright</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_caption">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Caption</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_captionwriter">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Captionwriter</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_headline">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Headline</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_specialinstruct">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Special Instructions</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">7</property>
+                                <property name="bottom_attach">8</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.ObjectName">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.Byline">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.BylineTitle">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.Copyright">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.Writer">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="caption_scroll">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <child>
+                                  <object class="GtkViewport" id="caption_viewport">
+                                    <property name="visible">True</property>
+                                    <property name="resize_mode">queue</property>
+                                    <child>
+                                      <object class="GtkTextView" id="Iptc.Application2.Caption">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="headline_scroll">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <child>
+                                  <object class="GtkViewport" id="headline_viewport">
+                                    <property name="visible">True</property>
+                                    <property name="resize_mode">queue</property>
+                                    <child>
+                                      <object class="GtkTextView" id="Iptc.Application2.Headline">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="instruct_scroll">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <child>
+                                  <object class="GtkViewport" id="instruct_viewport">
+                                    <property name="visible">True</property>
+                                    <property name="resize_mode">queue</property>
+                                    <child>
+                                      <object class="GtkTextView" id="Iptc.Application2.SpecialInstructions">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">7</property>
+                                <property name="bottom_attach">8</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="iptcdesc">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Description</property>
+                  </object>
+                  <packing>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="iptc_category_scroll1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkViewport" id="iptc_category_viewport1">
+                        <property name="visible">True</property>
+                        <property name="resize_mode">queue</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkTable" id="table3">
+                            <property name="visible">True</property>
+                            <property name="n_rows">4</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">3</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_keywords1">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Keywords</property>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_category1">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Category</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_suppcat1">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Supplemental
+Category</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_urgency1">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Urgency</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow10">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <child>
+                                  <object class="GtkViewport" id="viewport10">
+                                    <property name="visible">True</property>
+                                    <property name="resize_mode">queue</property>
+                                    <child>
+                                      <object class="GtkTextView" id="Iptc.Application2.Keywords">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow12">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <child>
+                                  <object class="GtkViewport" id="viewport12">
+                                    <property name="visible">True</property>
+                                    <property name="resize_mode">queue</property>
+                                    <child>
+                                      <object class="GtkTextView" id="Iptc.Application2.SuppCategory">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.Urgency">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.Category">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="iptckeys">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Keywords/Categories</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="iptc_credit_scroll">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkViewport" id="iptc_credit_viewport">
+                        <property name="visible">True</property>
+                        <property name="resize_mode">queue</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkTable" id="table4">
+                            <property name="visible">True</property>
+                            <property name="n_rows">9</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">3</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkHSeparator" id="hseparator3">
+                                <property name="visible">True</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHSeparator" id="hseparator4">
+                                <property name="visible">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_credit">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Credit</property>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_source">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Source</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.Credit">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.Source">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="date_hbox">
+                                <property name="visible">True</property>
+                                <child>
+                                  <object class="GtkLabel" id="l_date">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="xpad">3</property>
+                                    <property name="ypad">3</property>
+                                    <property name="label" translatable="yes">Date</property>
+                                  </object>
+                                  <packing>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="Iptc.Application2.DateCreated">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">&#x25CF;</property>
+                                  </object>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="l_yyyymmdd">
+                                    <property name="visible">True</property>
+                                    <property name="label" translatable="yes">(YYYY-MM-DD)</property>
+                                  </object>
+                                  <packing>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_city">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">City</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_sublocation">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Sublocation</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_province">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Province/State</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_country">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">Country</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">7</property>
+                                <property name="bottom_attach">8</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_transmission">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Transmission
+reference</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">8</property>
+                                <property name="bottom_attach">9</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.City">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.SubLocation">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.ProvinceState">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.CountryName">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">7</property>
+                                <property name="bottom_attach">8</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Iptc.Application2.TransmissionReference">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">8</property>
+                                <property name="bottom_attach">9</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="iptccredits">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Credits/Origin</property>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox4">
+                <property name="visible">True</property>
+                <property name="spacing">2</property>
+                <child>
+                  <object class="GtkButton" id="iptc_write_button">
+                    <property name="label" translatable="yes">write</property>
+                    <property name="width_request">70</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="iptc">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">IPTC</property>
+          </object>
+          <packing>
+            <property name="position">2</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="position">0</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h
index 72097fb..9becc42 100644
--- a/app/widgets/gimphelp-ids.h
+++ b/app/widgets/gimphelp-ids.h
@@ -40,6 +40,7 @@
 #define GIMP_HELP_FILE_SAVE_AS_TEMPLATE           "gimp-file-save-as-template"
 #define GIMP_HELP_FILE_REVERT                     "gimp-file-revert"
 #define GIMP_HELP_FILE_CLOSE                      "gimp-file-close"
+#define GIMP_HELP_FILE_SHOW_METADATA              "gimp-file-show-metadata"
 #define GIMP_HELP_FILE_CLOSE_ALL                  "gimp-file-close-all"
 #define GIMP_HELP_FILE_CREATE_TEMPLATE            "gimp-file-save-as-template" /* Update string along with gimp-help-2 */
 #define GIMP_HELP_FILE_QUIT                       "gimp-file-quit"
@@ -513,6 +514,7 @@
 #define GIMP_HELP_DISPLAY_FILTER_DIALOG           "gimp-display-filter-dialog"
 #define GIMP_HELP_HISTOGRAM_DIALOG                "gimp-histogram-dialog"
 #define GIMP_HELP_INFO_DIALOG                     "gimp-info-dialog"
+#define GIMP_HELP_METADATA_DIALOG                 "gimp-metadata-dialog"
 #define GIMP_HELP_MODULE_DIALOG                   "gimp-module-dialog"
 #define GIMP_HELP_NAVIGATION_DIALOG               "gimp-navigation-dialog"
 #define GIMP_HELP_TEXT_EDITOR_DIALOG              "gimp-text-editor-dialog"
diff --git a/configure.ac b/configure.ac
index cf329d8..df0b341 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,6 +60,7 @@ m4_define([poppler_required_version], [0.12.4])
 m4_define([libcurl_required_version], [7.15.1])
 m4_define([libgudev_required_version], [167])
 m4_define([exif_required_version], [0.6.15])
+m4_define([gexiv2_required_version], [0.6.1])
 m4_define([lcms_required_version], [2.2])
 m4_define([libpng_required_version], [1.2.37])
 m4_define([liblzma_required_version], [5.0.0])
@@ -1348,6 +1349,26 @@ AC_SUBST(EXIF_LIBS)
 
 AM_CONDITIONAL(HAVE_LIBEXIF, test "x$have_libexif" = xyes)
 
+############################################################
+# libgexiv2: Library to allow gexiv2 handling, and
+# saved to, jpeg files. Currently, this permits exif data to
+# avoid destruction, but no data modification is performed.
+############################################################
+
+AC_ARG_WITH(libgexiv2,  [  --without-libgexiv2       build without GEXIV2 support])
+
+have_libgexiv2=no
+if test "x$with_libgexiv2" != xno && test -z "$GEXIV2_LIBS"; then
+  have_libgexiv2=yes
+  PKG_CHECK_MODULES(GEXIV2, gexiv2 >= gexiv2_required_version,
+    AC_DEFINE(HAVE_LIBGEXIV2, 1, [Define to 1 if libgexiv2 is available]),
+    have_libgexiv2="no (libgexiv2 not found or too old)")
+fi
+
+AC_SUBST(GEXIV2_CFLAGS)
+AC_SUBST(GEXIV2_LIBS)
+
+AM_CONDITIONAL(HAVE_LIBGEXIV2, test "x$have_libgexiv2" = xyes)
 
 #################
 # Check for libaa
@@ -2215,6 +2236,7 @@ app/tools/Makefile
 app/vectors/Makefile
 app/widgets/Makefile
 app/xcf/Makefile
+app/ui/Makefile
 app/tests/Makefile
 app/tests/files/Makefile
 app/tests/gimpdir-empty/Makefile
@@ -2404,6 +2426,7 @@ Optional Plug-Ins:
   WMF:                 $have_libwmf
   X11 Mouse Cursor:    $have_xmc
   XPM:                 $have_libxpm
+  GEXIV2:              $have_libgexiv2
 
 Plug-In Features:
   EXIF support:        $have_libexif
