diff --git a/cckpassword.info b/cckpassword.info
index 2e8ca33..ac9ee96 100644
--- a/cckpassword.info
+++ b/cckpassword.info
@@ -1,4 +1,5 @@
 name = CCK password
 description = Provides a cck password field
 core = 6.x
-dependencies[] = content
\ No newline at end of file
+dependencies[] = content
+dependencies[] = aes
\ No newline at end of file
diff --git a/cckpassword.module b/cckpassword.module
index 396e72a..13228cb 100644
--- a/cckpassword.module
+++ b/cckpassword.module
@@ -16,12 +16,18 @@ function cckpassword_theme() {
     'cckpassword_cckpassworddrupal' => array(
       'arguments' => array('element' => NULL),
     ),
+    'cckpassword_cckpasswordtext' => array(
+      'arguments' => array('element' => NULL),
+    ),
     'cckpassword_formatter_default' => array(
       'arguments' => array('element' => NULL),
     ),
     'cckpassword_formatter_plain' => array(
       'arguments' => array('element' => NULL),
     ),
+    'cckpassword_formatter_aes' => array(
+      'arguments' => array('element' => NULL),
+    ),
   );
 }
 
@@ -34,6 +40,10 @@ function theme_cckpassword_cckpassworddrupal($element) {
   return $element['#children'];
 }
 
+function theme_cckpassword_cckpasswordtext($element) {
+  return $element['#children'];
+}
+
 /**
  * Implementation of hook_elements().
  */
@@ -51,8 +61,15 @@ function cckpassword_elements() {
       '#delta' => 0,
       '#process' => array('cckpassword_cckpassworddrupal_process'),
     ),
+    'cckpassword_cckpasswordtext' => array(
+      '#input' => TRUE,
+      '#columns' => array('value'), 
+      '#delta' => 0,
+      '#process' => array('cckpassword_cckpasswordtext_process'),
+    ),
   );
 }
+
 function cckpassword_cckpasswordfield_process($element, $edit, $form_state, $form) {
   // Something overrides #required, so use #_required
   if (isset($element['#_required'])) {
@@ -96,6 +113,50 @@ function cckpassword_cckpasswordfield_process($element, $edit, $form_state, $for
   return $element;
 }
 
+function cckpassword_cckpasswordtext_process($element, $edit, $form_state, $form) {
+  // Something overrides #required, so use #_required
+  if (isset($element['#_required'])) {
+    $element['#required'] = $element['#_required'];
+  }
+  $field = $form['#field_info'][$element['#field_name']];
+  $field_key = $element['#columns'][0];
+  $delta = $element['#delta'];
+  $element[$field_key] = array(
+    '#module' => 'text',
+    '#type' => 'textarea',
+    '#default_value' => isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : NULL,
+    // '#size' => !empty($field['widget']['size']) ? $field['widget']['size'] : 60,
+    '#attributes' => array('class' => 'text'),
+    '#title' => $element['#title'],
+    '#description' => $element['#description'],
+    '#required' => $element['#_required_element'],
+    '#field_name' => $element['#field_name'],
+    '#type_name' => $element['#type_name'],
+    '#delta' => $element['#delta'],
+    '#columns' => $element['#columns'],
+  );
+  $element[$field_key]['#maxlength'] = !empty($field['max_length']) ? $field['max_length'] : NULL;
+  // Used so that hook_field('validate') knows where to flag an error.
+  $element['_error_element'] = array(
+    '#type' => 'value',
+    '#value' => implode('][', array_merge($element['#parents'], array($field_key))),
+  );
+  if (!empty($element['#provide_delete'])) {
+    $element['delete'] = array(
+      '#type'=>'checkbox',
+      '#title'=> t('Delete current data'),
+      '#default_value'=> 0,
+    );
+  }
+  if (!empty($element['#value_message'])) {
+    $element['value_message'] = array(
+      '#type' => 'markup',
+      '#value' => filter_xss($element['#value_message']),
+    );
+  }
+  return $element;
+}
+
 function cckpassword_cckpassworddrupal_process($element, $edit, $form_state, $form) {
   // Something overrides #required, so use #_required
   if (isset($element['#_required'])) {
@@ -158,8 +219,16 @@ function cckpassword_field_info() {
  */
 function cckpassword_password_methods() {
   return array(
+    'aes' => array(
+      'title' => 'AES',
+      'retrievable' => true,
+      'functions'=> array(
+        'presave'=>'cckpassword_aes',
+      ),
+      'max_length' => 4096,
+    ),
     'md5' => array(
-      'title'=>'MD5 Hash',
+      'title' => 'MD5 Hash',
       'functions'=> array(
         'presave'=>'cckpassword_md5',
       ),
@@ -198,6 +267,11 @@ function cckpassword_just_add_salt($items) {
   return $items;
 }
 
+function cckpassword_aes($items) {
+  $items['value'] = aes_encrypt($items['value']);
+  return $items;
+}
+
 
 /**
  * Return all, or one of the cck password storage methods.
@@ -241,7 +315,7 @@ function cckpassword_field_settings($op, $field) {
       $method = _cckpassword_password_methods($field['method']);
       $columns['value'] = array(
         'type' => 'varchar',
-        'length' => $method['max_length']?$method['max_length']:32,
+        'length' => $method['max_length'] ? $method['max_length'] : 32,
         'not null' => FALSE, 
         'sortable' => TRUE,
         'views' => TRUE
@@ -267,16 +341,14 @@ function cckpassword_field($op, &$node, $field, &$items, $teaser, $page) {
       if (empty($field['method'])) $field['method'] = 'md5';
       $method = _cckpassword_password_methods($field['method']);
       $field_name = $field['field_name'];
-      $old_vals = content_storage('load',$node);
-      $old_vals = $old_vals[$field_name] ;
+      $old_vals = content_storage('load', $node);
+      $old_vals = $old_vals[$field_name];
       if (is_array($items)) {
-        
         foreach ($items as $delta => $item) {
           $error_element = isset($item['_error_element']) ? $item['_error_element'] : '';
           if (is_array($item) && isset($item['_error_element'])) unset($item['_error_element']);
           if (!empty($item['value'])) {
             $presave = $method['functions']['presave'];
-            
             if ($presave && function_exists($presave)) {
               $items[$delta] = call_user_func($presave,$items[$delta]);
             }
@@ -320,6 +392,11 @@ function cckpassword_field_formatter_info() {
       'field types' => array('cckpassword'),
       'multiple values' => CONTENT_HANDLE_CORE,
     ),
+    'aes' => array(
+      'label' => t('AES'),
+      'field types' => array('cckpassword'),
+      'multiple values' => CONTENT_HANDLE_CORE,
+    ),
   );
 }
 
@@ -338,6 +415,13 @@ function theme_cckpassword_formatter_plain($element) {
 }
 
 /**
+ * Theme function for 'aes' cckpassword field formatter.
+ */
+function theme_cckpassword_formatter_aes($element) {
+  return ($allowed =_text_allowed_values($element)) ? $allowed : aes_decrypt($element['#item']['safe']);
+}
+
+/**
  * Implementation of hook_widget_info().
  *
  */
@@ -359,11 +443,17 @@ function cckpassword_widget_info() {
         'default value' => CONTENT_CALLBACK_DEFAULT,
       ),
     ),
+    'cckpassword_cckpasswordtext' => array(
+      'label' => t('Textarea field'),
+      'field types' => array('cckpassword'),
+      'multiple values' => CONTENT_HANDLE_CORE,
+      'callbacks' => array(
+        'default value' => CONTENT_CALLBACK_DEFAULT,
+      ),
+    ),
   );
 }
 
-
-
 /**
  * Implementation of hook_widget().
  *
@@ -377,8 +467,8 @@ function cckpassword_widget(&$form, &$form_state, $field, $items, $delta = 0) {
     '#provide_delete' => !empty($items[$delta]['value']) && !$field['required'],
     // If field is required, only require it when it's empty
     '#_required' => $required,
-    '#_required_element' => ($required && ($delta == 0)?TRUE:FALSE),
-    '#value_message' => !empty($items[$delta]['value'])?$field['value_message'] : '',
+    '#_required_element' => ($required && ($delta == 0) ? TRUE : FALSE),
+    '#value_message' => !empty($items[$delta]['value']) ? $field['value_message'] : '',
   );
   return $element;
-}
\ No newline at end of file
+}
