attr[0].origin_detail = NULL;   /* XXX */
        attr[1].name = NULL;
 
-        /*if (glite_jppsbe_open_file(ctx,in->jobid,"tags",NULL,
-                                                O_RDWR|O_CREAT,&file_be)
-                        // XXX: tags need reading to check magic number
-        ) {
-                err2fault(ctx,soap);
-                return SOAP_FAULT;
-        }
-
-       if (glite_jppsbe_close_file(ctx,file_be))
-       {
-               err2fault(ctx,soap);
-               return SOAP_FAULT;
-       }*/
-       glite_jppsbe_append_tags(ctx,in->jobid,attr);
-
-        /*if (tag_append(ctx,file_be,attr))
-       {
-                err2fault(ctx,soap);
-                return SOAP_FAULT;
-        }*/
+       if (glite_jppsbe_append_tags(ctx,in->jobid,attr)) goto err;
 
        /* XXX: ignore errors but don't fail silenty */
        glite_jpps_match_attr(ctx,in->jobid,attr);
        memset(meta,0,sizeof meta);
         meta[0].name = strdup(GLITE_JP_ATTR_OWNER);
 
-printf(__FUNCTION__);
        for (i=0; i<in->__sizejobs; i++) {
                struct jptype__jobRecord *jr = GLITE_SECURITY_GSOAP_LIST_GET(in->jobs,i);
 
-printf("jobid: %s\n",jr->jobid);
-
                if (glite_jppsbe_get_job_metadata(ctx,jr->jobid,meta)) {
                        ret = SOAP_FAULT;
                        goto cleanup;
                jobs[i+1] = NULL;
 
                attrs = realloc(attrs,sizeof(*attrs) * (i+2));
-               attrs[i+1] = attrs[i] = NULL;
+               attrs[i] = calloc(jr->__sizeattributes+1,sizeof attrs[i][0]);
+               attrs[i+1] = NULL;
 
                for (j=0; j < jr->__sizeattributes; j++) {
                        struct jptype__attrValue        *a = GLITE_SECURITY_GSOAP_LIST_GET(jr->attributes,j);
                        attrs[i][j].timestamp = time(NULL);
                        attrs[i][j].origin_detail = NULL;
                }
+               if (glite_jppsbe_append_tags(ctx,jobs[i],attrs[i])) {
+                       err2fault(ctx,soap);
+                       ret = SOAP_FAULT;
+                       goto cleanup;
+               }
        }
 
 /* XXX: ignore error */
        free(jobs);
 
        glite_jp_attrval_free(meta,0);
-       err2fault(ctx,soap);
+       if (ret == SOAP_FAULT) err2fault(ctx,soap);
        return ret;
 }