[gimp] Bug 769820 - Cannot enter Iptc information when no metadata is available...



commit dc9856cfe12d72c6478504ffc09d2135f90d117b
Author: Ben Touchette <draekko software gmail com>
Date:   Wed Jul 5 19:24:54 2017 -0400

    Bug 769820 - Cannot enter Iptc information when no metadata is available...
    
    ...and fails to write it to file when it is
    
    Completely redo metadata editor and viewer code, adds support for
    Xmp.xmpMM.History and more.

 configure.ac                                    |    1 +
 libgimp/gimpimagemetadata.c                     |   97 +-
 libgimpbase/gimpmetadata.c                      |  339 ++-
 libgimpbase/gimpmetadata.h                      |   13 +
 plug-ins/Makefile.am                            |    1 +
 plug-ins/common/.gitignore                      |    2 -
 plug-ins/common/Makefile.am                     |   21 -
 plug-ins/common/gimprc.common                   |    1 -
 plug-ins/common/metadata.c                      |  512 ---
 plug-ins/common/plugin-defs.pl                  |    1 -
 plug-ins/metadata/.gitignore                    |    9 +
 plug-ins/metadata/Makefile.am                   |   74 +
 plug-ins/metadata/metadata-editor.c             | 5571 +++++++++++++++++++++++
 plug-ins/metadata/metadata-editor.h             |   27 +
 plug-ins/metadata/metadata-impexp.c             |  238 +
 plug-ins/metadata/metadata-impexp.h             |   30 +
 plug-ins/metadata/metadata-misc.h               |   70 +
 plug-ins/metadata/metadata-tags.h               |  494 ++
 plug-ins/metadata/metadata-viewer.c             |  302 ++
 plug-ins/metadata/metadata-xml.c                | 1186 +++++
 plug-ins/metadata/metadata-xml.h                |   98 +
 plug-ins/ui/Makefile.am                         |   12 +-
 plug-ins/ui/plug-in-metadata-editor-calendar.ui |   25 +
 plug-ins/ui/plug-in-metadata-editor.ui          | 4953 ++++++++++++++++++++
 plug-ins/ui/plug-in-metadata-viewer.ui          |  226 +
 plug-ins/ui/plug-in-metadata.ui                 |  908 ----
 po-plug-ins/POTFILES.in                         |    3 +-
 27 files changed, 13739 insertions(+), 1475 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 533ab0e..5243862 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2548,6 +2548,7 @@ plug-ins/imagemap/images/Makefile
 plug-ins/lighting/Makefile
 plug-ins/lighting/images/Makefile
 plug-ins/map-object/Makefile
+plug-ins/metadata/Makefile
 plug-ins/pagecurl/Makefile
 plug-ins/print/Makefile
 plug-ins/pygimp/Makefile
diff --git a/libgimp/gimpimagemetadata.c b/libgimp/gimpimagemetadata.c
index d9f7df8..b786362 100644
--- a/libgimp/gimpimagemetadata.c
+++ b/libgimp/gimpimagemetadata.c
@@ -21,6 +21,7 @@
 #include "config.h"
 
 #include <string.h>
+#include <sys/time.h>
 
 #include <gtk/gtk.h>
 #include <gexiv2/gexiv2.h>
@@ -31,6 +32,12 @@
 
 #include "libgimp-intl.h"
 
+typedef struct
+{
+  gchar *tag;
+  gint  type;
+} xmpstructs;
+
 
 static void        gimp_image_metadata_rotate        (gint32             image_ID,
                                                       GExiv2Orientation  orientation);
@@ -78,28 +85,6 @@ gimp_image_metadata_load_prepare (gint32        image_ID,
 
   if (metadata)
     {
-#if 0
-      {
-        gchar *xml = gimp_metadata_serialize (metadata);
-        GimpMetadata *new = gimp_metadata_deserialize (xml);
-        gchar *xml2 = gimp_metadata_serialize (new);
-
-        FILE *f = fopen ("/tmp/gimp-test-xml1", "w");
-        fprintf (f, "%s", xml);
-        fclose (f);
-
-        f = fopen ("/tmp/gimp-test-xml2", "w");
-        fprintf (f, "%s", xml2);
-        fclose (f);
-
-        system ("diff -u /tmp/gimp-test-xml1 /tmp/gimp-test-xml2");
-
-        g_free (xml);
-        g_free (xml2);
-        g_object_unref (new);
-      }
-#endif
-
       gexiv2_metadata_erase_exif_thumbnail (GEXIV2_METADATA (metadata));
     }
 
@@ -377,6 +362,7 @@ gimp_image_metadata_save_prepare (gint32                 image_ID,
   return metadata;
 }
 
+
 /**
  * gimp_image_metadata_save_finish:
  * @image_ID:  The image
@@ -456,7 +442,72 @@ gimp_image_metadata_save_finish (gint32                  image_ID,
 
   if ((flags & GIMP_METADATA_SAVE_XMP) && support_xmp)
     {
-      gchar **xmp_data = gexiv2_metadata_get_xmp_tags (GEXIV2_METADATA (metadata));
+      gchar         **xmp_data;
+      struct timeval  timer_usec;
+      long long int   timestamp_usec;
+      gchar           ts[1024];
+
+      gimp_metadata_register_xmp_namespaces ();
+      gettimeofday(&timer_usec, NULL);
+      timestamp_usec = ((long long int) timer_usec.tv_sec) * 1000000ll +
+                        (long long int) timer_usec.tv_usec;
+      sprintf((gchar*)&ts, "%lld", timestamp_usec);
+
+      gimp_metadata_add_xmp_history (GEXIV2_METADATA (metadata),
+                                     "");
+
+      gexiv2_metadata_set_tag_string (GEXIV2_METADATA (metadata),
+                                      "Xmp.GIMP.TimeStamp",
+                                      ts);
+
+      gexiv2_metadata_set_tag_string (GEXIV2_METADATA (metadata),
+                                      "Xmp.xmp.CreatorTool",
+                                      N_("GIMP 2.9/2.10"));
+
+      gexiv2_metadata_set_tag_string (GEXIV2_METADATA (metadata),
+                                      "Xmp.GIMP.Version",
+                                      GIMP_VERSION);
+
+      gexiv2_metadata_set_tag_string (GEXIV2_METADATA (metadata),
+                                      "Xmp.GIMP.API",
+                                      GIMP_API_VERSION);
+
+      gexiv2_metadata_set_tag_string (GEXIV2_METADATA (metadata),
+                                      "Xmp.GIMP.Platform",
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)
+                                      "Windows");
+#elif defined(__linux__)
+                                      "Linux");
+#elif defined(__APPLE__) && defined(__MACH__)
+                                      "Mac OS");
+#elif defined(unix) || defined(__unix__) || defined(__unix)
+                                      "Unix");
+#else
+                                      "Unknown");
+#endif
+
+      xmp_data = gexiv2_metadata_get_xmp_tags (GEXIV2_METADATA (metadata));
+
+      /* Patch necessary structures */
+      xmpstructs structlist[] =
+        {
+          { "Xmp.iptcExt.LocationCreated", GEXIV2_STRUCTURE_XA_BAG },
+          { "Xmp.iptcExt.LocationShown", GEXIV2_STRUCTURE_XA_BAG },
+          { "Xmp.iptcExt.ArtworkOrObject", GEXIV2_STRUCTURE_XA_BAG },
+          { "Xmp.iptcExt.RegistryId", GEXIV2_STRUCTURE_XA_BAG },
+          { "Xmp.xmpMM.History", GEXIV2_STRUCTURE_XA_SEQ },
+          { "Xmp.plus.ImageSupplier", GEXIV2_STRUCTURE_XA_SEQ },
+          { "Xmp.plus.ImageCreator", GEXIV2_STRUCTURE_XA_SEQ },
+          { "Xmp.plus.CopyrightOwner", GEXIV2_STRUCTURE_XA_SEQ },
+          { "Xmp.plus.Licensor", GEXIV2_STRUCTURE_XA_SEQ }
+        };
+
+      for (i = 0; i < 9; i++)
+        {
+          gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (new_g2metadata),
+                                             structlist[i].tag,
+                                             structlist[i].type);
+        }
 
       for (i = 0; xmp_data[i] != NULL; i++)
         {
diff --git a/libgimpbase/gimpmetadata.c b/libgimpbase/gimpmetadata.c
index ad4d7b9..eb81356 100644
--- a/libgimpbase/gimpmetadata.c
+++ b/libgimpbase/gimpmetadata.c
@@ -120,7 +120,6 @@ static const gchar *unsupported_tags[] =
   "Exif.Image.ClipPath",
   "Exif.Image.XClipPathUnits",
   "Exif.Image.YClipPathUnits",
-  "Xmp.xmpMM.History",
   "Exif.Image.XPTitle",
   "Exif.Image.XPComment",
   "Exif.Image.XPAuthor",
@@ -189,6 +188,292 @@ gimp_metadata_init (GimpMetadata *metadata)
    */
 }
 
+/**
+ * gimp_metadata_register_xmp_namespace:
+ *
+ * Register XMP a new namespace.
+ *
+ * Since: 2.10
+ */
+void
+gimp_metadata_register_xmp_namespace (const gchar* nspace, const gchar* prefix)
+{
+  gboolean gexiv2_registered_namespace;
+  gexiv2_registered_namespace =
+    gexiv2_metadata_register_xmp_namespace(nspace, prefix);
+
+  if (gexiv2_registered_namespace == FALSE)
+    {
+      g_printerr("Failed to register %s namespace\n", prefix);
+    }
+}
+
+/**
+ * gimp_metadata_register_xmp_namespaces:
+ *
+ * Register XMP namespaces for GIMP and DICOM.
+ *
+ * Since: 2.10
+ */
+void
+gimp_metadata_register_xmp_namespaces (void)
+{
+  gimp_metadata_register_xmp_namespace ("http://ns.adobe.com/DICOM/";,
+                                        "DICOM");
+
+  /* Usage example Xmp.GIMP.tagname */
+  gimp_metadata_register_xmp_namespace ("http://www.gimp.org/xmp/";,
+                                        "GIMP");
+}
+
+/**
+ * gimp_metadata_get_guid:
+ *
+ * Generate Version 4 UUID/GUID.
+ *
+ * Return value: The new GUID/UUID string.
+ *
+ * Since: 2.10
+ */
+gchar*
+gimp_metadata_get_guid (void)
+{
+  const int DALLOC = 36;
+  struct    timespec ts;
+  long      time;
+  gint      shake;
+  gint      bake;
+  gchar    *GUID;
+  gchar    *szHex;
+
+  for (shake = 0; shake < 10; shake++)
+    {
+      timespec_get(&ts, TIME_UTC);
+      time = ts.tv_nsec / 1000;
+      srand (time);
+    }
+
+  GUID = (gchar*) g_malloc(DALLOC);
+  if (GUID == NULL)
+    {
+      return NULL;
+    }
+
+  memset(GUID, 0, DALLOC);
+
+  bake = 0;
+  szHex = "0123456789abcdef-";
+
+  for (bake = 0; bake < DALLOC; bake++)
+  {
+      int r = rand () % 16;
+      char c = ' ';
+
+      switch (bake)
+      {
+          default :
+            c = szHex [r];
+            break;
+
+          case 19 :
+            c = szHex [r & 0x03 | 0x08];
+            break;
+
+          case 8 :
+          case 13 :
+          case 18 :
+          case 23 :
+            c = '-';
+            break;
+
+          case 14 :
+            c = '4';
+            break;
+      }
+
+      GUID[bake] = ( bake < DALLOC ) ? c : 0x00;
+  }
+
+  return GUID;
+}
+
+/**
+ * gimp_metadata_add_history:
+ *
+ * Add XMP mm History data to file metadata.
+ *
+ * Since: 2.10
+ */
+void
+gimp_metadata_add_xmp_history (GimpMetadata *metadata,
+                               gchar *state_status)
+{
+  time_t now;
+  struct tm* now_tm;
+  char timestr[256];
+  char tzstr[7];
+  gchar  iid_data[256];
+  gchar  strdata[1024];
+  gchar  tagstr[1024];
+  gchar *uuid;
+  gint   id_count;
+  gint   found;
+  gint   lastfound;
+
+  gchar *tags[] =
+    {
+      "Xmp.xmpMM.InstanceID",
+      "Xmp.xmpMM.DocumentID",
+      "Xmp.xmpMM.OriginalDocumentID",
+      "Xmp.xmpMM.History"
+    };
+
+  gchar *history_tags[] =
+    {
+      "/stEvt:action",
+      "/stEvt:instanceID",
+      "/stEvt:when",
+      "/stEvt:softwareAgent",
+      "/stEvt:changed"
+    };
+
+  /* Update new Instance ID */
+  uuid = gimp_metadata_get_guid();
+  strcpy((gchar*)&iid_data, "xmp.iid:");
+  strcat((gchar*)&iid_data, uuid);
+  gexiv2_metadata_set_tag_string (metadata,
+                                              tags[0],
+                                              (gchar*)&iid_data);
+  if (uuid)
+    g_free(uuid);
+
+  /* Update new Document ID if none found */
+  gchar *did =  gexiv2_metadata_get_tag_interpreted_string (metadata,
+                                                           tags[1]);
+  if (!did || strlen(did) < 1)
+    {
+      gchar did_data[256];
+      uuid = gimp_metadata_get_guid();
+      strcpy((gchar*)&did_data, "gimp:docid:gimp:");
+      strcat((gchar*)&did_data, uuid);
+      gexiv2_metadata_set_tag_string (metadata,
+                                                  tags[1],
+                                                  (gchar*)&did_data);
+      if (uuid)
+        g_free(uuid);
+    }
+
+  /* Update new Original Document ID if none found */
+  gchar *odid =  gexiv2_metadata_get_tag_interpreted_string (metadata,
+                                                           tags[2]);
+  if (!odid || strlen(odid) < 1)
+    {
+      gchar did_data[256];
+      gchar *uuid = gimp_metadata_get_guid();
+      strcpy((gchar*)&did_data, "xmp.did:");
+      strcat((gchar*)&did_data, uuid);
+      gexiv2_metadata_set_tag_string (metadata,
+                                                  tags[2],
+                                                  (gchar*)&did_data);
+      if (uuid)
+        g_free(uuid);
+    }
+
+  /* Handle Xmp.xmpMM.History */
+
+  gexiv2_metadata_set_xmp_tag_struct(metadata,
+                                     tags[3],
+                                     GEXIV2_STRUCTURE_XA_SEQ);
+
+  /* Find current number of entries for Xmp.xmpMM.History */
+  found = 0;
+  for (gint count = 1; count < 65536; count++)
+    {
+      lastfound = 0;
+      for (int ii = 0; ii < 5; ii++)
+        {
+          g_sprintf((gchar*)&tagstr, "%s[%d]%s", tags[3], count, history_tags[ii]);
+          if (gexiv2_metadata_has_tag(metadata, (gchar*)&tagstr))
+            {
+              lastfound = 1;
+            }
+        }
+
+      if (lastfound == 0)
+        break;
+
+      found++;
+    }
+
+  id_count = found + 1;
+
+  memset(tagstr, 0, 1024);
+  memset(strdata, 0, 1024);
+  g_sprintf((gchar*)&tagstr, "%s[%d]%s", tags[3], id_count, history_tags[0]);
+  gexiv2_metadata_set_tag_string (metadata,
+                                              (gchar*)&tagstr,
+                                              "saved");
+
+  memset(tagstr, 0, 1024);
+  memset(strdata, 0, 1024);
+  uuid = gimp_metadata_get_guid();
+  g_sprintf((gchar*)&tagstr, "%s[%d]%s", tags[3], id_count, history_tags[1]);
+  g_sprintf((gchar*)&strdata, "xmp.iid:%s", uuid);
+  gexiv2_metadata_set_tag_string (metadata,
+                                              (gchar*)&tagstr,
+                                              (gchar*)&strdata);
+  if (uuid)
+    g_free(uuid);
+
+  memset(tagstr, 0, 1024);
+  memset(strdata, 0, 1024);
+  g_sprintf((gchar*)&tagstr, "%s[%d]%s", tags[3], id_count, history_tags[2]);
+
+  /* get local time */
+  time(&now);
+  now_tm = localtime(&now);
+
+  /* get timezone and fix format */
+  strftime (tzstr, 7, "%z", now_tm);
+  tzstr[5] = tzstr[4];
+  tzstr[4] = tzstr[3];
+  tzstr[3] = ':';
+
+  /* get current time and timezone string */
+  strftime (timestr, 256, "%Y-%m-%dT%H:%M:%S", now_tm);
+  g_sprintf((gchar*)&timestr, "%s%s",(gchar*)&timestr, tzstr);
+
+  gexiv2_metadata_set_tag_string (metadata,
+                                              (gchar*)&tagstr,
+                                              (gchar*)&timestr);
+
+  memset(tagstr, 0, 1024);
+  memset(strdata, 0, 1024);
+  g_sprintf((gchar*)&tagstr, "%s[%d]%s", tags[3], id_count, history_tags[3]);
+  gexiv2_metadata_set_tag_string (metadata,
+                                              (gchar*)&tagstr,
+                                              "Gimp 2.9/2.10 "
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)
+                                              "(Windows)");
+#elif defined(__linux__)
+                                              "(Linux)");
+#elif defined(__APPLE__) && defined(__MACH__)
+                                              "(Mac OS)");
+#elif defined(unix) || defined(__unix__) || defined(__unix)
+                                              "(Unix)");
+#else
+                                              "(Unknown)");
+#endif
+
+  memset(tagstr, 0, 1024);
+  memset(strdata, 0, 1024);
+  g_sprintf((gchar*)&tagstr, "%s[%d]%s", tags[3], id_count, history_tags[4]);
+  strcpy((gchar*)&strdata, "/");
+  strcat((gchar*)&strdata, state_status);
+  gexiv2_metadata_set_tag_string (metadata,
+                                  (gchar*)&tagstr,
+                                  (gchar*)&strdata);
+}
 
 /**
  * gimp_metadata_new:
@@ -209,6 +494,8 @@ gimp_metadata_new (void)
       metadata = g_object_new (GIMP_TYPE_METADATA, NULL);
                                gexiv2_metadata_new ();
 
+      gimp_metadata_register_xmp_namespaces ();
+
       if (! gexiv2_metadata_open_buf (GEXIV2_METADATA (metadata),
                                       wilber_jpg, wilber_jpg_len,
                                       NULL))
@@ -587,6 +874,7 @@ gimp_metadata_load_from_file (GFile   *file,
   if (gexiv2_initialize ())
     {
       meta = g_object_new (GIMP_TYPE_METADATA, NULL);
+      gimp_metadata_register_xmp_namespaces ();
 
       if (! gexiv2_metadata_open_path (GEXIV2_METADATA (meta), filename, error))
         {
@@ -722,6 +1010,55 @@ gimp_metadata_set_from_exif (GimpMetadata  *metadata,
 }
 
 /**
+ * gimp_metadata_set_from_iptc:
+ * @metadata:        A #GimpMetadata instance.
+ * @iptc_data:       The blob of Ipc data to set
+ * @iptc_data_length:Length of @iptc_data, in bytes
+ * @error:           Return location for error message
+ *
+ * Sets the tags from a piece of IPTC data on @metadata.
+ *
+ * Return value: %TRUE on success, %FALSE otherwise.
+ *
+ * Since: 2.10
+ */
+gboolean
+gimp_metadata_set_from_iptc (GimpMetadata  *metadata,
+                             const guchar  *iptc_data,
+                             gint           iptc_data_length,
+                             GError       **error)
+{
+  GimpMetadata *iptc_metadata;
+
+  g_return_val_if_fail (GEXIV2_IS_METADATA (metadata), FALSE);
+  g_return_val_if_fail (iptc_data != NULL, FALSE);
+  g_return_val_if_fail (iptc_data_length > 0, FALSE);
+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+  iptc_metadata = gimp_metadata_new ();
+
+  if (! gexiv2_metadata_open_buf (iptc_metadata,
+                                  iptc_data, iptc_data_length, error))
+    {
+      g_object_unref (iptc_metadata);
+      return FALSE;
+    }
+
+  if (! gexiv2_metadata_has_iptc (iptc_metadata))
+    {
+      g_set_error (error, gimp_metadata_error_quark (), 0,
+                   _("Parsing IPTC data failed."));
+      g_object_unref (iptc_metadata);
+      return FALSE;
+    }
+
+  gimp_metadata_add (iptc_metadata, metadata);
+  g_object_unref (iptc_metadata);
+
+  return TRUE;
+}
+
+/**
  * gimp_metadata_set_from_xmp:
  * @metadata:        A #GimpMetadata instance.
  * @xmp_data:        The blob of Exif data to set
diff --git a/libgimpbase/gimpmetadata.h b/libgimpbase/gimpmetadata.h
index e879155..6879920 100644
--- a/libgimpbase/gimpmetadata.h
+++ b/libgimpbase/gimpmetadata.h
@@ -66,6 +66,10 @@ GimpMetadata * gimp_metadata_duplicate           (GimpMetadata           *metada
 
 GimpMetadata * gimp_metadata_deserialize         (const gchar            *metadata_xml);
 gchar        * gimp_metadata_serialize           (GimpMetadata           *metadata);
+gchar        * gimp_metadata_get_guid            (void);
+
+void           gimp_metadata_add_xmp_history     (GimpMetadata           *metadata,
+                                                  gchar                  *state_status);
 
 GimpMetadata * gimp_metadata_load_from_file      (GFile                  *file,
                                                   GError                **error);
@@ -77,6 +81,10 @@ gboolean       gimp_metadata_set_from_exif       (GimpMetadata           *metada
                                                   const guchar           *exif_data,
                                                   gint                    exif_data_length,
                                                   GError                **error);
+gboolean       gimp_metadata_set_from_iptc       (GimpMetadata           *metadata,
+                                                  const guchar           *iptc_data,
+                                                  gint                    iptc_data_length,
+                                                  GError                **error);
 gboolean       gimp_metadata_set_from_xmp        (GimpMetadata           *metadata,
                                                   const guchar           *xmp_data,
                                                   gint                    xmp_data_length,
@@ -105,6 +113,11 @@ void           gimp_metadata_set_colorspace      (GimpMetadata           *metada
 gboolean       gimp_metadata_is_tag_supported    (const gchar            *tag,
                                                   const gchar            *mime_type);
 
+void           gimp_metadata_register_xmp_namespace  (const gchar*           nspace,
+                                                      const gchar*           prefix);
+
+void           gimp_metadata_register_xmp_namespaces (void);
+
 G_END_DECLS
 
 #endif /* __GIMP_METADATA_H__ */
diff --git a/plug-ins/Makefile.am b/plug-ins/Makefile.am
index da45da2..7a2e2d8 100644
--- a/plug-ins/Makefile.am
+++ b/plug-ins/Makefile.am
@@ -56,6 +56,7 @@ SUBDIRS = \
        imagemap                \
        lighting                \
        map-object              \
+       metadata                \
        pagecurl                \
        $(print)                \
        screenshot              \
diff --git a/plug-ins/common/.gitignore b/plug-ins/common/.gitignore
index e9c7cc9..c36ed9f 100644
--- a/plug-ins/common/.gitignore
+++ b/plug-ins/common/.gitignore
@@ -142,8 +142,6 @@
 /mail.exe
 /max-rgb
 /max-rgb.exe
-/metadata
-/metadata.exe
 /newsprint
 /newsprint.exe
 /nl-filter
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index 68286b4..d2df391 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -119,7 +119,6 @@ libexec_PROGRAMS = \
        jigsaw \
        $(MAIL) \
        max-rgb \
-       metadata \
        newsprint \
        nl-filter \
        oilify \
@@ -1406,26 +1405,6 @@ max_rgb_LDADD = \
        $(INTLLIBS)             \
        $(max_rgb_RC)
 
-metadata_CFLAGS = $(GEXIV2_CFLAGS)
-
-metadata_SOURCES = \
-       metadata.c
-
-metadata_LDADD = \
-       $(libgimpui)            \
-       $(libgimpwidgets)       \
-       $(libgimpmodule)        \
-       $(libgimp)              \
-       $(libgimpmath)          \
-       $(libgimpconfig)        \
-       $(libgimpcolor)         \
-       $(libgimpbase)          \
-       $(GTK_LIBS)             \
-       $(GEXIV2_LIBS)          \
-       $(RT_LIBS)              \
-       $(INTLLIBS)             \
-       $(metadata_RC)
-
 newsprint_SOURCES = \
        newsprint.c
 
diff --git a/plug-ins/common/gimprc.common b/plug-ins/common/gimprc.common
index ad384c2..6a66bc8 100644
--- a/plug-ins/common/gimprc.common
+++ b/plug-ins/common/gimprc.common
@@ -68,7 +68,6 @@ hot_RC = hot.rc.o
 jigsaw_RC = jigsaw.rc.o
 mail_RC = mail.rc.o
 max_rgb_RC = max-rgb.rc.o
-metadata_RC = metadata.rc.o
 newsprint_RC = newsprint.rc.o
 nl_filter_RC = nl-filter.rc.o
 oilify_RC = oilify.rc.o
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index de88e8d..ea7481b 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -69,7 +69,6 @@
     'jigsaw' => { ui => 1 },
     'mail' => { ui => 1, optional => 1 },
     'max-rgb' => { ui => 1 },
-    'metadata' => { ui => 1, libs => 'GEXIV2_LIBS', cflags => 'GEXIV2_CFLAGS' },
     'newsprint' => { ui => 1 },
     'nl-filter' => { ui => 1 },
     'oilify' => { ui => 1 },
diff --git a/plug-ins/metadata/.gitignore b/plug-ins/metadata/.gitignore
new file mode 100644
index 0000000..bcea2fe
--- /dev/null
+++ b/plug-ins/metadata/.gitignore
@@ -0,0 +1,9 @@
+/Makefile.in
+/Makefile
+/.deps
+/_libs
+/.libs
+/metadata-editor
+/metadata-editor.exe
+/metadata-viewer
+/metadata-viewer.exe
diff --git a/plug-ins/metadata/Makefile.am b/plug-ins/metadata/Makefile.am
new file mode 100644
index 0000000..6d53b40
--- /dev/null
+++ b/plug-ins/metadata/Makefile.am
@@ -0,0 +1,74 @@
+## Process this file with automake to produce Makefile.in
+
+if OS_WIN32
+mwindows = -mwindows
+else
+libm = -lm
+endif
+
+libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la
+libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la
+libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la
+libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la
+libgimpcolor = $(top_builddir)/libgimpcolor/libgimpcolor-$(GIMP_API_VERSION).la
+libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la
+libgimpmath = $(top_builddir)/libgimpmath/libgimpmath-$(GIMP_API_VERSION).la
+
+if HAVE_WINDRES
+include $(top_srcdir)/build/windows/gimprc-plug-ins.rule
+metadata_editor_RC = metadata-editor.rc.o
+metadata_viewer_RC = metadata-viewer.rc.o
+endif
+
+AM_LDFLAGS = $(mwindows)
+
+libexecdir = $(gimpplugindir)/plug-ins
+
+libexec_PROGRAMS = \
+       metadata-editor         \
+       metadata-viewer
+
+metadata_editor_SOURCES = \
+       metadata-impexp.c               \
+       metadata-xml.c          \
+       metadata-editor.c
+
+metadata_viewer_SOURCES = \
+  metadata-viewer.c
+
+AM_CPPFLAGS = \
+       -I$(top_srcdir) \
+       $(GTK_CFLAGS)   \
+       $(GEGL_CFLAGS) \
+       -I$(includedir)
+
+metadata_viewer_LDADD = \
+       $(libm)                 \
+       $(libgimpui)            \
+       $(libgimpwidgets)       \
+       $(libgimpconfig)        \
+       $(libgimp)              \
+       $(libgimpcolor)         \
+       $(libgimpmath)          \
+       $(libgimpbase)          \
+       $(GTK_LIBS)             \
+       $(GEXIV2_LIBS)          \
+       $(RT_LIBS)              \
+       $(INTLLIBS)             \
+       $(metadata_viewer_RC)
+
+metadata_editor_LDADD = \
+       $(libm)                 \
+       $(libgimpui)            \
+       $(libgimpwidgets)       \
+       $(libgimpconfig)        \
+       $(libgimp)              \
+       $(libgimpcolor)         \
+       $(libgimpmath)          \
+       $(libgimpbase)          \
+       $(GTK_LIBS)             \
+       $(GEXIV2_LIBS)          \
+       $(RT_LIBS)              \
+       $(INTLLIBS)             \
+       $(metadata_editor_RC)
+
diff --git a/plug-ins/metadata/metadata-editor.c b/plug-ins/metadata/metadata-editor.c
new file mode 100644
index 0000000..e4fa12d
--- /dev/null
+++ b/plug-ins/metadata/metadata-editor.c
@@ -0,0 +1,5571 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * metadata-editor.c
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 <stdlib.h>
+#include <ctype.h>
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+#include <gexiv2/gexiv2.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "libgimp/stdplugins-intl.h"
+
+#include "metadata-tags.h"
+#include "metadata-xml.h"
+#include "metadata-impexp.h"
+#include "metadata-misc.h"
+
+#define PLUG_IN_PROC            "plug-in-metadata-editor"
+#define PLUG_IN_BINARY          "metadata-editor"
+#define PLUG_IN_ROLE            "gimp-metadata"
+
+#define DEFAULT_TEMPLATE_FILE   "gimp_metadata_template.xml"
+
+/*  local function prototypes  */
+
+static void       query                          (void);
+static void       run                            (const gchar          *name,
+                                                  gint                 nparams,
+                                                  const GimpParam     *param,
+                                                  gint                *nreturn_vals,
+                                                  GimpParam          **return_vals);
+
+static gboolean metadata_editor_dialog           (gint32               image_id,
+                                                  GimpMetadata        *metadata);
+
+static void metadata_dialog_editor_set_metadata  (GExiv2Metadata      *metadata,
+                                                  GtkBuilder          *builder);
+
+void metadata_editor_write_callback              (GtkWidget           *dialog,
+                                                  GtkBuilder          *builder,
+                                                  gint32               image_id);
+
+static void impex_combo_callback                (GtkComboBoxText      *combo,
+                                                 gpointer              data);
+
+static void gpsaltsys_combo_callback            (GtkComboBoxText      *combo,
+                                                 gpointer              data);
+
+static void remove_substring                    (const gchar          *string,
+                                                 const gchar          *substring);
+
+gboolean hasCreatorTagData                      (GtkBuilder           *builder);
+gboolean hasLocationCreationTagData             (GtkBuilder           *builder);
+gboolean hasImageSupplierTagData                (GtkBuilder           *builder);
+
+void on_date_button_clicked                     (GtkButton            *widget,
+                                                 GtkWidget            *entry_widget,
+                                                 gchar                *tag);
+
+void on_create_date_button_clicked              (GtkButton            *widget,
+                                                 gpointer              data);
+
+void on_patient_dob_date_button_clicked         (GtkButton            *widget,
+                                                 gpointer              data);
+
+void on_study_date_button_clicked               (GtkButton            *widget,
+                                                 gpointer              data);
+
+void on_series_date_button_clicked              (GtkButton            *widget,
+                                                 gpointer              data);
+
+
+static void
+property_release_id_remove_callback             (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+property_release_id_add_callback                (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+model_release_id_remove_callback                (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+model_release_id_add_callback                   (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+shown_location_remove_callback                  (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+shown_location_add_callback                     (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+feat_org_name_add_callback                      (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+feat_org_name_remove_callback                   (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+feat_org_code_add_callback                      (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+feat_org_code_remove_callback                   (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+artwork_object_add_callback                     (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+artwork_object_remove_callback                  (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+reg_entry_add_callback                          (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+reg_entry_remove_callback                       (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+image_creator_add_callback                      (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+image_creator_remove_callback                   (GtkWidget            *widget,
+                                                 gpointer              data);
+
+static void
+copyright_own_add_callback                      (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+copyright_own_remove_callback                   (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+licensor_add_callback                           (GtkWidget            *widget,
+                                                 gpointer              data);
+static void
+licensor_remove_callback                        (GtkWidget            *widget,
+                                                 gpointer              data);
+
+static void
+list_row_remove_callback                        (GtkWidget            *widget,
+                                                 gpointer              data,
+                                                 gchar                *tag);
+
+static void
+list_row_add_callback                           (GtkWidget            *widget,
+                                                 gpointer              data,
+                                                 gchar                *tag);
+
+int
+count_tags                                      (GExiv2Metadata       *metadata,
+                                                 gchar                *header,
+                                                 gchar               **tags,
+                                                 int                   items);
+
+void
+get_tags                                        (GExiv2Metadata       *metadata,
+                                                 gchar                *header,
+                                                 gchar               **tags,
+                                                 const int             items,
+                                                 const int             count);
+
+gboolean
+hasModelReleaseTagData                          (GtkBuilder           *builder);
+
+gboolean
+hasPropertyReleaseTagData                       (GtkBuilder           *builder);
+
+static void
+organisation_image_code_cell_edited_callback    (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+organisation_image_name_cell_edited_callback    (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+prop_rel_id_cell_edited_callback                (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+loc_sho_sub_loc_cell_edited_callback            (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+loc_sho_city_cell_edited_callback               (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+loc_sho_state_prov_cell_edited_callback         (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+loc_sho_cntry_cell_edited_callback              (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+loc_sho_cntry_iso_cell_edited_callback          (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+reg_org_id_cell_edited_callback                 (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+reg_item_id_cell_edited_callback                (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+aoo_title_cell_edited_callback                  (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+aoo_copyright_notice_cell_edited_callback       (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+aoo_source_inv_cell_edited_callback             (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+aoo_source_cell_edited_callback                 (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+aoo_creator_cell_edited_callback                (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+aoo_date_creat_cell_edited_callback             (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+cr_owner_name_cell_edited_callback              (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+cr_owner_id_cell_edited_callback                (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_name_cell_edited_callback              (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_id_cell_edited_callback                (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_phone1_cell_edited_callback            (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_phone_type1_cell_edited_callback       (GtkCellRendererCombo *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_phone2_cell_edited_callback            (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_phone_type2_cell_edited_callback       (GtkCellRendererCombo *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_email_cell_edited_callback             (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+static void
+licensor_web_cell_edited_callback               (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data);
+
+void
+cell_edited_callback                            (GtkCellRendererText  *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data,
+                                                 int                   index);
+
+void
+cell_edited_callback_combo                      (GtkCellRendererCombo *cell,
+                                                 const gchar          *path_string,
+                                                 const gchar          *new_text,
+                                                 gpointer              data,
+                                                 int                   index);
+
+
+/* local variables */
+
+gchar *tagdata[256][256];
+
+static int last_gpsaltsys_sel;
+
+gboolean gimpmetadata;
+gboolean force_write;
+
+static const gchar *lang_default = "lang=\"x-default\"";
+static const gchar *seq_default = "type=\"Seq\"";
+static const gchar *bag_default = "type=\"Bag\"";
+
+metadata_editor meta_args;
+
+const GimpPlugInInfo PLUG_IN_INFO =
+{
+  NULL,  /* init_proc  */
+  NULL,  /* quit_proc  */
+  query, /* query_proc */
+  run,   /* run_proc   */
+};
+
+/* ============================================================================
+ * ==[           ]=============================================================
+ * ==[ FUNCTIONS ]=============================================================
+ * ==[           ]=============================================================
+ * ============================================================================
+ */
+
+
+MAIN ()
+
+/* ============================================================================
+ * ==[ QUERY ]=================================================================
+ * ============================================================================
+ */
+
+static void
+query (void)
+{
+  static const GimpParamDef metadata_args[] =
+  {
+    { GIMP_PDB_INT32, "run-mode", "Run mode { RUN-INTERACTIVE (0) }" },
+    { GIMP_PDB_IMAGE, "image",    "Input image"                      }
+  };
+
+  gimp_install_procedure (PLUG_IN_PROC,
+                          N_("Edit metadata"),
+                          "Edit metadata information attached to the "
+                          "current image.   Some or all of this metadata "
+                          "will be saved in the file, depending on the output "
+                          "file format.",
+                          "Ben Touchette",
+                          "Ben Touchette",
+                          "2017",
+                          N_("Edit Metadata"),
+                          "*",
+                          GIMP_PLUGIN,
+                          G_N_ELEMENTS (metadata_args), 0,
+                          metadata_args, NULL);
+
+  gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Image/Metadata");
+}
+
+/* ============================================================================
+ * ==[ RUN ]===================================================================
+ * ============================================================================
+ */
+
+static void
+run (const gchar      *name,
+     gint              nparams,
+     const GimpParam  *param,
+     gint             *nreturn_vals,
+     GimpParam       **return_vals)
+{
+  static GimpParam   values[1];
+  GimpPDBStatusType  status = GIMP_PDB_SUCCESS;
+
+  *nreturn_vals = 1;
+  *return_vals  = values;
+
+  values[0].type          = GIMP_PDB_STATUS;
+  values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
+
+  force_write = FALSE;
+
+  INIT_I18N();
+  gimp_ui_init (PLUG_IN_BINARY, TRUE);
+
+  if (! strcmp (name, PLUG_IN_PROC))
+    {
+      GimpMetadata *metadata;
+      gint32        image_ID = param[1].data.d_image;
+
+      metadata = gimp_image_get_metadata (image_ID);
+
+      /* Always show metadata dialog so we can add
+         appropriate iptc data as needed. Sometimes
+         license data needs to be added after the
+         fact and the image may not contain metadata
+         but should have it added as needed. */
+
+      if (!metadata)
+        {
+          metadata = gimp_metadata_new();
+          gimp_image_set_metadata (image_ID, metadata);
+        }
+
+      metadata_editor_dialog (image_ID, metadata);
+
+      status = GIMP_PDB_SUCCESS;
+    }
+  else
+    {
+      status = GIMP_PDB_CALLING_ERROR;
+    }
+
+  values[0].data.d_status = status;
+}
+
+/* ============================================================================
+ * ==[ EDITOR DIALOG UI ]======================================================
+ * ============================================================================
+ */
+
+static gboolean
+metadata_editor_dialog (gint32        image_id,
+                        GimpMetadata *g_metadata)
+{
+  GtkBuilder     *builder;
+  GtkWidget      *dialog;
+  GtkWidget      *metadata_vbox;
+  GtkWidget      *impex_combo;
+  GtkWidget      *content_area;
+  GExiv2Metadata *metadata;
+  gchar          *ui_file;
+  gchar          *title;
+  gchar          *name;
+  GError         *error = NULL;
+  gboolean        run;
+
+  metadata = GEXIV2_METADATA(g_metadata);
+
+  builder = gtk_builder_new ();
+
+  meta_args.image_id = image_id;
+  meta_args.builder = builder;
+  meta_args.metadata = metadata;
+  meta_args.filename = g_strconcat (g_get_home_dir(), "/", DEFAULT_TEMPLATE_FILE,
+                                    NULL);
+
+  ui_file = g_build_filename (gimp_data_directory (),
+                              "ui", "plug-ins", "plug-in-metadata-editor.ui", NULL);
+
+  if (! gtk_builder_add_from_file (builder, ui_file, &error))
+    {
+      g_printerr ("Error occured while loading UI file!\n");
+      g_printerr ("Message: %s\n", error->message);
+      g_clear_error (&error);
+      if (ui_file)
+        g_free (ui_file);
+      g_object_unref (builder);
+      return FALSE;
+    }
+
+  g_free (ui_file);
+
+  name = gimp_image_get_name (image_id);
+  title = g_strdup_printf ("Metadata Editor: %s", name);
+  if (name)
+    g_free (name);
+
+  dialog = gimp_dialog_new (title,
+                            "gimp-metadata-editor-dialog",
+                            NULL, 0,
+                            gimp_standard_help_func, PLUG_IN_PROC,
+                            GTK_STOCK_CANCEL, GTK_RESPONSE_NO,
+                            _("Write Metadata"), GTK_RESPONSE_YES,
+                            NULL);
+
+  meta_args.dialog = dialog;
+
+  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+      GTK_RESPONSE_YES,
+      GTK_RESPONSE_NO,
+      -1);
+
+  gimp_window_set_transient (GTK_WINDOW (dialog));
+
+  if (title)
+    g_free (title);
+
+  content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+  metadata_vbox = GTK_WIDGET (gtk_builder_get_object (builder,
+                              "metadata-vbox"));
+
+  impex_combo = GTK_WIDGET (gtk_builder_get_object (builder,
+                            "impex_combo"));
+
+  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(impex_combo),
+                                  _("Select:"));
+  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(impex_combo),
+                                  _("Import metadata"));
+  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(impex_combo),
+                                  _("Export metadata"));
+  gtk_combo_box_set_active (GTK_COMBO_BOX(impex_combo), 0);
+
+  g_signal_connect(G_OBJECT(impex_combo),
+                   "changed", G_CALLBACK(impex_combo_callback), &meta_args);
+
+  gtk_container_set_border_width (GTK_CONTAINER (metadata_vbox), 12);
+  gtk_box_pack_start (GTK_BOX (content_area), metadata_vbox, TRUE, TRUE, 0);
+
+  metadata_dialog_editor_set_metadata (metadata, builder);
+
+  run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_YES);
+  if (run)
+    {
+      metadata_editor_write_callback (dialog, builder, image_id);
+    }
+
+  if (meta_args.filename)
+    {
+      g_free (meta_args.filename);
+    }
+
+  return TRUE;
+}
+
+/* ============================================================================
+ * ==[                   ]=====================================================
+ * ==[ PRIVATE FUNCTIONS ]=====================================================
+ * ==[                   ]=====================================================
+ * ============================================================================
+ */
+static void
+remove_substring(const gchar *string,const gchar *substring)
+{
+  if (string != NULL && substring != NULL)
+    {
+      gchar *p = strstr(string, substring);
+      if (p)
+        {
+          strcpy (p, p + strlen (substring));
+        }
+    }
+}
+
+
+int
+count_tags(GExiv2Metadata *metadata, gchar *header, gchar **tags, int items)
+{
+  int tagcount;
+  gchar tag[256];
+
+  tagcount = 0;
+  for (int oo = 1; oo < 256; oo++)
+    {
+      for (int ii = 0; ii < items; ii++)
+        {
+          g_sprintf((gchar*)&tag, "%s[%d]", header, oo);
+          g_sprintf((gchar*)&tag, "%s%s", (gchar*)&tag, (gchar*)tags[ii]);
+          if (gexiv2_metadata_has_tag(metadata, (gchar*)&tag))
+            {
+              tagcount++;
+              break;
+            }
+        }
+    }
+  return tagcount;
+}
+
+void
+get_tags(GExiv2Metadata *metadata, gchar *header,
+         gchar **tags, const int items, const int count)
+{
+  gchar tag[256];
+
+  for (int ooo = 1; ooo < count + 1; ooo++)
+    {
+      for (int iii = 0; iii < items; iii++)
+        {
+          gchar *value;
+          g_sprintf((gchar*)&tag, "%s[%d]", header, ooo);
+          g_sprintf((gchar*)&tag, "%s%s", (gchar*)&tag, (gchar*)tags[iii]);
+          value = gexiv2_metadata_get_tag_string(metadata, (gchar*)&tag);
+          tagdata[ooo-1][iii] = strdup(value);
+        }
+    }
+}
+
+/* ============================================================================
+ * ==[ DATE CALLBACKS ]========================================================
+ * ============================================================================
+ */
+void
+on_create_date_button_clicked (GtkButton *widget, gpointer data)
+{
+  on_date_button_clicked (widget, (GtkWidget*)data,
+                          "Xmp.photoshop.DateCreated");
+}
+
+void
+on_patient_dob_date_button_clicked (GtkButton *widget, gpointer data)
+{
+  on_date_button_clicked (widget, (GtkWidget*)data,
+                          "Xmp.DICOM.PatientDOB");
+}
+
+void
+on_study_date_button_clicked (GtkButton *widget, gpointer data)
+{
+  on_date_button_clicked (widget, (GtkWidget*)data,
+                          "Xmp.DICOM.StudyDateTime");
+}
+
+void
+on_series_date_button_clicked (GtkButton *widget, gpointer data)
+{
+  on_date_button_clicked (widget, (GtkWidget*)data,
+                          "Xmp.DICOM.SeriesDateTime");
+}
+
+void
+on_date_button_clicked (GtkButton *widget, GtkWidget *entry_widget, gchar *tag)
+{
+  GtkBuilder     *builder;
+  GtkWidget      *calendar_dialog;
+  GtkWidget      *calendar_content_area;
+  GtkWidget      *calendar_vbox;
+  GtkWidget      *calendar;
+  const gchar    *date_text;
+  gchar          *ui_file;
+  GError         *error = NULL;
+  GDateTime      *current_datetime;
+  guint           year, month, day;
+
+  builder = gtk_builder_new ();
+
+  ui_file = g_build_filename (gimp_data_directory (),
+                              "ui", "plug-ins",
+                              "plug-in-metadata-editor-calendar.ui", NULL);
+
+  if (! gtk_builder_add_from_file (builder, ui_file, &error))
+    {
+      g_printerr ("Error occured while loading UI file!\n");
+      if (error != NULL)
+        {
+          g_printerr ("Message: %s\n", error->message);
+          g_clear_error (&error);
+        }
+      if (ui_file)
+        g_free (ui_file);
+      g_object_unref (builder);
+      return;
+    }
+
+  if (ui_file)
+    g_free (ui_file);
+
+  date_text = gtk_entry_get_text (GTK_ENTRY (entry_widget));
+  if (date_text && date_text[0] != '\0')
+    {
+      sscanf(date_text, "%d-%d-%d;", &year, &month, &day);
+      month--;
+    }
+  else
+    {
+      current_datetime = g_date_time_new_now_local ();
+      year = g_date_time_get_year (current_datetime);
+      month = g_date_time_get_month (current_datetime) - 1;
+      day = g_date_time_get_day_of_month (current_datetime);
+    }
+
+  calendar_dialog =
+    gtk_dialog_new_with_buttons (_("Calendar Date:"),
+                                 NULL,
+                                 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                 GTK_STOCK_CANCEL, GTK_RESPONSE_NO,
+                                 _("Set Date"), GTK_RESPONSE_YES,
+                                 NULL);
+
+  gtk_dialog_set_default_response (GTK_DIALOG (calendar_dialog),
+                                   GTK_RESPONSE_YES);
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (calendar_dialog),
+      GTK_RESPONSE_YES,
+      GTK_RESPONSE_NO,
+      -1);
+
+  gimp_window_set_transient (GTK_WINDOW (calendar_dialog));
+
+  calendar_content_area = gtk_dialog_get_content_area (GTK_DIALOG (
+                            calendar_dialog));
+
+  calendar_vbox = GTK_WIDGET (gtk_builder_get_object (builder,
+                              "calendar-vbox"));
+
+  gtk_container_set_border_width (GTK_CONTAINER (calendar_vbox), 12);
+  gtk_box_pack_start (GTK_BOX (calendar_content_area), calendar_vbox, TRUE, TRUE,
+                      0);
+
+  calendar = GTK_WIDGET (gtk_builder_get_object (builder, "calendar"));
+
+  gtk_calendar_select_month (GTK_CALENDAR (calendar), month, year);
+  gtk_calendar_select_day (GTK_CALENDAR (calendar), day);
+  gtk_calendar_mark_day (GTK_CALENDAR (calendar), day);
+
+  if (gtk_dialog_run (GTK_DIALOG (calendar_dialog)) == GTK_RESPONSE_YES)
+    {
+      gchar date[25];
+      gtk_calendar_get_date (GTK_CALENDAR (calendar), &year, &month, &day);
+      g_sprintf((gchar*)&date, "%d-%02d-%02d", year, month+1, day);
+      gtk_entry_set_text (GTK_ENTRY (entry_widget), date);
+    }
+
+  gtk_widget_destroy (calendar_dialog);
+}
+
+/* ============================================================================
+ * ==[ SEPCIAL TAGS HANDLERS ]=================================================
+ * ============================================================================
+ */
+
+gboolean
+hasImageSupplierTagData(GtkBuilder *builder)
+{
+  gint loop;
+
+  for (loop = 0; loop < imageSupplierInfoHeader.size; loop++)
+    {
+      GObject       *object;
+
+      object = gtk_builder_get_object (builder, default_metadata_tags[loop].tag);
+
+      if (!strcmp(imageSupplierInfoTags[loop].mode, "single"))
+        {
+          const gchar *text;
+          text = gtk_entry_get_text (GTK_ENTRY (object));
+          if (text != NULL)
+            {
+              if (text[0] != '\0')
+                {
+                  return TRUE;
+                }
+            }
+        }
+      else if (!strcmp(imageSupplierInfoTags[loop].mode, "multi"))
+        {
+          const gchar *text;
+          text = gtk_entry_get_text (GTK_ENTRY (object));
+          if (text != NULL)
+            {
+              if (text[0] != '\0')
+                {
+                  return TRUE;
+                }
+            }
+        }
+    }
+
+  return FALSE;
+}
+
+gboolean
+hasLocationCreationTagData(GtkBuilder *builder)
+{
+  gint loop;
+
+  for (loop = 0; loop < creatorContactInfoHeader.size; loop++)
+    {
+      GObject       *object;
+      const gchar   *text;
+
+      object = gtk_builder_get_object (builder, default_metadata_tags[loop].tag);
+
+      if (!strcmp(locationCreationInfoTags[loop].mode, "single"))
+        {
+          text = gtk_entry_get_text (GTK_ENTRY (object));
+          if (text != NULL)
+            {
+              if (text[0] != '\0')
+                {
+                  return TRUE;
+                }
+            }
+        }
+    }
+
+  return FALSE;
+}
+
+gboolean
+hasModelReleaseTagData (GtkBuilder *builder)
+{
+  return FALSE;
+}
+
+gboolean
+hasPropertyReleaseTagData (GtkBuilder *builder)
+{
+  return FALSE;
+}
+
+
+gboolean
+hasCreatorTagData (GtkBuilder *builder)
+{
+  gint loop;
+
+  for (loop = 0; loop < creatorContactInfoHeader.size; loop++)
+    {
+      GObject       *object;
+      GtkTextView   *text_view;
+      GtkTextBuffer *buffer;
+      GtkTextIter    start;
+      GtkTextIter    end;
+
+      object = gtk_builder_get_object (builder, default_metadata_tags[loop].tag);
+
+      if (!strcmp(creatorContactInfoTags[loop].mode, "single"))
+        {
+          const gchar *text;
+          text = gtk_entry_get_text (GTK_ENTRY (object));
+          if (text != NULL)
+            {
+              if (text[0] != '\0')
+                {
+                  return TRUE;
+                }
+            }
+        }
+      else if (!strcmp(creatorContactInfoTags[loop].mode, "multi"))
+        {
+          const gchar *text;
+          text_view = GTK_TEXT_VIEW (object);
+          buffer = gtk_text_view_get_buffer (text_view);
+          gtk_text_buffer_get_start_iter (buffer, &start);
+          gtk_text_buffer_get_end_iter (buffer, &end);
+          text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+          if (text != NULL)
+            {
+              if (text[0] != '\0')
+                {
+                  return TRUE;
+                }
+            }
+        }
+    }
+
+  return FALSE;
+}
+
+/* ============================================================================
+ * ==[ SET DIALOG METADATA ]===================================================
+ * ============================================================================
+ */
+
+/* CELL EDITED */
+
+void
+cell_edited_callback (GtkCellRendererText *cell,
+                      const gchar         *path_string,
+                      const gchar         *new_text,
+                      gpointer             data,
+                      int                  index)
+{
+  GtkTreeModel *model;
+  GtkTreePath  *path;
+  GtkTreeIter   iter;
+
+  model = (GtkTreeModel *)data;
+  path = gtk_tree_path_new_from_string (path_string);
+
+  gtk_tree_model_get_iter (model, &iter, path);
+
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter, index,
+                      new_text, -1);
+}
+
+void
+cell_edited_callback_combo (GtkCellRendererCombo *cell,
+                            const gchar          *path_string,
+                            const gchar          *new_text,
+                            gpointer              data,
+                            int                   column)
+{
+  GtkWidget        *widget;
+  GtkTreeModel     *treemodel;
+  GtkListStore     *liststore;
+  GtkTreeIter       iter;
+  GtkTreePath      *path;
+  GtkTreeSelection *selection;
+
+  widget = GTK_WIDGET(data);
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget));
+
+  if (gtk_tree_selection_get_selected (GTK_TREE_SELECTION(selection),
+                                       NULL, &iter))
+    {
+      path = gtk_tree_model_get_path (treemodel, &iter);
+      gtk_tree_path_free (path);
+      gtk_list_store_set (liststore, &iter, column, new_text, -1);
+    }
+}
+
+static void
+licensor_name_cell_edited_callback (GtkCellRendererText *cell,
+                                    const gchar         *path_string,
+                                    const gchar         *new_text,
+                                    gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+licensor_id_cell_edited_callback (GtkCellRendererText *cell,
+                                  const gchar         *path_string,
+                                  const gchar         *new_text,
+                                  gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+licensor_phone1_cell_edited_callback (GtkCellRendererText *cell,
+                                      const gchar         *path_string,
+                                      const gchar         *new_text,
+                                      gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 2);
+}
+
+static void
+licensor_phone_type1_cell_edited_callback (GtkCellRendererCombo *cell,
+    const gchar         *path_string,
+    const gchar         *new_text,
+    gpointer             data)
+{
+  cell_edited_callback_combo (cell, path_string, new_text, data, 3);
+}
+
+static void
+licensor_phone2_cell_edited_callback (GtkCellRendererText *cell,
+                                      const gchar         *path_string,
+                                      const gchar         *new_text,
+                                      gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 4);
+}
+
+static void
+licensor_phone_type2_cell_edited_callback (GtkCellRendererCombo *cell,
+    const gchar         *path_string,
+    const gchar         *new_text,
+    gpointer             data)
+{
+  cell_edited_callback_combo (cell, path_string, new_text, data, 5);
+}
+
+static void
+licensor_email_cell_edited_callback (GtkCellRendererText *cell,
+                                     const gchar         *path_string,
+                                     const gchar         *new_text,
+                                     gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 6);
+}
+
+static void
+licensor_web_cell_edited_callback (GtkCellRendererText *cell,
+                                   const gchar         *path_string,
+                                   const gchar         *new_text,
+                                   gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 7);
+}
+
+static void
+cr_owner_name_cell_edited_callback (GtkCellRendererText *cell,
+                                    const gchar         *path_string,
+                                    const gchar         *new_text,
+                                    gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+cr_owner_id_cell_edited_callback (GtkCellRendererText *cell,
+                                  const gchar         *path_string,
+                                  const gchar         *new_text,
+                                  gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+img_cr8_name_cell_edited_callback (GtkCellRendererText *cell,
+                                   const gchar         *path_string,
+                                   const gchar         *new_text,
+                                   gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+img_cr8_id_cell_edited_callback (GtkCellRendererText *cell,
+                                 const gchar         *path_string,
+                                 const gchar         *new_text,
+                                 gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+aoo_copyright_notice_cell_edited_callback (GtkCellRendererText *cell,
+    const gchar         *path_string,
+    const gchar         *new_text,
+    gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 5);
+}
+
+static void
+aoo_source_inv_cell_edited_callback (GtkCellRendererText *cell,
+                                     const gchar         *path_string,
+                                     const gchar         *new_text,
+                                     gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 4);
+}
+
+static void
+aoo_source_cell_edited_callback (GtkCellRendererText *cell,
+                                 const gchar         *path_string,
+                                 const gchar         *new_text,
+                                 gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 3);
+}
+
+static void
+aoo_creator_cell_edited_callback (GtkCellRendererText *cell,
+                                  const gchar         *path_string,
+                                  const gchar         *new_text,
+                                  gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 2);
+}
+
+static void
+aoo_date_creat_cell_edited_callback (GtkCellRendererText *cell,
+                                     const gchar         *path_string,
+                                     const gchar         *new_text,
+                                     gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+aoo_title_cell_edited_callback (GtkCellRendererText *cell,
+                                const gchar         *path_string,
+                                const gchar         *new_text,
+                                gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+reg_org_id_cell_edited_callback (GtkCellRendererText *cell,
+                                 const gchar         *path_string,
+                                 const gchar         *new_text,
+                                 gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+reg_item_id_cell_edited_callback (GtkCellRendererText *cell,
+                                  const gchar         *path_string,
+                                  const gchar         *new_text,
+                                  gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+loc_sho_sub_loc_cell_edited_callback (GtkCellRendererText *cell,
+                                      const gchar         *path_string,
+                                      const gchar         *new_text,
+                                      gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+loc_sho_city_cell_edited_callback (GtkCellRendererText *cell,
+                                   const gchar         *path_string,
+                                   const gchar         *new_text,
+                                   gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+loc_sho_state_prov_cell_edited_callback (GtkCellRendererText *cell,
+    const gchar         *path_string,
+    const gchar         *new_text,
+    gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 2);
+}
+
+static void
+loc_sho_cntry_cell_edited_callback (GtkCellRendererText *cell,
+                                    const gchar         *path_string,
+                                    const gchar         *new_text,
+                                    gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 3);
+}
+
+static void
+loc_sho_cntry_iso_cell_edited_callback (GtkCellRendererText *cell,
+                                        const gchar         *path_string,
+                                        const gchar         *new_text,
+                                        gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 4);
+}
+
+static void
+loc_sho_wrld_reg_cell_edited_callback (GtkCellRendererText *cell,
+                                       const gchar         *path_string,
+                                       const gchar         *new_text,
+                                       gpointer             data)
+{
+  cell_edited_callback (cell, path_string, new_text, data, 5);
+}
+
+static void
+prop_rel_id_cell_edited_callback (GtkCellRendererText *cell,
+                                  const gchar         *path_string,
+                                  const gchar         *new_text,
+                                  gpointer             data)
+{
+  GtkTreeModel *model;
+  GtkTreePath  *path;
+  GtkTreeIter   iter;
+  gint          column;
+  model = (GtkTreeModel *)data;
+  path = gtk_tree_path_new_from_string (path_string);
+
+  column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+  gtk_tree_model_get_iter (model, &iter, path);
+
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+                      new_text, -1);
+}
+
+static void
+mod_rel_id_cell_edited_callback (GtkCellRendererText *cell,
+                                 const gchar         *path_string,
+                                 const gchar         *new_text,
+                                 gpointer             data)
+{
+  GtkTreeModel *model;
+  GtkTreePath  *path;
+  GtkTreeIter   iter;
+  gint          column;
+
+  model = (GtkTreeModel *)data;
+  path = gtk_tree_path_new_from_string (path_string);
+
+  column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+  gtk_tree_model_get_iter (model, &iter, path);
+
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+                      new_text, -1);
+}
+
+static void
+organisation_image_name_cell_edited_callback (GtkCellRendererText *cell,
+    const gchar         *path_string,
+    const gchar         *new_text,
+    gpointer             data)
+{
+  GtkTreeModel *model;
+  GtkTreePath  *path;
+  GtkTreeIter   iter;
+  gint          column;
+
+  model = (GtkTreeModel *)data;
+  path = gtk_tree_path_new_from_string (path_string);
+
+  column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+  gtk_tree_model_get_iter (model, &iter, path);
+
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+                      new_text, -1);
+}
+
+static void
+organisation_image_code_cell_edited_callback (GtkCellRendererText *cell,
+    const gchar         *path_string,
+    const gchar         *new_text,
+    gpointer             data)
+{
+  GtkTreeModel *model;
+  GtkTreePath  *path;
+  GtkTreeIter   iter;
+  gint          column;
+
+  model = (GtkTreeModel *)data;
+  path = gtk_tree_path_new_from_string (path_string);
+
+  column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+  gtk_tree_model_get_iter (model, &iter, path);
+
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+                      new_text, -1);
+}
+
+
+/* CELL / ROW REMOVE */
+
+static void
+list_row_remove_callback (GtkWidget *widget, gpointer data, gchar *tag)
+{
+  GtkWidget        *list_widget;
+  GtkListStore     *liststore;
+  GtkTreeIter       iter;
+  GtkBuilder       *builder;
+  GtkTreeModel     *treemodel;
+  GtkTreeSelection *selection;
+  GtkTreePath      *path;
+
+  builder = (GtkBuilder*)data;
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, tag));
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+  selection = gtk_tree_view_get_selection ((GtkTreeView *)list_widget);
+
+  if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+    {
+      int number_of_rows;
+      path = gtk_tree_model_get_path (treemodel, &iter);
+      gtk_list_store_remove (liststore, &iter);
+      gtk_tree_path_free (path);
+      number_of_rows =
+        gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL);
+      // Make sur that two rows are always showing, else it looks ugly.
+      if (number_of_rows < 2)
+        {
+          gtk_list_store_append(liststore, &iter);
+        }
+    }
+}
+
+static void
+property_release_id_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.plus.PropertyReleaseID");
+}
+
+static void
+model_release_id_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.plus.ModelReleaseID");
+}
+
+static void
+shown_location_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.iptcExt.LocationShown");
+}
+
+static void
+feat_org_name_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.iptcExt.OrganisationInImageName");
+}
+
+static void
+feat_org_code_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.iptcExt.OrganisationInImageCode");
+}
+
+static void
+artwork_object_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.iptcExt.ArtworkOrObject");
+}
+
+static void
+reg_entry_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.iptcExt.RegistryId");
+}
+
+static void
+image_creator_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.plus.ImageCreator");
+}
+
+static void
+copyright_own_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.plus.CopyrightOwner");
+}
+
+static void
+licensor_remove_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_remove_callback (widget, data, "Xmp.plus.Licensor");
+}
+
+
+/* CELL / ROW ADD */
+
+static void
+list_row_add_callback (GtkWidget *widget, gpointer data, gchar *tag)
+{
+  GtkWidget     *list_widget;
+  GtkListStore  *liststore;
+  GtkTreeIter    iter;
+  GtkBuilder    *builder = (GtkBuilder*)data;
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, tag));
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)list_widget));
+
+  gtk_list_store_append (liststore, &iter);
+}
+
+static void
+property_release_id_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.plus.PropertyReleaseID");
+}
+
+static void
+model_release_id_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.plus.ModelReleaseID");
+}
+
+static void
+shown_location_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.iptcExt.LocationShown");
+}
+
+static void
+feat_org_name_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.iptcExt.OrganisationInImageName");
+}
+
+static void
+feat_org_code_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.iptcExt.OrganisationInImageCode");
+}
+
+static void
+artwork_object_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.iptcExt.ArtworkOrObject");
+}
+
+static void
+reg_entry_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.iptcExt.RegistryId");
+}
+
+static void
+image_creator_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.plus.ImageCreator");
+}
+
+static void
+copyright_own_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.plus.CopyrightOwner");
+}
+
+static void
+licensor_add_callback (GtkWidget *widget, gpointer data)
+{
+  list_row_add_callback (widget, data, "Xmp.plus.Licensor");
+}
+
+
+/* Set dialog display settings and data */
+
+static void
+metadata_dialog_editor_set_metadata (GExiv2Metadata *metadata,
+                                     GtkBuilder     *builder)
+{
+  GtkWidget *combo_widget;
+  GtkWidget *entry_widget;
+  GtkWidget *text_widget;
+  GtkWidget *button_widget;
+  gint       width, height;
+  gchar     *value;
+  gint       i;
+
+  gint32 numele = G_N_ELEMENTS (default_metadata_tags);
+
+  /* Setup Buttons */
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_licensor_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(licensor_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_licensor_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(licensor_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_copyright_own_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(copyright_own_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_copyright_own_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(copyright_own_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_image_creator_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(image_creator_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_image_creator_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(image_creator_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_reg_entry_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(reg_entry_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_reg_entry_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(reg_entry_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_artwork_object_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(artwork_object_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_artwork_object_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(artwork_object_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_feat_org_code_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(feat_org_code_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_feat_org_code_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(feat_org_code_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_feat_org_name_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(feat_org_name_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_feat_org_name_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(feat_org_name_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_shown_location_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(shown_location_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_shown_location_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(shown_location_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_model_rel_id_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(model_release_id_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_model_rel_id_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(model_release_id_remove_callback), builder);
+
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "add_prop_rel_id_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(property_release_id_add_callback), builder);
+  button_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "rem_prop_rel_id_button"));
+  g_signal_connect(G_OBJECT(button_widget),
+                   "clicked", G_CALLBACK(property_release_id_remove_callback), builder);
+
+
+  /* Setup Comboboxes */
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.xmp.Rating"));
+  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                  _("Unrated"));
+  for (gint32 i=1; i < 6; i++)
+    {
+      gchar *display;
+      display = g_strdup_printf("%d", i);
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      display);
+      if (display)
+        g_free(display);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.xmpRights.Marked"));
+  for (i = 0; i < 3; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      marked[i].display);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.photoshop.Urgency"));
+  for (i = 0; i < 9; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      urgency[i]);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Xmp.plus.MinorModelAgeDisclosure"));
+  for (i = 0; i < 13; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      minormodelagedisclosure[i].display);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Xmp.plus.ModelReleaseStatus"));
+  for (i = 0; i < 4; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      modelreleasestatus[i].display);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+  gtk_widget_get_size_request (combo_widget, &width, &height);
+  gtk_widget_set_size_request (combo_widget, 180, height);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Xmp.iptcExt.DigitalSourceType"));
+  for (i = 0; i < 4; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      digitalsourcetype[i].display);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Xmp.plus.PropertyReleaseStatus"));
+  for (i = 0; i < 4; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      propertyreleasestatus[i].display);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+  gtk_widget_get_size_request (combo_widget, &width, &height);
+  gtk_widget_set_size_request (combo_widget, 180, height);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Xmp.DICOM.PatientSex"));
+  for (i = 0; i < 4; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      dicom[i].display);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Exif.GPSInfo.GPSLatitudeRef"));
+  for (i = 0; i < 3; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      gpslatref[i]);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Exif.GPSInfo.GPSLongitudeRef"));
+  for (i = 0; i < 3; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      gpslngref[i]);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Exif.GPSInfo.GPSAltitudeRef"));
+  for (i = 0; i < 3; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      gpsaltref[i]);
+    }
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  combo_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "GPSAltitudeSystem"));
+  for (i = 0; i < 2; i++)
+    {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_widget),
+                                      gpsaltsys[i]);
+    }
+
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo_widget), 0);
+
+  g_signal_connect(G_OBJECT(combo_widget),
+                   "changed", G_CALLBACK(gpsaltsys_combo_callback), builder);
+
+  /* Set up text view heights */
+  for (i = 0; i < numele; i++)
+    {
+      if (! strcmp("multi", default_metadata_tags[i].mode))
+        {
+          text_widget =
+            GTK_WIDGET (gtk_builder_get_object (builder,
+                                                default_metadata_tags[i].tag));
+          gtk_widget_get_size_request (text_widget, &width, &height);
+          gtk_widget_set_size_request (text_widget, width, height + 60);
+        }
+    }
+
+  for (i = 0; i < creatorContactInfoHeader.size; i++)
+    {
+      if (! strcmp("multi", creatorContactInfoTags[i].mode))
+        {
+          text_widget =
+            GTK_WIDGET (gtk_builder_get_object (builder,
+                                                creatorContactInfoTags[i].id));
+          gtk_widget_get_size_request (text_widget, &width, &height);
+          gtk_widget_set_size_request (text_widget, width, height + 60);
+        }
+    }
+
+  /* Set up lists */
+  for (i = 0; i < imageSupplierInfoHeader.size; i++)
+    {
+      GtkWidget *widget;
+
+      widget = GTK_WIDGET (gtk_builder_get_object (builder,
+                           imageSupplierInfoTags[i].id));
+
+      value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+              imageSupplierInfoTags[i].tag);
+
+      if (value)
+        {
+          gchar *value_clean;
+          gchar *value_utf;
+
+          value_clean = g_strdup(value);
+
+          if (strstr(value_clean, lang_default) != NULL)
+            {
+              remove_substring (value_clean, lang_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, bag_default) != NULL)
+            {
+              remove_substring (value_clean, bag_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, seq_default) != NULL)
+            {
+              remove_substring (value_clean, seq_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+          if (! strcmp ("single", imageSupplierInfoTags[i].mode))
+            {
+              gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+            }
+          else if (! strcmp("multi", imageSupplierInfoTags[i].mode))
+            {
+              GtkTextBuffer *buffer;
+              buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+              gtk_text_buffer_set_text (buffer, value_utf, -1);
+            }
+        }
+    }
+
+  for (i = 0; i < locationCreationInfoHeader.size; i++)
+    {
+      GtkWidget *widget;
+
+      widget = GTK_WIDGET (gtk_builder_get_object (builder,
+                           locationCreationInfoTags[i].id));
+
+      value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+              locationCreationInfoTags[i].tag);
+
+      if (value)
+        {
+          gchar *value_clean;
+          gchar *value_utf;
+
+          value_clean = g_strdup(value);
+
+          if (strstr(value_clean, lang_default) != NULL)
+            {
+              remove_substring (value_clean, lang_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, bag_default) != NULL)
+            {
+              remove_substring (value_clean, bag_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, seq_default) != NULL)
+            {
+              remove_substring (value_clean, seq_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+          if (! strcmp ("single", locationCreationInfoTags[i].mode))
+            {
+              gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+            }
+        }
+    }
+
+  /* Set up tag data */
+
+  for (i = 0; i < creatorContactInfoHeader.size; i++)
+    {
+      GtkWidget *widget;
+
+      widget = GTK_WIDGET (gtk_builder_get_object (builder,
+                           creatorContactInfoTags[i].id));
+
+      value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+              creatorContactInfoTags[i].tag);
+
+      if (value)
+        {
+          gchar *value_clean;
+          gchar *value_utf;
+
+          value_clean = g_strdup(value);
+
+          if (strstr(value_clean, lang_default) != NULL)
+            {
+              remove_substring (value_clean, lang_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, bag_default) != NULL)
+            {
+              remove_substring (value_clean, bag_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, seq_default) != NULL)
+            {
+              remove_substring (value_clean, seq_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+          if (! strcmp ("single", creatorContactInfoTags[i].mode))
+            {
+              gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+            }
+          else if (! strcmp("multi", creatorContactInfoTags[i].mode))
+            {
+              GtkTextBuffer *buffer;
+              buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+              gtk_text_buffer_set_text (buffer, value_utf, -1);
+            }
+        }
+    }
+
+  for (i = 0; i < numele; i++)
+    {
+      GtkWidget *widget;
+      widget = GTK_WIDGET (gtk_builder_get_object (builder,
+                           default_metadata_tags[i].tag));
+
+      value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+              default_metadata_tags[i].tag);
+      if (!value || value[0] == '\0')
+        {
+          int index;
+
+          if (value)
+            g_free(value);
+
+          index = default_metadata_tags[i].other_tag_index;
+          if (index > -1)
+            {
+              value =
+                gexiv2_metadata_get_tag_interpreted_string (metadata,
+                    equivalent_metadata_tags[index].tag);
+            }
+        }
+
+      if (value)
+        {
+          gchar *value_clean;
+          gchar *value_utf;
+
+          value_clean = g_strdup(value);
+
+          if (strstr(value_clean, lang_default) != NULL)
+            {
+              remove_substring (value_clean, lang_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, bag_default) != NULL)
+            {
+              remove_substring (value_clean, bag_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (strstr(value_clean, seq_default) != NULL)
+            {
+              remove_substring (value_clean, seq_default);
+              if (strstr(value_clean, " ") != NULL)
+                {
+                  remove_substring (value_clean, " ");
+                }
+            }
+
+          if (!strcmp ("Exif.GPSInfo.GPSAltitude", default_metadata_tags[i].tag))
+            {
+              gchar *new_value_clean[2];
+              new_value_clean[0] = strtok(value_clean," ");
+              strcpy(value_clean, new_value_clean[0]);
+            }
+
+          value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+          if (! strcmp ("single", default_metadata_tags[i].mode))
+            {
+              gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+            }
+          else if (!strcmp ("multi", default_metadata_tags[i].mode))
+            {
+              GtkTextBuffer *buffer;
+              buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+              gtk_text_buffer_set_text (buffer, value_utf, -1);
+            }
+          else if (!strcmp ("list", default_metadata_tags[i].mode))
+            {
+              if (!strcmp ("Xmp.plus.CopyrightOwner", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               store_index;
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  // COPYRIGHT OWNER - NAME
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_CR_OWNER_NAME);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (cr_owner_name_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_CR_OWNER_NAME));
+                    }
+
+                  // COPYRIGHT OWNER - ID
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_CR_OWNER_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (cr_owner_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_CR_OWNER_ID));
+                    }
+
+                  store_index = 0;
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_CR_OWNER_NAME, NULL,
+                                              COL_CR_OWNER_ID, NULL,
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_CR_OWNER_NAME, NULL,
+                                              COL_CR_OWNER_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.ImageCreator", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               store_index;
+                  gchar              arr1[256][256];
+                  gchar              arr2[256][256];
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  // IMAGE CREATOR - NAME
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_IMG_CR8_NAME);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (img_cr8_name_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_IMG_CR8_NAME));
+                    }
+
+                  // IMAGE CREATOR - ID
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_IMG_CR8_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (img_cr8_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_IMG_CR8_ID));
+                    }
+
+                  store_index = 0;
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_IMG_CR8_NAME, &arr1[item],
+                                              COL_IMG_CR8_ID, &arr2[item],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_IMG_CR8_NAME, NULL,
+                                              COL_IMG_CR8_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.ArtworkOrObject",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               store_index;
+                  gchar              arr1[256][256];
+                  gchar              arr2[256][256];
+                  gchar              arr3[256][256];
+                  gchar              arr4[256][256];
+                  gchar              arr5[256][256];
+                  gchar              arr6[256][256];
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* ARTWORK OR OBJECT - TITLE */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_TITLE);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_title_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_TITLE));
+                    }
+
+                  /* ARTWORK OR OBJECT - DATE CREATED */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_DATE_CREAT);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_date_creat_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_DATE_CREAT));
+                    }
+
+                  /* ARTWORK OR OBJECT - CREATOR */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_CREATOR);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_creator_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_CREATOR));
+                    }
+
+                  /* ARTWORK OR OBJECT - SOURCE */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_SOURCE);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_source_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_SOURCE));
+                    }
+
+                  /* ARTWORK OR OBJECT - SOURCE INVENTORY ID */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_SRC_INV_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_source_inv_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_SRC_INV_ID));
+                    }
+
+                  /* ARTWORK OR OBJECT - COPYRIGHT NOTICE */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_CR_NOT);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_copyright_notice_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_CR_NOT));
+                    }
+
+                  store_index = 0;
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_AOO_TITLE, &arr1[item],
+                                              COL_AOO_DATE_CREAT, &arr2[item],
+                                              COL_AOO_CREATOR, &arr3[item],
+                                              COL_AOO_SOURCE, &arr4[item],
+                                              COL_AOO_SRC_INV_ID, &arr5[item],
+                                              COL_AOO_CR_NOT, &arr6[item],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_AOO_TITLE, NULL,
+                                              COL_AOO_DATE_CREAT, NULL,
+                                              COL_AOO_CREATOR, NULL,
+                                              COL_AOO_SOURCE, NULL,
+                                              COL_AOO_SRC_INV_ID, NULL,
+                                              COL_AOO_CR_NOT, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.RegistryId", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               store_index;
+                  gchar              arr1[256][256];
+                  gchar              arr2[256][256];
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* LOCATION SHOWN - SUB LOCATION */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_REGSITRY_ORG_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (reg_org_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_REGSITRY_ORG_ID));
+                    }
+
+                  /* LOCATION SHOWN - CITY */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+                                                     COL_REGSITRY_ITEM_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (reg_item_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_REGSITRY_ITEM_ID));
+                    }
+
+                  store_index = 0;
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_REGSITRY_ORG_ID, &arr1[item],
+                                              COL_REGSITRY_ITEM_ID, &arr2[item],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_REGSITRY_ORG_ID, NULL,
+                                              COL_REGSITRY_ITEM_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.OrganisationInImageName",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar             *str;
+                  gint               i_ctr;
+                  gint               store_index;
+                  gchar              arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL; i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (organisation_image_name_cell_edited_callback), 
treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_ORG_IMG_NAME));
+                    }
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_ORG_IMG_NAME, &arr[item],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_ORG_IMG_NAME, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.OrganisationInImageCode",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar              *str;
+                  int                i_ctr;
+                  int                store_index;
+                  gchar               arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL; i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (organisation_image_code_cell_edited_callback), 
treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_ORG_IMG_CODE));
+                    }
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_ORG_IMG_CODE, &arr[item],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_ORG_IMG_CODE, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.PropertyReleaseID",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar              *str;
+                  int                i_ctr;
+                  int                store_index;
+                  gchar               arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL; i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (prop_rel_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_PROP_REL_ID));
+                    }
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_PROP_REL_ID, &arr[item],
+                                              -1);
+                        }
+                      if (store_index == 1)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_PROP_REL_ID, NULL,
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_PROP_REL_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.ModelReleaseID", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar              *str;
+                  int                i_ctr;
+                  int                store_index;
+                  gchar               arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL; i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (mod_rel_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_PROP_REL_ID));
+                    }
+
+                  if (store_index > 0)
+                    {
+                      for (int item = 0; item < store_index; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_MOD_REL_ID, &arr[item],
+                                              -1);
+                        }
+                      if (store_index == 1)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_MOD_REL_ID, NULL,
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_MOD_REL_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+            }
+          else if (!strcmp ("combo", default_metadata_tags[i].mode))
+            {
+              gint32 data;
+
+              data = 0;
+              if (!strcmp ("Exif.GPSInfo.GPSLatitudeRef", default_metadata_tags[i].tag))
+                {
+                  if (strncmp ("N", value, 1) == 0)
+                    {
+                      data = 1;
+                    }
+                  else if (strncmp ("S", value, 1) == 0)
+                    {
+                      data = 2;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+              else if (!strcmp ("Exif.GPSInfo.GPSLongitudeRef",
+                                default_metadata_tags[i].tag))
+                {
+                  if (strncmp ("E", value, 1) == 0)
+                    {
+                      data = 1;
+                    }
+                  else if (strncmp ("W", value, 1) == 0)
+                    {
+                      data = 2;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+              else if (!strcmp ("Exif.GPSInfo.GPSAltitudeRef",
+                                default_metadata_tags[i].tag))
+                {
+                  if (strncmp ("A", value, 1) == 0)
+                    {
+                      data = 1;
+                    }
+                  else if (strncmp ("B", value, 1) == 0)
+                    {
+                      data = 2;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+              else if (!strcmp ("Xmp.xmp.Rating", default_metadata_tags[i].tag))
+                {
+                  if (!strcmp ("1", value))
+                    {
+                      data = 1;
+                    }
+                  else if (!strcmp ("2", value))
+                    {
+                      data = 2;
+                    }
+                  else if (!strcmp ("3", value))
+                    {
+                      data = 3;
+                    }
+                  else if (!strcmp ("4", value))
+                    {
+                      data = 4;
+                    }
+                  else if (!strcmp ("5", value))
+                    {
+                      data = 5;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+              else if (!strcmp ("Xmp.xmpRights.Marked", default_metadata_tags[i].tag))
+                {
+                  if (!strcmp ("True", value))
+                    {
+                      data = 1;
+                    }
+                  else if (!strcmp ("False", value))
+                    {
+                      data = 2;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+              else if (!strcmp ("Xmp.photoshop.Urgency", default_metadata_tags[i].tag))
+                {
+                  if (!strcmp ("1", value))
+                    {
+                      data = 1;
+                    }
+                  else if (!strcmp ("2", value))
+                    {
+                      data = 2;
+                    }
+                  else if (!strcmp ("3", value))
+                    {
+                      data = 3;
+                    }
+                  else if (!strcmp ("4", value))
+                    {
+                      data = 4;
+                    }
+                  else if (!strcmp ("5", value))
+                    {
+                      data = 5;
+                    }
+                  else if (!strcmp ("6", value))
+                    {
+                      data = 6;
+                    }
+                  else if (!strcmp ("7", value))
+                    {
+                      data = 7;
+                    }
+                  else if (!strcmp ("8", value))
+                    {
+                      data = 8;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+              else if (!strcmp ("Xmp.plus.MinorModelAgeDisclosure",
+                                default_metadata_tags[i].tag))
+                {
+                  if (!strcmp ("Age Unknown", value))
+                    {
+                      data = 0;
+                    }
+                  else if (!strcmp ("Age 25 or Over", value))
+                    {
+                      data = 1;
+                    }
+                  else if (!strcmp ("Age 24", value))
+                    {
+                      data = 2;
+                    }
+                  else if (!strcmp ("Age 23", value))
+                    {
+                      data = 3;
+                    }
+                  else if (!strcmp ("Age 22", value))
+                    {
+                      data = 4;
+                    }
+                  else if (!strcmp ("Age 21", value))
+                    {
+                      data = 5;
+                    }
+                  else if (!strcmp ("Age 20", value))
+                    {
+                      data = 6;
+                    }
+                  else if (!strcmp ("Age 19", value))
+                    {
+                      data = 7;
+                    }
+                  else if (!strcmp ("Age 18", value))
+                    {
+                      data = 8;
+                    }
+                  else if (!strcmp ("Age 17", value))
+                    {
+                      data = 9;
+                    }
+                  else if (!strcmp ("Age 16", value))
+                    {
+                      data = 10;
+                    }
+                  else if (!strcmp ("Age 15", value))
+                    {
+                      data = 11;
+                    }
+                  else if (!strcmp ("Age 14 or Under", value))
+                    {
+                      data = 12;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+              else if (!strcmp ("Xmp.plus.ModelReleaseStatus",
+                                default_metadata_tags[i].tag))
+                {
+                  for (int loop = 0; loop < 4; loop++)
+                    {
+                      if (!strcmp (modelreleasestatus[loop].data, value))
+                        {
+                          gtk_combo_box_set_active (GTK_COMBO_BOX(widget), loop);
+                          break;
+                        }
+                      if (!strcmp (modelreleasestatus[loop].display, value))
+                        {
+                          gtk_combo_box_set_active (GTK_COMBO_BOX(widget), loop);
+                          break;
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.DigitalSourceType",
+                                default_metadata_tags[i].tag))
+                {
+                  for (int loop = 0; loop < 4; loop++)
+                    {
+                      if (!strcmp (digitalsourcetype[loop].data, value))
+                        {
+                          gtk_combo_box_set_active (GTK_COMBO_BOX(widget), loop);
+                          break;
+                        }
+                      if (!strcmp (digitalsourcetype[loop].display, value))
+                        {
+                          gtk_combo_box_set_active (GTK_COMBO_BOX(widget), loop);
+                          break;
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.PropertyReleaseStatus",
+                                default_metadata_tags[i].tag))
+                {
+                  for (int loop = 0; loop < 4; loop++)
+                    {
+                      if (!strcmp (propertyreleasestatus[loop].data, value))
+                        {
+                          gtk_combo_box_set_active (GTK_COMBO_BOX(widget), loop);
+                          break;
+                        }
+                      if (!strcmp (propertyreleasestatus[loop].display, value))
+                        {
+                          gtk_combo_box_set_active (GTK_COMBO_BOX(widget), loop);
+                          break;
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.DICOM.PatientSex", default_metadata_tags[i].tag))
+                {
+                  if (!strcmp ("male", value))
+                    {
+                      data = 1;
+                    }
+                  else if (!strcmp ("female", value))
+                    {
+                      data = 2;
+                    }
+                  else if (!strcmp ("other", value))
+                    {
+                      data = 3;
+                    }
+                  gtk_combo_box_set_active (GTK_COMBO_BOX(widget), data);
+                }
+            }
+        }
+      else
+        {
+          if (!strcmp ("list", default_metadata_tags[i].mode))
+            {
+              if (!strcmp ("Xmp.plus.Licensor", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkTreeModel      *phonemodel;
+                  GtkListStore      *liststore;
+                  GtkListStore      *phonestore;
+                  GtkTreeIter        iter;
+                  GtkTreeIter        phoneiter;
+                  gint               counter;
+
+                  counter =
+                    count_tags(metadata, (gchar*)licensor_header,
+                               (char**)licensor, licensor_items);
+
+                  get_tags(metadata, (gchar*)licensor_header,
+                           (char**)&licensor, licensor_items, counter);
+
+                  phonestore = gtk_list_store_new(1, G_TYPE_STRING);
+                  gtk_list_store_append (phonestore, &phoneiter);
+                  gtk_list_store_set (phonestore, &phoneiter, 0, "Unknown", -1);
+                  for (int i=1; i < 6; i++)
+                    {
+                      gtk_list_store_append (phonestore, &phoneiter);
+                      gtk_list_store_set (phonestore, &phoneiter, 0, phone_types[i].display, -1);
+                    }
+                  phonemodel = GTK_TREE_MODEL (phonestore);
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* LICENSOR - NAME */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LICENSOR_NAME);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_name_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_NAME));
+                    }
+
+                  /* LICENSOR - ID */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LICENSOR_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_ID));
+                    }
+
+                  /* LICENSOR - PHONE NUMBER 1 */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LICENSOR_PHONE1);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_phone1_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_PHONE1));
+                    }
+
+                  /* LICENSOR - PHONE TYPE 1 */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+                                                     COL_LICENSOR_PHONE_TYPE1);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    "text-column", 0,
+                                    "has-entry", FALSE,
+                                    "model", phonemodel,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_phone_type1_cell_edited_callback), widget);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_PHONE_TYPE1));
+                    }
+
+                  /* LICENSOR - PHONE NUMBER 2 */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LICENSOR_PHONE2);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_phone2_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_PHONE2));
+                    }
+
+                  /* LICENSOR - PHONE TYPE 2 */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+                                                     COL_LICENSOR_PHONE_TYPE2);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    "text-column", 0,
+                                    "has-entry", FALSE,
+                                    "model", phonemodel,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_phone_type2_cell_edited_callback), widget);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_PHONE_TYPE2));
+                    }
+
+                  /* LICENSOR - EMAIL */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LICENSOR_EMAIL);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_email_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_EMAIL));
+                    }
+
+                  /* LICENSOR - WEB ADDRESS */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LICENSOR_WEB);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (licensor_web_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LICENSOR_WEB));
+                    }
+
+                  if (counter > 0)
+                    {
+                      for (int item = 0; item < counter; item++)
+                        {
+                          gchar type1[256];
+                          gchar type2[256];
+
+                          strcpy((gchar*)&type1, phone_types[0].display);
+                          strcpy((gchar*)&type2, phone_types[0].display);
+
+                          for (int types = 0; types < 6; types++)
+                            {
+                              if (strcmp(tagdata[item][3], phone_types[types].data) == 0)
+                                {
+                                  strcpy((gchar*)&type1, phone_types[types].display);
+                                }
+                              if (strcmp(tagdata[item][5], phone_types[types].data) == 0)
+                                {
+                                  strcpy((gchar*)&type2, phone_types[types].display);
+                                }
+                            }
+
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_LICENSOR_NAME, tagdata[item][0],
+                                              COL_LICENSOR_ID, tagdata[item][1],
+                                              COL_LICENSOR_PHONE1, tagdata[item][2],
+                                              COL_LICENSOR_PHONE_TYPE1, (gchar*)&type1,
+                                              COL_LICENSOR_PHONE2, tagdata[item][4],
+                                              COL_LICENSOR_PHONE_TYPE2, (gchar*)&type2,
+                                              COL_LICENSOR_EMAIL, tagdata[item][6],
+                                              COL_LICENSOR_WEB, tagdata[item][7],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_LICENSOR_NAME, NULL,
+                                              COL_LICENSOR_ID, NULL,
+                                              COL_LICENSOR_PHONE1, NULL,
+                                              COL_LICENSOR_PHONE_TYPE1, phone_types[0].display,
+                                              COL_LICENSOR_PHONE2, NULL,
+                                              COL_LICENSOR_PHONE_TYPE1, phone_types[0].display,
+                                              COL_LICENSOR_EMAIL, NULL,
+                                              COL_LICENSOR_WEB, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.CopyrightOwner", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               counter;
+
+                  counter =
+                    count_tags(metadata, (gchar*)copyrightowner_header,
+                               (char**)copyrightowner, copyrightowner_items);
+
+                  get_tags(metadata, (gchar*)copyrightowner_header,
+                           (char**)&copyrightowner, copyrightowner_items, counter);
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* COPYRIGHT OWNER - NAME */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_CR_OWNER_NAME);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (cr_owner_name_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_CR_OWNER_NAME));
+                    }
+
+                  /* COPYRIGHT OWNER - ID */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_CR_OWNER_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (cr_owner_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_CR_OWNER_ID));
+                    }
+
+                  if (counter > 0)
+                    {
+                      for (int item = 0; item < counter; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_CR_OWNER_NAME, tagdata[item][0],
+                                              COL_CR_OWNER_ID, tagdata[item][1],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_CR_OWNER_NAME, NULL,
+                                              COL_CR_OWNER_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.ImageCreator", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               counter;
+
+                  counter =
+                    count_tags(metadata, (gchar*)imagecreator_header,
+                               (char**)imagecreator, imagecreator_items);
+
+                  get_tags(metadata, (gchar*)imagecreator_header,
+                           (char**)&imagecreator, imagecreator_items, counter);
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* IMAGE CREATOR - NAME */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_IMG_CR8_NAME);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (img_cr8_name_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_IMG_CR8_NAME));
+                    }
+
+                  /* IMAGE CREATOR - ID */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_IMG_CR8_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (img_cr8_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_IMG_CR8_ID));
+                    }
+
+                  if (counter > 0)
+                    {
+                      for (int item = 0; item < counter; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_IMG_CR8_NAME, tagdata[item][0],
+                                              COL_IMG_CR8_ID, tagdata[item][1],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_IMG_CR8_NAME, NULL,
+                                              COL_IMG_CR8_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.ArtworkOrObject",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               counter;
+
+                  counter =
+                    count_tags(metadata, (gchar*)artworkorobject_header,
+                               (char**)artworkorobject, artworkorobject_items);
+
+                  get_tags(metadata, (gchar*)artworkorobject_header,
+                           (char**)&artworkorobject, artworkorobject_items, counter);
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* ARTWORK OR OBJECT - TITLE */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_TITLE);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_title_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_TITLE));
+                    }
+
+                  /* ARTWORK OR OBJECT - DATED CREATED */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_DATE_CREAT);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_date_creat_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_DATE_CREAT));
+                    }
+
+                  /* ARTWORK OR OBJECT - CREATOR */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_CREATOR);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_creator_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_CREATOR));
+                    }
+
+                  /* ARTWORK OR OBJECT - SOURCE */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_SOURCE);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_source_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_SOURCE));
+                    }
+
+                  /* ARTWORK OR OBJECT - SOURCE INVENTORY ID */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_SRC_INV_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_source_inv_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_SRC_INV_ID));
+                    }
+
+                  /* ARTWORK OR OBJECT - COPYRIGHT NOTICE */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_AOO_CR_NOT);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (aoo_copyright_notice_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_AOO_CR_NOT));
+                    }
+
+                  if (counter > 0)
+                    {
+                      for (int item = 0; item < counter; item++)
+                        {
+                          /* remove substring for language id in title field */
+                          remove_substring (tagdata[item][4], lang_default);
+                          if (strstr(tagdata[item][4], " ") != NULL)
+                            {
+                              remove_substring (tagdata[item][4], " ");
+                            }
+                          remove_substring (tagdata[item][4], bag_default);
+                          if (strstr(tagdata[item][4], " ") != NULL)
+                            {
+                              remove_substring (tagdata[item][4], " ");
+                            }
+                          remove_substring (tagdata[item][4], seq_default);
+                          if (strstr(tagdata[item][4], " ") != NULL)
+                            {
+                              remove_substring (tagdata[item][4], " ");
+                            }
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_AOO_TITLE, tagdata[item][4],
+                                              COL_AOO_DATE_CREAT, tagdata[item][0],
+                                              COL_AOO_CREATOR, tagdata[item][5],
+                                              COL_AOO_SOURCE, tagdata[item][1],
+                                              COL_AOO_SRC_INV_ID, tagdata[item][2],
+                                              COL_AOO_CR_NOT, tagdata[item][3],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_AOO_TITLE, NULL,
+                                              COL_AOO_DATE_CREAT, NULL,
+                                              COL_AOO_CREATOR, NULL,
+                                              COL_AOO_SOURCE, NULL,
+                                              COL_AOO_SRC_INV_ID, NULL,
+                                              COL_AOO_CR_NOT, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.RegistryId", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               counter;
+
+                  counter =
+                    count_tags(metadata, (gchar*)registryid_header,
+                               (char**)registryid, registryid_items);
+
+                  get_tags(metadata, (gchar*)registryid_header,
+                           (char**)&registryid, registryid_items, counter);
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* REGISTRY - ORGANIZATION ID */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_REGSITRY_ORG_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (reg_org_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_REGSITRY_ORG_ID));
+                    }
+
+                  /* REGISTRY - ITEM ID */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+                                                     COL_REGSITRY_ITEM_ID);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (reg_item_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_REGSITRY_ITEM_ID));
+                    }
+
+                  if (counter > 0)
+                    {
+                      for (int item = 0; item < counter; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_REGSITRY_ORG_ID, tagdata[item][0],
+                                              COL_REGSITRY_ITEM_ID, tagdata[item][1],
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_REGSITRY_ORG_ID, NULL,
+                                              COL_REGSITRY_ITEM_ID, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.LocationShown",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gint               counter;
+
+                  counter =
+                    count_tags(metadata, (gchar*)locationshown_header,
+                               (char**)locationshown, locationshown_items);
+
+                  get_tags(metadata, (gchar*)locationshown_header,
+                           (char**)&locationshown, locationshown_items, counter);
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  /* LOCATION SHOWN - SUB LOCATION */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LOC_SHO_SUB_LOC);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (loc_sho_sub_loc_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LOC_SHO_SUB_LOC));
+                    }
+
+                  /* LOCATION SHOWN - CITY */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LOC_SHO_CITY);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (loc_sho_city_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LOC_SHO_CITY));
+                    }
+
+                  /* LOCATION SHOWN - STATE PROVINCE */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+                                                     COL_LOC_SHO_STATE_PROV);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (loc_sho_state_prov_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LOC_SHO_STATE_PROV));
+                    }
+
+                  /* LOCATION SHOWN - COUNTRY */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), COL_LOC_SHO_CNTRY);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (loc_sho_cntry_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LOC_SHO_CNTRY));
+                    }
+
+                  /* LOCATION SHOWN - COUNTRY ISO */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+                                                     COL_LOC_SHO_CNTRY_ISO);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (loc_sho_cntry_iso_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LOC_SHO_CNTRY_ISO));
+                    }
+
+                  /* LOCATION SHOWN - WORLD REGION */
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+                                                     COL_LOC_SHO_CNTRY_WRLD_REG);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (loc_sho_wrld_reg_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_LOC_SHO_CNTRY_WRLD_REG));
+                    }
+
+                  if (counter > 0)
+                    {
+                      for (int item = 0; item < counter; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_LOC_SHO_SUB_LOC, tagdata[item][0],
+                                              COL_LOC_SHO_CITY, tagdata[item][1],
+                                              COL_LOC_SHO_STATE_PROV, tagdata[item][2],
+                                              COL_LOC_SHO_CNTRY, tagdata[item][3],
+                                              COL_LOC_SHO_CNTRY_ISO, tagdata[item][4],
+                                              COL_LOC_SHO_CNTRY_WRLD_REG, tagdata[item][5],
+                                              -1);
+                        }
+                      if (counter == 1)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_LOC_SHO_SUB_LOC, NULL,
+                                              COL_LOC_SHO_CITY, NULL,
+                                              COL_LOC_SHO_STATE_PROV, NULL,
+                                              COL_LOC_SHO_CNTRY, NULL,
+                                              COL_LOC_SHO_CNTRY_ISO, NULL,
+                                              COL_LOC_SHO_CNTRY_WRLD_REG, NULL,
+                                              -1);
+                        }
+                    }
+                  else
+                    {
+                      for (int item = 0; item < 2; item++)
+                        {
+                          gtk_list_store_append (liststore, &iter);
+                          gtk_list_store_set (liststore, &iter,
+                                              COL_LOC_SHO_SUB_LOC, NULL,
+                                              COL_LOC_SHO_CITY, NULL,
+                                              COL_LOC_SHO_STATE_PROV, NULL,
+                                              COL_LOC_SHO_CNTRY, NULL,
+                                              COL_LOC_SHO_CNTRY_ISO, NULL,
+                                              COL_LOC_SHO_CNTRY_WRLD_REG, NULL,
+                                              -1);
+                        }
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.OrganisationInImageName",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar             *str;
+                  gint               i_ctr;
+                  gint               store_index;
+                  gchar              arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL; i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (organisation_image_name_cell_edited_callback), 
treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_ORG_IMG_NAME));
+                    }
+
+                  for (int item = 0; item < 2; item++)
+                    {
+                      gtk_list_store_append (liststore, &iter);
+                      gtk_list_store_set (liststore, &iter,
+                                          COL_ORG_IMG_NAME, NULL,
+                                          -1);
+                    }
+                }
+              else if (!strcmp ("Xmp.iptcExt.OrganisationInImageCode",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar              *str;
+                  int                i_ctr;
+                  int                store_index;
+                  gchar               arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL; i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (organisation_image_code_cell_edited_callback), 
treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_ORG_IMG_CODE));
+                    }
+
+                  for (int item = 0; item < 2; item++)
+                    {
+                      gtk_list_store_append (liststore, &iter);
+                      gtk_list_store_set (liststore, &iter,
+                                          COL_ORG_IMG_CODE, NULL,
+                                          -1);
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.PropertyReleaseID",
+                                default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar              *str;
+                  int                i_ctr;
+                  int                store_index;
+                  gchar               arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL;
+                      i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (prop_rel_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_PROP_REL_ID));
+                    }
+
+                  for (int item = 0; item < 2; item++)
+                    {
+                      gtk_list_store_append (liststore, &iter);
+                      gtk_list_store_set (liststore, &iter,
+                                          COL_PROP_REL_ID, NULL,
+                                          -1);
+                    }
+                }
+              else if (!strcmp ("Xmp.plus.ModelReleaseID", default_metadata_tags[i].tag))
+                {
+                  GList             *rlist;
+                  GList             *r;
+                  GtkTreeViewColumn *column;
+                  GtkCellRenderer   *renderer;
+                  GtkTreeModel      *treemodel;
+                  GtkListStore      *liststore;
+                  GtkTreeIter        iter;
+                  gchar              *str;
+                  int                i_ctr;
+                  int                store_index;
+                  gchar               arr[256][256];
+
+                  /* seperate list on commas */
+                  store_index = 0;
+                  for(i_ctr=0, str=strtok(value,",;"); str!= NULL;
+                      i_ctr++, str=strtok(NULL,",;"))
+                    {
+                      /* remove leading whitespace */
+                      int l = strlen(str);
+                      while(isspace(str[l - 1])) --l;
+                      while(* str && isspace(* str)) ++str, --l;
+
+                      /* stuff into array */
+                      strcpy( arr[i_ctr], str);
+                      store_index++;
+                    }
+
+                  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+                  treemodel = GTK_TREE_MODEL (liststore);
+
+                  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
+                                                 widget)),
+                                               GTK_SELECTION_SINGLE);
+
+                  column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+                  rlist = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+                  for (r = rlist; r != NULL; r = r->next)
+                    {
+                      renderer = (GtkCellRenderer*) r->data;
+                      g_object_set (renderer,
+                                    "editable", TRUE,
+                                    NULL);
+                      g_signal_connect (renderer, "edited",
+                                        G_CALLBACK (mod_rel_id_cell_edited_callback), treemodel);
+                      g_object_set_data (G_OBJECT (renderer),
+                                         "column", GINT_TO_POINTER (COL_PROP_REL_ID));
+                    }
+
+                  for (int item = 0; item < 2; item++)
+                    {
+                      gtk_list_store_append (liststore, &iter);
+                      gtk_list_store_set (liststore, &iter,
+                                          COL_PROP_REL_ID, NULL,
+                                          -1);
+                    }
+                }
+            }
+        }
+    }
+
+  /* Set creation date */
+  entry_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "create_date_button"));
+  g_signal_connect(entry_widget, "clicked",
+                   G_CALLBACK (on_create_date_button_clicked),
+                   GTK_WIDGET (gtk_builder_get_object (builder,
+                               "Xmp.photoshop.DateCreated")));
+
+  /* Set patient dob date */
+  entry_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "dob_date_button"));
+  g_signal_connect(entry_widget, "clicked",
+                   G_CALLBACK (on_patient_dob_date_button_clicked),
+                   GTK_WIDGET (gtk_builder_get_object (builder,
+                               "Xmp.DICOM.PatientDOB")));
+
+  /* Set study date */
+  entry_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "study_date_button"));
+  g_signal_connect(entry_widget, "clicked",
+                   G_CALLBACK (on_study_date_button_clicked),
+                   GTK_WIDGET (gtk_builder_get_object (builder,
+                               "Xmp.DICOM.StudyDateTime")));
+
+  /* Set series date */
+  entry_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "series_date_button"));
+  g_signal_connect(entry_widget, "clicked",
+                   G_CALLBACK (on_series_date_button_clicked),
+                   GTK_WIDGET (gtk_builder_get_object (builder,
+                               "Xmp.DICOM.SeriesDateTime")));
+}
+
+/* ============================================================================
+ * ==[ WRITE METADATA ]========================================================
+ * ============================================================================
+ */
+
+void
+metadata_editor_write_callback (GtkWidget  *dialog,
+                                GtkBuilder *builder,
+                                gint32      image_id)
+{
+  GimpMetadata     *g_metadata;
+  gint              max_elements;
+  gint              i;
+  GtkWidget        *list_widget;
+  GtkListStore     *liststore;
+  GtkTreeIter       iter;
+  GtkTreeModel     *treemodel;
+  gchar            *rc_data;
+  gint              number_of_rows;
+  gchar             output_data[256 * 1024];
+  gchar             tag[1024];
+  gint              counter;
+
+  i = 0;
+
+  g_metadata = gimp_image_get_metadata (image_id);
+
+  gimp_metadata_add_xmp_history(GEXIV2_METADATA (g_metadata), "metadata");
+
+  /* DO ORG IMG NAME (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Xmp.iptcExt.OrganisationInImageName"));
+
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_ORG_IMG_NAME, &rc_data,
+                              -1);
+          if (rc_data && strlen(rc_data) > 0)
+            {
+              strcat((gchar*)&output_data, rc_data);
+              if (row + 1 < number_of_rows)
+                strcat((gchar*)&output_data, ", ");
+            }
+        }
+    }
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             "Xmp.iptcExt.OrganisationInImageName");
+
+  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                       "Xmp.iptcExt.OrganisationInImageName",
+                                       (gchar*)&output_data))
+    {
+      g_printerr("failed to set tag [Xmp.iptcExt.OrganisationInImageName]\n");
+    }
+
+  /* DO ORG IMG CODE (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder,
+                                        "Xmp.iptcExt.OrganisationInImageCode"));
+
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_ORG_IMG_CODE, &rc_data,
+                              -1);
+          if (rc_data && strlen(rc_data) > 0)
+            {
+              strcat((gchar*)&output_data, rc_data);
+              if (row + 1 < number_of_rows)
+                strcat((gchar*)&output_data, ", ");
+            }
+        }
+    }
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             "Xmp.iptcExt.OrganisationInImageCode");
+
+  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                       "Xmp.iptcExt.OrganisationInImageCode",
+                                       (gchar*)&output_data))
+    {
+      g_printerr("failed to set tag [Xmp.iptcExt.OrganisationInImageCode]\n");
+    }
+
+  /* DO MODEL RELEASE (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.plus.ModelReleaseID"));
+
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_MOD_REL_ID, &rc_data,
+                              -1);
+          if (rc_data && strlen(rc_data) > 0)
+            {
+              strcat((gchar*)&output_data, rc_data);
+              if (row + 1 < number_of_rows)
+                strcat((gchar*)&output_data, ", ");
+            }
+        }
+    }
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             "Xmp.plus.ModelReleaseID");
+
+  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                       "Xmp.plus.ModelReleaseID",
+                                       (gchar*)&output_data))
+    {
+      g_printerr("failed to set tag [Xmp.plus.ModelReleaseID]\n");
+    }
+
+  /* DO PROPERTY RELEASE (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.plus.PropertyReleaseID"));
+
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_PROP_REL_ID, &rc_data,
+                              -1);
+          if (rc_data && strlen(rc_data) > 0)
+            {
+              strcat((gchar*)&output_data, rc_data);
+              if (row + 1 < number_of_rows)
+                strcat((gchar*)&output_data, ", ");
+            }
+        }
+    }
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             "Xmp.plus.PropertyReleaseID");
+
+  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                       "Xmp.plus.PropertyReleaseID",
+                                       (gchar*)&output_data))
+    {
+      g_printerr("failed to set tag [Xmp.plus.PropertyReleaseID]\n");
+    }
+
+  /* DO LOCATION SHOWN (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.iptcExt.LocationShown"));
+
+  liststore = GTK_LIST_STORE (gtk_tree_view_get_model((GtkTreeView *)
+                              list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children (GTK_TREE_MODEL(liststore), NULL);
+
+  /* CLEAR LOCATION SHOW DATA */
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             locationshown_header);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < 256; row++)
+    {
+      for (int item = 0; item < locationshown_items; item++)
+        {
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  locationshown_header, row, locationshown[item]);
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+        }
+    }
+
+  /* SET LOCATION SHOW DATA */
+  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                     "Xmp.iptcExt.LocationShown",
+                                     GEXIV2_STRUCTURE_XA_BAG);
+
+  counter = 1;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gchar *tag_data;
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LOC_SHO_SUB_LOC,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  locationshown_header, counter, locationshown[0]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LOC_SHO_CITY,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  locationshown_header, counter, locationshown[1]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LOC_SHO_STATE_PROV,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  locationshown_header, counter, locationshown[2]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LOC_SHO_CNTRY,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  locationshown_header, counter, locationshown[3]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LOC_SHO_CNTRY_ISO,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  locationshown_header, counter, locationshown[4]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LOC_SHO_CNTRY_WRLD_REG,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  locationshown_header, counter, locationshown[5]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          counter++;
+        }
+    }
+
+  /* DO ARTWORK OR OBJECT (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.iptcExt.ArtworkOrObject"));
+
+  liststore = GTK_LIST_STORE (gtk_tree_view_get_model((GtkTreeView *)
+                              list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children (GTK_TREE_MODEL(liststore), NULL);
+
+  /* CLEAR ARTWORK OR OBJECT DATA */
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             artworkorobject_header);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < 256; row++)
+    {
+      for (int item = 0; item < artworkorobject_items; item++)
+        {
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  artworkorobject_header, row, artworkorobject[item]);
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+        }
+    }
+
+  /* SET ARTWORK OR OBJECT DATA */
+
+  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                     "Xmp.iptcExt.ArtworkOrObject",
+                                     GEXIV2_STRUCTURE_XA_BAG);
+
+  counter = 1;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gchar *tag_data;
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_AOO_TITLE,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  artworkorobject_header, counter, artworkorobject[0]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_AOO_DATE_CREAT,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  artworkorobject_header, counter, artworkorobject[1]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_AOO_CREATOR,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  artworkorobject_header, counter, artworkorobject[2]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_AOO_SOURCE,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  artworkorobject_header, counter, artworkorobject[3]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_AOO_SRC_INV_ID,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  artworkorobject_header, counter, artworkorobject[4]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_AOO_CR_NOT,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  artworkorobject_header, counter, artworkorobject[5]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          counter++;
+        }
+    }
+
+  /* DO REGISTRY ID (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.iptcExt.RegistryId"));
+
+  liststore = GTK_LIST_STORE (gtk_tree_view_get_model((GtkTreeView *)
+                              list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children (GTK_TREE_MODEL(liststore), NULL);
+
+  /* CLEAR REGISTRY ID DATA */
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             registryid_header);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < 256; row++)
+    {
+      for (int item = 0; item < registryid_items; item++)
+        {
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  registryid_header, row, registryid[item]);
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+        }
+    }
+
+  /* SET REGISTRY ID DATA */
+
+  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                     "Xmp.iptcExt.RegistryId",
+                                     GEXIV2_STRUCTURE_XA_BAG);
+
+  counter = 1;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gchar *tag_data;
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_REGSITRY_ORG_ID,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  registryid_header, counter, registryid[0]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_REGSITRY_ITEM_ID,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  registryid_header, counter, registryid[1]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          counter++;
+        }
+    }
+
+  /* DO IMAGE CREATOR (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.plus.ImageCreator"));
+
+  liststore = GTK_LIST_STORE (gtk_tree_view_get_model((GtkTreeView *)
+                              list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children (GTK_TREE_MODEL(liststore), NULL);
+
+  /* CLEAR IMAGE CREATOR DATA */
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             imagecreator_header);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < 256; row++)
+    {
+      for (int item = 0; item < imagecreator_items; item++)
+        {
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  imagecreator_header, row, imagecreator[item]);
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+        }
+    }
+
+  /* SET IMAGE CREATOR DATA */
+
+  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                     "Xmp.plus.ImageCreator",
+                                     GEXIV2_STRUCTURE_XA_SEQ);
+
+  counter = 1;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gchar *tag_data;
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_IMG_CR8_NAME,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  imagecreator_header, counter, imagecreator[0]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_IMG_CR8_ID,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  imagecreator_header, counter, imagecreator[1]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          counter++;
+        }
+    }
+
+  /* DO COPYRIGHT OWNER (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.plus.CopyrightOwner"));
+
+  liststore = GTK_LIST_STORE (gtk_tree_view_get_model((GtkTreeView *)
+                              list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children (GTK_TREE_MODEL(liststore), NULL);
+
+  /* CLEAR COPYRIGHT OWNER DATA */
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             copyrightowner_header);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < 256; row++)
+    {
+      for (int item = 0; item < copyrightowner_items; item++)
+        {
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  copyrightowner_header, row, copyrightowner[item]);
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+        }
+    }
+
+  /* SET COPYRIGHT OWNER DATA */
+
+  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                     "Xmp.plus.CopyrightOwner",
+                                     GEXIV2_STRUCTURE_XA_SEQ);
+
+  counter = 1;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gchar *tag_data;
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_CR_OWNER_NAME,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  copyrightowner_header, counter, copyrightowner[0]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_CR_OWNER_ID,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  copyrightowner_header, counter, copyrightowner[1]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          counter++;
+        }
+    }
+
+  /* DO LICENSOR (LISTSTORE) */
+
+  list_widget =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Xmp.plus.Licensor"));
+
+  liststore = GTK_LIST_STORE (gtk_tree_view_get_model((GtkTreeView *)
+                              list_widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+
+  number_of_rows =
+    gtk_tree_model_iter_n_children (GTK_TREE_MODEL(liststore), NULL);
+
+  /* CLEAR LICENSOR DATA */
+
+  gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                             licensor_header);
+
+  output_data[0] = 0;
+  for (gint row = 0; row < 256; row++)
+    {
+      for (int item = 0; item < licensor_items; item++)
+        {
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, row, licensor[item]);
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+        }
+    }
+
+  /* SET LICENSOR DATA */
+
+  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                     "Xmp.plus.Licensor",
+                                     GEXIV2_STRUCTURE_XA_SEQ);
+
+  counter = 1;
+  for (gint row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          gchar *tag_data;
+          gchar type1[256];
+          gchar type2[256];
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_NAME,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[0]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_ID,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[1]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_PHONE1,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[2]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_PHONE_TYPE1,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[3]);
+
+          strcpy((gchar*)&type1, phone_types[0].data);
+          for (gint types = 0; types < 6; types++)
+            {
+              if (strcmp(tag_data, phone_types[types].display) == 0)
+                {
+                  strcpy((gchar*)&type1, phone_types[types].data);
+                  break;
+                }
+            }
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               (gchar*)&type1))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_PHONE2,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[4]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_PHONE_TYPE2,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[5]);
+
+          strcpy((gchar*)&type2, phone_types[0].data);
+          for (gint types = 0; types < 6; types++)
+            {
+              if (strcmp(tag_data, phone_types[types].display) == 0)
+                {
+                  strcpy((gchar*)&type2, phone_types[types].data);
+                  break;
+                }
+            }
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               (gchar*)&type2))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_EMAIL,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[6]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          gtk_tree_model_get (treemodel, &iter,
+                              COL_LICENSOR_WEB,
+                              &tag_data,
+                              -1);
+
+          g_sprintf((gchar*)&tag, "%s[%d]%s",
+                  licensor_header, counter, licensor[7]);
+
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     (gchar*)&tag);
+          if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                               (gchar*)&tag,
+                                               tag_data))
+            {
+              g_printerr("failed to set tag [%s]\n", (gchar*)&tag);
+            }
+
+          counter++;
+        }
+    }
+
+  /* DO CREATOR TAGS */
+
+  if (hasCreatorTagData(builder))
+    {
+      if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                           creatorContactInfoHeader.header,
+                                           "type=\"Struct\""))
+        {
+          g_printerr("failed to set tag [%s]\n", creatorContactInfoTags[i].tag);
+        }
+
+      for (i = 0; i < creatorContactInfoHeader.size; i++)
+        {
+          GObject *object = gtk_builder_get_object (builder,
+                            creatorContactInfoTags[i].id);
+
+          if (! strcmp ("single", creatorContactInfoTags[i].mode))
+            {
+              GtkEntry *entry = GTK_ENTRY (object);
+
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   creatorContactInfoTags[i].tag,
+                                                   gtk_entry_get_text (entry)))
+                {
+                  g_printerr("failed to set tag [%s]\n", creatorContactInfoTags[i].tag);
+                }
+            }
+          else if (!strcmp ("multi", default_metadata_tags[i].mode))
+            {
+              GtkTextView   *text_view = GTK_TEXT_VIEW (object);
+              GtkTextBuffer *buffer;
+              GtkTextIter    start;
+              GtkTextIter    end;
+              gchar         *text;
+
+              buffer = gtk_text_view_get_buffer (text_view);
+              gtk_text_buffer_get_start_iter (buffer, &start);
+              gtk_text_buffer_get_end_iter (buffer, &end);
+
+              text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   creatorContactInfoTags[i].tag,
+                                                   text))
+                {
+                  g_printerr("failed to set tag [%s]\n", creatorContactInfoTags[i].tag);
+                }
+
+              if (text)
+                g_free (text);
+            }
+        }
+    }
+
+  /* DO SINGLE, MULTI AND COMBO TAGS */
+
+  else
+    {
+      gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                 creatorContactInfoHeader.header);
+      for (i = 0; i < creatorContactInfoHeader.size; i++)
+        {
+          gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                     creatorContactInfoTags[i].tag);
+        }
+    }
+
+  max_elements = G_N_ELEMENTS (default_metadata_tags);
+
+  for (i = 0; i < max_elements; i++)
+    {
+      GObject *object = gtk_builder_get_object (builder,
+                        default_metadata_tags[i].tag);
+
+      /* SINGLE TAGS */
+
+      if (! strcmp ("single", default_metadata_tags[i].mode))
+        {
+          GtkEntry *entry = GTK_ENTRY (object);
+          gchar *value_entry = g_strdup(gtk_entry_get_text (entry));
+
+          if (!strcmp ("Exif.GPSInfo.GPSLongitude", default_metadata_tags[i].tag))
+            {
+              const gchar delimiters_dms[] = " deg'\"";
+              gchar *s = g_strdup(value_entry);
+              gchar lng[256];
+              gchar *str1;
+              gchar *str2;
+              gchar *str3;
+              if (strstr(s, "."))
+                {
+                  double degs;
+                  int deg;
+                  int min;
+                  int sec;
+
+                  degs = atof(s);
+                  if (degs < 0) degs *= -1;
+                  deg = (int)degs;
+                  min = (int)((degs - deg) * 60.f);
+                  sec = (int)((degs - (float)deg - (float)(min / 60.f)) * 60.f * 60.f);
+                  str1 = (gchar*) malloc(256);
+                  str2 = (gchar*) malloc(256);
+                  str3 = (gchar*) malloc(256);
+                  g_sprintf(str1, "%d", deg);
+                  g_sprintf(str2, "%d", min);
+                  g_sprintf(str3, "%d", sec);
+                }
+              else
+                {
+                  str1 = strtok(s, delimiters_dms);
+                  str2 = strtok(NULL, delimiters_dms);
+                  str3 = strtok(NULL, delimiters_dms);
+                }
+
+              if (str1 != NULL)
+                {
+                  strcpy((gchar*)&lng, str1);
+                  strcat((gchar*)&lng, "/1");
+                }
+              else
+                {
+                  strcpy((gchar*)&lng, "0/1");
+                }
+
+              if (str2 != NULL)
+                {
+                  strcat((gchar*)&lng, " ");
+                  strcat((gchar*)&lng, str2);
+                  strcat((gchar*)&lng, "/1");
+                }
+              else
+                {
+                  strcat((gchar*)&lng, " ");
+                  strcat((gchar*)&lng, "0/1");
+                }
+
+              if (str3 != NULL)
+                {
+                  strcat((gchar*)&lng, " ");
+                  strcat((gchar*)&lng, str3);
+                  strcat((gchar*)&lng, "/1");
+                }
+              else
+                {
+                  strcat((gchar*)&lng, " ");
+                  strcat((gchar*)&lng, "0/1");
+                }
+
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   default_metadata_tags[i].tag,
+                                                   lng))
+                {
+                  g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                }
+
+              if (strstr(s, "."))
+                {
+                  free(str1);
+                  free(str2);
+                  free(str3);
+                }
+
+              free(s);
+            }
+          else if (!strcmp ("Exif.GPSInfo.GPSLatitude", default_metadata_tags[i].tag))
+            {
+              const gchar delimiters_dms[] = " deg'\"";
+              gchar *s = g_strdup(value_entry);
+              gchar lat[256];
+              gchar *str1;
+              gchar *str2;
+              gchar *str3;
+
+              if (strstr(s, "."))
+                {
+                  double degs;
+                  int deg;
+                  int min;
+                  int sec;
+
+                  degs = atof(s);
+                  if (degs < 0) degs *= -1;
+                  deg = (int)(degs);
+                  min = (int)((degs - deg) * 60.f);
+                  sec = (int)((degs - (float)deg - (float)(min / 60.f)) * 60.f * 60.f);
+                  str1 = (gchar*) malloc(256);
+                  str2 = (gchar*) malloc(256);
+                  str3 = (gchar*) malloc(256);
+                  g_sprintf(str1, "%d", deg);
+                  g_sprintf(str2, "%d", min);
+                  g_sprintf(str3, "%d", sec);
+                }
+              else
+                {
+                  str1 = strtok(s, delimiters_dms);
+                  str2 = strtok(NULL, delimiters_dms);
+                  str3 = strtok(NULL, delimiters_dms);
+                }
+
+              if (str1 != NULL)
+                {
+                  strcpy((gchar*)&lat, str1);
+                  strcat((gchar*)&lat, "/1");
+                }
+              else
+                {
+                  strcpy((gchar*)&lat, "0/1");
+                }
+
+              if (str2 != NULL)
+                {
+                  strcat((gchar*)&lat, " ");
+                  strcat((gchar*)&lat, str2);
+                  strcat((gchar*)&lat, "/1");
+                }
+              else
+                {
+                  strcat((gchar*)&lat, " ");
+                  strcat((gchar*)&lat, "0/1");
+                }
+
+              if (str3 != NULL)
+                {
+                  strcat((gchar*)&lat, " ");
+                  strcat((gchar*)&lat, str3);
+                  strcat((gchar*)&lat, "/1");
+                }
+              else
+                {
+                  strcat((gchar*)&lat, " ");
+                  strcat((gchar*)&lat, "0/1");
+                }
+
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   default_metadata_tags[i].tag,
+                                                   lat))
+                {
+                  g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                }
+
+              if (s)
+                free(s);
+            }
+          else if (!strcmp ("Exif.GPSInfo.GPSAltitude", default_metadata_tags[i].tag))
+            {
+              GtkWidget *combo_widget;
+              gchar alt_str[256];
+              double alt_d;
+              int msr;
+
+              combo_widget =
+                GTK_WIDGET (gtk_builder_get_object (builder,
+                                                    "GPSAltitudeSystem"));
+              msr = gtk_combo_box_get_active (GTK_COMBO_BOX(combo_widget));
+
+              alt_d = atof(gtk_entry_get_text (entry));
+              if (msr == 1)
+                alt_d = (alt_d * 12 * 2.54d) / 100;
+              alt_d *= 10.f;
+              g_sprintf((gchar*)&alt_str, "%d/10", (int)alt_d);
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   default_metadata_tags[i].tag,
+                                                   alt_str))
+                {
+                  g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                }
+            }
+          else
+            {
+              const char* text_value = gtk_entry_get_text (entry);
+              if (default_metadata_tags[i].xmp_type == GIMP_XMP_TEXT ||
+                  default_metadata_tags[i].xmp_type == GIMP_XMP_NONE)
+                {
+                  gexiv2_metadata_clear_tag(GEXIV2_METADATA (g_metadata),
+                                            default_metadata_tags[i].tag);
+                  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                                     default_metadata_tags[i].tag,
+                                                     GEXIV2_STRUCTURE_XA_NONE);
+                  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                       default_metadata_tags[i].tag,
+                                                       text_value))
+                    {
+                      g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                    }
+                }
+              else if (default_metadata_tags[i].xmp_type == GIMP_XMP_BAG)
+                {
+                  gexiv2_metadata_clear_tag(GEXIV2_METADATA (g_metadata),
+                                            default_metadata_tags[i].tag);
+                  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                                     default_metadata_tags[i].tag,
+                                                     GEXIV2_STRUCTURE_XA_BAG);
+                  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                       default_metadata_tags[i].tag,
+                                                       text_value))
+                    {
+                      g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                    }
+                }
+              else if (default_metadata_tags[i].xmp_type == GIMP_XMP_SEQ)
+                {
+                  gexiv2_metadata_clear_tag(GEXIV2_METADATA (g_metadata),
+                                            default_metadata_tags[i].tag);
+                  gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                                     default_metadata_tags[i].tag,
+                                                     GEXIV2_STRUCTURE_XA_SEQ);
+                  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                       default_metadata_tags[i].tag,
+                                                       text_value))
+                    {
+                      g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                    }
+                }
+            }
+        }
+
+      /* MULTI TAGS */
+
+      else if (!strcmp ("multi", default_metadata_tags[i].mode))
+        {
+          GtkTextView   *text_view = GTK_TEXT_VIEW (object);
+          GtkTextBuffer *buffer;
+          GtkTextIter    start;
+          GtkTextIter    end;
+          gchar         *text;
+
+          buffer = gtk_text_view_get_buffer (text_view);
+          gtk_text_buffer_get_start_iter (buffer, &start);
+          gtk_text_buffer_get_end_iter (buffer, &end);
+
+          text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+
+          if (default_metadata_tags[i].xmp_type == GIMP_XMP_TEXT ||
+              default_metadata_tags[i].xmp_type == GIMP_XMP_NONE)
+            {
+              gexiv2_metadata_clear_tag(GEXIV2_METADATA (g_metadata),
+                                        default_metadata_tags[i].tag);
+              gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                                 default_metadata_tags[i].tag,
+                                                 GEXIV2_STRUCTURE_XA_NONE);
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   default_metadata_tags[i].tag,
+                                                   text))
+                {
+                  g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                }
+            }
+          else if (default_metadata_tags[i].xmp_type == GIMP_XMP_BAG)
+            {
+              gexiv2_metadata_clear_tag(GEXIV2_METADATA (g_metadata),
+                                        default_metadata_tags[i].tag);
+              gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                                 default_metadata_tags[i].tag,
+                                                 GEXIV2_STRUCTURE_XA_BAG);
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   default_metadata_tags[i].tag,
+                                                   text))
+                {
+                  g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                }
+            }
+          else if (default_metadata_tags[i].xmp_type == GIMP_XMP_SEQ)
+            {
+              gexiv2_metadata_clear_tag(GEXIV2_METADATA (g_metadata),
+                                        default_metadata_tags[i].tag);
+              gexiv2_metadata_set_xmp_tag_struct(GEXIV2_METADATA (g_metadata),
+                                                 default_metadata_tags[i].tag,
+                                                 GEXIV2_STRUCTURE_XA_SEQ);
+              if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                   default_metadata_tags[i].tag,
+                                                   text))
+                {
+                  g_printerr("failed to set tag [%s]\n", default_metadata_tags[i].tag);
+                }
+            }
+
+          if (text)
+            g_free (text);
+        }
+      else if (!strcmp ("list", default_metadata_tags[i].mode))
+        {
+          /* MIGHT DO SOMETHING HERE */
+        }
+
+      /* COMBO TAGS */
+
+      else if (!strcmp ("combo", default_metadata_tags[i].mode))
+        {
+          GtkComboBoxText *combo;
+          gint32 value;
+
+          combo = GTK_COMBO_BOX_TEXT (object);
+          value = gtk_combo_box_get_active (GTK_COMBO_BOX(combo));
+          if (!strcmp ("Xmp.xmp.Rating", default_metadata_tags[i].tag))
+            {
+              if (value == 0)
+                {
+                  if (!gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag))
+                    {
+                      g_printerr("failed to clear tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                }
+              else
+                {
+                  gchar *save;
+                  save = g_strdup_printf("%d", value);
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag, save);
+                  if (save)
+                    g_free(save);
+                }
+            }
+          else if (!strcmp ("Xmp.DICOM.PatientSex", default_metadata_tags[i].tag))
+            {
+              switch (value)
+                {
+                case 0:
+                  if (!gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag))
+                    {
+                      g_printerr("failed to clear tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                  break;
+
+                case 1:
+                  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                       default_metadata_tags[i].tag,
+                                                       "male"))
+                    {
+                      g_printerr("failed to set tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                  break;
+
+                case 2:
+                  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                       default_metadata_tags[i].tag,
+                                                       "female"))
+                    {
+                      g_printerr("failed to set tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                  break;
+
+                case 3:
+                  if (!gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                       default_metadata_tags[i].tag,
+                                                       "other"))
+                    {
+                      g_printerr("failed to set tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                  break;
+                }
+            }
+          else if (!strcmp ("Exif.GPSInfo.GPSLongitudeRef",
+                            default_metadata_tags[i].tag))
+            {
+              switch (value)
+                {
+                case 0:
+                  if (!gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag))
+                    {
+                      g_printerr("failed to clear tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                  break;
+
+                case 1:
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag, "E");
+                  break;
+
+                case 2:
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag, "W");
+                  break;
+                }
+            }
+          else if (!strcmp ("Exif.GPSInfo.GPSLatitudeRef",
+                            default_metadata_tags[i].tag))
+            {
+              switch (value)
+                {
+                case 0:
+                  if (!gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag))
+                    {
+                      g_printerr("failed to clear tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                  break;
+
+                case 1:
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag, "N");
+                  break;
+
+                case 2:
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag, "S");
+                  break;
+                }
+            }
+          else if (!strcmp ("Exif.GPSInfo.GPSAltitudeRef",
+                            default_metadata_tags[i].tag))
+            {
+              switch (value)
+                {
+                case 0:
+                  if (!gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag))
+                    {
+                      g_printerr("failed to clear tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                  break;
+
+                case 1:
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag, "0");
+                  break;
+
+                case 2:
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag, "1");
+                  break;
+                }
+            }
+          else if (!strcmp ("Xmp.plus.ModelReleaseStatus",
+                            default_metadata_tags[i].tag))
+            {
+              gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                              default_metadata_tags[i].tag,
+                                              modelreleasestatus[value].data);
+            }
+          else if (!strcmp ("Xmp.plus.PropertyReleaseStatus",
+                            default_metadata_tags[i].tag))
+            {
+              if (value == 0)
+                {
+                  if (!gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag))
+                    {
+                      g_printerr("failed to clear tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                }
+              else
+                {
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag,
+                                                  propertyreleasestatus[value].data);
+                }
+            }
+          else if (!strcmp ("Xmp.plus.MinorModelAgeDisclosure",
+                            default_metadata_tags[i].tag))
+            {
+              if (value == 0)
+                {
+                  if (!gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag))
+                    {
+                      g_printerr("failed to clear tag [%s]\n",
+                                 default_metadata_tags[i].tag);
+                    }
+                }
+              else
+                {
+                  gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                                  default_metadata_tags[i].tag,
+                                                  minormodelagedisclosure[value].data);
+                }
+            }
+          else if (!strcmp ("Xmp.iptcExt.DigitalSourceType",
+                            default_metadata_tags[i].tag))
+            {
+              gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+                                              default_metadata_tags[i].tag,
+                                              digitalsourcetype[value].data);
+            }
+        }
+    }
+
+  gimp_image_set_metadata (image_id, g_metadata);
+}
+
+/* ============================================================================
+ * ==[ METADATA IMPORT / EXPORT FILE DIALOG UI ]===============================
+ * ============================================================================
+ */
+
+static void
+import_dialog_metadata(metadata_editor *args)
+{
+  GtkWidget *file_dialog;
+  gchar *filename;
+
+  file_dialog = gtk_file_chooser_dialog_new ("Import Metadata File",
+                NULL,
+                GTK_FILE_CHOOSER_ACTION_OPEN,
+                GTK_STOCK_CANCEL,
+                GTK_RESPONSE_CANCEL,
+                GTK_STOCK_OPEN,
+                GTK_RESPONSE_ACCEPT,
+                NULL);
+
+  gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (file_dialog),
+                                 args->filename);
+
+  if (gtk_dialog_run (GTK_DIALOG (file_dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+      filename =
+        gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog));
+
+      if (filename)
+        {
+          if (args->filename)
+            {
+              g_free (args->filename);
+            }
+
+          args->filename = g_strdup(filename);
+          import_file_metadata (args);
+        }
+    }
+
+  gtk_widget_destroy (file_dialog);
+}
+
+static void
+export_dialog_metadata(metadata_editor *args)
+{
+  GtkWidget *file_dialog;
+  gchar *filename;
+
+  file_dialog = gtk_file_chooser_dialog_new ("Export Metadata File",
+                NULL,
+                GTK_FILE_CHOOSER_ACTION_SAVE,
+                GTK_STOCK_CANCEL,
+                GTK_RESPONSE_CANCEL,
+                GTK_STOCK_SAVE,
+                GTK_RESPONSE_ACCEPT,
+                NULL);
+
+  gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (file_dialog),
+      TRUE);
+  gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (file_dialog),
+                                 args->filename);
+
+  if (gtk_dialog_run (GTK_DIALOG (file_dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+      filename =
+        gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog));
+
+      if (filename)
+        {
+          if (args->filename)
+            {
+              g_free (args->filename);
+            }
+
+          args->filename = g_strdup (filename);
+          export_file_metadata (args);
+        }
+    }
+
+  gtk_widget_destroy (file_dialog);
+}
+
+static void
+impex_combo_callback (GtkComboBoxText *combo,
+                      gpointer         data)
+{
+  metadata_editor *args;
+  gint32 selection;
+
+  args = data;
+  selection = gtk_combo_box_get_active (GTK_COMBO_BOX(combo));
+
+  switch(selection)
+    {
+    case 1: /* Import */
+      import_dialog_metadata(args);
+      gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 0);
+      break;
+
+    case 2: /* Export */
+      export_dialog_metadata(args);
+      gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 0);
+      break;
+    }
+}
+
+
+static void
+gpsaltsys_combo_callback (GtkComboBoxText *combo,
+                          gpointer         data)
+{
+  GtkWidget  *entry;
+  GtkBuilder *builder;
+  gint32      selection;
+  gchar        alt_str[256];
+  double      alt_d;
+
+  builder = data;
+  selection = gtk_combo_box_get_active (GTK_COMBO_BOX(combo));
+
+  entry =
+    GTK_WIDGET (gtk_builder_get_object (builder, "Exif.GPSInfo.GPSAltitude"));
+
+  switch(selection)
+    {
+    case 0: /* Meters */
+      if (last_gpsaltsys_sel != 0)
+        {
+          alt_d = atof(gtk_entry_get_text (GTK_ENTRY(entry)));
+          alt_d = (alt_d * (12 * 2.54d)) / 100;
+          g_sprintf((gchar*)&alt_str, "%2f", (float)alt_d);
+          gtk_entry_set_text (GTK_ENTRY(entry), (gchar*)&alt_str);
+        }
+      break;
+
+    case 1: /* Feet */
+      if (last_gpsaltsys_sel != 1)
+        {
+          alt_d = atof(gtk_entry_get_text (GTK_ENTRY(entry)));
+          alt_d = alt_d * 3.28d;
+          g_sprintf((gchar*)&alt_str, "%2f", (float)alt_d);
+          gtk_entry_set_text (GTK_ENTRY(entry), (gchar*)&alt_str);
+        }
+      break;
+    }
+
+  last_gpsaltsys_sel = selection;
+}
+
diff --git a/plug-ins/metadata/metadata-editor.h b/plug-ins/metadata/metadata-editor.h
new file mode 100644
index 0000000..66b6268
--- /dev/null
+++ b/plug-ins/metadata/metadata-editor.h
@@ -0,0 +1,27 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 __METADATA_EDITOR_H__
+#define __METADATA_EDITOR_H__
+
+extern void metadata_editor_write_callback       (GtkWidget           *dialog,
+                                                  GtkBuilder          *builder,
+                                                  gint32               image_id);
+
+#endif /* __METADATA_EDITOR_H__ */
diff --git a/plug-ins/metadata/metadata-impexp.c b/plug-ins/metadata/metadata-impexp.c
new file mode 100644
index 0000000..1b8b00b
--- /dev/null
+++ b/plug-ins/metadata/metadata-impexp.c
@@ -0,0 +1,238 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * metadata-editor.c
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 <stdlib.h>
+#include <ctype.h>
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+#include <gexiv2/gexiv2.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "libgimp/stdplugins-intl.h"
+
+#include "metadata-xml.h"
+#include "metadata-misc.h"
+#include "metadata-tags.h"
+#include "metadata-impexp.h"
+#include "metadata-editor.h"
+
+extern gboolean gimpmetadata;
+extern gboolean xmptag;
+extern gboolean iptctag;
+extern gboolean tagvalue;
+extern gboolean tagname;
+extern gboolean force_write;
+extern gchar *str_tag_value;
+extern gchar *str_tag_name;
+
+const GMarkupParser xml_markup_parser =
+{
+  xml_parser_start_element,
+  xml_parser_end_element,
+  xml_parser_data,
+  NULL,  /*  passthrough  */
+  NULL   /*  error        */
+};
+
+
+/* ============================================================================
+ * ==[ METADATA IMPORT TEMPLATE ]==============================================
+ * ============================================================================
+ */
+void
+import_file_metadata(metadata_editor *args)
+{
+  GimpXmlParser  *xml_parser;
+  GError         *error = NULL;
+  FILE           *file;
+  gchar          *xmldata;
+
+  gimpmetadata = FALSE;
+  xmptag = FALSE;
+  iptctag = FALSE;
+  tagvalue = FALSE;
+  tagname = FALSE;
+
+  file = g_fopen (args->filename, "r");
+  if (file != NULL)
+    {
+      /* get xml data from file */
+      g_file_get_contents (args->filename, &xmldata, NULL, &error);
+
+      /* parse xml data fetched from file */
+      xml_parser = xml_parser_new (&xml_markup_parser, args);
+      xml_parser_parse_file (xml_parser, args->filename, &error);
+      xml_parser_free (xml_parser);
+
+      fclose (file);
+    }
+}
+
+/* ============================================================================
+ * ==[ METADATA EXPORT TEMPLATE ]==============================================
+ * ============================================================================
+ */
+void
+export_file_metadata(metadata_editor *args)
+{
+  GError *error = NULL;
+  FILE   *file;
+  gchar  *value;
+  gchar  *value_utf;
+  gchar  *xmldata;
+  gint    i, size;
+
+  if (force_write == TRUE)
+    {
+      /* Save fields in case of updates */
+      metadata_editor_write_callback (args->dialog, args->builder, args->image_id);
+      /* Fetch a fresh copy of the metadata */
+      args->metadata = GEXIV2_METADATA (gimp_image_get_metadata (args->image_id));
+    }
+
+  xmldata = g_strconcat ("<?xml version=“1.0” encoding=“utf-8”?>\n",
+                         "<gimp-metadata>\n", NULL);
+
+  /* HANDLE IPTC */
+  for (i = 0; i < G_N_ELEMENTS (equivalent_metadata_tags); i++)
+    {
+      int index = equivalent_metadata_tags[i].other_tag_index;
+      xmldata = g_strconcat (xmldata, "\t<iptc-tag>\n", NULL);
+      xmldata = g_strconcat (xmldata, "\t\t<tag-name>", NULL);
+      xmldata = g_strconcat (xmldata, equivalent_metadata_tags[i].tag, NULL);
+      xmldata = g_strconcat (xmldata, "</tag-name>\n", NULL);
+      xmldata = g_strconcat (xmldata, "\t\t<tag-mode>", NULL);
+      xmldata = g_strconcat (xmldata, equivalent_metadata_tags[i].mode, NULL);
+      xmldata = g_strconcat (xmldata, "</tag-mode>\n", NULL);
+
+      xmldata = g_strconcat (xmldata, "\t\t<tag-value>", NULL);
+
+      if (!strcmp("single", default_metadata_tags[index].mode) ||
+          !strcmp("multi", default_metadata_tags[index].mode))
+        {
+          value = get_tag_ui_text (args, default_metadata_tags[index].tag,
+                                   default_metadata_tags[index].mode);
+
+          if (value)
+            {
+              value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
+              xmldata = g_strconcat (xmldata, value_utf, NULL);
+            }
+        }
+      else if (!strcmp("combo", default_metadata_tags[index].mode))
+        {
+          gint data = get_tag_ui_combo (args, default_metadata_tags[index].tag,
+                                         default_metadata_tags[index].mode);
+          value = g_malloc(1024);
+          g_sprintf(value, "%d", data);
+          xmldata = g_strconcat (xmldata, value, NULL);
+          g_free(value);
+        }
+      else if (!strcmp("list", default_metadata_tags[i].mode))
+        {
+            /* No IPTC lists elements at this point */
+        }
+
+      xmldata = g_strconcat (xmldata, "</tag-value>\n", NULL);
+      xmldata = g_strconcat (xmldata, "\t</iptc-tag>\n", NULL);
+    }
+
+  /* HANDLE XMP */
+  for (i = 0; i < G_N_ELEMENTS (default_metadata_tags); i++)
+    {
+      xmldata = g_strconcat (xmldata, "\t<xmp-tag>\n", NULL);
+      xmldata = g_strconcat (xmldata, "\t\t<tag-name>", NULL);
+      xmldata = g_strconcat (xmldata, default_metadata_tags[i].tag, NULL);
+      xmldata = g_strconcat (xmldata, "</tag-name>\n", NULL);
+      xmldata = g_strconcat (xmldata, "\t\t<tag-mode>", NULL);
+      xmldata = g_strconcat (xmldata, default_metadata_tags[i].mode, NULL);
+      xmldata = g_strconcat (xmldata, "</tag-mode>\n", NULL);
+
+      if (!strcmp("single", default_metadata_tags[i].mode) ||
+          !strcmp("multi", default_metadata_tags[i].mode))
+        {
+          xmldata = g_strconcat (xmldata, "\t\t<tag-value>", NULL);
+          value = get_tag_ui_text (args, default_metadata_tags[i].tag,
+                                   default_metadata_tags[i].mode);
+
+          if (value)
+            {
+              value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
+              xmldata = g_strconcat (xmldata, value_utf, NULL);
+            }
+
+          xmldata = g_strconcat (xmldata, "</tag-value>\n", NULL);
+        }
+      else if (!strcmp("combo", default_metadata_tags[i].mode))
+        {
+          gint data;
+          xmldata = g_strconcat (xmldata, "\t\t<tag-value>", NULL);
+
+          data = get_tag_ui_combo (args, default_metadata_tags[i].tag,
+                                         default_metadata_tags[i].mode);
+          value = g_malloc(1024);
+          g_sprintf(value, "%d", data);
+          xmldata = g_strconcat (xmldata, value, NULL);
+          g_free(value);
+
+          xmldata = g_strconcat (xmldata, "</tag-value>\n", NULL);
+        }
+      else if (!strcmp("list", default_metadata_tags[i].mode))
+        {
+          gchar* data;
+          xmldata = g_strconcat (xmldata, "\t\t<tag-list-value>\n", NULL);
+
+          data = get_tag_ui_list (args, default_metadata_tags[i].tag,
+                                         default_metadata_tags[i].mode);
+          xmldata = g_strconcat (xmldata, data, NULL);
+
+          if (data)
+            g_free(data);
+
+          xmldata = g_strconcat (xmldata, "\t\t</tag-list-value>\n", NULL);
+        }
+
+      xmldata = g_strconcat (xmldata, "\t</xmp-tag>\n", NULL);
+    }
+
+  xmldata = g_strconcat(xmldata, "</gimp-metadata>\n", NULL);
+
+  size = strlen (xmldata);
+  file = g_fopen (args->filename, "w");
+  if (file != NULL)
+    {
+      g_file_set_contents (args->filename, xmldata, size, &error);
+      fclose (file);
+    }
+
+  if (xmldata)
+    {
+      g_free (xmldata);
+    }
+}
+
diff --git a/plug-ins/metadata/metadata-impexp.h b/plug-ins/metadata/metadata-impexp.h
new file mode 100644
index 0000000..5d31bc5
--- /dev/null
+++ b/plug-ins/metadata/metadata-impexp.h
@@ -0,0 +1,30 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 __METADATA_IMPEXP_H__
+#define __METADATA_IMPEXP_H__
+
+void
+import_file_metadata                            (metadata_editor *args);
+
+void
+export_file_metadata                            (metadata_editor *args);
+
+#endif /* __METADATA_IMPEXP_H__ */
+
diff --git a/plug-ins/metadata/metadata-misc.h b/plug-ins/metadata/metadata-misc.h
new file mode 100644
index 0000000..1f10ffd
--- /dev/null
+++ b/plug-ins/metadata/metadata-misc.h
@@ -0,0 +1,70 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 __METADATA_MISC_H__
+#define __METADATA_MISC_H__
+
+typedef struct
+{
+  GtkWidget      *dialog;
+  GtkBuilder     *builder;
+  GExiv2Metadata *metadata;
+  gint32          image_id;
+  gchar          *filename;
+} metadata_editor;
+
+typedef struct
+{
+  gchar  *tag;
+  gchar  *mode;
+  gint32  other_tag_index;
+  gint32  tag_type;
+  gint32  xmp_type;
+} metadata_tag;
+
+typedef struct
+{
+  gchar  *data;
+  gchar  *display;
+} combobox_str_tag;
+
+typedef struct
+{
+  gint32  data;
+  gchar  *display;
+} combobox_int_tag;
+
+typedef struct
+{
+  gchar  *header;
+  gchar  *type;
+  gint32  size;
+} TranslateHeaderTag;
+
+typedef struct
+{
+  gchar  *id;
+  gchar  *tag;
+  gchar  *mode;
+  gint32  other_tag_index;
+  gint32  tag_type;
+} TranslateTag;
+
+#endif /* __METADATA_MISC_H__ */
+
diff --git a/plug-ins/metadata/metadata-tags.h b/plug-ins/metadata/metadata-tags.h
new file mode 100644
index 0000000..aa3515a
--- /dev/null
+++ b/plug-ins/metadata/metadata-tags.h
@@ -0,0 +1,494 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 __METADATA_TAGS_H__
+#define __METADATA_TAGS_H__
+
+#include "metadata-misc.h"
+
+#define TAG_TYPE_XMP            1
+#define TAG_TYPE_EXIF           2
+#define TAG_TYPE_IPTC           3
+
+enum
+{
+  GIMP_XMP_NONE = 0,
+  GIMP_XMP_TEXT,
+  GIMP_XMP_BAG,
+  GIMP_XMP_SEQ,
+  GIMP_XMP_LANG,
+  GIMP_XMP_ALT
+};
+
+enum
+{
+  COL_LICENSOR_NAME = 0,
+  COL_LICENSOR_ID,
+  COL_LICENSOR_PHONE1,
+  COL_LICENSOR_PHONE_TYPE1,
+  COL_LICENSOR_PHONE2,
+  COL_LICENSOR_PHONE_TYPE2,
+  COL_LICENSOR_EMAIL,
+  COL_LICENSOR_WEB,
+  COL_LICENSOR_NUM_COLS
+};
+
+enum
+{
+  COL_CR_OWNER_NAME = 0,
+  COL_CR_OWNER_ID,
+  COL_CR_OWNER_NUM_COLS
+};
+
+enum
+{
+  COL_IMG_CR8_NAME = 0,
+  COL_IMG_CR8_ID,
+  COL_IMG_CR8_NUM_COLS
+};
+
+enum
+{
+  COL_AOO_TITLE = 0,
+  COL_AOO_DATE_CREAT,
+  COL_AOO_CREATOR,
+  COL_AOO_SOURCE,
+  COL_AOO_SRC_INV_ID,
+  COL_AOO_CR_NOT,
+  COL_AOO_NUM_COLS
+};
+
+enum
+{
+  COL_REGSITRY_ORG_ID = 0,
+  COL_REGSITRY_ITEM_ID,
+  COL_REGSITRY_NUM_COLS
+};
+
+enum
+{
+  COL_LOC_SHO_SUB_LOC = 0,
+  COL_LOC_SHO_CITY,
+  COL_LOC_SHO_STATE_PROV,
+  COL_LOC_SHO_CNTRY,
+  COL_LOC_SHO_CNTRY_ISO,
+  COL_LOC_SHO_CNTRY_WRLD_REG,
+  COL_LOC_SHO_NUM_COLS
+};
+
+enum
+{
+  COL_ORG_IMG_CODE = 0,
+  ORG_IMG_CODE_REL_NUM_COLS
+};
+
+enum
+{
+  COL_ORG_IMG_NAME = 0,
+  ORG_IMG_NAME_REL_NUM_COLS
+};
+
+enum
+{
+  COL_MOD_REL_ID = 0,
+  MOD_REL_NUM_COLS
+};
+
+enum
+{
+  COL_PROP_REL_ID = 0,
+  PROP_REL_NUM_COLS
+};
+
+static const metadata_tag default_metadata_tags[] =
+{
+  /* Description */
+  { "Xmp.dc.title",                              "single", 16,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, //  0
+  { "Xmp.dc.creator",                            "single", 13,  TAG_TYPE_XMP, GIMP_XMP_SEQ   }, //  1
+  { "Xmp.dc.description",                        "multi",  14,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, //  2
+  { "Xmp.dc.subject",                            "multi",  15,  TAG_TYPE_XMP, GIMP_XMP_BAG   }, //  3
+  { "Xmp.dc.rights",                             "single", 17,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, //  4
+  { "Xmp.photoshop.AuthorsPosition",             "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, //  5
+  { "Xmp.photoshop.CaptionWriter",               "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, //  6
+  { "Xmp.xmp.Rating",                            "combo",  -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, //  7
+  { "Xmp.xmpRights.Marked",                      "combo",  -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, //  8
+  { "Xmp.xmpRights.WebStatement",                "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, //  9
+
+  /* IPTC */
+  { "Xmp.photoshop.DateCreated",                 "single",  0,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 10
+  { "Xmp.photoshop.Headline",                    "multi",   3,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 11
+  { "Xmp.photoshop.TransmissionReference",       "single",  1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 12
+  { "Xmp.photoshop.Instructions",                "multi",   2,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 13
+  { "Xmp.iptc.IntellectualGenre",                "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 14
+  { "Xmp.iptc.Scene",                            "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_BAG   }, // 15
+  { "Xmp.iptc.Location",                         "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 16
+  { "Xmp.iptc.CountryCode",                      "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 17
+  { "Xmp.iptc.SubjectCode",                      "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_BAG   }, // 18
+  { "Xmp.xmpRights.UsageTerms",                  "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 19
+  { "Xmp.photoshop.City",                        "single",  5,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 20
+  { "Xmp.photoshop.State",                       "single",  6,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 21
+  { "Xmp.photoshop.Country",                     "single",  7,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 22
+  { "Xmp.photoshop.CaptionWriter",               "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 23
+  { "Xmp.photoshop.Credit",                      "single",  8,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 24
+  { "Xmp.photoshop.Source",                      "single",  9,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 25
+  { "Xmp.photoshop.Urgency",                     "combo",  11,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 26
+
+  /* IPTC Extension */
+  { "Xmp.iptcExt.PersonInImage",                 "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_BAG   }, // 27
+  { "Xmp.iptcExt.Sublocation",                   "single", 12,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 28
+  { "Xmp.iptcExt.City",                          "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 29
+  { "Xmp.iptcExt.ProvinceState",                 "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 30
+  { "Xmp.iptcExt.CountryName",                   "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 31
+  { "Xmp.iptcExt.CountryCode",                   "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 32
+  { "Xmp.iptcExt.WorldRegion",                   "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 33
+  { "Xmp.iptcExt.LocationShown",                 "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 34
+  { "Xmp.iptcExt.OrganisationInImageName",       "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 35
+  { "Xmp.iptcExt.OrganisationInImageCode",       "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 36
+  { "Xmp.iptcExt.Event",                         "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 37
+  { "Xmp.iptcExt.RegistryId",                    "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 38
+  { "Xmp.iptcExt.ArtworkOrObject",               "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 39
+  { "Xmp.iptcExt.AddlModelInfo",                 "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 40
+  { "Xmp.iptcExt.ModelAge",                      "single", -1,  TAG_TYPE_XMP, GIMP_XMP_BAG   }, // 41
+  { "Xmp.iptcExt.MaxAvailWidth",                 "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 42
+  { "Xmp.iptcExt.MaxAvailHeight",                "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 43
+  { "Xmp.iptcExt.DigitalSourceType",             "combo",  -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 44
+  { "Xmp.plus.MinorModelAgeDisclosure",          "combo",  -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 45
+  { "Xmp.plus.ModelReleaseStatus",               "combo",  -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 46
+  { "Xmp.plus.ModelReleaseID",                   "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 47
+  { "Xmp.plus.ImageSupplierName",                "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 48
+  { "Xmp.plus.ImageSupplierID",                  "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 49
+  { "Xmp.plus.ImageSupplierImageID",             "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 50
+  { "Xmp.plus.ImageCreator",                     "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 51
+  { "Xmp.plus.CopyrightOwner",                   "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 52
+  { "Xmp.plus.Licensor",                         "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 53
+  { "Xmp.plus.PropertyReleaseStatus",            "combo",  -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 54
+  { "Xmp.plus.PropertyReleaseID",                "list",   -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 55
+
+  /* Categories */
+  { "Xmp.photoshop.Category",                    "single",  4,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 56
+  { "Xmp.photoshop.SupplementalCategories",      "multi",  10,  TAG_TYPE_XMP, GIMP_XMP_BAG   }, // 57
+
+  /* GPS */
+  { "Exif.GPSInfo.GPSLongitude",                 "single", -1,  TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 58
+  { "Exif.GPSInfo.GPSLongitudeRef",              "combo",  -1,  TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 59
+  { "Exif.GPSInfo.GPSLatitude",                  "single", -1,  TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 60
+  { "Exif.GPSInfo.GPSLatitudeRef",               "combo",  -1,  TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 61
+  { "Exif.GPSInfo.GPSAltitude",                  "single", -1,  TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 62
+  { "Exif.GPSInfo.GPSAltitudeRef",               "combo",  -1,  TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 63
+
+  /* DICOM */
+  { "Xmp.DICOM.PatientName",                     "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 64
+  { "Xmp.DICOM.PatientID",                       "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 65
+  { "Xmp.DICOM.PatientDOB",                      "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 66
+  { "Xmp.DICOM.PatientSex",                      "combo",  -1,  TAG_TYPE_XMP, GIMP_XMP_NONE  }, // 67
+  { "Xmp.DICOM.StudyID",                         "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 68
+  { "Xmp.DICOM.StudyPhysician",                  "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 69
+  { "Xmp.DICOM.StudyDateTime",                   "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 70
+  { "Xmp.DICOM.StudyDescription",                "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 71
+  { "Xmp.DICOM.SeriesNumber",                    "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 72
+  { "Xmp.DICOM.SeriesModality",                  "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 73
+  { "Xmp.DICOM.SeriesDateTime",                  "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 74
+  { "Xmp.DICOM.SeriesDescription",               "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 75
+  { "Xmp.DICOM.EquipmentInstitution",            "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 76
+  { "Xmp.DICOM.EquipmentManufacturer",           "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 77
+
+  /* IPTC */
+  { "Xmp.iptc.CiAdrExtadr",                      "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 78
+  { "Xmp.iptc.CiAdrCity",                        "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 79
+  { "Xmp.iptc.CiAdrRegion",                      "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 80
+  { "Xmp.iptc.CiAdrPcode",                       "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 81
+  { "Xmp.iptc.CiAdrCtry",                        "single", -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 82
+  { "Xmp.iptc.CiTelWork",                        "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 83
+  { "Xmp.iptc.CiEmailWork",                      "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }, // 84
+  { "Xmp.iptc.CiUrlWork",                        "multi",  -1,  TAG_TYPE_XMP, GIMP_XMP_TEXT  }  // 85
+
+};
+
+static const metadata_tag const equivalent_metadata_tags[] =
+{
+  { "Iptc.Application2.DateCreated",             "single", 10,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  0
+  { "Iptc.Application2.TransmissionReference",   "single", 12,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  1
+  { "Iptc.Application2.SpecialInstructions",     "single", 13,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  2
+  { "Iptc.Application2.Headline",                "multi",  11,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  3
+  { "Iptc.Application2.Category",                "single", 56,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  4
+  { "Iptc.Application2.City",                    "single", 20,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  5
+  { "Iptc.Application2.ProvinceState",           "single", 21,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  6
+  { "Iptc.Application2.CountryName",             "single", 22,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  7
+  { "Iptc.Application2.Credit",                  "single", 24,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  8
+  { "Iptc.Application2.Source",                  "single", 25,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, //  9
+  { "Iptc.Application2.SuppCategory",            "single", 57,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 10
+  { "Iptc.Application2.Urgency",                 "combo",  26,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 11
+  { "Iptc.Application2.SubLocation",             "single", 28,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 12
+  { "Iptc.Application2.Byline",                  "single",  1,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 13
+  { "Iptc.Application2.Caption",                 "multi",   2,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 14
+  { "Iptc.Application2.Keywords",                "single",  3,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 15
+  { "Iptc.Application2.ObjectName",              "multi",   0,  TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 16
+  { "Iptc.Application2.Copyright",               "single",  4,  TAG_TYPE_IPTC, GIMP_XMP_NONE }  // 17
+};
+
+/* Digital Source Type Combobox Items
+ * http://cv.iptc.org/newscodes/digitalsourcetype/
+ */
+static const combobox_str_tag digitalsourcetype[] =
+{
+  { "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture";, "Original digital capture of a real 
life scene"    },
+  { "http://cv.iptc.org/newscodes/digitalsourcetype/negativeFilm";,   "Digitised from a negative on film"     
           },
+  { "http://cv.iptc.org/newscodes/digitalsourcetype/positiveFilm";,   "Digitised from a positive on film"     
           },
+  { "http://cv.iptc.org/newscodes/digitalsourcetype/print";,          "Digitised from a print on 
non-transparent medium" },
+  { "http://cv.iptc.org/newscodes/digitalsourcetype/softwareImage";,  "Created by software"                   
           }
+};
+
+/* Model Release Status Combobox Items
+ * http://ns.useplus.org/LDF/ldf-XMPSpecification#ModelReleaseStatus
+ */
+static const combobox_str_tag modelreleasestatus[] =
+{
+  { "http://ns.useplus.org/ldf/vocab/MR-NON";, "None"                                 },
+  { "http://ns.useplus.org/ldf/vocab/MR-NAP";, "Not Applicable"                       },
+  { "http://ns.useplus.org/ldf/vocab/MR-NAP";, "Unlimited Model Releases"             },
+  { "http://ns.useplus.org/ldf/vocab/MR-LPR";, "Limited or Incomplete Model Releases" }
+};
+
+/* Property Release Status Combobox Items
+ * http://ns.useplus.org/LDF/ldf-XMPSpecification#PropertyReleaseStatus
+ */
+static const combobox_str_tag propertyreleasestatus[] =
+{
+  { "http://ns.useplus.org/ldf/vocab/PR-NON";, "None"                                    },
+  { "http://ns.useplus.org/ldf/vocab/PR-NAP";, "Not Applicable"                          },
+  { "http://ns.useplus.org/ldf/vocab/PR-NAP";, "Unlimited Property Releases"             },
+  { "http://ns.useplus.org/ldf/vocab/PR-LPR";, "Limited or Incomplete Property Releases" }
+};
+
+/* Minor Model Age Disclosure Combobox Items
+ * http://ns.useplus.org/LDF/ldf-XMPSpecification#MinorModelAgeDisclosure
+ */
+static const combobox_str_tag minormodelagedisclosure[] =
+{
+  { "http://ns.useplus.org/ldf/vocab/AG-UNK";, "Age Unknown"     },
+  { "http://ns.useplus.org/ldf/vocab/AG-A25";, "Age 25 or Over"  },
+  { "http://ns.useplus.org/ldf/vocab/AG-A24";, "Age 24"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A23";, "Age 23"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A22";, "Age 22"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A21";, "Age 21"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A20";, "Age 20"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A19";, "Age 19"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A18";, "Age 18"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A17";, "Age 17"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A16";, "Age 16"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-A15";, "Age 15"          },
+  { "http://ns.useplus.org/ldf/vocab/AG-U14";, "Age 14 or Under" }
+};
+
+/* Urgency */
+static const gchar *urgency[] =
+{
+  "None", "High", "2", "3", "4", "Normal", "6", "7", "Low"
+};
+
+/* Marked */
+static const combobox_int_tag marked[] =
+{
+  { -1,     "Unknown"       }, // DO NOT SAVE
+  {  TRUE,  "Copyrighted"   }, // TRUE
+  {  FALSE, "Public Domain" }, // FALSE
+};
+
+/* Phone Types */
+static const combobox_str_tag phone_types[] =
+{
+  { "",                                      "Select a value" },
+  { "http://ns.useplus.org/ldf/vocab/work";,  "Work"  },
+  { "http://ns.useplus.org/ldf/vocab/cell";,  "Cell"  },
+  { "http://ns.useplus.org/ldf/vocab/fax";,   "Fax"   },
+  { "http://ns.useplus.org/ldf/vocab/home";,  "Home"  },
+  { "http://ns.useplus.org/ldf/vocab/pager";, "Pager" }
+};
+
+/* DICOM Patient Sex
+ * http://dicomlookup.com/lookup.asp?sw=Ttable&q=C.7-1
+ * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/XMP.html#DICOM
+ * https://dicomiseasy.blogspot.ca/2011/11/introduction-to-dicom-chapter-iii-dicom.html
+ * http://dicom.nema.org/standard.html
+ */
+static const combobox_str_tag dicom[] =
+{
+  { "",        "Select a value" },
+  { "male",    "Male"    },
+  { "female",  "Female"  },
+  { "other",   "Other"   },
+};
+
+/* GPS Altitute Ref */
+static const gchar *gpsaltref[] =
+{
+  "Unknown", "Above Sea Level", "Below Sea Level"
+};
+
+/* GPS Latitute Ref */
+static const gchar *gpslatref[] =
+{
+  "Unknown", "North", "South"
+};
+
+/* GPS Longitute Ref */
+static const gchar *gpslngref[] =
+{
+  "Unknown", "East", "West"
+};
+
+/* GPS Measurement System */
+static const gchar *gpsaltsys[] =
+{
+  "M", "FT"
+};
+
+static const TranslateHeaderTag creatorContactInfoHeader =
+{
+  "Xmp.iptc.CreatorContactInfo", "type=\"Struct\"", 8
+};
+
+static const TranslateTag creatorContactInfoTags[] =
+{
+  { "Xmp.iptc.CiAdrExtadr", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrExtadr", "multi",  -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptc.CiAdrCity",   "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrCity",   "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptc.CiAdrRegion", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrRegion", "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptc.CiAdrPcode",  "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrPcode",  "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptc.CiAdrCtry",   "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrCtry",   "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptc.CiTelWork",   "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiTelWork",   "multi",  -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptc.CiEmailWork", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiEmailWork", "multi",  -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptc.CiUrlWork",   "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiUrlWork",   "multi",  -1,  
TAG_TYPE_XMP }
+};
+
+static const TranslateHeaderTag locationCreationInfoHeader =
+{
+  "Xmp.iptcExt.LocationCreated", "type=\"Bag\"", 6
+};
+
+static const TranslateTag locationCreationInfoTags[] =
+{
+  { "Xmp.iptcExt.Sublocation",   "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:Sublocation",   "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptcExt.City",          "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:City",          "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptcExt.ProvinceState", "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:ProvinceState", "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptcExt.CountryName",   "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:CountryName",   "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptcExt.CountryCode",   "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:CountryCode",   "single", -1,  
TAG_TYPE_XMP },
+  { "Xmp.iptcExt.WorldRegion",   "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:WorldRegion",   "single", -1,  
TAG_TYPE_XMP }
+};
+
+static const TranslateHeaderTag imageSupplierInfoHeader =
+{
+  "Xmp.plus.ImageSupplier", "type=\"Seq\"", 2
+};
+
+static const TranslateTag imageSupplierInfoTags[] =
+{
+  { "Xmp.plus.ImageSupplierName",   "Xmp.plus.ImageSupplier[1]/plus:ImageSupplierName", "multi",  -1,  
TAG_TYPE_XMP },
+  { "Xmp.plus.ImageSupplierID",     "Xmp.plus.ImageSupplier[1]/plus:ImageSupplierID",   "single", -1,  
TAG_TYPE_XMP }
+};
+
+/* Plus and IPTC extension tags */
+
+static const int licensor_items = 8;
+static const gchar *licensor_header = "Xmp.plus.Licensor";
+static const gchar *licensor[] =
+{
+  "/plus:LicensorName",
+  "/plus:LicensorID",
+  "/plus:LicensorTelephone1",
+  "/plus:LicensorTelephoneType1",
+  "/plus:LicensorTelephone2",
+  "/plus:LicensorTelephoneType2",
+  "/plus:LicensorEmail",
+  "/plus:LicensorURL"
+};
+
+#ifdef USE_TAGS
+static const int imagesupplier_items = 2;
+static const gchar *imagesupplier_header = "Xmp.plus.ImageSupplier";
+static const gchar *imagesupplier[] =
+{
+  "/plus:ImageSupplierName",
+  "/plus:ImageSupplierID"
+};
+#endif
+
+static const int imagecreator_items = 2;
+static const gchar *imagecreator_header = "Xmp.plus.ImageCreator";
+static const gchar *imagecreator[] =
+{
+  "/plus:ImageCreatorName",
+  "/plus:ImageCreatorID"
+};
+
+static const int copyrightowner_items = 2;
+static const gchar *copyrightowner_header = "Xmp.plus.CopyrightOwner";
+static const gchar *copyrightowner[] =
+{
+  "/plus:CopyrightOwnerName",
+  "/plus:CopyrightOwnerID"
+};
+
+static const int registryid_items = 2;
+static const gchar *registryid_header = "Xmp.iptcExt.RegistryId";
+static const gchar *registryid[] =
+{
+  "/Iptc4xmpExt:RegOrgId",
+  "/Iptc4xmpExt:RegItemId"
+};
+
+static const int artworkorobject_items = 6;
+static const gchar *artworkorobject_header = "Xmp.iptcExt.ArtworkOrObject";
+static const gchar *artworkorobject[] =
+{
+  "/Iptc4xmpExt:AODateCreated",
+  "/Iptc4xmpExt:AOSource",
+  "/Iptc4xmpExt:AOSourceInvNo",
+  "/Iptc4xmpExt:AOTitle",
+  "/Iptc4xmpExt:AOCopyrightNotice",
+  "/Iptc4xmpExt:AOCreator"
+};
+
+static const int locationshown_items = 6;
+static const gchar *locationshown_header = "Xmp.iptcExt.LocationShown";
+static const gchar *locationshown[] =
+{
+  "/Iptc4xmpExt:Sublocation",
+  "/Iptc4xmpExt:City",
+  "/Iptc4xmpExt:ProvinceState",
+  "/Iptc4xmpExt:CountryName",
+  "/Iptc4xmpExt:CountryCode",
+  "/Iptc4xmpExt:WorldRegion"
+};
+
+#ifdef USE_TAGS
+static const int locationcreated_items = 6;
+static const gchar *locationcreated_header = "Xmp.iptcExt.LocationCreated";
+static const gchar *locationcreated[] =
+{
+  "/Iptc4xmpExt:Sublocation",
+  "/Iptc4xmpExt:City",
+  "/Iptc4xmpExt:ProvinceState",
+  "/Iptc4xmpExt:CountryName",
+  "/Iptc4xmpExt:CountryCode",
+  "/Iptc4xmpExt:WorldRegion"
+};
+#endif
+
+#endif /* __METADATA_TAGS_H__ */
+
diff --git a/plug-ins/metadata/metadata-viewer.c b/plug-ins/metadata/metadata-viewer.c
new file mode 100644
index 0000000..3b82c51
--- /dev/null
+++ b/plug-ins/metadata/metadata-viewer.c
@@ -0,0 +1,302 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * metadata.c
+ * Copyright (C) 2013 Hartmut Kuhse
+ * Copyright (C) 2016 Ben Touchette
+ *
+ * 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 <gegl.h>
+#include <gtk/gtk.h>
+#include <gexiv2/gexiv2.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "libgimp/stdplugins-intl.h"
+
+
+#define PLUG_IN_PROC   "plug-in-metadata-viewer"
+#define PLUG_IN_BINARY "metadata-viewer"
+#define PLUG_IN_ROLE   "gimp-metadata"
+
+#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
+};
+
+enum
+{
+  C_IPTC_TAG = 0,
+  C_IPTC_VALUE,
+  NUM_IPTC_COLS
+};
+
+
+/*  local function prototypes  */
+
+static void       query                         (void);
+static void       run                           (const gchar      *name,
+                                                 gint              nparams,
+                                                 const GimpParam  *param,
+                                                 gint             *nreturn_vals,
+                                                 GimpParam       **return_vals);
+
+static gboolean   metadata_viewer_dialog        (gint32          image_id,
+                                                 GExiv2Metadata *metadata);
+static void       metadata_dialog_set_metadata  (GExiv2Metadata *metadata,
+                                                 GtkBuilder     *builder);
+
+
+
+/* local variables */
+
+const GimpPlugInInfo PLUG_IN_INFO =
+{
+  NULL,  /* init_proc  */
+  NULL,  /* quit_proc  */
+  query, /* query_proc */
+  run,   /* run_proc   */
+};
+
+/*  functions  */
+
+MAIN ()
+
+static void
+query (void)
+{
+  static const GimpParamDef metadata_args[] =
+  {
+    { GIMP_PDB_INT32, "run-mode", "Run mode { RUN-INTERACTIVE (0) }" },
+    { GIMP_PDB_IMAGE, "image",    "Input image"                      }
+  };
+
+  gimp_install_procedure (PLUG_IN_PROC,
+                          N_("View metadata (Exif, IPTC, XMP)"),
+                          "View metadata information attached to the "
+                          "current image.  This can include Exif, IPTC and/or "
+                          "XMP information.",
+                          "Hartmut Kuhse, Michael Natterer, Ben Touchette",
+                          "Hartmut Kuhse, Michael Natterer, Ben Touchette",
+                          "2013, 2016",
+                          N_("View Metadata"),
+                          "*",
+                          GIMP_PLUGIN,
+                          G_N_ELEMENTS (metadata_args), 0,
+                          metadata_args, NULL);
+
+  gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Image/Metadata");
+}
+
+static void
+run (const gchar      *name,
+     gint              nparams,
+     const GimpParam  *param,
+     gint             *nreturn_vals,
+     GimpParam       **return_vals)
+{
+  static GimpParam   values[1];
+  GimpPDBStatusType  status = GIMP_PDB_SUCCESS;
+
+  *nreturn_vals = 1;
+  *return_vals  = values;
+
+  values[0].type          = GIMP_PDB_STATUS;
+  values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
+
+  INIT_I18N();
+  gimp_ui_init (PLUG_IN_BINARY, TRUE);
+
+  if (! strcmp (name, PLUG_IN_PROC))
+    {
+      GimpMetadata *metadata;
+      gint32        image_ID = param[1].data.d_image;
+
+      metadata = gimp_image_get_metadata (image_ID);
+
+      /* Always show metadata dialog so we can add
+         appropriate iptc data as needed. Sometimes
+         license data needs to be added after the
+         fact and the image may not contain metadata
+         but should have it added as needed. */
+
+      if (!metadata)
+        {
+          metadata = gimp_metadata_new();
+          gimp_image_set_metadata (image_ID, metadata);
+        }
+
+      metadata_viewer_dialog (image_ID, metadata);
+
+      status = GIMP_PDB_SUCCESS;
+    }
+  else
+    {
+      status = GIMP_PDB_CALLING_ERROR;
+    }
+
+  values[0].data.d_status = status;
+}
+
+static gboolean
+metadata_viewer_dialog (gint32          image_id,
+                        GExiv2Metadata *metadata)
+{
+  GtkBuilder    *builder;
+  GtkWidget     *dialog;
+  GtkWidget     *metadata_vbox;
+  GtkWidget     *content_area;
+  gchar         *ui_file;
+  gchar         *title;
+  gchar         *name;
+  GError        *error = NULL;
+
+  builder = gtk_builder_new ();
+
+  ui_file = g_build_filename (gimp_data_directory (),
+                              "ui", "plug-ins", "plug-in-metadata-viewer.ui", NULL);
+
+  if (! gtk_builder_add_from_file (builder, ui_file, &error))
+    {
+      g_printerr ("Error occured while loading UI file!\n");
+      g_printerr ("Message: %s\n", error->message);
+      g_clear_error (&error);
+      g_free (ui_file);
+      g_object_unref (builder);
+      return FALSE;
+    }
+
+  g_free (ui_file);
+
+  name = gimp_image_get_name (image_id);
+  title = g_strdup_printf ("Metadata Viewer: %s", name);
+  g_free (name);
+
+  dialog = gimp_dialog_new (title,
+                            "gimp-metadata-viewer-dialog",
+                            NULL, 0,
+                            gimp_standard_help_func, PLUG_IN_PROC,
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+                            NULL);
+
+  gtk_widget_set_size_request(dialog, 460, 340);
+
+  g_free (title);
+
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+                                           GTK_RESPONSE_CLOSE,
+                                           -1);
+
+  content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+  metadata_vbox = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                      "metadata-vbox"));
+  gtk_container_set_border_width (GTK_CONTAINER (metadata_vbox), 12);
+  gtk_box_pack_start (GTK_BOX (content_area), metadata_vbox, TRUE, TRUE, 0);
+
+  metadata_dialog_set_metadata (metadata, builder);
+
+  gtk_dialog_run (GTK_DIALOG (dialog));
+
+  return TRUE;
+}
+
+
+/*  private functions  */
+
+static void
+metadata_dialog_set_metadata (GExiv2Metadata *metadata,
+                              GtkBuilder     *builder)
+{
+  GtkListStore  *exif_store;
+  GtkListStore  *xmp_store;
+  GtkListStore  *iptc_store;
+  gchar        **exif_data;
+  gchar        **iptc_data;
+  gchar        **xmp_data;
+  gchar         *value;
+  gchar         *value_utf;
+  GtkTreeIter    iter;
+  gint           i;
+
+  exif_store = GTK_LIST_STORE (gtk_builder_get_object  (builder,
+                                                        "exif-liststore"));
+  xmp_store  = GTK_LIST_STORE (gtk_builder_get_object  (builder,
+                                                        "xmp-liststore"));
+  iptc_store  = GTK_LIST_STORE (gtk_builder_get_object (builder,
+                                                        "iptc-liststore"));
+
+  exif_data = gexiv2_metadata_get_exif_tags (metadata);
+
+  for (i = 0; exif_data[i] != NULL; i++)
+    {
+      gtk_list_store_append (exif_store, &iter);
+      value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+                                                          exif_data[i]);
+      value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
+
+      gtk_list_store_set (exif_store, &iter,
+                          C_EXIF_TAG,   exif_data[i],
+                          C_EXIF_VALUE, value_utf,
+                          -1);
+    }
+
+  xmp_data = gexiv2_metadata_get_xmp_tags (metadata);
+
+  for (i = 0; xmp_data[i] != NULL; i++)
+    {
+      gtk_list_store_append (xmp_store, &iter);
+      value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+                                                          xmp_data[i]);
+      value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
+
+      gtk_list_store_set (xmp_store, &iter,
+                          C_XMP_TAG,   xmp_data[i],
+                          C_XMP_VALUE, value_utf,
+                          -1);
+    }
+
+  iptc_data = gexiv2_metadata_get_iptc_tags (metadata);
+
+  for (i = 0; iptc_data[i] != NULL; i++)
+    {
+      gtk_list_store_append (iptc_store, &iter);
+      value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+                                                          iptc_data[i]);
+      value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
+
+      gtk_list_store_set (iptc_store, &iter,
+                          C_IPTC_TAG,   iptc_data[i],
+                          C_IPTC_VALUE, value_utf,
+                          -1);
+    }
+}
diff --git a/plug-ins/metadata/metadata-xml.c b/plug-ins/metadata/metadata-xml.c
new file mode 100644
index 0000000..aa57b01
--- /dev/null
+++ b/plug-ins/metadata/metadata-xml.c
@@ -0,0 +1,1186 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * metadata-editor.c
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 <stdlib.h>
+#include <ctype.h>
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+#include <gexiv2/gexiv2.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "libgimp/stdplugins-intl.h"
+
+#include "metadata-misc.h"
+#include "metadata-xml.h"
+#include "metadata-tags.h"
+
+extern gboolean gimpmetadata;
+extern gboolean force_write;
+
+gboolean xmptag;
+gboolean iptctag;
+gboolean tagvalue;
+gboolean taglistvalue;
+gboolean tagname;
+gboolean tagmode;
+gboolean listelement;
+gboolean element;
+gchar *str_tag_value;
+gchar *str_tag_name;
+gchar *str_tag_mode;
+gchar *str_element;
+gchar *list_tag_data[256][256];
+gint row_count = 0;
+gint item_count = 0;
+
+
+void
+xml_parser_start_element (GMarkupParseContext  *context,
+                          const gchar          *element_name,
+                          const gchar         **attribute_names,
+                          const gchar         **attribute_values,
+                          gpointer              user_data,
+                          GError              **error)
+{
+  if (strcmp (element_name, "gimp-metadata") == 0)
+    {
+      gimpmetadata = TRUE;
+    }
+  else if (strcmp (element_name, "iptc-tag") == 0)
+    {
+      item_count = 0;
+      row_count = 0;
+      iptctag = TRUE;
+    }
+  else if (strcmp (element_name, "xmp-tag") == 0)
+    {
+      item_count = 0;
+      row_count = 0;
+      xmptag = TRUE;
+    }
+  else if (strcmp (element_name, "tag-value") == 0)
+    {
+      tagvalue = TRUE;
+    }
+  else if (strcmp (element_name, "tag-list-value") == 0)
+    {
+      taglistvalue = TRUE;
+    }
+  else if (strcmp (element_name, "tag-name") == 0)
+    {
+      tagname = TRUE;
+    }
+  else if (strcmp (element_name, "tag-mode") == 0)
+    {
+      tagmode = TRUE;
+    }
+  else if (strcmp (element_name, "list-element") == 0)
+    {
+      listelement = TRUE;
+      row_count += 1;
+    }
+  else if (strcmp (element_name, "element") == 0)
+    {
+      element = TRUE;
+      item_count += 1;
+    }
+}
+
+void
+xml_parser_data (GMarkupParseContext *context,
+                 const gchar         *text,
+                 gsize                text_len,
+                 gpointer             user_data,
+                 GError             **error)
+{
+  if (tagvalue)
+    {
+      if (str_tag_value)
+        g_free(str_tag_value);
+
+      if (text)
+        str_tag_value = g_strdup(text);
+      else
+        str_tag_value = g_strconcat("", NULL);
+    }
+  else if (tagname)
+    {
+      if (str_tag_name)
+        g_free(str_tag_name);
+
+      if (text)
+        str_tag_name = g_strdup(text);
+      else
+        str_tag_name = g_strconcat("", NULL);
+    }
+  else if (tagmode)
+    {
+      if (str_tag_mode)
+        g_free(str_tag_mode);
+
+      if (text)
+        str_tag_mode = g_strdup(text);
+      else
+        str_tag_mode = g_strconcat("", NULL);
+    }
+  else if (element)
+    {
+      if (str_element)
+        g_free(str_element);
+
+      if (text)
+        str_element = g_strdup(text);
+      else
+        str_element = g_strconcat("", NULL);
+    }
+}
+
+void
+set_tag_ui (metadata_editor *args, int index,
+            gchar *name, gchar *value, gchar* mode)
+{
+  GtkWidget *widget;
+  gchar *value_utf;
+
+  widget = GTK_WIDGET (gtk_builder_get_object (args->builder, str_tag_name));
+
+  if (!strcmp ("single", mode))
+    {
+      GtkEntry *entry_widget;
+
+      value_utf = g_locale_to_utf8 (str_tag_value, -1, NULL, NULL, NULL);
+      entry_widget = GTK_ENTRY (widget);
+      gtk_entry_set_text (entry_widget, value_utf);
+    }
+  else if (!strcmp ("multi", mode))
+    {
+      GtkTextView   *text_view;
+      GtkTextBuffer *buffer;
+
+      value_utf = g_locale_to_utf8 (str_tag_value, -1, NULL, NULL, NULL);
+      text_view = GTK_TEXT_VIEW (widget);
+      buffer = gtk_text_view_get_buffer (text_view);
+      gtk_text_buffer_set_text (buffer, value_utf, -1);
+    }
+  else if (!strcmp ("combo", mode))
+    {
+      gint32 value;
+
+      value_utf = g_locale_to_utf8 (str_tag_value, -1, NULL, NULL, NULL);
+      value = atoi(value_utf);
+      gtk_combo_box_set_active (GTK_COMBO_BOX(widget), value);
+    }
+  else if (!strcmp ("list", mode))
+    {
+      GtkTreePath   *path;
+      GtkTreeModel  *treemodel;
+      GtkListStore  *liststore;
+      GtkTreeIter    iter;
+      gchar          tag[1024];
+      gint           number_of_rows;
+      gint           row;
+      gint           item;
+
+      liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+      treemodel = GTK_TREE_MODEL (liststore);
+      number_of_rows =
+        gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL);
+
+      /* Clear all current values */
+      for (row = number_of_rows; row > -1; row--)
+        {
+          if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+            {
+              gtk_list_store_remove(liststore, &iter);
+            }
+        }
+      /* Add new values values */
+      if (!strcmp ("Xmp.plus.Licensor", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_LICENSOR_NAME, list_tag_data[row][1],
+                                  COL_LICENSOR_ID, list_tag_data[row][2],
+                                  COL_LICENSOR_PHONE1, list_tag_data[row][3],
+                                  COL_LICENSOR_PHONE_TYPE1, list_tag_data[row][4],
+                                  COL_LICENSOR_PHONE2, list_tag_data[row][5],
+                                  COL_LICENSOR_PHONE_TYPE2, list_tag_data[row][6],
+                                  COL_LICENSOR_EMAIL, list_tag_data[row][7],
+                                  COL_LICENSOR_WEB, list_tag_data[row][8],
+                                  -1);
+              for (item = 1; item < licensor_items+1; item++)
+                {
+                  if (list_tag_data[row][item])
+                    {
+                      if (list_tag_data[row][item])
+                        g_free(list_tag_data[row][item]);
+                    }
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_LICENSOR_NAME, NULL,
+                                      COL_LICENSOR_ID, NULL,
+                                      COL_LICENSOR_PHONE1, NULL,
+                                      COL_LICENSOR_PHONE_TYPE1, NULL,
+                                      COL_LICENSOR_PHONE2, NULL,
+                                      COL_LICENSOR_PHONE_TYPE2, NULL,
+                                      COL_LICENSOR_EMAIL, NULL,
+                                      COL_LICENSOR_WEB, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.plus.ImageCreator", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_IMG_CR8_NAME, list_tag_data[row][1],
+                                  COL_IMG_CR8_ID, list_tag_data[row][2],
+                                  -1);
+              for (item = 1; item < imagecreator_items+1; item++)
+                {
+                  if (list_tag_data[row][item])
+                    {
+                      if (list_tag_data[row][item])
+                        g_free(list_tag_data[row][item]);
+                    }
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_IMG_CR8_NAME, NULL,
+                                      COL_IMG_CR8_ID, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.iptcExt.ArtworkOrObject", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_AOO_TITLE, list_tag_data[row][1],
+                                  COL_AOO_DATE_CREAT, list_tag_data[row][2],
+                                  COL_AOO_CREATOR, list_tag_data[row][3],
+                                  COL_AOO_SOURCE, list_tag_data[row][4],
+                                  COL_AOO_SRC_INV_ID, list_tag_data[row][5],
+                                  COL_AOO_CR_NOT, list_tag_data[row][6],
+                                  -1);
+              for (item = 1; item < artworkorobject_items+1; item++)
+                {
+                  if (list_tag_data[row][item])
+                    {
+                      if (list_tag_data[row][item])
+                        g_free(list_tag_data[row][item]);
+                    }
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_AOO_TITLE, NULL,
+                                      COL_AOO_DATE_CREAT, NULL,
+                                      COL_AOO_CREATOR, NULL,
+                                      COL_AOO_SOURCE, NULL,
+                                      COL_AOO_SRC_INV_ID, NULL,
+                                      COL_AOO_CR_NOT, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.iptcExt.RegistryId", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_REGSITRY_ORG_ID, list_tag_data[row][1],
+                                  COL_REGSITRY_ITEM_ID, list_tag_data[row][2],
+                                  -1);
+              for (item = 1; item < registryid_items+1; item++)
+                {
+                  if (list_tag_data[row][item])
+                    {
+                      if (list_tag_data[row][item])
+                        g_free(list_tag_data[row][item]);
+                    }
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_REGSITRY_ORG_ID, NULL,
+                                      COL_REGSITRY_ITEM_ID, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.plus.CopyrightOwner", name))
+        {
+          if (row_count > 0)
+            {
+              for (row = 1; row < row_count+1; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_CR_OWNER_NAME, list_tag_data[row][1],
+                                      COL_CR_OWNER_ID, list_tag_data[row][2],
+                                      -1);
+                  for (item = 1; item < copyrightowner_items+1; item++)
+                    {
+                      if (list_tag_data[row][item])
+                        {
+                          if (list_tag_data[row][item])
+                            g_free(list_tag_data[row][item]);
+                        }
+                    }
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_CR_OWNER_NAME, NULL,
+                                      COL_CR_OWNER_ID, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.iptcExt.LocationShown", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_LOC_SHO_SUB_LOC, list_tag_data[row][1],
+                                  COL_LOC_SHO_CITY, list_tag_data[row][2],
+                                  COL_LOC_SHO_STATE_PROV, list_tag_data[row][3],
+                                  COL_LOC_SHO_CNTRY, list_tag_data[row][4],
+                                  COL_LOC_SHO_CNTRY_ISO, list_tag_data[row][5],
+                                  COL_LOC_SHO_CNTRY_WRLD_REG, list_tag_data[row][6],
+                                  -1);
+              for (item = 1; item < locationshown_items+1; item++)
+                {
+                  if (list_tag_data[row][item])
+                    {
+                      if (list_tag_data[row][item])
+                        g_free(list_tag_data[row][item]);
+                    }
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_LOC_SHO_SUB_LOC, NULL,
+                                      COL_LOC_SHO_CITY, NULL,
+                                      COL_LOC_SHO_STATE_PROV, NULL,
+                                      COL_LOC_SHO_CNTRY, NULL,
+                                      COL_LOC_SHO_CNTRY_ISO, NULL,
+                                      COL_LOC_SHO_CNTRY_WRLD_REG, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.iptcExt.OrganisationInImageName", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_ORG_IMG_NAME, list_tag_data[row][1],
+                                  -1);
+              if (list_tag_data[row][1])
+                {
+                   if (list_tag_data[row][1])
+                     g_free(list_tag_data[row][1]);
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_ORG_IMG_NAME, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.iptcExt.OrganisationInImageCode", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_ORG_IMG_CODE, list_tag_data[row][1],
+                                  -1);
+              if (list_tag_data[row][1])
+                {
+                   if (list_tag_data[row][1])
+                     g_free(list_tag_data[row][1]);
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_ORG_IMG_CODE, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.plus.PropertyReleaseID", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_PROP_REL_ID, list_tag_data[row][1],
+                                  -1);
+              if (list_tag_data[row][1])
+                {
+                   if (list_tag_data[row][1])
+                     g_free(list_tag_data[row][1]);
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_PROP_REL_ID, NULL,
+                                      -1);
+                }
+            }
+        }
+      else if (!strcmp ("Xmp.plus.ModelReleaseID", name))
+        {
+          for (row = 1; row < row_count+1; row++)
+            {
+              gtk_list_store_append (liststore, &iter);
+              gtk_list_store_set (liststore, &iter,
+                                  COL_MOD_REL_ID, list_tag_data[row][1],
+                                  -1);
+              if (list_tag_data[row][1])
+                {
+                   if (list_tag_data[row][1])
+                     g_free(list_tag_data[row][1]);
+                }
+            }
+
+          if (row_count < 2)
+            {
+              for (row = 0; row < 2 - row_count; row++)
+                {
+                  gtk_list_store_append (liststore, &iter);
+                  gtk_list_store_set (liststore, &iter,
+                                      COL_MOD_REL_ID, NULL,
+                                      -1);
+                }
+            }
+        }
+    }
+}
+
+gchar *
+get_tag_ui_text (metadata_editor *args, gchar *name, gchar *mode)
+{
+  GObject *object;
+
+  object = gtk_builder_get_object (args->builder, name);
+
+  if (! strcmp ("single", mode))
+    {
+      GtkEntry *entry = GTK_ENTRY (object);
+      return gtk_entry_get_text (entry);
+    }
+  else if (!strcmp ("multi", mode))
+    {
+      GtkTextView   *text_view = GTK_TEXT_VIEW (object);
+      GtkTextBuffer *buffer;
+      GtkTextIter    start;
+      GtkTextIter    end;
+
+      buffer = gtk_text_view_get_buffer (text_view);
+      gtk_text_buffer_get_start_iter (buffer, &start);
+      gtk_text_buffer_get_end_iter (buffer, &end);
+
+      return gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+    }
+
+  return NULL;
+}
+
+gchar *
+get_tag_ui_list (metadata_editor *args, gchar *name, gchar *mode)
+{
+  GObject       *object;
+  GtkWidget     *widget;
+  GtkTreeModel  *treemodel;
+  GtkListStore  *liststore;
+  GtkTreeIter    iter;
+  gchar         *xmldata;
+  gint           number_of_rows;
+  gint           row;
+  gint           has_data;
+  gchar         *tagdata[256][256];
+
+  has_data = FALSE;
+  xmldata = (gchar*)g_malloc(262144);
+  object = gtk_builder_get_object (args->builder, name);
+  widget = GTK_WIDGET(object);
+
+  liststore = GTK_LIST_STORE(gtk_tree_view_get_model((GtkTreeView *)widget));
+  treemodel = GTK_TREE_MODEL (liststore);
+  number_of_rows =
+    gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL);
+
+  for (row = 0; row < number_of_rows; row++)
+    {
+      if (gtk_tree_model_iter_nth_child(treemodel, &iter, NULL, row))
+        {
+          if (!strcmp ("Xmp.plus.Licensor", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_LICENSOR_NAME, &tagdata[row][0],
+                                  COL_LICENSOR_ID, &tagdata[row][1],
+                                  COL_LICENSOR_PHONE1, &tagdata[row][2],
+                                  COL_LICENSOR_PHONE_TYPE1, &tagdata[row][3],
+                                  COL_LICENSOR_PHONE2, &tagdata[row][4],
+                                  COL_LICENSOR_PHONE_TYPE2, &tagdata[row][5],
+                                  COL_LICENSOR_EMAIL, &tagdata[row][6],
+                                  COL_LICENSOR_WEB, &tagdata[row][7],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0) ||
+                  (tagdata[row][1] != NULL && strlen(tagdata[row][1]) > 0) ||
+                  (tagdata[row][2] != NULL && strlen(tagdata[row][2]) > 0) ||
+                  (tagdata[row][3] != NULL && strlen(tagdata[row][3]) > 0) ||
+                  (tagdata[row][4] != NULL && strlen(tagdata[row][4]) > 0) ||
+                  (tagdata[row][5] != NULL && strlen(tagdata[row][5]) > 0) ||
+                  (tagdata[row][6] != NULL && strlen(tagdata[row][6]) > 0) ||
+                  (tagdata[row][7] != NULL && strlen(tagdata[row][7]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  for (types = 0; types < 8; types++)
+                    {
+                      xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                      xmldata = g_strconcat (xmldata, tagdata[row][types], NULL);
+                      xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                    }
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.plus.CopyrightOwner", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_CR_OWNER_NAME, &tagdata[row][0],
+                                  COL_CR_OWNER_ID, &tagdata[row][1],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0) ||
+                  (tagdata[row][1] != NULL && strlen(tagdata[row][1]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                  xmldata = g_strconcat (xmldata, tagdata[row][0], NULL);
+                  xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                  xmldata = g_strconcat (xmldata, tagdata[row][1], NULL);
+                  xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.plus.ImageCreator", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_IMG_CR8_NAME, &tagdata[row][0],
+                                  COL_IMG_CR8_ID, &tagdata[row][1],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0) ||
+                  (tagdata[row][1] != NULL && strlen(tagdata[row][1]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  for (types = 0; types < 2; types++)
+                    {
+                      xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                      xmldata = g_strconcat (xmldata, tagdata[row][types], NULL);
+                      xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                    }
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.iptcExt.ArtworkOrObject", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_AOO_TITLE, &tagdata[row][0],
+                                  COL_AOO_DATE_CREAT, &tagdata[row][1],
+                                  COL_AOO_CREATOR, &tagdata[row][2],
+                                  COL_AOO_SOURCE, &tagdata[row][3],
+                                  COL_AOO_SRC_INV_ID, &tagdata[row][4],
+                                  COL_AOO_CR_NOT, &tagdata[row][5],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0) ||
+                  (tagdata[row][1] != NULL && strlen(tagdata[row][1]) > 0) ||
+                  (tagdata[row][2] != NULL && strlen(tagdata[row][2]) > 0) ||
+                  (tagdata[row][3] != NULL && strlen(tagdata[row][3]) > 0) ||
+                  (tagdata[row][4] != NULL && strlen(tagdata[row][4]) > 0) ||
+                  (tagdata[row][5] != NULL && strlen(tagdata[row][5]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  for (types = 0; types < 6; types++)
+                    {
+                      xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                      xmldata = g_strconcat (xmldata, tagdata[row][types], NULL);
+                      xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                    }
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.iptcExt.RegistryId", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_REGSITRY_ORG_ID, &tagdata[row][0],
+                                  COL_REGSITRY_ITEM_ID, &tagdata[row][1],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0) ||
+                  (tagdata[row][1] != NULL && strlen(tagdata[row][1]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  for (types = 0; types < 2; types++)
+                    {
+                      xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                      xmldata = g_strconcat (xmldata, tagdata[row][types], NULL);
+                      xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                    }
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.iptcExt.LocationShown", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_LOC_SHO_SUB_LOC, &tagdata[row][0],
+                                  COL_LOC_SHO_CITY, &tagdata[row][1],
+                                  COL_LOC_SHO_STATE_PROV, &tagdata[row][2],
+                                  COL_LOC_SHO_CNTRY, &tagdata[row][3],
+                                  COL_LOC_SHO_CNTRY_ISO, &tagdata[row][4],
+                                  COL_LOC_SHO_CNTRY_WRLD_REG, &tagdata[row][5],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0) ||
+                  (tagdata[row][1] != NULL && strlen(tagdata[row][1]) > 0) ||
+                  (tagdata[row][2] != NULL && strlen(tagdata[row][2]) > 0) ||
+                  (tagdata[row][3] != NULL && strlen(tagdata[row][3]) > 0) ||
+                  (tagdata[row][4] != NULL && strlen(tagdata[row][4]) > 0) ||
+                  (tagdata[row][5] != NULL && strlen(tagdata[row][5]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  for (types = 0; types < 6; types++)
+                    {
+                      xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                      xmldata = g_strconcat (xmldata, tagdata[row][types], NULL);
+                      xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                    }
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.iptcExt.OrganisationInImageName", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_ORG_IMG_NAME, &tagdata[row][0],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                  xmldata = g_strconcat (xmldata, tagdata[row][0], NULL);
+                  xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.iptcExt.OrganisationInImageCode", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_ORG_IMG_CODE, &tagdata[row][0],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                  xmldata = g_strconcat (xmldata, tagdata[row][0], NULL);
+                  xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.plus.PropertyReleaseID", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_PROP_REL_ID, &tagdata[row][0],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                  xmldata = g_strconcat (xmldata, tagdata[row][0], NULL);
+                  xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+          else if (!strcmp ("Xmp.plus.ModelReleaseID", name))
+            {
+              gtk_tree_model_get (treemodel, &iter,
+                                  COL_MOD_REL_ID, &tagdata[row][0],
+                                  -1);
+
+              if ((tagdata[row][0] != NULL && strlen(tagdata[row][0]) > 0))
+                {
+                  gint  types;
+
+                  has_data = TRUE;
+
+                  xmldata = g_strconcat (xmldata, "\t\t\t<list-element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t\t<element>", NULL);
+                  xmldata = g_strconcat (xmldata, tagdata[row][0], NULL);
+                  xmldata = g_strconcat (xmldata, "</element>\n", NULL);
+                  xmldata = g_strconcat (xmldata, "\t\t\t</list-element>\n", NULL);
+                }
+            }
+        }
+    }
+
+  if (has_data == TRUE)
+    {
+      return xmldata;
+    }
+
+  g_free(xmldata);
+
+  return NULL;
+}
+
+gint
+get_tag_ui_combo (metadata_editor *args, gchar *name, gchar *mode)
+{
+  GObject *object;
+  GtkComboBoxText *combo;
+  gint value;
+
+  object = gtk_builder_get_object (args->builder, name);
+
+  combo = GTK_COMBO_BOX_TEXT (object);
+  value = gtk_combo_box_get_active (GTK_COMBO_BOX(combo));
+
+  return value;
+}
+
+void
+xml_parser_end_element (GMarkupParseContext  *context,
+                        const gchar          *element_name,
+                        gpointer              user_data,
+                        GError              **error)
+{
+  metadata_editor *args;
+  int i;
+
+  args = user_data;
+
+  if (strcmp (element_name, "gimp-metadata") == 0)
+    {
+      gimpmetadata = FALSE;
+    }
+  else if (strcmp (element_name, "iptc-tag") == 0)
+    {
+      iptctag = FALSE;
+#ifdef _ENABLE_IPTC_TAG_
+      if (str_tag_name && str_tag_value)
+        {
+          /* make sure to only allow supported tags */
+          for (i = 0; i < G_N_ELEMENTS (equivalent_metadata_tags); i++)
+            {
+              if (strcmp(equivalent_metadata_tags[i].tag, str_tag_name) == 0)
+                {
+#ifdef _SET_IPTC_TAG_
+                  set_tag_ui (args, i, str_tag_name, str_tag_value,
+                              equivalent_metadata_tags[i].mode);
+#endif
+                  if (force_write == TRUE)
+                    gexiv2_metadata_set_tag_string (args->metadata,
+                                                    str_tag_name,
+                                                    str_tag_value);
+                  break;
+                }
+            }
+        }
+#endif
+    }
+  else if (strcmp (element_name, "xmp-tag") == 0)
+    {
+      xmptag = FALSE;
+      if (strcmp (str_tag_mode, "list") != 0)
+        {
+          if (str_tag_name && str_tag_value)
+            {
+              /* make sure to only allow supported tags */
+              for (i = 0; i < G_N_ELEMENTS (default_metadata_tags); i++)
+                {
+                  if (strcmp(default_metadata_tags[i].tag, str_tag_name) == 0)
+                    {
+                      set_tag_ui (args, i, str_tag_name, str_tag_value,
+                                  default_metadata_tags[i].mode);
+#ifdef _ENABLE_FORCE_WRITE_
+                      if (force_write == TRUE)
+                        gexiv2_metadata_set_tag_string (args->metadata,
+                                                        str_tag_name,
+                                                        str_tag_value);
+#endif
+                      break;
+                    }
+                }
+            }
+
+        }
+      else if (strcmp (str_tag_mode, "list") == 0)
+        {
+          if (row_count > 0)
+            {
+              /* make sure to only allow supported tags */
+              for (i = 0; i < G_N_ELEMENTS (default_metadata_tags); i++)
+                {
+                  if (strcmp(default_metadata_tags[i].tag, str_tag_name) == 0)
+                    {
+                      set_tag_ui (args, i, str_tag_name, str_tag_value,
+                                       default_metadata_tags[i].mode);
+#ifdef _ENABLE_FORCE_WRITE_
+                      if (force_write == TRUE)
+                        gexiv2_metadata_set_tag_string (args->metadata,
+                                                        str_tag_name,
+                                                        str_tag_value);
+#endif
+                      break;
+                    }
+                }
+            }
+          row_count = 0;
+          item_count = 0;
+        }
+    }
+  else if (strcmp (element_name, "tag-value") == 0)
+    {
+      tagvalue = FALSE;
+    }
+  else if (strcmp (element_name, "tag-list-value") == 0)
+    {
+      taglistvalue = FALSE;
+    }
+  else if (strcmp (element_name, "tag-name") == 0)
+    {
+      tagname = FALSE;
+    }
+  else if (strcmp (element_name, "tag-mode") == 0)
+    {
+      tagmode = FALSE;
+    }
+  else if (strcmp (element_name, "list-element") == 0)
+    {
+      listelement = FALSE;
+      item_count = 0;
+    }
+  else if (strcmp (element_name, "element") == 0)
+    {
+      element = FALSE;
+      list_tag_data[row_count][item_count] = g_strdup(str_element);
+    }
+}
+
+gboolean
+xml_parser_parse_file (GimpXmlParser  *parser,
+                       const gchar    *filename,
+                       GError        **error)
+{
+  GIOChannel *io;
+  gboolean    success;
+
+  g_return_val_if_fail (parser != NULL, FALSE);
+  g_return_val_if_fail (filename != NULL, FALSE);
+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+  io = g_io_channel_new_file (filename, "r", error);
+  if (!io)
+    return FALSE;
+
+  success = xml_parser_parse_io_channel (parser, io, error);
+
+  g_io_channel_unref (io);
+
+  return success;
+}
+
+GimpXmlParser *
+xml_parser_new (const GMarkupParser *markup_parser,
+                gpointer             user_data)
+{
+  GimpXmlParser *parser;
+
+  g_return_val_if_fail (markup_parser != NULL, NULL);
+
+  parser = g_slice_new (GimpXmlParser);
+
+  parser->context = g_markup_parse_context_new (markup_parser,
+                    0, user_data, NULL);
+
+  return parser;
+}
+
+void
+xml_parser_free (GimpXmlParser *parser)
+{
+  g_return_if_fail (parser != NULL);
+
+  g_markup_parse_context_free (parser->context);
+  g_slice_free (GimpXmlParser, parser);
+}
+
+gboolean
+parse_encoding (const gchar  *text,
+                gint          text_len,
+                gchar       **encoding)
+{
+  const gchar *start;
+  const gchar *end;
+  gint         i;
+
+  g_return_val_if_fail (text, FALSE);
+
+  if (text_len < 20)
+    return FALSE;
+
+  start = g_strstr_len (text, text_len, "<?xml");
+  if (!start)
+    return FALSE;
+
+  end = g_strstr_len (start, text_len - (start - text), "?>");
+  if (!end)
+    return FALSE;
+
+  *encoding = NULL;
+
+  text_len = end - start;
+  if (text_len < 12)
+    return TRUE;
+
+  start = g_strstr_len (start + 1, text_len - 1, "encoding");
+  if (!start)
+    return TRUE;
+
+  start += 8;
+
+  while (start < end && *start == ' ')
+    start++;
+
+  if (*start != '=')
+    return TRUE;
+
+  start++;
+
+  while (start < end && *start == ' ')
+    start++;
+
+  if (*start != '\"' && *start != '\'')
+    return TRUE;
+
+  text_len = end - start;
+  if (text_len < 1)
+    return TRUE;
+
+  for (i = 1; i < text_len; i++)
+    if (start[i] == start[0])
+      break;
+
+  if (i == text_len || i < 3)
+    return TRUE;
+
+  *encoding = g_strndup (start + 1, i - 1);
+
+  return TRUE;
+}
+
+gboolean
+xml_parser_parse_io_channel (GimpXmlParser  *parser,
+                             GIOChannel     *io,
+                             GError        **error)
+{
+  GIOStatus    status;
+  gchar        buffer[4096];
+  gsize        len = 0;
+  gsize        bytes;
+  const gchar *io_encoding;
+  gchar       *encoding = NULL;
+
+  g_return_val_if_fail (parser != NULL, FALSE);
+  g_return_val_if_fail (io != NULL, FALSE);
+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+  io_encoding = g_io_channel_get_encoding (io);
+  if (g_strcmp0 (io_encoding, "UTF-8"))
+    {
+      g_warning ("xml_parser_parse_io_channel():\n"
+                 "The encoding has already been set on this GIOChannel!");
+      return FALSE;
+    }
+
+  /* try to determine the encoding */
+
+  g_io_channel_set_encoding (io, NULL, NULL);
+
+  while (len < sizeof (buffer))
+    {
+      status = g_io_channel_read_chars (io, buffer + len, 1, &bytes, error);
+      len += bytes;
+
+      if (status == G_IO_STATUS_ERROR)
+        return FALSE;
+      if (status == G_IO_STATUS_EOF)
+        break;
+
+      if (parse_encoding (buffer, len, &encoding))
+        break;
+    }
+
+  if (encoding)
+    {
+      if (! g_io_channel_set_encoding (io, encoding, error))
+        return FALSE;
+
+      if (encoding)
+        g_free (encoding);
+    }
+  else
+    {
+      g_io_channel_set_encoding (io, "UTF-8", NULL);
+    }
+
+  while (TRUE)
+    {
+      if (!g_markup_parse_context_parse (parser->context, buffer, len, error))
+        return FALSE;
+
+      status = g_io_channel_read_chars (io,
+                                        buffer, sizeof (buffer), &len, error);
+
+      switch (status)
+        {
+        case G_IO_STATUS_ERROR:
+          return FALSE;
+        case G_IO_STATUS_EOF:
+          return g_markup_parse_context_end_parse (parser->context, error);
+        case G_IO_STATUS_NORMAL:
+        case G_IO_STATUS_AGAIN:
+          break;
+        }
+    }
+}
+
diff --git a/plug-ins/metadata/metadata-xml.h b/plug-ins/metadata/metadata-xml.h
new file mode 100644
index 0000000..2f59726
--- /dev/null
+++ b/plug-ins/metadata/metadata-xml.h
@@ -0,0 +1,98 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * 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 __METADATA_XML_H__
+#define __METADATA_XML_H__
+
+#include "metadata-misc.h"
+
+struct _GimpXmlParser
+{
+  GMarkupParseContext *context;
+};
+
+typedef struct _GimpXmlParser GimpXmlParser;
+
+void
+xml_parser_start_element                     (GMarkupParseContext   *context,
+                                              const gchar           *element_name,
+                                              const gchar          **attribute_names,
+                                              const gchar          **attribute_values,
+                                              gpointer               user_data,
+                                              GError               **error);
+
+void
+xml_parser_data                              (GMarkupParseContext  *context,
+                                              const gchar          *text,
+                                              gsize                 text_len,
+                                              gpointer              user_data,
+                                              GError              **error);
+
+void
+set_tag_ui                                   (metadata_editor      *args,
+                                              int                   index,
+                                              gchar                *name,
+                                              gchar                *value,
+                                              gchar                *mode);
+
+gchar *
+get_tag_ui_text                              (metadata_editor      *args,
+                                              gchar                *name,
+                                              gchar                *mode);
+
+gchar *
+get_tag_ui_list                              (metadata_editor      *args,
+                                              gchar                *name,
+                                              gchar                *mode);
+
+gint
+get_tag_ui_combo                             (metadata_editor      *args,
+                                              gchar                *name,
+                                              gchar                *mode);
+
+void
+xml_parser_end_element                       (GMarkupParseContext  *context,
+                                              const gchar          *element_name,
+                                              gpointer              user_data,
+                                              GError              **error);
+
+gboolean
+xml_parser_parse_file                        (GimpXmlParser        *parser,
+                                              const gchar          *filename,
+                                              GError              **error);
+
+void
+xml_parser_free                              (GimpXmlParser        *parser);
+
+gboolean
+parse_encoding                               (const gchar          *text,
+                                              gint                  text_len,
+                                              gchar               **encoding);
+
+gboolean
+xml_parser_parse_io_channel                  (GimpXmlParser        *parser,
+                                              GIOChannel           *io,
+                                              GError              **error);
+
+GimpXmlParser *
+xml_parser_new                               (const GMarkupParser  *markup_parser,
+                                              gpointer              user_data);
+
+#endif /* __METADATA_XML_H__ */
+
diff --git a/plug-ins/ui/Makefile.am b/plug-ins/ui/Makefile.am
index 1b569f8..058aaf8 100644
--- a/plug-ins/ui/Makefile.am
+++ b/plug-ins/ui/Makefile.am
@@ -1,10 +1,12 @@
 uidatadir = $(gimpdatadir)/ui/plug-ins
 
 uidata_DATA = \
-       plug-in-file-gif.ui     \
-       plug-in-file-png.ui     \
-       plug-in-file-raw.ui     \
-       plug-in-file-tiff.ui    \
-       plug-in-metadata.ui
+       plug-in-file-gif.ui                     \
+       plug-in-file-png.ui                     \
+       plug-in-file-raw.ui                     \
+       plug-in-file-tiff.ui                    \
+       plug-in-metadata-editor.ui              \
+       plug-in-metadata-editor-calendar.ui     \
+       plug-in-metadata-viewer.ui
 
 EXTRA_DIST = $(uidata_DATA)
diff --git a/plug-ins/ui/plug-in-metadata-editor-calendar.ui b/plug-ins/ui/plug-in-metadata-editor-calendar.ui
new file mode 100644
index 0000000..e066a84
--- /dev/null
+++ b/plug-ins/ui/plug-in-metadata-editor-calendar.ui
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.24"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkVBox" id="calendar-vbox">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="spacing">6</property>
+    <child>
+      <object class="GtkCalendar" id="calendar">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="year">2016</property>
+        <property name="month">1</property>
+        <property name="day">1</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/plug-ins/ui/plug-in-metadata-editor.ui b/plug-ins/ui/plug-in-metadata-editor.ui
new file mode 100644
index 0000000..7da7de1
--- /dev/null
+++ b/plug-ins/ui/plug-in-metadata-editor.ui
@@ -0,0 +1,4953 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.24"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkListStore" id="artwork_or_object">
+    <columns>
+      <!-- column-name Title -->
+      <column type="gchararray"/>
+      <!-- column-name Date -->
+      <column type="gchararray"/>
+      <!-- column-name Creator -->
+      <column type="gchararray"/>
+      <!-- column-name Source -->
+      <column type="gchararray"/>
+      <!-- column-name SourceInventoryID -->
+      <column type="gchararray"/>
+      <!-- column-name CopyrightNotice -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="copyright_owner">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Identifier -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="feature_organization_code">
+    <columns>
+      <!-- column-name Code -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="feature_organization_name">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="image_creator">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Identifier -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="licensor">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Identifier -->
+      <column type="gchararray"/>
+      <!-- column-name Phone1 -->
+      <column type="gchararray"/>
+      <!-- column-name PhoneType1 -->
+      <column type="gchararray"/>
+      <!-- column-name Phone2 -->
+      <column type="gchararray"/>
+      <!-- column-name PhoneType2 -->
+      <column type="gchararray"/>
+      <!-- column-name Email -->
+      <column type="gchararray"/>
+      <!-- column-name Web -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="location_shown">
+    <columns>
+      <!-- column-name Sublocation -->
+      <column type="gchararray"/>
+      <!-- column-name City -->
+      <column type="gchararray"/>
+      <!-- column-name ProvinceState -->
+      <column type="gchararray"/>
+      <!-- column-name Country -->
+      <column type="gchararray"/>
+      <!-- column-name CountryCode -->
+      <column type="gchararray"/>
+      <!-- column-name WorldRegion -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="model_release_identifier">
+    <columns>
+      <!-- column-name Model -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="property_release_identifier">
+    <columns>
+      <!-- column-name PropertyReleaseID -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="registry_entry">
+    <columns>
+      <!-- column-name OrganisationID -->
+      <column type="gchararray"/>
+      <!-- column-name ItemID -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkVBox" id="metadata-vbox">
+    <property name="width_request">644</property>
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="spacing">6</property>
+    <child>
+      <object class="GtkNotebook" id="iptc-notebook">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <child>
+          <object class="GtkVBox" id="description_box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">never</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkViewport" id="viewport1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkTable" id="description_table">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">7</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="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Document Title</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_author">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_authortitle">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Author Title</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_description">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Description</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_descriptionwriter">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Description Writer   </property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.dc.title">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.dc.creator">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.photoshop.AuthorsPosition">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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="GtkEntry" id="Xmp.photoshop.CaptionWriter">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.dc.description">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </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="GtkLabel" id="l_rating">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Rating</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.dc.subject">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </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="GtkLabel" id="l_keywords2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Keywords</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkComboBoxText" id="Xmp.xmp.Rating">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="copyright_table">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">3</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">28</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_copyright_status">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Copyright Status</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_copyright1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Copyright Notice</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_copyright_url">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Copyright URL</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.dc.rights">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.xmpRights.WebStatement">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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="GtkComboBoxText" id="Xmp.xmpRights.Marked">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="description_page">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xpad">2</property>
+            <property name="ypad">2</property>
+            <property name="label" translatable="yes">Description</property>
+          </object>
+          <packing>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="iptc_box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow5">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">never</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkViewport" id="viewport4">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkTable" id="description_table1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">5</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">31</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_address">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Address</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l__city">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_postal_code">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Postal Code  </property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptc.CiAdrPcode">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkLabel" id="l_state_province">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">State / Province</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_country">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Country</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="address_scroll">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptc.CiAdrExtadr">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptc.CiAdrRegion">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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="GtkEntry" id="Xmp.iptc.CiAdrCtry">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.iptc.CiAdrCity">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="copyright_table1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">3</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">68</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_phones">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Phone(s)</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_copyright2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Email(s)</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_copyright_url1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Website(s)</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="address_scroll1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptc.CiTelWork">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="address_scroll2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptc.CiEmailWork">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </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="GtkScrolledWindow" id="address_scroll3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptc.CiUrlWork">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </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>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="copyright_table3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">3</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">16</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_creation_date1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Creation Date</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_intellectual_genre1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Intellectual Genre</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_scene_code1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">IPTC Scene Code</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="address_scroll5">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptc.Scene">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </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="Xmp.iptc.IntellectualGenre">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="hbox5">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkEntry" id="Xmp.photoshop.DateCreated">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="editable">False</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="create_date_button">
+                                    <property name="width_request">24</property>
+                                    <property name="height_request">24</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <child>
+                                      <object class="GtkImage" id="create_date_image">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="pixel_size">16</property>
+                                        <property name="icon_name">gtk-add</property>
+                                        <property name="icon-size">2</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">4</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator6">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">5</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="iptc_location_table3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">5</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">19</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_sublocation1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Sublocation  </property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_city1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptc.Location">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.photoshop.City">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.photoshop.Country">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkLabel" id="l_iptc_state_province1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">State / Province</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_country_code1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">ISO Country Code</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.photoshop.State">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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="GtkEntry" id="Xmp.iptc.CountryCode">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkLabel" id="l_iptc_country1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Country</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">6</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator5">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">7</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="iptc_location_table4">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">3</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">16</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_subject_code1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">IPTC Subject Code</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_keywords1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">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">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="iptc_headline_scroll1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.photoshop.Headline">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </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="GtkScrolledWindow" id="iptc_subject_code_scroll4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptc.SubjectCode">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </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="GtkLabel" id="l_iptc_urgency">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Urgency</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkComboBoxText" id="Xmp.photoshop.Urgency">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">8</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator7">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">12</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="iptc_location_table2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">5</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">45</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_job_identifier">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Job Identifier       </property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_instructions">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Instructions</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_credit_line">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Credit Line</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_source">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">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">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.photoshop.Source">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.photoshop.TransmissionReference">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.photoshop.Credit">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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="GtkScrolledWindow" id="iptc_subject_code_scroll1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.photoshop.Instructions">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </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="GtkLabel" id="l_iptc_usage_terms">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Usage Terms</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="iptc_usage_terms_scroll">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.xmpRights.UsageTerms">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </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>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">17</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="iptc_page">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">IPTC</property>
+          </object>
+          <packing>
+            <property name="position">1</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="iptc_ext_box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow2">
+                <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="viewport2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkTable" id="image_description_table">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">10</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">43</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_sublocation">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_city">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_prov_state">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Province / Sate</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_person_in_image">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Person Shown</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_country_name">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Country Name</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptcExt.CountryName">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.iptcExt.Sublocation">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.iptcExt.ProvinceState">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkLabel" id="l_iptc_ext_country_code">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Country ISO-Code</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_world_region">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.019999999552965164</property>
+                                <property name="xpad">4</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">World Region</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="iptc_ext_person_shown_scroll">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptcExt.PersonInImage">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptcExt.City">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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="GtkEntry" id="Xmp.iptcExt.CountryCode">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.iptcExt.WorldRegion">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkLabel" id="l_iptc_ext_location_shown">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.019999999552965164</property>
+                                <property name="xpad">4</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Location Shown</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">7</property>
+                                <property name="bottom_attach">8</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_featured_org">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.019999999552965164</property>
+                                <property name="xpad">4</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Featured Organisation</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">8</property>
+                                <property name="bottom_attach">9</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_event">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.019999999552965164</property>
+                                <property name="xpad">4</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Event</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">9</property>
+                                <property name="bottom_attach">10</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="spacing">4</property>
+                                <child>
+                                  <object class="GtkVBox" id="vbox8">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkTreeView" id="Xmp.iptcExt.OrganisationInImageName">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="model">feature_organization_name</property>
+                                        <property name="headers_clickable">False</property>
+                                        <property name="search_column">0</property>
+                                        <property name="enable_grid_lines">both</property>
+                                        <child>
+                                          <object class="GtkTreeViewColumn" id="Name">
+                                            <property name="resizable">True</property>
+                                            <property name="title" translatable="yes">Name</property>
+                                            <child>
+                                              <object class="GtkCellRendererText" id="cellrenderertext7">
+                                                <property name="editable">True</property>
+                                              </object>
+                                              <attributes>
+                                                <attribute name="text">0</attribute>
+                                              </attributes>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkHBox" id="hbox10">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <child>
+                                          <object class="GtkButton" id="add_feat_org_name_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <child>
+                                              <object class="GtkImage" id="add_feat_org_name_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="stock">gtk-add</property>
+                                                <property name="pixel_size">16</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="rem_feat_org_name_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="focus_on_click">False</property>
+                                            <child>
+                                              <object class="GtkImage" id="rem_feat_org_name_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="stock">gtk-remove</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="padding">4</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkVBox" id="vbox9">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkTreeView" id="Xmp.iptcExt.OrganisationInImageCode">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="model">feature_organization_code</property>
+                                        <property name="headers_clickable">False</property>
+                                        <property name="search_column">0</property>
+                                        <property name="enable_grid_lines">both</property>
+                                        <child>
+                                          <object class="GtkTreeViewColumn" id="Code">
+                                            <property name="resizable">True</property>
+                                            <property name="title" translatable="yes">Code</property>
+                                            <child>
+                                              <object class="GtkCellRendererText" id="cellrenderertext8">
+                                                <property name="editable">True</property>
+                                              </object>
+                                              <attributes>
+                                                <attribute name="text">0</attribute>
+                                              </attributes>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkHBox" id="hbox11">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="spacing">4</property>
+                                        <child>
+                                          <object class="GtkButton" id="rem_feat_org_code_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="focus_on_click">False</property>
+                                            <child>
+                                              <object class="GtkImage" id="rem_feat_org_code_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="stock">gtk-remove</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="add_feat_org_code_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <child>
+                                              <object class="GtkImage" id="add_feat_org_code_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="stock">gtk-add</property>
+                                                <property name="pixel_size">16</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="padding">4</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </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>
+                            <child>
+                              <object class="GtkVBox" id="vbox6">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkTreeView" id="Xmp.iptcExt.LocationShown">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="model">location_shown</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="search_column">0</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Sublocation">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Sublocation</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext1">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="City">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">City</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext2">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="State">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Province / State</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext3">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">2</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Country">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Country</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext4">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">3</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="CountryCode">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Country ISO Code</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext5">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">4</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="WorldRegion">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">World Region</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext6">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">5</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox6">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkButton" id="add_shown_location_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <child>
+                                          <object class="GtkImage" id="add_shown_location_image">
+                                            <property name="width_request">0</property>
+                                            <property name="height_request">0</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="stock">gtk-add</property>
+                                            <property name="pixel_size">16</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="rem_shown_location_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <child>
+                                          <object class="GtkImage" id="rem_shown_location_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="stock">gtk-remove</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </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>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptcExt.Event">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">9</property>
+                                <property name="bottom_attach">10</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator4">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="image_description_table1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">73</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_artwork_object">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.019999999552965164</property>
+                                <property name="xpad">4</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Artwork or Object</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkVBox" id="vbox10">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkTreeView" id="Xmp.iptcExt.ArtworkOrObject">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="model">artwork_or_object</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="search_column">0</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Title">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Title</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext9">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="DateCreated">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Date Created</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext10">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Creator">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Creator</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext11">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">2</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Source">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Source</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext12">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">3</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="SourceInventoryID">
+                                        <property name="title" translatable="yes">Source Inventory 
ID</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext13">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">4</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Copyright">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Copyright Notice</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext14">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">5</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox12">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkButton" id="rem_artwork_object_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                        <property name="focus_on_click">False</property>
+                                        <child>
+                                          <object class="GtkImage" id="rem_artwork_object_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="stock">gtk-remove</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="add_artwork_object_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                        <child>
+                                          <object class="GtkImage" id="add_artwork_object_image">
+                                            <property name="width_request">0</property>
+                                            <property name="height_request">0</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <property name="stock">gtk-add</property>
+                                            <property name="pixel_size">16</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator9">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">4</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="image_description_table2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">4</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">8</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_model_age">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Model Age</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_city1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Minor Model Age 
Disclosure</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_model_release_status">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Model Release Status</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_additional_model_info">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Additional Model Info</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptcExt.ModelAge">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkScrolledWindow" id="iptc_ext_person_shown_scroll1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.iptcExt.AddlModelInfo">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkComboBoxText" id="Xmp.plus.MinorModelAgeDisclosure">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="spacing">4</property>
+                                <child>
+                                  <object class="GtkFixed" id="fixed2">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkComboBoxText" id="Xmp.plus.ModelReleaseStatus">
+                                        <property name="width_request">140</property>
+                                        <property name="height_request">32</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkVBox" id="vbox11">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkTreeView" id="Xmp.plus.ModelReleaseID">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="model">model_release_identifier</property>
+                                        <property name="headers_clickable">False</property>
+                                        <property name="search_column">0</property>
+                                        <property name="enable_grid_lines">both</property>
+                                        <child>
+                                          <object class="GtkTreeViewColumn" id="ModelReleaseID">
+                                            <property name="resizable">True</property>
+                                            <property name="title" translatable="yes">Model Release 
Identifier</property>
+                                            <child>
+                                              <object class="GtkCellRendererText" id="cellrenderertext15">
+                                                <property name="editable">True</property>
+                                              </object>
+                                              <attributes>
+                                                <attribute name="text">0</attribute>
+                                              </attributes>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkHBox" id="hbox13">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <child>
+                                          <object class="GtkButton" id="add_model_rel_id_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <child>
+                                              <object class="GtkImage" id="add_model_rel_id_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                                <property name="stock">gtk-add</property>
+                                                <property name="pixel_size">16</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="rem_model_rel_id_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="focus_on_click">False</property>
+                                            <child>
+                                              <object class="GtkImage" id="rem_model_rel_id_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                                <property name="stock">gtk-remove</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="padding">4</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </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>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">5</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator10">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">6</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="image_description_table3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">7</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">54</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_image_supplier_id">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Image Supplier ID</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_iptc_ext_city2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Supplier's Image ID</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_registry_entry">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Registry Entry</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_image_supplier">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Image Supplier Name</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_max_width">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Max. Available Width</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.iptcExt.MaxAvailWidth">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.plus.ImageSupplierID">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkLabel" id="l_max_height">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Max. Available Height</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_digital_source_type">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.019999999552965164</property>
+                                <property name="xpad">4</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Digital Source Type</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="iptc_ext_person_shown_scroll2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.plus.ImageSupplierName">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.plus.ImageSupplierImageID">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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="GtkEntry" id="Xmp.iptcExt.MaxAvailHeight">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkComboBoxText" id="Xmp.iptcExt.DigitalSourceType">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkVBox" id="vbox12">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkTreeView" id="Xmp.iptcExt.RegistryId">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="model">registry_entry</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="search_column">0</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="OrganizationID">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Organization 
Identifier</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext16">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="ItemID">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Item Identifier</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext17">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox14">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkButton" id="add_reg_entry_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                        <child>
+                                          <object class="GtkImage" id="add_reg_entry_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <property name="stock">gtk-add</property>
+                                            <property name="pixel_size">16</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="rem_reg_entry_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                        <property name="focus_on_click">False</property>
+                                        <child>
+                                          <object class="GtkImage" id="rem_reg_entry_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="stock">gtk-remove</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </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>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">7</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator11">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="padding">8</property>
+                            <property name="position">8</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="image_description_table4">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">4</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">36</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_copyright_owner">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Copyright Owner</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_licensor">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Licensor</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_property_release_status">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Property Release Status</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_image_creator">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Image Creator</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkVBox" id="vbox13">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkTreeView" id="Xmp.plus.ImageCreator">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="model">image_creator</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="search_column">0</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Name1">
+                                        <property name="resizable">True</property>
+                                        <property name="spacing">3</property>
+                                        <property name="title" translatable="yes">Name</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext18">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Identifier">
+                                        <property name="title" translatable="yes">Identifier</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext19">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox15">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkButton" id="add_image_creator_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                        <child>
+                                          <object class="GtkImage" id="add_image_creator_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <property name="stock">gtk-add</property>
+                                            <property name="pixel_size">16</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="rem_image_creator_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                        <property name="focus_on_click">False</property>
+                                        <child>
+                                          <object class="GtkImage" id="rem_image_creator_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="stock">gtk-remove</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkVBox" id="vbox14">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkTreeView" id="Xmp.plus.CopyrightOwner">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="model">copyright_owner</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="search_column">0</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Name2">
+                                        <property name="title" translatable="yes">Name</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext20">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Identifier1">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Identifier</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext21">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox16">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkButton" id="add_copyright_own_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                        <child>
+                                          <object class="GtkImage" id="add_copyright_own_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <property name="stock">gtk-add</property>
+                                            <property name="pixel_size">16</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="rem_copyright_own_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                        <property name="focus_on_click">False</property>
+                                        <child>
+                                          <object class="GtkImage" id="rem_copyright_own_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="stock">gtk-remove</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </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="GtkVBox" id="vbox15">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkTreeView" id="Xmp.plus.Licensor">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="model">licensor</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="search_column">0</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Name3">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Name</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext22">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="Identifier2">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Identifier</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext23">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="PhoneNumber1">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Phone Number 1</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext24">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">2</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="PhoneNumberCombo1">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Phone Type 1</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererCombo" id="cellrenderercombo1"/>
+                                          <attributes>
+                                            <attribute name="text">3</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="PhoneNumber2">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Phone Number 2</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext25">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">4</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="PhoneNumberCombo2">
+                                        <property name="title" translatable="yes">Phone Type 2</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererCombo" id="cellrenderercombo2"/>
+                                          <attributes>
+                                            <attribute name="text">5</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="EmailAddress">
+                                        <property name="resizable">True</property>
+                                        <property name="title" translatable="yes">Email Address</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext26">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">6</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="WebAddress">
+                                        <property name="title" translatable="yes">Web Address</property>
+                                        <property name="expand">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext27">
+                                            <property name="editable">True</property>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="text">7</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox17">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkButton" id="add_licensor_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                        <child>
+                                          <object class="GtkImage" id="add_licensor_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <property name="stock">gtk-add</property>
+                                            <property name="pixel_size">16</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="rem_licensor_button">
+                                        <property name="width_request">24</property>
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                        <property name="focus_on_click">False</property>
+                                        <child>
+                                          <object class="GtkImage" id="rem_licensor_image">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="stock">gtk-remove</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">2</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </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="GtkHBox" id="hbox4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="spacing">4</property>
+                                <child>
+                                  <object class="GtkFixed" id="fixed1">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkComboBoxText" id="Xmp.plus.PropertyReleaseStatus">
+                                        <property name="width_request">140</property>
+                                        <property name="height_request">32</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkVBox" id="vbox16">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkTreeView" id="Xmp.plus.PropertyReleaseID">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="model">property_release_identifier</property>
+                                        <property name="headers_clickable">False</property>
+                                        <property name="search_column">0</property>
+                                        <property name="enable_grid_lines">both</property>
+                                        <child>
+                                          <object class="GtkTreeViewColumn" id="PropertyReleaseID">
+                                            <property name="resizable">True</property>
+                                            <property name="title" translatable="yes">Property Release 
Identifier</property>
+                                            <child>
+                                              <object class="GtkCellRendererText" id="cellrenderertext28">
+                                                <property name="editable">True</property>
+                                              </object>
+                                              <attributes>
+                                                <attribute name="text">0</attribute>
+                                              </attributes>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkHBox" id="hbox18">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <child>
+                                          <object class="GtkButton" id="add_prop_rel_id_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                            <child>
+                                              <object class="GtkImage" id="add_prop_rel_id_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Add an 
entry</property>
+                                                <property name="stock">gtk-add</property>
+                                                <property name="pixel_size">16</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="rem_prop_rel_id_button">
+                                            <property name="width_request">24</property>
+                                            <property name="height_request">24</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                            <property name="focus_on_click">False</property>
+                                            <child>
+                                              <object class="GtkImage" id="rem_prop_rel_id_image">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Remove an 
entry</property>
+                                                <property name="stock">gtk-remove</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="padding">2</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="padding">4</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </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>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">9</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="iptc_extension_page">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">IPTC Extension</property>
+          </object>
+          <packing>
+            <property name="position">2</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="categories_box_page">
+            <property name="height_request">380</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow3">
+                <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="viewport3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox5">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkTable" id="image_description_table5">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">2</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">16</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_supplemental_category">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">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">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_category">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Category</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="iptc_ext_person_shown_scroll4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.photoshop.SupplementalCategories">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </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="Xmp.photoshop.Category">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="max_length">3</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="categories_page">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xpad">2</property>
+            <property name="ypad">2</property>
+            <property name="label" translatable="yes">Categories</property>
+          </object>
+          <packing>
+            <property name="position">3</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="gps_box_page">
+            <property name="height_request">380</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow6">
+                <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="viewport5">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox7">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkTable" id="image_description_table6">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">6</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">43</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_longitude_ref">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Longitude Reference</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_longitude">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Longitude</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Exif.GPSInfo.GPSLongitude">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_altitude">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Altitude</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_latitude">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Latitude</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Exif.GPSInfo.GPSLatitude">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">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_latitude_ref">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Latitude Reference</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_altitude_ref">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Altitude Reference</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkComboBoxText" id="Exif.GPSInfo.GPSLongitudeRef">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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="GtkComboBoxText" id="Exif.GPSInfo.GPSLatitudeRef">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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="GtkComboBoxText" id="Exif.GPSInfo.GPSAltitudeRef">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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="GtkHBox" id="hbox19">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkEntry" id="Exif.GPSInfo.GPSAltitude">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkComboBoxText" id="GPSAltitudeSystem">
+                                    <property name="width_request">60</property>
+                                    <property name="height_request">30</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </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>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">4</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="gps_page">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">GPS</property>
+          </object>
+          <packing>
+            <property name="position">4</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="dicom_box_page">
+            <property name="height_request">380</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow7">
+                <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="viewport6">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkTable" id="description_table2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">4</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">100</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_patient_name">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Patient</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_patient_id">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Patient ID</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_dob">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Date of Birth</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_patient_sex">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Patient Sex</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.DICOM.PatientName">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.DICOM.PatientID">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkComboBoxText" id="Xmp.DICOM.PatientSex">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</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>
+                                <property name="y_padding">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox9">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkEntry" id="Xmp.DICOM.PatientDOB">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="editable">False</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="dob_date_button">
+                                    <property name="width_request">24</property>
+                                    <property name="height_request">24</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <child>
+                                      <object class="GtkImage" id="dob_date_image">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="pixel_size">16</property>
+                                        <property name="icon_name">gtk-add</property>
+                                        <property name="icon-size">2</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </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>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator12">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="description_table4">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">8</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">59</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_study_id">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Study ID</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_referring_physician">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Referring Physician</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_study_date">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Study Date</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.DICOM.StudyID">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.DICOM.StudyPhysician">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkLabel" id="l_study_description">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Study Description</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">3</property>
+                                <property name="bottom_attach">4</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="iptc_headline_scroll2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.DICOM.StudyDescription">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
+                              </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="GtkLabel" id="l_series_number">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Series Number</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_modality">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Modality</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_series_date">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Series Date</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">6</property>
+                                <property name="bottom_attach">7</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_series_description">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Series Description</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">7</property>
+                                <property name="bottom_attach">8</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="iptc_headline_scroll3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTextView" id="Xmp.DICOM.SeriesDescription">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                  </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>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.DICOM.SeriesNumber">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="Xmp.DICOM.SeriesModality">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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="GtkHBox" id="hbox7">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkEntry" id="Xmp.DICOM.StudyDateTime">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="editable">False</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="study_date_button">
+                                    <property name="width_request">24</property>
+                                    <property name="height_request">24</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <child>
+                                      <object class="GtkImage" id="study_date_image">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="pixel_size">16</property>
+                                        <property name="icon_name">gtk-add</property>
+                                        <property name="icon-size">2</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </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="GtkHBox" id="hbox8">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkEntry" id="Xmp.DICOM.SeriesDateTime">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="editable">False</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="series_date_button">
+                                    <property name="width_request">24</property>
+                                    <property name="height_request">24</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <child>
+                                      <object class="GtkImage" id="series_date_image">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="pixel_size">16</property>
+                                        <property name="icon_name">gtk-add</property>
+                                        <property name="icon-size">2</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">4</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </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>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHSeparator" id="hseparator13">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="description_table3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="border_width">6</property>
+                            <property name="n_rows">2</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">23</property>
+                            <property name="row_spacing">3</property>
+                            <child>
+                              <object class="GtkLabel" id="l_equipment_institution">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Equipment Institution</property>
+                                <property name="single_line_mode">True</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="l_equipment_manufacturer">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">3</property>
+                                <property name="ypad">3</property>
+                                <property name="label" translatable="yes">Equipment Manufacturer</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.DICOM.EquipmentInstitution">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="Xmp.DICOM.EquipmentManufacturer">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</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>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">4</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">5</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="dicom_page">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">DICOM</property>
+          </object>
+          <packing>
+            <property name="position">5</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHBox" id="hbox1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <object class="GtkComboBoxText" id="impex_combo">
+            <property name="width_request">160</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">6</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/plug-ins/ui/plug-in-metadata-viewer.ui b/plug-ins/ui/plug-in-metadata-viewer.ui
new file mode 100644
index 0000000..706550c
--- /dev/null
+++ b/plug-ins/ui/plug-in-metadata-viewer.ui
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkListStore" id="exif-liststore">
+    <columns>
+      <!-- column-name c_exif_tag -->
+      <column type="gchararray"/>
+      <!-- column-name c_exif_value -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="xmp-liststore">
+    <columns>
+      <!-- column-name c_xmp_tag -->
+      <column type="gchararray"/>
+      <!-- column-name c_xmp_value -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="iptc-liststore">
+    <columns>
+      <!-- column-name c_iptc_tag -->
+      <column type="gchararray"/>
+      <!-- column-name c_iptc_value -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkVBox" id="metadata-vbox">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkNotebook" id="metadata-notebook">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="scrollable">True</property>
+        <child>
+          <object class="GtkScrolledWindow" id="exif-scroll">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="border_width">6</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="exif-treeview">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="model">exif-liststore</property>
+                <property name="headers_clickable">False</property>
+                <property name="search_column">0</property>
+                <child internal-child="selection">
+                  <object class="GtkTreeSelection" id="exif-treeview-selection"/>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="exif_tag_column">
+                    <property name="resizable">True</property>
+                    <property name="spacing">3</property>
+                    <property name="title" translatable="yes">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" translatable="yes">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>
+        <child type="tab">
+          <object class="GtkLabel" id="exif">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xpad">4</property>
+            <property name="ypad">4</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>
+            <property name="border_width">6</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="xmp-treeview">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="model">xmp-liststore</property>
+                <property name="headers_clickable">False</property>
+                <property name="search_column">0</property>
+                <child internal-child="selection">
+                  <object class="GtkTreeSelection" id="xmp-treeview-selection"/>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="xmp_tag_column">
+                    <property name="resizable">True</property>
+                    <property name="spacing">3</property>
+                    <property name="title" translatable="yes">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" translatable="yes">Value</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="xmp_value_cell_renderer"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </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="can_focus">False</property>
+            <property name="xpad">4</property>
+            <property name="ypad">4</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="GtkScrolledWindow" id="iptc-scroll">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="border_width">6</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="iptc-treeview">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="model">iptc-liststore</property>
+                <property name="headers_clickable">False</property>
+                <property name="search_column">0</property>
+                <child internal-child="selection">
+                  <object class="GtkTreeSelection" id="iptc-treeview-selection"/>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="iptc_tag_column">
+                    <property name="resizable">True</property>
+                    <property name="spacing">3</property>
+                    <property name="title" translatable="yes">IPTC Tag</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="iptc_tag_cell_renderer"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="iptc_value_column">
+                    <property name="resizable">True</property>
+                    <property name="spacing">3</property>
+                    <property name="title" translatable="yes">Value</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="iptc_value_cell_renderer"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </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="can_focus">False</property>
+            <property name="xpad">4</property>
+            <property name="ypad">4</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="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/po-plug-ins/POTFILES.in b/po-plug-ins/POTFILES.in
index 605df17..591b9b3 100644
--- a/po-plug-ins/POTFILES.in
+++ b/po-plug-ins/POTFILES.in
@@ -73,7 +73,6 @@ plug-ins/common/hot.c
 plug-ins/common/jigsaw.c
 plug-ins/common/mail.c
 plug-ins/common/max-rgb.c
-plug-ins/common/metadata.c
 plug-ins/common/newsprint.c
 plug-ins/common/nl-filter.c
 plug-ins/common/oilify.c
@@ -222,6 +221,8 @@ plug-ins/lighting/lighting-ui.c
 plug-ins/map-object/map-object-apply.c
 plug-ins/map-object/map-object-main.c
 plug-ins/map-object/map-object-ui.c
+plug-ins/metadata/metadata-editor.c
+plug-ins/metadata/metadata-viewer.c
 plug-ins/pagecurl/pagecurl.c
 plug-ins/print/print-draw-page.c
 plug-ins/print/print-page-layout.c


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]