--- pvar.c.orig	2007-10-24 18:18:50.000000000 +0200
+++ pvar.c	2007-10-25 14:27:24.000000000 +0200
@@ -1062,9 +1062,11 @@
     return 0;
 }
 
-static int pv_get_pai(struct sip_msg *msg, pv_param_t *param,
+static int pv_get_pai_attr(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res)
 {
+	struct sip_uri *uri;
+
     if(msg==NULL || res==NULL)
 	return -1;
     
@@ -1079,11 +1081,52 @@
 	return pv_get_null(msg, param, res);
     }
     
-    res->rs.s = get_pai(msg)->uri.s;
-    res->rs.len = get_pai(msg)->uri.len; 
-    
-    res->flags = PV_VAL_STR;
-    return 0;
+        if(param->pvn.u.isname.name.n==1) /* uri */
+        {
+                res->rs.s = get_pai(msg)->uri.s;
+                res->rs.len = get_pai(msg)->uri.len;
+                res->flags = PV_VAL_STR;
+                return 0;
+        }
+
+        if(param->pvn.u.isname.name.n==5) /* display name */ {
+                if(get_pai(msg)->display.s==NULL ||
+                   get_pai(msg)->display.len<=0) {
+                        LM_DBG("no PAI display name\n");
+                        return pv_get_null(msg, param, res);
+                }
+                res->rs.s = get_pai(msg)->display.s;
+                res->rs.len = get_pai(msg)->display.len;
+                res->flags = PV_VAL_STR;
+                return 0;
+        }
+
+
+        if((uri=parse_pai_uri(msg))==NULL) {
+                LM_ERR("cannot parse From URI\n");
+                return pv_get_null(msg, param, res);
+        }
+        if(param->pvn.u.isname.name.n==2) /* username */ {
+            if(uri->user.s==NULL || uri->user.len<=0) {
+                    LM_DBG("no PAI username\n");
+                        return pv_get_null(msg, param, res);
+                }
+                res->rs.s   = uri->user.s;
+                res->rs.len = uri->user.len;
+                res->flags = PV_VAL_STR;
+        } else if(param->pvn.u.isname.name.n==3) /* domain */ {
+            if(uri->host.s==NULL || uri->host.len<=0) {
+                    LM_DBG("no PAI domain\n");
+                        return pv_get_null(msg, param, res);
+                }
+                res->rs.s   = uri->host.s;
+                res->rs.len = uri->host.len;
+                res->flags = PV_VAL_STR;
+        } else {
+                LM_ERR("unknown specifier\n");
+                return pv_get_null(msg, param, res);
+        }
+        return 0;
 }
 
 /* proto of received message: $pr or $proto*/
@@ -2374,8 +2417,17 @@
 		pv_set_scriptvar, pv_parse_scriptvar_name, 0, 0, 0},
 
 	{{"ai", (sizeof("ai")-1)}, /* */
-		PVT_PAI_URI, pv_get_pai, 0,
-		0, 0, 0, 0},
+		PVT_PAI_URI, pv_get_pai_attr, 0,
+		0, 0, pv_init_iname, 1},
+        {{"aid", (sizeof("aid")-1)}, /* */
+                PVT_PAI_DOMAIN, pv_get_pai_attr, 0,
+                0, 0, pv_init_iname, 2},
+        {{"aiU", (sizeof("aiU")-1)}, /* */
+                PVT_PAI_USERNAME, pv_get_pai_attr, 0,
+                0, 0, pv_init_iname, 3},
+        {{"ain", (sizeof("ain")-1)}, /* */
+                PVT_PAI_DISPLAYNAME, pv_get_pai_attr, 0,
+                0, 0, pv_init_iname, 5},
 	{{"adu", (sizeof("adu")-1)}, /* auth digest uri */
 		PVT_AUTH_DURI, pv_get_authattr, 0,
 		0, 0, pv_init_iname, 3},
