diff --git a/iban_field.info b/iban_field.info
index 2d475e4..77e1de6 100644
--- a/iban_field.info
+++ b/iban_field.info
@@ -3,11 +3,7 @@ description = Creates an IBAN field type
 package = IBAN
 core = 7.x
 
-files[] = iban_field.module
-files[] = iban_field.admin.inc
-; Information added by Drupal.org packaging script on 2015-04-22
-version = "7.x-1.0+1-dev"
-core = "7.x"
-project = "iban_field"
-datestamp = "1429721506"
+configure = admin/config/iban/settings
 
+files[] = iban_field.module
+files[] = iban_field.admin.inc
\ No newline at end of file
diff --git a/iban_field.install b/iban_field.install
index f4c60c9..f872678 100644
--- a/iban_field.install
+++ b/iban_field.install
@@ -59,7 +59,7 @@ function iban_field_install() {
         'iban_length' => $row[2],
       ))->execute();
   }
-  
+
   $t = get_t();
   $message = $t('IBAN Field requires you to enabled some countries first. Go to the <a href="@iban_settings">IBAN Settings</a> page to enable some.',
     array(
diff --git a/iban_field.module b/iban_field.module
index fe4785b..e50e129 100644
--- a/iban_field.module
+++ b/iban_field.module
@@ -20,7 +20,9 @@ function iban_field_menu() {
     'title' => 'IBAN',
     'description' => 'IBAN specific settings.',
     'access arguments' => array('access administration pages'),
-    'file' => 'iban_field.admin.inc',
+    'page callback' => 'system_admin_menu_block_page',
+    'file' => 'system.admin.inc',
+    'file path' => drupal_get_path('module', 'system'),
   );
 
   $items['admin/config/iban/settings'] = array(
@@ -143,7 +145,7 @@ function iban_field_field_instance_settings_form($field, $instance) {
  * Implements hook_field_widget_form().
  */
 function iban_field_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
-  $element['iban_field'] = array(
+  $element['iban_field'] = $element + array(
     '#type' => 'textfield',
     '#title' => t('IBAN'),
     '#default_value' => isset($items[$delta]['iban_field']) ? $items[$delta]['iban_field'] : '',
@@ -267,6 +269,15 @@ function iban_field_field_widget_error($element, $error, $form, &$form_state) {
 }
 
 /**
+ * Implements hook_field_placeholder_info().
+ */
+function iban_field_field_placeholder_info() {
+  return array(
+    'iban_field' => t('IBAN'),
+  );
+}
+
+/**
  * Validates given IBAN number.
  */
 function iban_field_validate_iban($iban) {
@@ -322,3 +333,101 @@ function iban_field_validate_iban($iban) {
 
   return FALSE;
 }
+
+/**
+ * Implements hook_element_info().
+ */
+function iban_field_element_info() {
+  return array(
+    'iban_field' => array(
+      '#input' => TRUE,
+      '#tree' => TRUE,
+      '#process' => array('iban_field_attribute_process'),
+      '#element_validate' => array('iban_field_fapi_validate'),
+    ),
+  );
+}
+
+/**
+ * Form api handling.
+ */
+function iban_field_attribute_process($element, &$form_state) {
+  // Create a dummy field instance to get the same output from our field widget.
+  $instance = array(
+    'field_name' => 'iban_field_ability',
+    'settings' => array(),
+    'widget' => array(
+      'type' => 'iban_field_ability',
+    ),
+  );
+
+  $form = array();
+  $field = array(
+    'settings' => array(
+      'abilities' => array(),
+    ),
+  );
+  $langcode = LANGUAGE_NONE;
+  $items = array();
+  $delta = 0;
+  $form_state['field'] = array(
+    'iban_field_ability' => array(
+      $langcode => array(
+        'field' => array(
+          'type' => 'iban_field_ability',
+          'cardinality' => 1,
+          'settings' => array(),
+        ),
+      ),
+    ),
+  );
+
+  $element = iban_field_field_widget_form($form, $form_state, $field, $instance, $langcode, $items, $delta, $element);
+  return $element;
+}
+
+/**
+ * Handles field validation when submitted from the Form API.
+ */
+function iban_field_fapi_validate($element, $form_state) {
+  // Strip all whitespaces.
+  $iban = preg_replace('/\s+/', '', $element['#value']['iban_field']);
+
+  if (!iban_field_field_is_empty($iban)) {
+    $allowed_countries = $element['#settings']['allowed_countries'];
+    
+    if (!empty($allowed_countries)) {
+      if (!iban_field_validate_country($iban, $allowed_countries)) {
+        $errors[] = array(
+          'error' => 'iban_field_country_invalid',
+          'message' => t('IBAN number is from an not-supported country.'),
+        );
+      }
+      if (!iban_field_validate_length($iban)) {
+        $errors[] = array(
+          'error' => 'iban_field_country_length_invalid',
+          'message' => t("IBAN length does not match with the countries' IBAN length."),
+        );
+      }
+
+      foreach ($allowed_countries as $key => $country) {
+        $country = strtoupper($country);
+        $allowed_countries[$country] = $country;
+        unset($allowed_countries[$key]);
+      }
+    }
+
+    if (!iban_field_validate_iban($iban)) {
+      $errors[] = array(
+        'error' => 'iban_field_iban_invalid',
+        'message' => t('Invalid IBAN number.'),
+      );
+    }
+  }
+
+  if (isset($errors) && count($errors) > 0) {
+    foreach ($errors as $error) {
+      form_error($element, $error['message']);
+    }
+  }
+}
