diff --git a/formats/image/file_image.admin.inc b/formats/image/file_image.admin.inc
index 32be97a..85383c2 100644
--- a/formats/image/file_image.admin.inc
+++ b/formats/image/file_image.admin.inc
@@ -92,6 +92,48 @@ function file_image_admin_settings() {
     }
   }
 
+  // IPTC settings.
+  $form['iptc'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('IPTC settings'),
+    '#description' => function_exists('iptcparse')
+      ? t('IPTC extensions are installed in the system.')
+      : t('IPTC extensions are not installed in the system.'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE
+  );
+  $form['iptc']['file_image_iptc'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable Extraction of the image\'s <a href="http://en.wikipedia.org/wiki/IPTC_Information_Interchange_Model" title="IPTC Information Interchange Model (IIM)">IPTC</a> metadata'),
+    '#default_value' => function_exists('iptcparse')
+      ? FILE_IMAGE_IPTC
+      : 0,
+    '#description' => t('Check this box if you want to extract any of the exif metadata.'),
+    '#disabled' => function_exists('iptcparse')
+      ? FALSE
+      : TRUE,
+    '#prefix' => '<div class="file-image-iptc-file-image-iptc-setting">',
+    '#suffix' => '</div>',
+  );
+  $iptc = _file_image_iptc();
+  foreach ($iptc as $name => $data) {
+    $iptc_data_default[$name] = $data['default'];
+  }
+  $iptc_data = variable_get('file_image_iptc_data', $iptc_data_default);
+  $i = $j = 0;
+  foreach ($iptc as $name => $data) {
+    $form['iptc']['iptc_'. $i][$j]['file_image_iptc_'. $name] = array(
+      '#type' => 'checkbox',
+      '#title' => $data['name'],
+      '#default_value' => $iptc_data[$name],
+    );
+    $j++;
+    if ($j == 3) {
+      $i++;
+      $j = 0;
+    }
+  }
+
   // Geo settings.
   $form['geo'] = array('#type' => 'fieldset', '#title' => t('Geo location settings'), '#collapsible' => TRUE, '#collapsed' => FALSE);
   $form['geo']['file_image_geo'] = array(
@@ -181,6 +223,13 @@ function file_image_admin_settings_submit($form, &$form_state) {
         $exif_data[$name] = $values['file_image_exif_'. $name];
       }
       variable_set('file_image_exif_data', $exif_data);
+      variable_set('file_image_iptc', $values['file_image_iptc']);
+      $iptc = _file_image_iptc();
+      $iptc_data = array();
+      foreach ($iptc as $name => $data) {
+        $iptc_data[$name] = $values['file_image_iptc_'. $name];
+      }
+      variable_set('file_image_iptc_data', $iptc_data);
       variable_set('file_image_geo', $values['file_image_geo']);
       drupal_set_message(t('The configuration options have been saved.'));
       break;
@@ -192,6 +241,8 @@ function file_image_admin_settings_submit($form, &$form_state) {
       variable_del('file_image_custom_previews');
       variable_del('file_image_exif');
       variable_del('file_image_exif_data');
+      variable_del('file_image_iptc');
+      variable_del('file_image_iptc_data');
       variable_del('file_image_geo');
       drupal_set_message(t('The configuration options have been reset to their default values.'));
       break;
diff --git a/formats/image/file_image.module b/formats/image/file_image.module
index 2e2b549..0f63b38 100644
--- a/formats/image/file_image.module
+++ b/formats/image/file_image.module
@@ -12,6 +12,7 @@ define('FILE_IMAGE_PREVIEW_RESOLUTION',   variable_get('file_image_preview_resol
 define('FILE_IMAGE_MEDIUM_RESOLUTION',    variable_get('file_image_medium_resolution', '300x300'));
 define('FILE_IMAGE_THUMBNAIL_RESOLUTION', variable_get('file_image_thumbnail_resolution', '120x120'));
 define('FILE_IMAGE_EXIF',                 variable_get('file_image_exif', 0));
+define('FILE_IMAGE_IPTC',                 variable_get('file_image_iptc', 0));
 define('FILE_IMAGE_GEO',                  variable_get('file_image_geo', 0));
 
 //////////////////////////////////////////////////////////////////////////////
@@ -255,11 +256,18 @@ function file_image_metadata_info() {
     'geo:lat' => array('name' => t('Latitude')),
     'geo:long' => array('name' => t('Longitude')),
   );
+  // exif info
   foreach (_file_image_exif() as $name => $data) {
     $info[$data['rdf']] = array('name' => t($data['name']));
     if (isset($data['theme']))
       $info[$data['rdf']]['theme'] = $data['theme'];
   }
+  // iptc info
+  foreach (_file_image_iptc() as $name => $data) {
+    $info[$data['rdf']] = array('name' => t($data['name']));
+    if (isset($data['theme']))
+      $info[$data['rdf']]['theme'] = $data['theme'];
+  }
   return $info;
 }
 
@@ -267,12 +275,12 @@ function file_image_metadata_info() {
  * Implementation of hook_metadata_parse().
  */
 function file_image_metadata_parse($filename, $mimetype) {
-  
+
   if (!array_key_exists($mimetype, file_image_mime_types()))
     return NULL;
-   
+
   $metadata = array();
-  if ($info = @getimagesize($filename)) {
+  if ($info = @getimagesize($filename, $ext_info)) {
     $width = $info[0];
     $height = $info[1];
     $metadata =  array_merge(array(
@@ -283,15 +291,15 @@ function file_image_metadata_parse($filename, $mimetype) {
 
   // EXIF.
   if (FILE_IMAGE_EXIF && function_exists('exif_read_data')) {
-    
+
     $exif = _file_image_exif();
-   
+
     foreach ($exif as $name => $data) {
       $exif_data_default[$name] = $data['default'];
     }
     $exif_data = variable_get('file_image_exif_data', $exif_data_default);
     if ($info = @exif_read_data($filename)) {
-     
+
       $rdf_exif = array();
       foreach ($exif as $name => $data) {
         if (isset($exif_data[$name]) && $element = file_get_recursive($info, $data['exif'])) {
@@ -321,6 +329,18 @@ function file_image_metadata_parse($filename, $mimetype) {
       }
     }
   }
+
+  // IPTC
+  $iptc = _file_image_iptc();
+  if (FILE_IMAGE_IPTC && function_exists('iptcparse') && isset($ext_info["APP13"])) {
+    $iptc_info = iptcparse($ext_info["APP13"]);
+    $rdf_iptc = array();
+    foreach ($iptc as $name => $data) {
+      $rdf_iptc[$data['rdf']] = array_map('utf8_encode', $iptc_info[key($data['iptc'])]);
+    }
+    $metadata =  array_merge($rdf_iptc, $metadata);
+  }
+
   return $metadata;
 }
 
@@ -421,6 +441,7 @@ function file_image_thumbnail_render($uri, $options = array()) {
 function file_image_rdf_namespaces() {
   return array(
     'exif' => 'http://www.w3.org/2003/12/exif/ns',
+    'iptc' => 'http://iptc.org/std/nar/2006-10-01/',
     'geo'  => 'http://www.w3.org/2003/01/geo/wgs84_pos#',
   );
 }
@@ -547,3 +568,27 @@ function _file_image_exif() {
   );
 }
 
+//////////////////////////////////////////////////////////////////////////////
+// IPTC settings
+
+/**
+ * IPTC to RDF mapping.
+ */
+function _file_image_iptc() {
+  return array(
+  	'author'             => array('name' => 'Author',             'iptc' => array('2#080' => NULL),'rdf' => 'iptc:author', 'type' => '', 'default' => 0),
+    'author_titel'       => array('name' => 'Author Title',       'iptc' => array('2#085' => NULL),'rdf' => 'iptc:author_title', 'type' => '', 'default' => 0),
+  	'categories'         => array('name' => 'Categories',         'iptc' => array('2#020' => NULL),'rdf' => 'iptc:categories', 'type' => '', 'default' => 0),
+  	'feeds'              => array('name' => 'Feeds',              'iptc' => array('2#025' => NULL),'rdf' => 'iptc:feeds', 'type' => '', 'default' => 0),
+  	'copyright'          => array('name' => 'Copyright',          'iptc' => array('2#116' => NULL),'rdf' => 'iptc:copyright', 'type' => '', 'default' => 0),
+  	'description'        => array('name' => 'Description',        'iptc' => array('2#120' => NULL),'rdf' => 'iptc:description', 'type' => '', 'default' => 0),
+  	'author_description' => array('name' => 'Author Description', 'iptc' => array('2#122' => NULL),'rdf' => 'iptc:author_description', 'type' => '', 'default' => 0),
+  	'source_titel'       => array('name' => 'Source Titel',       'iptc' => array('2#105' => NULL),'rdf' => 'iptc:source_title', 'type' => '', 'default' => 0),
+  	'source_assignment'  => array('name' => 'Source Assignment',  'iptc' => array('2#040' => NULL),'rdf' => 'iptc:source_assignment', 'type' => '', 'default' => 0),
+  	'source_assistant'   => array('name' => 'Source Assistant',   'iptc' => array('2#110' => NULL),'rdf' => 'iptc:source_assistant', 'type' => '', 'default' => 0),
+  	'source_repository'  => array('name' => 'Source Repository',  'iptc' => array('2#115' => NULL),'rdf' => 'iptc:source_repository', 'type' => '', 'default' => 0),
+  	'source_city'        => array('name' => 'Source City',        'iptc' => array('2#090' => NULL),'rdf' => 'iptc:source_city', 'type' => '', 'default' => 0),
+  	'source_state'       => array('name' => 'Source State',       'iptc' => array('2#095' => NULL),'rdf' => 'iptc:source_state', 'type' => '', 'default' => 0),
+  	'source_country'     => array('name' => 'Source Country',     'iptc' => array('2#095' => NULL),'rdf' => 'iptc:source_country', 'type' => '', 'default' => 0),
+  );
+}
\ No newline at end of file
diff --git a/formats/image/file_image.theme.inc b/formats/image/file_image.theme.inc
index 80367f5..1591d45 100644
--- a/formats/image/file_image.theme.inc
+++ b/formats/image/file_image.theme.inc
@@ -29,6 +29,25 @@ function theme_file_image_admin_settings($form) {
     '#prefix' => '<div class="file-image-exif-file-image-exif-data-setting'. (function_exists('exif_read_data') && FILE_IMAGE_EXIF ? '' : ' js-hide') .'">',
     '#suffix' => '</div>',
   );
+
+  $rows = array();
+  foreach ($form['iptc'] as $name => $element) {
+    if (preg_match('/iptc_/', $name)) {
+      $rows[] = array(
+          drupal_render($form['iptc'][$name][0]),
+          drupal_render($form['iptc'][$name][1]),
+          drupal_render($form['iptc'][$name][2])
+      );
+      unset($form['iptc'][$name]);
+    }
+  }
+  $form['iptc']['iptc'] = array(
+      '#type' => 'markup',
+      '#value' => theme('table', NULL, $rows),
+      '#prefix' => '<div class="file-image-iptc-file-image-iptc-data-setting'. (function_exists('iptcparse') && FILE_IMAGE_IPTC ? '' : ' js-hide') .'">',
+      '#suffix' => '</div>',
+  );
+
   return drupal_render($form);
 }
 
diff --git a/formats/image/file_image_admin.js b/formats/image/file_image_admin.js
index ce7a4bf..a5e967d 100644
--- a/formats/image/file_image_admin.js
+++ b/formats/image/file_image_admin.js
@@ -3,6 +3,7 @@
  * Conditionally show or hide settings.
  */
 Drupal.behaviors.file_image_admin = function () {
+  // EXIF
   $('div.file-image-exif-file-image-exif-setting input.form-checkbox').click(function () {
     if (this.checked) {
       $('div.file-image-exif-file-image-exif-data-setting').show();
@@ -13,5 +14,16 @@ Drupal.behaviors.file_image_admin = function () {
       $('div.file-image-geo-file-image-geo-setting input.form-checkbox').attr('disabled', 'disabled');
     }
   });
+  // IPTC
+  $('div.file-image-iptc-file-image-iptc-setting input.form-checkbox').click(function () {
+	if (this.checked) {
+	  $('div.file-image-iptc-file-image-iptc-data-setting').show();
+	  $('div.file-image-geo-file-image-geo-setting input.form-checkbox').attr('disabled', '');
+	}
+	else {
+	  $('div.file-image-iptc-file-image-iptc-data-setting').hide();
+	  $('div.file-image-geo-file-image-geo-setting input.form-checkbox').attr('disabled', 'disabled');
+	}
+  });
 };
 
