http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/task/TaskModel.java
----------------------------------------------------------------------
diff --git 
a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/task/TaskModel.java
 
b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/task/TaskModel.java
index 3d6450f..5ebdacf 100644
--- 
a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/task/TaskModel.java
+++ 
b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/task/TaskModel.java
@@ -23,32 +23,16 @@
  */
 package org.apache.airavata.model.task;
 
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.protocol.TTupleProtocol;
 import org.apache.thrift.scheme.IScheme;
 import org.apache.thrift.scheme.SchemeFactory;
 import org.apache.thrift.scheme.StandardScheme;
-
 import org.apache.thrift.scheme.TupleScheme;
-import org.apache.thrift.protocol.TTupleProtocol;
-import org.apache.thrift.protocol.TProtocolException;
-import org.apache.thrift.EncodingUtils;
-import org.apache.thrift.TException;
-import org.apache.thrift.async.AsyncMethodCallback;
-import org.apache.thrift.server.AbstractNonblockingServer.*;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.EnumMap;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.EnumSet;
-import java.util.Collections;
-import java.util.BitSet;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
+
 import javax.annotation.Generated;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.nio.ByteBuffer;
+import java.util.*;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
 /**
@@ -69,10 +53,10 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
   private static final org.apache.thrift.protocol.TField 
PARENT_PROCESS_ID_FIELD_DESC = new 
org.apache.thrift.protocol.TField("parentProcessId", 
org.apache.thrift.protocol.TType.STRING, (short)3);
   private static final org.apache.thrift.protocol.TField 
CREATION_TIME_FIELD_DESC = new 
org.apache.thrift.protocol.TField("creationTime", 
org.apache.thrift.protocol.TType.I64, (short)4);
   private static final org.apache.thrift.protocol.TField 
LAST_UPDATE_TIME_FIELD_DESC = new 
org.apache.thrift.protocol.TField("lastUpdateTime", 
org.apache.thrift.protocol.TType.I64, (short)5);
-  private static final org.apache.thrift.protocol.TField 
TASK_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("taskStatus", 
org.apache.thrift.protocol.TType.STRUCT, (short)6);
+  private static final org.apache.thrift.protocol.TField 
TASK_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("taskStatuses", 
org.apache.thrift.protocol.TType.LIST, (short)6);
   private static final org.apache.thrift.protocol.TField 
TASK_DETAIL_FIELD_DESC = new org.apache.thrift.protocol.TField("taskDetail", 
org.apache.thrift.protocol.TType.STRING, (short)7);
   private static final org.apache.thrift.protocol.TField 
SUB_TASK_MODEL_FIELD_DESC = new 
org.apache.thrift.protocol.TField("subTaskModel", 
org.apache.thrift.protocol.TType.STRING, (short)8);
-  private static final org.apache.thrift.protocol.TField TASK_ERROR_FIELD_DESC 
= new org.apache.thrift.protocol.TField("taskError", 
org.apache.thrift.protocol.TType.STRUCT, (short)9);
+  private static final org.apache.thrift.protocol.TField TASK_ERROR_FIELD_DESC 
= new org.apache.thrift.protocol.TField("taskErrors", 
org.apache.thrift.protocol.TType.LIST, (short)9);
   private static final org.apache.thrift.protocol.TField JOBS_FIELD_DESC = new 
org.apache.thrift.protocol.TField("jobs", 
org.apache.thrift.protocol.TType.LIST, (short)10);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = 
new HashMap<Class<? extends IScheme>, SchemeFactory>();
@@ -86,10 +70,10 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
   private String parentProcessId; // required
   private long creationTime; // required
   private long lastUpdateTime; // required
-  private org.apache.airavata.model.status.TaskStatus taskStatus; // required
+  private List<org.apache.airavata.model.status.TaskStatus> taskStatuses; // 
required
   private String taskDetail; // optional
   private ByteBuffer subTaskModel; // optional
-  private org.apache.airavata.model.commons.ErrorModel taskError; // optional
+  private List<org.apache.airavata.model.commons.ErrorModel> taskErrors; // 
optional
   private List<org.apache.airavata.model.job.JobModel> jobs; // optional
 
   /** The set of fields this struct contains, along with convenience methods 
for finding and manipulating them. */
@@ -103,10 +87,10 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     PARENT_PROCESS_ID((short)3, "parentProcessId"),
     CREATION_TIME((short)4, "creationTime"),
     LAST_UPDATE_TIME((short)5, "lastUpdateTime"),
-    TASK_STATUS((short)6, "taskStatus"),
+    TASK_STATUS((short)6, "taskStatuses"),
     TASK_DETAIL((short)7, "taskDetail"),
     SUB_TASK_MODEL((short)8, "subTaskModel"),
-    TASK_ERROR((short)9, "taskError"),
+    TASK_ERROR((short)9, "taskErrors"),
     JOBS((short)10, "jobs");
 
     private static final Map<String, _Fields> byName = new HashMap<String, 
_Fields>();
@@ -199,14 +183,16 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
         new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.LAST_UPDATE_TIME, new 
org.apache.thrift.meta_data.FieldMetaData("lastUpdateTime", 
org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
-    tmpMap.put(_Fields.TASK_STATUS, new 
org.apache.thrift.meta_data.FieldMetaData("taskStatus", 
org.apache.thrift.TFieldRequirementType.REQUIRED, 
-        new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.airavata.model.status.TaskStatus.class)));
+    tmpMap.put(_Fields.TASK_STATUS, new 
org.apache.thrift.meta_data.FieldMetaData("taskStatuses", 
org.apache.thrift.TFieldRequirementType.REQUIRED,
+        new 
org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+            new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.airavata.model.status.TaskStatus.class))));
     tmpMap.put(_Fields.TASK_DETAIL, new 
org.apache.thrift.meta_data.FieldMetaData("taskDetail", 
org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.SUB_TASK_MODEL, new 
org.apache.thrift.meta_data.FieldMetaData("subTaskModel", 
org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING
        , true)));
-    tmpMap.put(_Fields.TASK_ERROR, new 
org.apache.thrift.meta_data.FieldMetaData("taskError", 
org.apache.thrift.TFieldRequirementType.OPTIONAL, 
-        new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.airavata.model.commons.ErrorModel.class)));
+    tmpMap.put(_Fields.TASK_ERROR, new 
org.apache.thrift.meta_data.FieldMetaData("taskErrors", 
org.apache.thrift.TFieldRequirementType.OPTIONAL,
+        new 
org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+            new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.airavata.model.commons.ErrorModel.class))));
     tmpMap.put(_Fields.JOBS, new 
org.apache.thrift.meta_data.FieldMetaData("jobs", 
org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new 
org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
             new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.airavata.model.job.JobModel.class))));
@@ -225,7 +211,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     String parentProcessId,
     long creationTime,
     long lastUpdateTime,
-    org.apache.airavata.model.status.TaskStatus taskStatus)
+    List<org.apache.airavata.model.status.TaskStatus> taskStatus)
   {
     this();
     this.taskId = taskId;
@@ -235,7 +221,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     setCreationTimeIsSet(true);
     this.lastUpdateTime = lastUpdateTime;
     setLastUpdateTimeIsSet(true);
-    this.taskStatus = taskStatus;
+    this.taskStatuses = taskStatus;
   }
 
   /**
@@ -255,7 +241,11 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     this.creationTime = other.creationTime;
     this.lastUpdateTime = other.lastUpdateTime;
     if (other.isSetTaskStatus()) {
-      this.taskStatus = new 
org.apache.airavata.model.status.TaskStatus(other.taskStatus);
+      List<org.apache.airavata.model.status.TaskStatus> __this__taskStatus = 
new 
ArrayList<org.apache.airavata.model.status.TaskStatus>(other.taskStatuses.size());
+      for (org.apache.airavata.model.status.TaskStatus other_element : 
other.taskStatuses) {
+        __this__taskStatus.add(new 
org.apache.airavata.model.status.TaskStatus(other_element));
+      }
+      this.taskStatuses = __this__taskStatus;
     }
     if (other.isSetTaskDetail()) {
       this.taskDetail = other.taskDetail;
@@ -264,7 +254,11 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       this.subTaskModel = 
org.apache.thrift.TBaseHelper.copyBinary(other.subTaskModel);
     }
     if (other.isSetTaskError()) {
-      this.taskError = new 
org.apache.airavata.model.commons.ErrorModel(other.taskError);
+      List<org.apache.airavata.model.commons.ErrorModel> __this__taskError = 
new 
ArrayList<org.apache.airavata.model.commons.ErrorModel>(other.taskErrors.size());
+      for (org.apache.airavata.model.commons.ErrorModel other_element : 
other.taskErrors) {
+        __this__taskError.add(new 
org.apache.airavata.model.commons.ErrorModel(other_element));
+      }
+      this.taskErrors = __this__taskError;
     }
     if (other.isSetJobs()) {
       List<org.apache.airavata.model.job.JobModel> __this__jobs = new 
ArrayList<org.apache.airavata.model.job.JobModel>(other.jobs.size());
@@ -289,10 +283,10 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     this.creationTime = 0;
     setLastUpdateTimeIsSet(false);
     this.lastUpdateTime = 0;
-    this.taskStatus = null;
+    this.taskStatuses = null;
     this.taskDetail = null;
     this.subTaskModel = null;
-    this.taskError = null;
+    this.taskErrors = null;
     this.jobs = null;
   }
 
@@ -417,26 +411,41 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, 
__LASTUPDATETIME_ISSET_ID, value);
   }
 
-  public org.apache.airavata.model.status.TaskStatus getTaskStatus() {
-    return this.taskStatus;
+  public int getTaskStatusSize() {
+    return (this.taskStatuses == null) ? 0 : this.taskStatuses.size();
+  }
+
+  public java.util.Iterator<org.apache.airavata.model.status.TaskStatus> 
getTaskStatusIterator() {
+    return (this.taskStatuses == null) ? null : this.taskStatuses.iterator();
+  }
+
+  public void addToTaskStatus(org.apache.airavata.model.status.TaskStatus 
elem) {
+    if (this.taskStatuses == null) {
+      this.taskStatuses = new 
ArrayList<org.apache.airavata.model.status.TaskStatus>();
+    }
+    this.taskStatuses.add(elem);
+  }
+
+  public List<org.apache.airavata.model.status.TaskStatus> getTaskStatuses() {
+    return this.taskStatuses;
   }
 
-  public void setTaskStatus(org.apache.airavata.model.status.TaskStatus 
taskStatus) {
-    this.taskStatus = taskStatus;
+  public void 
setTaskStatuses(List<org.apache.airavata.model.status.TaskStatus> taskStatuses) 
{
+    this.taskStatuses = taskStatuses;
   }
 
   public void unsetTaskStatus() {
-    this.taskStatus = null;
+    this.taskStatuses = null;
   }
 
-  /** Returns true if field taskStatus is set (has been assigned a value) and 
false otherwise */
+  /** Returns true if field taskStatuses is set (has been assigned a value) 
and false otherwise */
   public boolean isSetTaskStatus() {
-    return this.taskStatus != null;
+    return this.taskStatuses != null;
   }
 
   public void setTaskStatusIsSet(boolean value) {
     if (!value) {
-      this.taskStatus = null;
+      this.taskStatuses = null;
     }
   }
 
@@ -495,26 +504,41 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     }
   }
 
-  public org.apache.airavata.model.commons.ErrorModel getTaskError() {
-    return this.taskError;
+  public int getTaskErrorSize() {
+    return (this.taskErrors == null) ? 0 : this.taskErrors.size();
   }
 
-  public void setTaskError(org.apache.airavata.model.commons.ErrorModel 
taskError) {
-    this.taskError = taskError;
+  public java.util.Iterator<org.apache.airavata.model.commons.ErrorModel> 
getTaskErrorIterator() {
+    return (this.taskErrors == null) ? null : this.taskErrors.iterator();
+  }
+
+  public void addToTaskError(org.apache.airavata.model.commons.ErrorModel 
elem) {
+    if (this.taskErrors == null) {
+      this.taskErrors = new 
ArrayList<org.apache.airavata.model.commons.ErrorModel>();
+    }
+    this.taskErrors.add(elem);
+  }
+
+  public List<org.apache.airavata.model.commons.ErrorModel> getTaskErrors() {
+    return this.taskErrors;
+  }
+
+  public void setTaskErrors(List<org.apache.airavata.model.commons.ErrorModel> 
taskErrors) {
+    this.taskErrors = taskErrors;
   }
 
   public void unsetTaskError() {
-    this.taskError = null;
+    this.taskErrors = null;
   }
 
-  /** Returns true if field taskError is set (has been assigned a value) and 
false otherwise */
+  /** Returns true if field taskErrors is set (has been assigned a value) and 
false otherwise */
   public boolean isSetTaskError() {
-    return this.taskError != null;
+    return this.taskErrors != null;
   }
 
   public void setTaskErrorIsSet(boolean value) {
     if (!value) {
-      this.taskError = null;
+      this.taskErrors = null;
     }
   }
 
@@ -602,7 +626,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       if (value == null) {
         unsetTaskStatus();
       } else {
-        setTaskStatus((org.apache.airavata.model.status.TaskStatus)value);
+        setTaskStatuses((List<org.apache.airavata.model.status.TaskStatus>) 
value);
       }
       break;
 
@@ -626,7 +650,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       if (value == null) {
         unsetTaskError();
       } else {
-        setTaskError((org.apache.airavata.model.commons.ErrorModel)value);
+        setTaskErrors((List<org.apache.airavata.model.commons.ErrorModel>) 
value);
       }
       break;
 
@@ -659,7 +683,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       return getLastUpdateTime();
 
     case TASK_STATUS:
-      return getTaskStatus();
+      return getTaskStatuses();
 
     case TASK_DETAIL:
       return getTaskDetail();
@@ -668,7 +692,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       return getSubTaskModel();
 
     case TASK_ERROR:
-      return getTaskError();
+      return getTaskErrors();
 
     case JOBS:
       return getJobs();
@@ -771,7 +795,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     if (this_present_taskStatus || that_present_taskStatus) {
       if (!(this_present_taskStatus && that_present_taskStatus))
         return false;
-      if (!this.taskStatus.equals(that.taskStatus))
+      if (!this.taskStatuses.equals(that.taskStatuses))
         return false;
     }
 
@@ -798,7 +822,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     if (this_present_taskError || that_present_taskError) {
       if (!(this_present_taskError && that_present_taskError))
         return false;
-      if (!this.taskError.equals(that.taskError))
+      if (!this.taskErrors.equals(that.taskErrors))
         return false;
     }
 
@@ -846,7 +870,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     boolean present_taskStatus = true && (isSetTaskStatus());
     list.add(present_taskStatus);
     if (present_taskStatus)
-      list.add(taskStatus);
+      list.add(taskStatuses);
 
     boolean present_taskDetail = true && (isSetTaskDetail());
     list.add(present_taskDetail);
@@ -861,7 +885,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     boolean present_taskError = true && (isSetTaskError());
     list.add(present_taskError);
     if (present_taskError)
-      list.add(taskError);
+      list.add(taskErrors);
 
     boolean present_jobs = true && (isSetJobs());
     list.add(present_jobs);
@@ -934,7 +958,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       return lastComparison;
     }
     if (isSetTaskStatus()) {
-      lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.taskStatus, other.taskStatus);
+      lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.taskStatuses, other.taskStatuses);
       if (lastComparison != 0) {
         return lastComparison;
       }
@@ -964,7 +988,7 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       return lastComparison;
     }
     if (isSetTaskError()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.taskError, 
other.taskError);
+      lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.taskErrors, other.taskErrors);
       if (lastComparison != 0) {
         return lastComparison;
       }
@@ -1031,11 +1055,11 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     sb.append(this.lastUpdateTime);
     first = false;
     if (!first) sb.append(", ");
-    sb.append("taskStatus:");
-    if (this.taskStatus == null) {
+    sb.append("taskStatuses:");
+    if (this.taskStatuses == null) {
       sb.append("null");
     } else {
-      sb.append(this.taskStatus);
+      sb.append(this.taskStatuses);
     }
     first = false;
     if (isSetTaskDetail()) {
@@ -1060,11 +1084,11 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     }
     if (isSetTaskError()) {
       if (!first) sb.append(", ");
-      sb.append("taskError:");
-      if (this.taskError == null) {
+      sb.append("taskErrors:");
+      if (this.taskErrors == null) {
         sb.append("null");
       } else {
-        sb.append(this.taskError);
+        sb.append(this.taskErrors);
       }
       first = false;
     }
@@ -1105,16 +1129,10 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
     }
 
     if (!isSetTaskStatus()) {
-      throw new org.apache.thrift.protocol.TProtocolException("Required field 
'taskStatus' is unset! Struct:" + toString());
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 
'taskStatuses' is unset! Struct:" + toString());
     }
 
     // check for sub-struct validity
-    if (taskStatus != null) {
-      taskStatus.validate();
-    }
-    if (taskError != null) {
-      taskError.validate();
-    }
   }
 
   private void writeObject(java.io.ObjectOutputStream out) throws 
java.io.IOException {
@@ -1194,9 +1212,19 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
             }
             break;
           case 6: // TASK_STATUS
-            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
-              struct.taskStatus = new 
org.apache.airavata.model.status.TaskStatus();
-              struct.taskStatus.read(iprot);
+            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+              {
+                org.apache.thrift.protocol.TList _list0 = 
iprot.readListBegin();
+                struct.taskStatuses = new 
ArrayList<org.apache.airavata.model.status.TaskStatus>(_list0.size);
+                org.apache.airavata.model.status.TaskStatus _elem1;
+                for (int _i2 = 0; _i2 < _list0.size; ++_i2)
+                {
+                  _elem1 = new org.apache.airavata.model.status.TaskStatus();
+                  _elem1.read(iprot);
+                  struct.taskStatuses.add(_elem1);
+                }
+                iprot.readListEnd();
+              }
               struct.setTaskStatusIsSet(true);
             } else { 
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
@@ -1219,9 +1247,19 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
             }
             break;
           case 9: // TASK_ERROR
-            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
-              struct.taskError = new 
org.apache.airavata.model.commons.ErrorModel();
-              struct.taskError.read(iprot);
+            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+              {
+                org.apache.thrift.protocol.TList _list3 = 
iprot.readListBegin();
+                struct.taskErrors = new 
ArrayList<org.apache.airavata.model.commons.ErrorModel>(_list3.size);
+                org.apache.airavata.model.commons.ErrorModel _elem4;
+                for (int _i5 = 0; _i5 < _list3.size; ++_i5)
+                {
+                  _elem4 = new org.apache.airavata.model.commons.ErrorModel();
+                  _elem4.read(iprot);
+                  struct.taskErrors.add(_elem4);
+                }
+                iprot.readListEnd();
+              }
               struct.setTaskErrorIsSet(true);
             } else { 
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
@@ -1230,14 +1268,14 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
           case 10: // JOBS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list0 = 
iprot.readListBegin();
-                struct.jobs = new 
ArrayList<org.apache.airavata.model.job.JobModel>(_list0.size);
-                org.apache.airavata.model.job.JobModel _elem1;
-                for (int _i2 = 0; _i2 < _list0.size; ++_i2)
+                org.apache.thrift.protocol.TList _list6 = 
iprot.readListBegin();
+                struct.jobs = new 
ArrayList<org.apache.airavata.model.job.JobModel>(_list6.size);
+                org.apache.airavata.model.job.JobModel _elem7;
+                for (int _i8 = 0; _i8 < _list6.size; ++_i8)
                 {
-                  _elem1 = new org.apache.airavata.model.job.JobModel();
-                  _elem1.read(iprot);
-                  struct.jobs.add(_elem1);
+                  _elem7 = new org.apache.airavata.model.job.JobModel();
+                  _elem7.read(iprot);
+                  struct.jobs.add(_elem7);
                 }
                 iprot.readListEnd();
               }
@@ -1280,9 +1318,16 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       oprot.writeFieldBegin(LAST_UPDATE_TIME_FIELD_DESC);
       oprot.writeI64(struct.lastUpdateTime);
       oprot.writeFieldEnd();
-      if (struct.taskStatus != null) {
+      if (struct.taskStatuses != null) {
         oprot.writeFieldBegin(TASK_STATUS_FIELD_DESC);
-        struct.taskStatus.write(oprot);
+        {
+          oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.taskStatuses.size()));
+          for (org.apache.airavata.model.status.TaskStatus _iter9 : 
struct.taskStatuses)
+          {
+            _iter9.write(oprot);
+          }
+          oprot.writeListEnd();
+        }
         oprot.writeFieldEnd();
       }
       if (struct.taskDetail != null) {
@@ -1299,10 +1344,17 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
           oprot.writeFieldEnd();
         }
       }
-      if (struct.taskError != null) {
+      if (struct.taskErrors != null) {
         if (struct.isSetTaskError()) {
           oprot.writeFieldBegin(TASK_ERROR_FIELD_DESC);
-          struct.taskError.write(oprot);
+          {
+            oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.taskErrors.size()));
+            for (org.apache.airavata.model.commons.ErrorModel _iter10 : 
struct.taskErrors)
+            {
+              _iter10.write(oprot);
+            }
+            oprot.writeListEnd();
+          }
           oprot.writeFieldEnd();
         }
       }
@@ -1311,9 +1363,9 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
           oprot.writeFieldBegin(JOBS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.jobs.size()));
-            for (org.apache.airavata.model.job.JobModel _iter3 : struct.jobs)
+            for (org.apache.airavata.model.job.JobModel _iter11 : struct.jobs)
             {
-              _iter3.write(oprot);
+              _iter11.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -1342,7 +1394,13 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       oprot.writeString(struct.parentProcessId);
       oprot.writeI64(struct.creationTime);
       oprot.writeI64(struct.lastUpdateTime);
-      struct.taskStatus.write(oprot);
+      {
+        oprot.writeI32(struct.taskStatuses.size());
+        for (org.apache.airavata.model.status.TaskStatus _iter12 : 
struct.taskStatuses)
+        {
+          _iter12.write(oprot);
+        }
+      }
       BitSet optionals = new BitSet();
       if (struct.isSetTaskDetail()) {
         optionals.set(0);
@@ -1364,14 +1422,20 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
         oprot.writeBinary(struct.subTaskModel);
       }
       if (struct.isSetTaskError()) {
-        struct.taskError.write(oprot);
+        {
+          oprot.writeI32(struct.taskErrors.size());
+          for (org.apache.airavata.model.commons.ErrorModel _iter13 : 
struct.taskErrors)
+          {
+            _iter13.write(oprot);
+          }
+        }
       }
       if (struct.isSetJobs()) {
         {
           oprot.writeI32(struct.jobs.size());
-          for (org.apache.airavata.model.job.JobModel _iter4 : struct.jobs)
+          for (org.apache.airavata.model.job.JobModel _iter14 : struct.jobs)
           {
-            _iter4.write(oprot);
+            _iter14.write(oprot);
           }
         }
       }
@@ -1390,8 +1454,17 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
       struct.setCreationTimeIsSet(true);
       struct.lastUpdateTime = iprot.readI64();
       struct.setLastUpdateTimeIsSet(true);
-      struct.taskStatus = new org.apache.airavata.model.status.TaskStatus();
-      struct.taskStatus.read(iprot);
+      {
+        org.apache.thrift.protocol.TList _list15 = new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
iprot.readI32());
+        struct.taskStatuses = new 
ArrayList<org.apache.airavata.model.status.TaskStatus>(_list15.size);
+        org.apache.airavata.model.status.TaskStatus _elem16;
+        for (int _i17 = 0; _i17 < _list15.size; ++_i17)
+        {
+          _elem16 = new org.apache.airavata.model.status.TaskStatus();
+          _elem16.read(iprot);
+          struct.taskStatuses.add(_elem16);
+        }
+      }
       struct.setTaskStatusIsSet(true);
       BitSet incoming = iprot.readBitSet(4);
       if (incoming.get(0)) {
@@ -1403,20 +1476,29 @@ public class TaskModel implements 
org.apache.thrift.TBase<TaskModel, TaskModel._
         struct.setSubTaskModelIsSet(true);
       }
       if (incoming.get(2)) {
-        struct.taskError = new org.apache.airavata.model.commons.ErrorModel();
-        struct.taskError.read(iprot);
+        {
+          org.apache.thrift.protocol.TList _list18 = new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
iprot.readI32());
+          struct.taskErrors = new 
ArrayList<org.apache.airavata.model.commons.ErrorModel>(_list18.size);
+          org.apache.airavata.model.commons.ErrorModel _elem19;
+          for (int _i20 = 0; _i20 < _list18.size; ++_i20)
+          {
+            _elem19 = new org.apache.airavata.model.commons.ErrorModel();
+            _elem19.read(iprot);
+            struct.taskErrors.add(_elem19);
+          }
+        }
         struct.setTaskErrorIsSet(true);
       }
       if (incoming.get(3)) {
         {
-          org.apache.thrift.protocol.TList _list5 = new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
iprot.readI32());
-          struct.jobs = new 
ArrayList<org.apache.airavata.model.job.JobModel>(_list5.size);
-          org.apache.airavata.model.job.JobModel _elem6;
-          for (int _i7 = 0; _i7 < _list5.size; ++_i7)
+          org.apache.thrift.protocol.TList _list21 = new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
iprot.readI32());
+          struct.jobs = new 
ArrayList<org.apache.airavata.model.job.JobModel>(_list21.size);
+          org.apache.airavata.model.job.JobModel _elem22;
+          for (int _i23 = 0; _i23 < _list21.size; ++_i23)
           {
-            _elem6 = new org.apache.airavata.model.job.JobModel();
-            _elem6.read(iprot);
-            struct.jobs.add(_elem6);
+            _elem22 = new org.apache.airavata.model.job.JobModel();
+            _elem22.read(iprot);
+            struct.jobs.add(_elem22);
           }
         }
         struct.setJobsIsSet(true);

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
 
b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
index 0015a21..0fc54fe 100644
--- 
a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
+++ 
b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
@@ -210,9 +210,14 @@ public class GFacUtils {
        public static void saveJobStatus(ProcessContext processContext, 
JobModel jobModel) throws GFacException {
                try {
             // first we save job jobModel to the registry for sa and then save 
the job status.
-                       JobStatus jobStatus = jobModel.getJobStatus();
+            JobStatus jobStatus = null;
+            if(jobModel.getJobStatuses() != null)
+                           jobStatus = jobModel.getJobStatuses().get(0);
+
             ExperimentCatalog experimentCatalog = 
processContext.getExperimentCatalog();
-            jobModel.setJobStatus(jobStatus);
+            List<JobStatus> statuses = new ArrayList<>();
+            statuses.add(jobStatus);
+            jobModel.setJobStatuses(statuses);
             if (jobStatus.getTimeOfStateChange() == 0 || 
jobStatus.getTimeOfStateChange() > 0 ){
                 
jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
             }else {

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/ProcessContext.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/ProcessContext.java
 
b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/ProcessContext.java
index 0e8c1f0..8a2cc4e 100644
--- 
a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/ProcessContext.java
+++ 
b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/ProcessContext.java
@@ -362,8 +362,8 @@ public class ProcessContext {
        }
 
        public ProcessState getProcessState() {
-               if(processModel.getProcessStatus() != null && 
processModel.getProcessStatus().size() > 0)
-                       return 
processModel.getProcessStatus().get(0).getState();
+               if(processModel.getProcessStatuses() != null && 
processModel.getProcessStatuses().size() > 0)
+                       return 
processModel.getProcessStatuses().get(0).getState();
                else
                        return null;
        }
@@ -374,13 +374,13 @@ public class ProcessContext {
                                        getProcessState().name(), 
status.getState().name());
                        List<ProcessStatus> processStatuses = new ArrayList<>();
                        processStatuses.add(status);
-                       processModel.setProcessStatus(processStatuses);
+                       processModel.setProcessStatuses(processStatuses);
                }
        }
 
        public ProcessStatus getProcessStatus(){
-               if(processModel.getProcessStatus() != null)
-                       return processModel.getProcessStatus().get(0);
+               if(processModel.getProcessStatuses() != null)
+                       return processModel.getProcessStatuses().get(0);
                else
                        return null;
        }

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/TaskContext.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/TaskContext.java
 
b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/TaskContext.java
index 1a276b3..6f95d3d 100644
--- 
a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/TaskContext.java
+++ 
b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/TaskContext.java
@@ -30,6 +30,9 @@ import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class TaskContext {
        private static final Logger log = 
LoggerFactory.getLogger(TaskContext.class);
 
@@ -64,15 +67,23 @@ public class TaskContext {
                log.info("expId: {}, processId: {}, taskId: {}, type: {}:- Task 
status changed {} -> {}", parentProcessContext
                                .getExperimentId(), 
parentProcessContext.getProcessId(), getTaskId(), getTaskType().name(),
                                getTaskState().name(), taskStatus 
.getState().name());
-               taskModel.setTaskStatus(taskStatus);
+               List<TaskStatus> taskStatuses = new ArrayList<>();
+               taskStatuses.add(taskStatus);
+               taskModel.setTaskStatuses(taskStatuses);
        }
 
        public TaskStatus getTaskStatus() {
-               return taskModel.getTaskStatus();
+               if(taskModel.getTaskStatuses() != null)
+                       return taskModel.getTaskStatuses().get(0);
+               else
+                       return null;
        }
 
        public TaskState getTaskState() {
-               return taskModel.getTaskStatus().getState();
+               if(taskModel.getTaskStatuses() != null)
+                       return taskModel.getTaskStatuses().get(0).getState();
+               else
+                       return null;
        }
 
        public TaskTypes getTaskType() {

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
index f64e521..90acacc 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
@@ -37,7 +37,6 @@ import org.apache.airavata.gfac.core.monitor.JobMonitor;
 import org.apache.airavata.gfac.core.task.JobSubmissionTask;
 import org.apache.airavata.gfac.core.task.Task;
 import org.apache.airavata.gfac.core.task.TaskException;
-import org.apache.airavata.gfac.impl.task.DataStageTask;
 import org.apache.airavata.gfac.impl.task.DataStreamingTask;
 import org.apache.airavata.gfac.impl.task.EnvironmentSetupTask;
 import 
org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
@@ -53,19 +52,9 @@ import org.apache.airavata.model.commons.ErrorModel;
 import org.apache.airavata.model.data.movement.SecurityProtocol;
 import org.apache.airavata.model.job.JobModel;
 import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
-import org.apache.airavata.model.status.ProcessState;
-import org.apache.airavata.model.status.ProcessStatus;
-import org.apache.airavata.model.status.TaskState;
-import org.apache.airavata.model.status.TaskStatus;
+import org.apache.airavata.model.status.*;
 import org.apache.airavata.model.task.*;
-import org.apache.airavata.registry.cpi.AppCatalog;
-import org.apache.airavata.registry.cpi.AppCatalogException;
-import org.apache.airavata.registry.cpi.ExpCatChildDataType;
-import org.apache.airavata.registry.cpi.ExperimentCatalog;
-import org.apache.airavata.registry.cpi.ExperimentCatalogModelType;
-import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.cpi.*;
 import org.apache.airavata.registry.cpi.utils.Constants;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.utils.ZKPaths;
@@ -339,7 +328,7 @@ public class GFacEngineImpl implements GFacEngine {
                     executeJobSubmission(taskContext, 
processContext.isRecovery());
                     // Don't put any checkpoint in between JobSubmission and 
Monitoring tasks
 
-                    JobStatus jobStatus = 
processContext.getJobModel().getJobStatus();
+                    JobStatus jobStatus = 
processContext.getJobModel().getJobStatuses().get(0);
                     if (jobStatus != null && (jobStatus.getJobState() == 
JobState.SUBMITTED
                             || jobStatus.getJobState() == JobState.QUEUED || 
jobStatus.getJobState() == JobState.ACTIVE)) {
 
@@ -350,7 +339,7 @@ public class GFacEngineImpl implements GFacEngine {
                                     if (output.isOutputStreaming()){
                                         TaskModel streamingTaskModel = new 
TaskModel();
                                         
streamingTaskModel.setTaskType(TaskTypes.OUTPUT_FETCHING);
-                                        streamingTaskModel.setTaskStatus(new 
TaskStatus(TaskState.CREATED));
+                                        
streamingTaskModel.setTaskStatuses(Arrays.asList(new 
TaskStatus(TaskState.CREATED)));
                                         
streamingTaskModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
                                         
streamingTaskModel.setParentProcessId(processContext.getProcessId());
                                         TaskContext streamingTaskContext = 
getTaskContext(processContext);
@@ -589,7 +578,7 @@ public class GFacEngineImpl implements GFacEngine {
         TaskModel taskModel = null;
         for (String taskId : taskExecutionOrder) {
             taskModel = taskMap.get(taskId);
-            TaskState state = taskModel.getTaskStatus().getState();
+            TaskState state = taskModel.getTaskStatuses().get(0).getState();
             if (state == TaskState.CREATED || state == TaskState.EXECUTING) {
                 recoverTaskId = taskId;
                 break;
@@ -786,7 +775,7 @@ public class GFacEngineImpl implements GFacEngine {
         taskModel.setLastUpdateTime(taskModel.getCreationTime());
         TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
         
taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-        taskModel.setTaskStatus(taskStatus);
+        taskModel.setTaskStatuses(Arrays.asList(taskStatus));
         taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
         taskCtx.setTaskModel(taskModel);
         return taskCtx;
@@ -803,7 +792,7 @@ public class GFacEngineImpl implements GFacEngine {
         taskModel.setLastUpdateTime(taskModel.getCreationTime());
         TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
         
taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-        taskModel.setTaskStatus(taskStatus);
+        taskModel.setTaskStatuses(Arrays.asList(taskStatus));
         taskModel.setTaskType(TaskTypes.DATA_STAGING);
         // create data staging sub task model
         String remoteOutputDir = processContext.getOutputDir();

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ArchiveTask.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ArchiveTask.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ArchiveTask.java
index 755eed5..df22654 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ArchiveTask.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ArchiveTask.java
@@ -54,6 +54,7 @@ import org.slf4j.LoggerFactory;
 import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Arrays;
 import java.util.Map;
 
 public class ArchiveTask implements Task {
@@ -89,7 +90,7 @@ public class ArchiveTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
             return status;
         }
 
@@ -159,7 +160,7 @@ public class ArchiveTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         }
         return status;
     }

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/BESJobSubmissionTask.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/BESJobSubmissionTask.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/BESJobSubmissionTask.java
index 6529395..a4dcb5d 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/BESJobSubmissionTask.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/BESJobSubmissionTask.java
@@ -35,7 +35,6 @@ import org.apache.airavata.gfac.core.GFacException;
 import org.apache.airavata.gfac.core.GFacUtils;
 import org.apache.airavata.gfac.core.SSHApiException;
 import org.apache.airavata.gfac.core.authentication.AuthenticationInfo;
-import org.apache.airavata.gfac.core.authentication.SSHKeyAuthentication;
 import org.apache.airavata.gfac.core.cluster.ServerInfo;
 import org.apache.airavata.gfac.core.context.ProcessContext;
 import org.apache.airavata.gfac.core.context.TaskContext;
@@ -73,6 +72,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
@@ -169,7 +169,7 @@ public class BESJobSubmissionTask implements 
JobSubmissionTask {
             log.info("JobID: " + jobId);
             jobDetails.setJobId(jobId);
             jobDetails.setJobDescription(activityEpr.toString());
-            jobDetails.setJobStatus(new JobStatus(JobState.SUBMITTED));
+            jobDetails.setJobStatuses(Arrays.asList(new 
JobStatus(JobState.SUBMITTED)));
             processContext.setJobModel(jobDetails);
             GFacUtils.saveJobModel(processContext, jobDetails);
             GFacUtils.saveJobStatus(processContext, jobDetails);
@@ -198,7 +198,7 @@ public class BESJobSubmissionTask implements 
JobSubmissionTask {
                 log.error(error);
 
                 JobState applicationJobStatus = JobState.FAILED;
-                jobDetails.setJobStatus(new JobStatus(applicationJobStatus));
+                jobDetails.setJobStatuses(Arrays.asList(new 
JobStatus(applicationJobStatus)));
                 sendNotification(processContext, jobDetails);
                 try {Thread.sleep(5000);} catch (InterruptedException e) {}
 
@@ -208,7 +208,7 @@ public class BESJobSubmissionTask implements 
JobSubmissionTask {
 
             } else if (activityStatus.getState() == 
ActivityStateEnumeration.CANCELLED) {
                 JobState applicationJobStatus = JobState.CANCELED;
-                jobDetails.setJobStatus(new JobStatus(applicationJobStatus));
+                jobDetails.setJobStatuses(Arrays.asList(new 
JobStatus(applicationJobStatus)));
                 GFacUtils.saveJobStatus(processContext, jobDetails);
                 throw new GFacException(
                         processContext.getExperimentId() + "Job Canceled");
@@ -218,7 +218,7 @@ public class BESJobSubmissionTask implements 
JobSubmissionTask {
                 } catch (InterruptedException ignored) {
                 }
                 JobState applicationJobStatus = JobState.COMPLETE;
-                jobDetails.setJobStatus(new JobStatus(applicationJobStatus));
+                jobDetails.setJobStatuses(Arrays.asList(new 
JobStatus(applicationJobStatus)));
                 GFacUtils.saveJobStatus(processContext, jobDetails);
                 log.info("Job Id: {}, exit code: {}, exit status: {}", 
jobDetails.getJobId(),
                         activityStatus.getExitCode(), 
ActivityStateEnumeration.FINISHED.toString());

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DataStageTask.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DataStageTask.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DataStageTask.java
index 69e8d77..8c6a125 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DataStageTask.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DataStageTask.java
@@ -20,7 +20,6 @@
  */
 package org.apache.airavata.gfac.impl.task;
 
-import org.apache.airavata.common.utils.ThriftUtils;
 import org.apache.airavata.gfac.core.SSHApiException;
 import org.apache.airavata.gfac.core.context.TaskContext;
 import org.apache.airavata.gfac.core.task.Task;
@@ -37,6 +36,7 @@ import org.slf4j.LoggerFactory;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Arrays;
 import java.util.Map;
 
 public class DataStageTask implements Task {
@@ -83,7 +83,7 @@ public class DataStageTask implements Task {
                                ErrorModel errorModel = new ErrorModel();
                                
errorModel.setActualErrorMessage(e.getMessage());
                                errorModel.setUserFriendlyMessage(msg);
-                               
taskContext.getTaskModel().setTaskError(errorModel);
+                               
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
                        } catch (TException e) {
                                String msg = "Invalid task invocation";
                                log.error(msg, e);
@@ -92,7 +92,7 @@ public class DataStageTask implements Task {
                                ErrorModel errorModel = new ErrorModel();
                                
errorModel.setActualErrorMessage(e.getMessage());
                                errorModel.setUserFriendlyMessage(msg);
-                               
taskContext.getTaskModel().setTaskError(errorModel);
+                               
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
                        } catch (URISyntaxException e) {
                                String msg = "source or destination is not a 
valid URI";
                                log.error(msg, e);
@@ -101,7 +101,7 @@ public class DataStageTask implements Task {
                                ErrorModel errorModel = new ErrorModel();
                                
errorModel.setActualErrorMessage(e.getMessage());
                                errorModel.setUserFriendlyMessage(msg);
-                               
taskContext.getTaskModel().setTaskError(errorModel);
+                               
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
                        }
                }
                return status;

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DefaultJobSubmissionTask.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DefaultJobSubmissionTask.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DefaultJobSubmissionTask.java
index b7f150f..a131ef5 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DefaultJobSubmissionTask.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/DefaultJobSubmissionTask.java
@@ -24,7 +24,6 @@ package org.apache.airavata.gfac.impl.task;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.gfac.core.*;
-import org.apache.airavata.gfac.core.cluster.CommandInfo;
 import org.apache.airavata.gfac.core.cluster.JobSubmissionOutput;
 import org.apache.airavata.gfac.core.cluster.RawCommandInfo;
 import org.apache.airavata.gfac.core.cluster.RemoteCluster;
@@ -49,6 +48,9 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 public class DefaultJobSubmissionTask implements JobSubmissionTask {
@@ -92,8 +94,10 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                 if (exitCode != 0 || 
jobSubmissionOutput.isJobSubmissionFailed()) {
                                        jobModel.setJobId(DEFAULT_JOB_ID);
                                        if 
(jobSubmissionOutput.isJobSubmissionFailed()) {
-                                               jobModel.setJobStatus(new 
JobStatus(JobState.FAILED));
-                                               
jobModel.getJobStatus().setReason(jobSubmissionOutput.getFailureReason());
+                                               List<JobStatus> statusList = 
new ArrayList<>();
+                                               statusList.add(new 
JobStatus(JobState.FAILED));
+                                               
statusList.get(0).setReason(jobSubmissionOutput.getFailureReason());
+                                               
jobModel.setJobStatuses(statusList);
                                                
GFacUtils.saveJobModel(processContext, jobModel);
                                                log.error("expId: {}, 
processid: {}, taskId: {} :- Job submission failed for job name {}",
                                 experimentId, taskContext.getProcessId(), 
taskContext.getTaskId(), jobModel.getJobName());
@@ -150,13 +154,13 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                             .getComputeResourceDescription();
                     jobStatus.setReason("Successfully Submitted to " + 
computeResourceDescription.getHostName());
                     
jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-                                   jobModel.setJobStatus(jobStatus);
+                                   
jobModel.setJobStatuses(Arrays.asList(jobStatus));
                                    
GFacUtils.saveJobStatus(taskContext.getParentProcessContext(), jobModel);
                                    if 
(verifyJobSubmissionByJobId(remoteCluster, jobId)) {
                                            
jobStatus.setJobState(JobState.QUEUED);
                                            jobStatus.setReason("Verification 
step succeeded");
                         
jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-                                           jobModel.setJobStatus(jobStatus);
+                                           
jobModel.setJobStatuses(Arrays.asList(jobStatus));
                                            
GFacUtils.saveJobStatus(taskContext.getParentProcessContext(), jobModel);
                                    }
                     // doing gateway reporting
@@ -184,7 +188,7 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                                                        
jobStatus.setJobState(JobState.QUEUED);
                                                        
jobStatus.setReason("Verification step succeeded");
                                                        
jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-                                                       
jobModel.setJobStatus(jobStatus);
+                                                       
jobModel.setJobStatuses(Arrays.asList(jobStatus));
                                                        
GFacUtils.saveJobStatus(taskContext.getParentProcessContext(), jobModel);
                                                        
taskStatus.setState(TaskState.COMPLETED);
                                                        
taskStatus.setReason("Submitted job to compute resource");
@@ -233,7 +237,7 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                    ErrorModel errorModel = new ErrorModel();
                    errorModel.setActualErrorMessage(e.getMessage());
                    errorModel.setUserFriendlyMessage(msg);
-                   taskContext.getTaskModel().setTaskError(errorModel);
+                   
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
            } catch (ApplicationSettingsException | GFacException e) {
                    String msg = "Error occurred while creating job descriptor";
                    log.error(msg, e);
@@ -243,7 +247,7 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                    ErrorModel errorModel = new ErrorModel();
                    errorModel.setActualErrorMessage(e.getMessage());
                    errorModel.setUserFriendlyMessage(msg);
-                   taskContext.getTaskModel().setTaskError(errorModel);
+                   
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
            } catch (SSHApiException e) {
                    String msg = "Error occurred while submitting the job";
                    log.error(msg, e);
@@ -253,7 +257,7 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                    ErrorModel errorModel = new ErrorModel();
                    errorModel.setActualErrorMessage(e.getMessage());
                    errorModel.setUserFriendlyMessage(msg);
-                   taskContext.getTaskModel().setTaskError(errorModel);
+                   
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
            } catch (IOException e) {
                    String msg = "Error while reading the content of the job 
file";
                    log.error(msg, e);
@@ -263,7 +267,7 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                    ErrorModel errorModel = new ErrorModel();
                    errorModel.setActualErrorMessage(e.getMessage());
                    errorModel.setUserFriendlyMessage(msg);
-                   taskContext.getTaskModel().setTaskError(errorModel);
+                   
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
            } catch (InterruptedException e) {
                    String msg = "Error occurred while verifying the job 
submission";
                    log.error(msg, e);
@@ -273,7 +277,7 @@ public class DefaultJobSubmissionTask implements 
JobSubmissionTask {
                    ErrorModel errorModel = new ErrorModel();
                    errorModel.setActualErrorMessage(e.getMessage());
                    errorModel.setUserFriendlyMessage(msg);
-                   taskContext.getTaskModel().setTaskError(errorModel);
+                   
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
            } catch (RegistryException e) {
             e.printStackTrace();
         }

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/EnvironmentSetupTask.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/EnvironmentSetupTask.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/EnvironmentSetupTask.java
index 1256e48..7de0282 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/EnvironmentSetupTask.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/EnvironmentSetupTask.java
@@ -32,6 +32,7 @@ import org.apache.airavata.model.task.TaskTypes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Arrays;
 import java.util.Map;
 
 public class EnvironmentSetupTask implements Task {
@@ -57,7 +58,7 @@ public class EnvironmentSetupTask implements Task {
                        ErrorModel errorModel = new ErrorModel();
                        errorModel.setActualErrorMessage(e.getMessage());
                        errorModel.setUserFriendlyMessage(msg);
-                       taskContext.getTaskModel().setTaskError(errorModel);
+                       
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
                }
                return status;
        }

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ForkJobSubmissionTask.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ForkJobSubmissionTask.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ForkJobSubmissionTask.java
index 59a36e1..b57b68d 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ForkJobSubmissionTask.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/ForkJobSubmissionTask.java
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Map;
 
 public class ForkJobSubmissionTask implements JobSubmissionTask {
@@ -87,7 +88,7 @@ public class ForkJobSubmissionTask implements 
JobSubmissionTask {
                     jobStatus.setReason("Successfully Submitted to " + 
taskContext.getParentProcessContext()
                             .getComputeResourceDescription().getHostName());
                     
jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-                    jobModel.setJobStatus(jobStatus);
+                    jobModel.setJobStatuses(Arrays.asList(jobStatus));
                     
GFacUtils.saveJobStatus(taskContext.getParentProcessContext(), jobModel);
                     taskStatus = new TaskStatus(TaskState.COMPLETED);
                     taskStatus.setReason("Submitted job to compute resource");
@@ -124,7 +125,7 @@ public class ForkJobSubmissionTask implements 
JobSubmissionTask {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (AppCatalogException e) {
             String msg = "Error while instantiating app catalog";
             log.error(msg, e);
@@ -133,7 +134,7 @@ public class ForkJobSubmissionTask implements 
JobSubmissionTask {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (GFacException e) {
             String msg = "Error occurred while creating job descriptor";
             log.error(msg, e);
@@ -142,7 +143,7 @@ public class ForkJobSubmissionTask implements 
JobSubmissionTask {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (SSHApiException e) {
             String msg = "Error occurred while submitting the job";
             log.error(msg, e);
@@ -151,7 +152,7 @@ public class ForkJobSubmissionTask implements 
JobSubmissionTask {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (IOException e) {
             String msg = "Error while reading the content of the job file";
             log.error(msg, e);
@@ -160,7 +161,7 @@ public class ForkJobSubmissionTask implements 
JobSubmissionTask {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         }
         return taskStatus;
     }

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SCPDataStageTask.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SCPDataStageTask.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SCPDataStageTask.java
index 904d486..6a8800e 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SCPDataStageTask.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SCPDataStageTask.java
@@ -24,7 +24,6 @@ import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Session;
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.ThriftUtils;
 import org.apache.airavata.gfac.core.GFacException;
 import org.apache.airavata.gfac.core.GFacUtils;
 import org.apache.airavata.gfac.core.SSHApiException;
@@ -57,6 +56,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Arrays;
 import java.util.Map;
 
 /**
@@ -179,7 +179,7 @@ public class SCPDataStageTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
             return status;
         } catch (ApplicationSettingsException | FileNotFoundException e) {
             String msg = "Failed while reading credentials";
@@ -189,7 +189,7 @@ public class SCPDataStageTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (URISyntaxException e) {
             String msg = "Source or destination uri is not correct source : " 
+ subTaskModel.getSource() + ", " +
                     "destination : " + subTaskModel.getDestination();
@@ -199,7 +199,7 @@ public class SCPDataStageTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (SSHApiException e) {
             String msg = e.getMessage();
             log.error(msg, e);
@@ -208,7 +208,7 @@ public class SCPDataStageTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (AiravataException e) {
             String msg = "Error while creating ssh session with client";
             log.error(msg, e);
@@ -217,7 +217,7 @@ public class SCPDataStageTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (JSchException | IOException e) {
             String msg = "Failed to do scp with client";
             log.error(msg, e);
@@ -226,7 +226,7 @@ public class SCPDataStageTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         } catch (GFacException e) {
             String msg = "Failed update experiment and process inputs and 
outputs";
             log.error(msg, e);
@@ -235,7 +235,7 @@ public class SCPDataStageTask implements Task {
             ErrorModel errorModel = new ErrorModel();
             errorModel.setActualErrorMessage(e.getMessage());
             errorModel.setUserFriendlyMessage(msg);
-            taskContext.getTaskModel().setTaskError(errorModel);
+            
taskContext.getTaskModel().setTaskErrors(Arrays.asList(errorModel));
         }
         return status;
     }

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/utils/StreamData.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/utils/StreamData.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/utils/StreamData.java
index 76b678a..375e570 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/utils/StreamData.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/utils/StreamData.java
@@ -24,15 +24,11 @@ package org.apache.airavata.gfac.impl.task.utils;
 import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Session;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.credential.store.credential.Credential;
-import org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential;
-import org.apache.airavata.credential.store.store.CredentialReader;
 import org.apache.airavata.credential.store.store.CredentialStoreException;
 import org.apache.airavata.gfac.core.GFacException;
 import org.apache.airavata.gfac.core.GFacUtils;
 import org.apache.airavata.gfac.core.SSHApiException;
 import org.apache.airavata.gfac.core.authentication.AuthenticationInfo;
-import org.apache.airavata.gfac.core.authentication.SSHKeyAuthentication;
 import org.apache.airavata.gfac.core.cluster.CommandInfo;
 import org.apache.airavata.gfac.core.cluster.RawCommandInfo;
 import org.apache.airavata.gfac.core.cluster.RemoteCluster;
@@ -40,7 +36,6 @@ import org.apache.airavata.gfac.core.cluster.ServerInfo;
 import org.apache.airavata.gfac.core.context.TaskContext;
 import org.apache.airavata.gfac.impl.Factory;
 import org.apache.airavata.gfac.impl.SSHUtils;
-import org.apache.airavata.model.commons.ErrorModel;
 import org.apache.airavata.model.status.JobState;
 import org.apache.airavata.model.status.JobStatus;
 import org.apache.airavata.model.task.DataStagingTaskModel;
@@ -48,7 +43,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -78,7 +72,7 @@ public class StreamData extends TimerTask  {
     public void run() {
         try {
             // output staging should start when the job is in active state
-            JobStatus jobStatus = 
taskContext.getParentProcessContext().getJobModel().getJobStatus();
+            JobStatus jobStatus = 
taskContext.getParentProcessContext().getJobModel().getJobStatuses().get(0);
             if (jobStatus != null && 
jobStatus.getJobState().equals(JobState.ACTIVE)){
                 runOutputStaging();
             }

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
----------------------------------------------------------------------
diff --git 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
index b2df00b..b24aa75 100644
--- 
a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
+++ 
b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
@@ -135,7 +135,7 @@ public class EmailBasedMonitor implements JobMonitor, 
Runnable{
                     newJobStatus.setReason("Moving job status to cancel, as we 
didn't see any email from this job " +
                             "for a while after execute job cancel command. 
This may happen if job was in queued state " +
                             "when we run the cancel command");
-                    jobModel.setJobStatus(newJobStatus);
+                    jobModel.setJobStatuses(Arrays.asList(newJobStatus));
                     GFacUtils.saveJobStatus(pc, jobModel);
                 }
                 ProcessStatus pStatus = new 
ProcessStatus(ProcessState.CANCELLING);
@@ -374,7 +374,7 @@ public class EmailBasedMonitor implements JobMonitor, 
Runnable{
         }
            if (jobStatus.getJobState() != null) {
                    try {
-                           jobModel.setJobStatus(jobStatus);
+                           jobModel.setJobStatuses(Arrays.asList(jobStatus));
                            log.info("[EJM]: Publishing status changes to amqp. 
" + jobDetails);
                            GFacUtils.saveJobStatus(parentProcessContext, 
jobModel);
                    } catch (GFacException e) {

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
 
b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
index 73a6aef..b1218e4 100644
--- 
a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
+++ 
b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
@@ -217,7 +217,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator{
         // FIXME
 //        List<JobDetails> jobDetailsList = task.getJobDetailsList();
 //        for(JobDetails jobDetails:jobDetailsList) {
-//            JobState jobState = jobDetails.getJobStatus().getJobState();
+//            JobState jobState = jobDetails.getJobStatuses().getJobState();
 //            if (jobState.getValue() > 4){
 //                logger.error("Cannot cancel the job, because current job 
state is : " + jobState.toString() +
 //                "jobId: " + jobDetails.getJobID() + " Job Name: " + 
jobDetails.getJobName());
@@ -346,7 +346,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator{
         List<String> envTaskIds = new ArrayList<>();
         TaskModel envSetupTask = new TaskModel();
         envSetupTask.setTaskType(TaskTypes.ENV_SETUP);
-        envSetupTask.setTaskStatus(new TaskStatus(TaskState.CREATED));
+        envSetupTask.setTaskStatuses(Arrays.asList(new 
TaskStatus(TaskState.CREATED)));
         
envSetupTask.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
         envSetupTask.setParentProcessId(processModel.getProcessId());
         EnvironmentSetupTaskModel envSetupSubModel = new 
EnvironmentSetupTaskModel();
@@ -487,7 +487,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator{
         taskModel.setLastUpdateTime(taskModel.getCreationTime());
         TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
         
taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-        taskModel.setTaskStatus(taskStatus);
+        taskModel.setTaskStatuses(Arrays.asList(taskStatus));
         taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
         JobSubmissionTaskModel submissionSubTask = new 
JobSubmissionTaskModel();
         submissionSubTask.setMonitorMode(monitorMode);
@@ -508,7 +508,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator{
             
monitorTaskModel.setLastUpdateTime(monitorTaskModel.getCreationTime());
             TaskStatus monitorTaskStatus = new TaskStatus(TaskState.CREATED);
             
monitorTaskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-            monitorTaskModel.setTaskStatus(monitorTaskStatus);
+            monitorTaskModel.setTaskStatuses(Arrays.asList(monitorTaskStatus));
             monitorTaskModel.setTaskType(TaskTypes.MONITORING);
             MonitorTaskModel monitorSubTaskModel = new MonitorTaskModel();
             monitorSubTaskModel.setMonitorMode(monitorMode);
@@ -538,7 +538,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator{
         taskModel.setLastUpdateTime(taskModel.getCreationTime());
         TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
         
taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-        taskModel.setTaskStatus(taskStatus);
+        taskModel.setTaskStatuses(Arrays.asList(taskStatus));
         taskModel.setTaskType(TaskTypes.DATA_STAGING);
         // create data staging sub task model
         DataStagingTaskModel submodel = new DataStagingTaskModel();
@@ -576,7 +576,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator{
             taskModel.setLastUpdateTime(taskModel.getCreationTime());
             TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
             
taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-            taskModel.setTaskStatus(taskStatus);
+            taskModel.setTaskStatuses(Arrays.asList(taskStatus));
             taskModel.setTaskType(TaskTypes.DATA_STAGING);
             ComputeResourcePreference computeResourcePreference = 
OrchestratorUtils.getComputeResourcePreference(orchestratorContext, 
processModel, gatewayId);
             ComputeResourceDescription computeResource = 
orchestratorContext.getRegistry().getAppCatalog().getComputeResource().getComputeResource(processModel.getComputeResourceId());

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
----------------------------------------------------------------------
diff --git 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
index a66295e..763f5da 100644
--- 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
+++ 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
@@ -38,7 +38,7 @@ public class JobEntity {
     private String stdErr;
     private int exitCode;
 
-    private List<JobStatusEntity> jobStatus;
+    private List<JobStatusEntity> jobStatuses;
 
     private TaskEntity task;
 
@@ -145,12 +145,12 @@ public class JobEntity {
     }
 
     @OneToMany(targetEntity = JobStatusEntity.class, cascade = 
CascadeType.ALL, mappedBy = "job")
-    public List<JobStatusEntity> getJobStatus() {
-        return jobStatus;
+    public List<JobStatusEntity> getJobStatuses() {
+        return jobStatuses;
     }
 
-    public void setJobStatus(List<JobStatusEntity> jobStatus) {
-        this.jobStatus = jobStatus;
+    public void setJobStatuses(List<JobStatusEntity> jobStatus) {
+        this.jobStatuses = jobStatus;
     }
 
     @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, 
fetch = FetchType.LAZY)

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
----------------------------------------------------------------------
diff --git 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
index 109041e..a379ef6 100644
--- 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
+++ 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
@@ -45,8 +45,8 @@ public class ProcessEntity {
     private String experimentDataDir;
     private String userName;
 
-    private List<ProcessStatusEntity> processStatus;
-    private List<ProcessErrorEntity> processError;
+    private List<ProcessStatusEntity> processStatuses;
+    private List<ProcessErrorEntity> processErrors;
     private List<ProcessInputEntity> processInputs;
     private List<ProcessOutputEntity> processOutputs;
     private ProcessResourceSchedulingEntity processResourceSchedule;
@@ -211,21 +211,21 @@ public class ProcessEntity {
     }
 
     @OneToMany(targetEntity = ProcessStatusEntity.class, cascade = 
CascadeType.ALL, mappedBy = "process")
-    public List<ProcessStatusEntity> getProcessStatus() {
-        return processStatus;
+    public List<ProcessStatusEntity> getProcessStatuses() {
+        return processStatuses;
     }
 
-    public void setProcessStatus(List<ProcessStatusEntity> processStatus) {
-        this.processStatus = processStatus;
+    public void setProcessStatuses(List<ProcessStatusEntity> processStatus) {
+        this.processStatuses = processStatus;
     }
 
     @OneToMany(targetEntity = ProcessErrorEntity.class, cascade = 
CascadeType.ALL, mappedBy = "process")
-    public List<ProcessErrorEntity> getProcessError() {
-        return processError;
+    public List<ProcessErrorEntity> getProcessErrors() {
+        return processErrors;
     }
 
-    public void setProcessError(List<ProcessErrorEntity> processError) {
-        this.processError = processError;
+    public void setProcessErrors(List<ProcessErrorEntity> processError) {
+        this.processErrors = processError;
     }
 
     @OneToMany(targetEntity = ProcessInputEntity.class, cascade = 
CascadeType.ALL, mappedBy = "process")

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskEntity.java
----------------------------------------------------------------------
diff --git 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskEntity.java
 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskEntity.java
index f01fa10..8e4be82 100644
--- 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskEntity.java
+++ 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskEntity.java
@@ -37,8 +37,8 @@ public class TaskEntity {
     private String taskDetail;
     private ByteBuffer subTaskModel;
 
-    private List<TaskStatusEntity> taskStatus;
-    private List<TaskErrorEntity> taskError;
+    private List<TaskStatusEntity> taskStatuses;
+    private List<TaskErrorEntity> taskErrors;
     private List<JobEntity> jobs;
 
     private ProcessEntity process;
@@ -109,21 +109,21 @@ public class TaskEntity {
     }
 
     @OneToMany(targetEntity = TaskStatusEntity.class, cascade = 
CascadeType.ALL, mappedBy = "task")
-    public List<TaskStatusEntity> getTaskStatus() {
-        return taskStatus;
+    public List<TaskStatusEntity> getTaskStatuses() {
+        return taskStatuses;
     }
 
-    public void setTaskStatus(List<TaskStatusEntity> taskStatus) {
-        this.taskStatus = taskStatus;
+    public void setTaskStatuses(List<TaskStatusEntity> taskStatus) {
+        this.taskStatuses = taskStatus;
     }
 
     @OneToMany(targetEntity = TaskErrorEntity.class, cascade = 
CascadeType.ALL, mappedBy = "task")
-    public List<TaskErrorEntity> getTaskError() {
-        return taskError;
+    public List<TaskErrorEntity> getTaskErrors() {
+        return taskErrors;
     }
 
-    public void setTaskError(List<TaskErrorEntity> taskError) {
-        this.taskError = taskError;
+    public void setTaskErrors(List<TaskErrorEntity> taskError) {
+        this.taskErrors = taskError;
     }
 
     @OneToMany(targetEntity = JobEntity.class, cascade = CascadeType.ALL, 
mappedBy = "task")

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
----------------------------------------------------------------------
diff --git 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
index d30b1de..a79a462 100644
--- 
a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
+++ 
b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
@@ -73,10 +73,10 @@ public class ExperimentRepository extends 
AbstractRepository<ExperimentModel, Ex
                     
process.getProcessInputs().forEach(proInput->proInput.setProceseId(processId));
                 if(process.getProcessOutputs() != null)
                     
process.getProcessOutputs().forEach(proOutput->proOutput.setProcessId(processId));
-                if(process.getProcessError() != null)
-                    
process.getProcessError().forEach(processErr->processErr.setProcessId(processId));
-                if(process.getProcessStatus() != null)
-                    
process.getProcessStatus().forEach(processStat->processStat.setProcessId(processId));
+                if(process.getProcessErrors() != null)
+                    
process.getProcessErrors().forEach(processErr->processErr.setProcessId(processId));
+                if(process.getProcessStatuses() != null)
+                    
process.getProcessStatuses().forEach(processStat->processStat.setProcessId(processId));
 
                 if(process.getTasks() != null){
                     process.getTasks().forEach(task->{

http://git-wip-us.apache.org/repos/asf/airavata/blob/b46fd511/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
----------------------------------------------------------------------
diff --git 
a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
 
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
index f66b283..8465af4 100644
--- 
a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
+++ 
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
@@ -309,8 +309,8 @@ public class ExperimentRegistry {
             processStatuses.add(processStatus);
             addProcessStatus(processStatuses.get(0), process.getProcessId());
 
-            if(process.getProcessError() != null) {
-                addProcessError(process.getProcessError().get(0), 
process.getProcessId());
+            if(process.getProcessErrors() != null) {
+                addProcessError(process.getProcessErrors().get(0), 
process.getProcessId());
             }
         } catch (Exception e) {
             logger.error(expId, "Error while adding process...", e);
@@ -463,8 +463,8 @@ public class ExperimentRegistry {
             
taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
                addTaskStatus(taskStatus, task.getTaskId());
 
-            if(task.getTaskError() != null) {
-                addTaskError(task.getTaskError(), task.getTaskId());
+            if(task.getTaskErrors() != null) {
+                addTaskError(task.getTaskErrors().get(0), task.getTaskId());
             }
         } catch (Exception e) {
             logger.error(processID, "Error while adding task...", e);
@@ -763,11 +763,11 @@ public class ExperimentRegistry {
             if(process.getProcessOutputs() != null && 
process.getProcessOutputs().size() > 0) {
                 updateProcessOutputs(process.getProcessOutputs(), 
process.getProcessId());
             }
-            if(process.getProcessStatus() != null) {
-                updateProcessStatus(process.getProcessStatus().get(0), 
process.getProcessId());
+            if(process.getProcessStatuses() != null) {
+                updateProcessStatus(process.getProcessStatuses().get(0), 
process.getProcessId());
             }
-            if(process.getProcessError() != null) {
-                updateProcessError(process.getProcessError().get(0), 
process.getProcessId());
+            if(process.getProcessErrors() != null) {
+                updateProcessError(process.getProcessErrors().get(0), 
process.getProcessId());
             }
             if(process.getTasks() != null && process.getTasks().size() > 0){
                 for(TaskModel task : process.getTasks()){
@@ -883,11 +883,11 @@ public class ExperimentRegistry {
             taskResource.setSubTaskModel(task.getSubTaskModel());
             taskResource.save();
 
-            if(task.getTaskError() != null) {
-                updateTaskError(task.getTaskError(), task.getTaskId());
+            if(task.getTaskErrors() != null) {
+                updateTaskError(task.getTaskErrors().get(0), task.getTaskId());
             }
-            if(task.getTaskError() != null) {
-                updateTaskError(task.getTaskError(), task.getTaskId());
+            if(task.getTaskErrors() != null) {
+                updateTaskError(task.getTaskErrors().get(0), task.getTaskId());
             }
         } catch (Exception e) {
             logger.error(taskID, "Error while adding task...", e);
@@ -1252,7 +1252,9 @@ public class ExperimentRegistry {
                        if (latestSR != null) {
                                JobStatus jobStatus = new 
JobStatus(JobState.valueOf(latestSR.getState()));
                                jobStatus.setReason(latestSR.getReason());
-                               jobModel.setJobStatus(jobStatus);
+                        List<JobStatus> statuses = new ArrayList<>();
+                        statuses.add(jobStatus);
+                               jobModel.setJobStatuses(statuses);
                        }
                        jobs.add(jobModel);
                 }
@@ -1267,7 +1269,9 @@ public class ExperimentRegistry {
                     if (latestSR != null) {
                         JobStatus jobStatus = new 
JobStatus(JobState.valueOf(latestSR.getState()));
                         jobStatus.setReason(latestSR.getReason());
-                        jobModel.setJobStatus(jobStatus);
+                        List<JobStatus> statuses = new ArrayList<>();
+                        statuses.add(jobStatus);
+                        jobModel.setJobStatuses(statuses);
                     }
                     jobs.add(jobModel);
                 }

Reply via email to