return EINVAL;
 
     out->BShost = strdup(bkserver);
-    portbeg = strchr(out->BShost, ':');
+    portbeg = strrchr(out->BShost, ':');
     if (portbeg) {
        *portbeg = 0;
         /* try to get port number */
 
     pom = strdup(idString + sizeof(GLITE_JOBID_PROTO_PREFIX) - 1);
     pom1 = strchr(pom, '/');
-    pom2 = strchr(pom, ':');
 
     if (!pom1) { free(pom); free(out); return EINVAL; }
 
+    pom2 = strrchr(pom, ':');
+    if (pom2 && strchr(pom2,']')) pom2 = NULL;
+
     if ( pom2 && (pom1 > pom2)) {
        pom[pom2-pom]     = '\0';
        out->BShost  = strdup(pom);
 
        dprintf(("generating jobids..."));
        {
                char *name=server?server:strdup(PROXY_SERVER);
-               char *p = strchr(name,':');
+               char *p = strrchr(name,':');
                int  port;
 
                if (p)  { *p=0; port = atoi(p+1); }
 
        {
                char *p;
 
-               p = strchr(host, ':');
+               p = strrchr(host, ':');
                if(p) 
                        *p = 0;
                dest_host = strdup(host);
 
 {
        char    *p = NULL,*s = mygetenv(param);
 
-        if (s) p = strchr(s,':');
+        if (s) p = strrchr(s,':');
        return  p ? atoi(p+1) : dflt;
 }
 
        s = mygetenv(param);
        if (!s && !dflt) return NULL;
        s = strdup(s?s:dflt),
-       p = strchr(s,':');
+       p = strrchr(s,':');
        if (p) *p = 0;
        return s;
 }
 
        if (mode & SERVICE_SERVER) {
                if ( fake_host )
                {
-                       char    *p = strchr(fake_host,':');
+                       char    *p = strrchr(fake_host,':');
 
                        if (p)
                        {
         }
 
        if (ar.err == NETDB_SUCCESS) {
-               if (name) *name = ar.host;
+               if (name) {
+                       if (numeric && addr->sa_family == AF_INET6) {
+                               asprintf(name,"[%s]",ar.host);
+                               free(ar.host);
+                       } else {
+                               *name = ar.host;
+                       }
+               }
                if (service) *service = ar.service;
        }
        err = ar.err;
 
                        free(ju); ju = NULL;
 
                        dest = strdup(jobc[1]);
-                       if ( !(aux = strchr(dest, ':')) )
+                       if ( !(aux = strrchr(dest, ':')) )
                        {
                                edg_wll_SetError(ctx, EINVAL, "Can't parse notification destination");
                                free(dest);
 
                        goto cleanup;
                }
                if ( !strncmp(address_override, "0.0.0.0", aux-address_override) || 
+                    !strncmp(address_override, "[::]", aux-address_override) ||
                     !strncmp(address_override, "::", aux-address_override) )
                        trio_asprintf(&addr_s, "%s:%s", ctx->connections->serverConnection->peerName, aux+1);
        }
                                goto rollback;
                        }
                        if ( !strncmp(address_override, "0.0.0.0", aux-address_override) ||
+                            !strncmp(address_override, "[::]", aux-address_override) ||
                             !strncmp(address_override, "::", aux-address_override) )
                                trio_asprintf(&addr_s, "%s:%s", ctx->connections->serverConnection->peerName, aux+1);
                }
        }
        if ( dest )
        {
-               host = strchr(dest, ':');
+               host = strrchr(dest, ':');
                port = atoi(host+1);
                if ( !(host = strndup(dest, host-dest)) )
                {
 
        edg_wll_InitContext(&ctx);
        if ( server )
        {
-               char *p = strchr(server, ':');
+               char *p = strrchr(server, ':');
                if ( p )
                {
                        edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, atoi(p+1));
 
        edg_wll_InitContext(&ctx);
        if ( server )
        {
-               char *p = strchr(server, ':');
+               char *p = strrchr(server, ':');
                if ( p )
                {
                        edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, atoi(p+1));
 
 
        if ( server )
        {
-               char *p = strchr(server, ':');
+               char *p = strrchr(server, ':');
                if ( p )
                {
                        edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, atoi(p+1));