};
 
 static int purge_one(edg_wll_Context ctx,const edg_wlc_JobId,int,int);
+static int unset_proxy_flag(edg_wll_Context ctx, edg_wlc_JobId job);
+
+/**
+ * return job membership in DB table jobs (proxy, server, both)
+ */
+static int edg_wll_jobMembership(edg_wll_Context ctx, edg_wlc_JobId job);
+
 
 int edg_wll_CreateTmpFileStorage(edg_wll_Context ctx, char *prefix, char **fname)
 {
 
 int edg_wll_PurgeServerProxy(edg_wll_Context ctx, edg_wlc_JobId job)
 {
-       switch ( purge_one(ctx, job, -1, 1) ) {
-       case 0:
-       case ENOENT:
-               edg_wll_ResetError(ctx);
-               return 0;
-
-       default:
-               return -1;
-       }
+       switch (edg_wll_jobMembership(ctx, job)) {
+               case DB_PROXY_JOB:
+                       switch ( purge_one(ctx, job, -1, 1) ) {
+                               case 0:
+                               case ENOENT:
+                                       edg_wll_ResetError(ctx);
+                                       return 0;
+
+                               default:
+                                       return -1;
+                       }
+                       break;
+               case DB_SERVER_JOB:
+                       // should not happen, however, no action needed
+                       // proxy flag is unset already
+                       break;
+               case DB_PROXY_JOB+DB_SERVER_JOB:
+                       return(unset_proxy_flag(ctx, job));
+                       break;
+               default:
+                       return -1;
+                       break;
+               }
 }
 
 int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request)
        free(stmt);
        return edg_wll_Error(ctx,NULL,NULL);
 }
+
+
+int edg_wll_jobMembership(edg_wll_Context ctx, edg_wlc_JobId job)
+{
+        char            *dbjob;
+        char            *stmt = NULL;
+        edg_wll_Stmt    q;
+        int             ret, result = -1;
+        char            *res[2] = { NULL, NULL};
+
+        edg_wll_ResetError(ctx);
+
+        dbjob = edg_wlc_JobIdGetUnique(job);
+
+        trio_asprintf(&stmt,"select proxy,server from jobs where jobid = '%|Ss'",dbjob);
+        ret = edg_wll_ExecStmt(ctx,stmt,&q);
+        if (ret <= 0) {
+                if (ret == 0) {
+                        fprintf(stderr,"%s: no such job\n",dbjob);
+                        edg_wll_SetError(ctx,ENOENT,dbjob);
+                }
+                goto clean;
+        }
+        free(stmt); stmt = NULL;
+
+        if ((ret = edg_wll_FetchRow(q,res)) > 0) {
+               result = 0;
+                if (strcmp(res[0],"0")) result += DB_PROXY_JOB;
+                if (strcmp(res[1],"0")) result += DB_SERVER_JOB;
+        }
+        else {
+                if (ret == 0) result = 0;
+                else {
+                        fprintf(stderr,"Error retrieving proxy&server fields of jobs table. Missing column?\n");
+                        edg_wll_SetError(ctx,ENOENT,dbjob);
+                }
+        }
+        edg_wll_FreeStmt(&q);
+
+clean:
+       free(res[0]); free(res[1]);
+        free(dbjob);
+        free(stmt);
+        return(result);
+}
+
+int unset_proxy_flag(edg_wll_Context ctx, edg_wlc_JobId job)
+{
+       char    *stmt = NULL;
+       char            *dbjob;
+
+       edg_wll_ResetError(ctx);
+
+       dbjob = edg_wlc_JobIdGetUnique(job);
+
+       trio_asprintf(&stmt,"update jobs set proxy='0' where jobid='%|Ss'", dbjob);
+
+       return(edg_wll_ExecStmt(ctx,stmt,NULL));
+}
+