diff --git a/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java b/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java
index f9fe118885a7611b07bd8535eb4face48c981d4c..31d443de8836fd53ab4be1e49ed17a36537335cc 100644
--- a/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java
+++ b/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java
@@ -253,27 +253,34 @@ public class JobDAO {
 
     public void updateJob(JobSummary job) {
 
-        String sql = "UPDATE job SET phase = ?, results = ? ";
+        String sql = "UPDATE job SET (phase, results";
         
         ErrorSummary errorSummary = job.getErrorSummary();
         if(errorSummary != null)
         {
-            sql += ", error_message = ?, error_type = ?, error_has_detail = ? ";
+            sql += ", error_message, error_type, error_has_detail";
+        }                
+       
+        sql += ") = (?, ?";
+        
+        if(errorSummary != null)
+        {
+            sql += ", ?, ?, ?";
         }
         
-        sql += "WHERE job_id = ?";
+        sql += ") WHERE job_id = ?";
 
         jdbcTemplate.update(sql, ps -> {
             int i = 0;
             ps.setObject(++i, job.getPhase().name(), Types.OTHER);
             ps.setObject(++i, toJson(job.getResults()), Types.OTHER);
-            ps.setString(++i, job.getJobId());
             if(errorSummary != null)
             {
                 ps.setString(++i, errorSummary.getMessage());
-                ps.setObject(++i, errorSummary.getType().name(), Types.OTHER);
+                ps.setObject(++i, errorSummary.getType().value(), Types.OTHER);                
                 ps.setBoolean(++i, errorSummary.isHasDetail());
             }
+            ps.setString(++i, job.getJobId());
         });
     }
 
diff --git a/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java b/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java
index 0173ba286f830a175b272f1aced105abc616599f..b13399b729da576bb45bd825e88ae89e51afc199 100644
--- a/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java
+++ b/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java
@@ -19,6 +19,8 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
 import java.util.Optional;
 import java.time.LocalDateTime;
 import java.time.Month;
+import net.ivoa.xml.uws.v1.ErrorSummary;
+import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
 import net.ivoa.xml.uws.v1.Jobs;
 
 @ExtendWith(SpringExtension.class)
@@ -35,9 +37,7 @@ public class JobDAOTest {
         dao = new JobDAO(dataSource);
     }
 
-    @Test
-    public void testJob() {
-
+    private JobSummary getJob() {
         Transfer transfer = new Transfer();
         transfer.setDirection("pushToVoSpace");
         transfer.setTarget("vos://example.com!vospace/mynode");
@@ -50,6 +50,21 @@ public class JobDAOTest {
         jobInfo.getAny().add(transfer);
         job.setJobInfo(jobInfo);
 
+        return job;
+    }
+
+    // don't want to override equals method just for testing without a use case
+    private boolean areEqual(ErrorSummary a, ErrorSummary b) {
+        return (a.getMessage().equals(b.getMessage())
+                && a.getType().equals(b.getType())
+                && a.isHasDetail() == b.isHasDetail());
+    }
+
+    @Test
+    public void testJob() {
+
+        JobSummary job = getJob();
+
         dao.createJob(job);
 
         assertTrue(dao.getJob("123").isPresent());
@@ -61,6 +76,56 @@ public class JobDAOTest {
         assertEquals(ExecutionPhase.EXECUTING, dao.getJob("123").get().getPhase());
     }
 
+    @Test
+    public void testCreateJobWithError() {
+        JobSummary job = getJob();
+
+        job.setPhase(ExecutionPhase.ERROR);
+
+        // A generic picked randomly
+        ErrorSummary errorSummary
+                = ErrorSummaryFactory.newErrorSummary(
+                        ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED);
+
+        job.setErrorSummary(errorSummary);
+
+        dao.createJob(job);
+
+        // Retrieve it back        
+        Optional<JobSummary> retrievedJobOpt = dao.getJob(job.getJobId());
+        assertTrue(retrievedJobOpt.isPresent());
+
+        JobSummary retrievedJob = retrievedJobOpt.get();
+        assertEquals(ExecutionPhase.ERROR, retrievedJob.getPhase());
+        assertTrue(areEqual(job.getErrorSummary(), retrievedJob.getErrorSummary()));
+
+    }
+
+    @Test
+    public void testUpdateJobWithError() {
+        JobSummary job = getJob();
+
+        dao.createJob(job);
+
+        job.setPhase(ExecutionPhase.ERROR);
+        // A generic picked randomly
+        ErrorSummary errorSummary
+                = ErrorSummaryFactory.newErrorSummary(
+                        ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED);
+
+        job.setErrorSummary(errorSummary);
+
+        dao.updateJob(job);
+
+        // Retrieve it back        
+        Optional<JobSummary> retrievedJobOpt = dao.getJob(job.getJobId());
+        assertTrue(retrievedJobOpt.isPresent());
+
+        JobSummary retrievedJob = retrievedJobOpt.get();
+        assertEquals(ExecutionPhase.ERROR, retrievedJob.getPhase());
+        assertTrue(areEqual(job.getErrorSummary(), retrievedJob.getErrorSummary()));
+    }
+
     @Test
     public void testJobsList() {
         // Check no arguments
@@ -159,10 +224,10 @@ public class JobDAOTest {
     public void testJobsAllchecks() {
         // Check no arguments
         String user = "user1";
-        List<ExecutionPhase> phaseList = List.of(ExecutionPhase.QUEUED, 
+        List<ExecutionPhase> phaseList = List.of(ExecutionPhase.QUEUED,
                 ExecutionPhase.PENDING);
-        List<JobService.JobType> directionList =
-                List.of(JobService.JobType.pullFromVoSpace,
+        List<JobService.JobType> directionList
+                = List.of(JobService.JobType.pullFromVoSpace,
                         JobService.JobType.pullToVoSpace);
 
         LocalDateTime ldt