diff -r 6c9c5ad0ae92 modules/openid/openid.inc
--- modules/openid/openid.inc	Fri Dec 18 10:30:01 2009 +0600
+++ modules/openid/openid.inc	Fri Dec 18 10:40:32 2009 +0600
@@ -23,6 +23,10 @@
 define('OPENID_NS_1_1', 'http://openid.net/signon/1.1');
 define('OPENID_NS_1_0', 'http://openid.net/signon/1.0');
 
+// OpenID attributes extensions
+define('OPENID_ATTR_SREG', 'http://openid.net/extensions/sreg/1.1');
+define('OPENID_ATTR_AX', 'http://openid.net/srv/ax/1.0');
+
 /**
  * Performs an HTTP 302 redirect (for the 1.x protocol).
  */
@@ -424,6 +428,73 @@
 }
 
 /**
+ * Prepares request parameters for attributes exchange.
+ *
+ * Here we'll try to get as much info as provider can give,
+ * so we're preparing request parameters for all namespaces
+ * available on OpenID provider side.
+ *
+ * @param $svc_types Array with services namespaces supported by OpenID provider.
+ * @return Request parameters array.
+ */
+function _openid_get_attr_request($svc_types) {
+  $request = array();
+
+  if (in_array(OPENID_ATTR_SREG, $svc_types)) {
+    $request['openid.ns.sreg'] = OPENID_ATTR_SREG;
+    $request['openid.sreg.required'] = 'nickname,email';
+  }
+  if (in_array(OPENID_ATTR_AX, $svc_types)) {
+    $request['openid.ns.ax'] = OPENID_ATTR_AX;
+    $request['openid.ax.mode'] = 'fetch_request';
+    $request['openid.ax.required'] = 'email';
+    $request['openid.ax.type.email'] = 'http://schema.openid.net/contact/email';
+  }
+
+  return $request;
+}
+
+/**
+ * Try to get Drupal name from data received from OpenID provier.
+ *
+ * @param $response Array with data received from OpenID provider.
+ * @return Name string.
+ */
+function _openid_get_name_from_response($response) {
+  $name = '';
+
+  if (!empty($response['openid.sreg.nickname'])) {
+    $name = $response['openid.sreg.nickname'];
+  }
+  elseif (!empty($response['openid.ext1.value.email'])) {
+    // as we can receive only email with AX method we can extract name from it
+    $parts = explode('@', $response['openid.ext1.value.email']);
+    $name = $parts[0];
+  }
+
+  return $name;
+}
+
+/**
+ * Try to get Drupal email from data received from OpenID provier.
+ *
+ * @param $response Array with data received from OpenID provider.
+ * @return Mail string.
+ */
+function _openid_get_mail_from_response($response) {
+  $mail = '';
+
+  if (!empty($response['openid.sreg.email'])) {
+    $mail = $response['openid.sreg.email'];
+  }
+  elseif (!empty($response['openid.ext1.value.email'])) {
+    $mail = $response['openid.ext1.value.email'];
+  }
+
+  return $mail;
+}
+
+/**
  * Provide bcpowmod support for PHP4.
  */
 if (!function_exists('bcpowmod')) {
diff -r 6c9c5ad0ae92 modules/openid/openid.module
--- modules/openid/openid.module	Fri Dec 18 10:30:01 2009 +0600
+++ modules/openid/openid.module	Fri Dec 18 10:40:32 2009 +0600
@@ -200,7 +200,9 @@
   if (isset($services[0]['types']) && is_array($services[0]['types']) && in_array(OPENID_NS_2_0 .'/server', $services[0]['types'])) {
     $claimed_id = $identity = 'http://specs.openid.net/auth/2.0/identifier_select';
   }
-  $authn_request = openid_authentication_request($claimed_id, $identity, $return_to, $assoc_handle, $services[0]['version']);
+  $svc_types = empty($services[0]['types']) ? array() : $services[0]['types'];
+  $attr_request = _openid_get_attr_request($svc_types);
+  $authn_request = openid_authentication_request($claimed_id, $identity, $return_to, $assoc_handle, $services[0]['version'], $attr_request);
 
   if ($services[0]['version'] == 2) {
     openid_redirect($op_endpoint, $authn_request);
@@ -400,14 +402,14 @@
   elseif (variable_get('user_register', 1)) {
     // Register new user
     $form_state['redirect'] = NULL;
-    $form_state['values']['name'] = (empty($response['openid.sreg.nickname'])) ? '' : $response['openid.sreg.nickname'];
-    $form_state['values']['mail'] = (empty($response['openid.sreg.email'])) ? '' : $response['openid.sreg.email'];
+    $form_state['values']['name'] = _openid_get_name_from_response($response);
+    $form_state['values']['mail'] = _openid_get_mail_from_response($response);
     $form_state['values']['pass']  = user_password();
     $form_state['values']['status'] = variable_get('user_register', 1) == 1;
     $form_state['values']['response'] = $response;
     $form_state['values']['auth_openid'] = $identity;
 
-    if (empty($response['openid.sreg.email']) && empty($response['openid.sreg.nickname'])) {
+    if (empty($form_state['values']['name']) && empty($form_state['values']['mail'])) {
       drupal_set_message(t('Please complete the registration by filling out the form below. If you already have an account, you can <a href="@login">log in</a> now and add your OpenID under "My account".', array('@login' => url('user/login'))), 'warning');
       $success = FALSE;
     }
@@ -470,7 +472,7 @@
   return $request;
 }
 
-function openid_authentication_request($claimed_id, $identity, $return_to = '', $assoc_handle = '', $version = 2) {
+function openid_authentication_request($claimed_id, $identity, $return_to = '', $assoc_handle = '', $version = 2, $attr_request = array()) {
   module_load_include('inc', 'openid');
 
   $ns = ($version == 2) ? OPENID_NS_2_0 : OPENID_NS_1_0;
@@ -490,9 +492,9 @@
     $request['openid.trust_root'] = url('', array('absolute' => TRUE));
   }
 
-  // Simple Registration
-  $request['openid.sreg.required'] = 'nickname,email';
-  $request['openid.ns.sreg'] = "http://openid.net/extensions/sreg/1.1";
+  // request fields for attributes (nickname,email) should be passed from caller
+  // and depend on provider supported attribute exchange method (SREG or AX)
+  $request += $attr_request;
 
   $request = array_merge($request, module_invoke_all('openid', 'request', $request));
 
