}
 
 
+void done(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data) {
+       free(data->uris[0]);
+       free(data->classes[0]);
+       free(data->uris);
+       free(data->classes);
+       memset(data, 0, sizeof(*data));
+}
+
 
 static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle)
 {
        return 0;
 
 fail:
-       for (i = 0; i < nevents; i++) edg_wll_FreeEvent(h->events[i]);
+       for (i = 0; i < nevents; i++) {
+               edg_wll_FreeEvent(h->events[i]);
+               free(h->events[i]);
+       }
        free(h->events);
        free(buffer.buf);
        edg_wll_FreeContext(context);
                i = 0;
                while (h->events[i])
                {
-                       edg_wll_FreeEvent(h->events[i]); 
+                       edg_wll_FreeEvent(h->events[i]);
+                       free(h->events[i]);
                        i++;
                }
                free(h->events);
                                        {
                                                av = realloc(av, (n_tags+2) * sizeof(glite_jp_attrval_t));
 
+                                               av[n_tags].attr.name = strdup(h->events[i]->userTag.name);
                                                av[n_tags].value.tag.name = strdup(h->events[i]->userTag.name);
                                                av[n_tags].value.tag.sequence = -1;
                                                av[n_tags].value.tag.timestamp =