diff --git a/iban_field.info b/iban_field.info
index 10b14ef..77e1de6 100644
--- a/iban_field.info
+++ b/iban_field.info
@@ -3,5 +3,7 @@ description = Creates an IBAN field type
 package = IBAN
 core = 7.x
 
+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.module b/iban_field.module
index 8f49360..4db6fe8 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(
@@ -331,3 +333,90 @@ function iban_field_validate_iban($iban) {
 
   return FALSE;
 }
+
+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'),
+    ),
+  );
+}
+
+function iban_field_attribute_process($element, &$form_state) {
+  // Create a dummy field instance just to get the same output from our existing 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;
+}
+
+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'];
+    
+    foreach ($allowed_countries as $key => $country) {
+      $country = strtoupper($country);
+      $allowed_countries[$country] = $country;
+      unset($allowed_countries[$key]);
+    }
+
+    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."),
+      );
+    }
+    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']);
+    }
+  }
+}
\ No newline at end of file
