You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@airavata.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2018/06/04 12:19:04 UTC

[jira] [Commented] (AIRAVATA-2728) Refactoring Experiment Catalog Implementation

    [ https://issues.apache.org/jira/browse/AIRAVATA-2728?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16500139#comment-16500139 ] 

ASF GitHub Bot commented on AIRAVATA-2728:
------------------------------------------

machristie closed pull request #191: [AIRAVATA-2728] Refactoring Experiment Catalog Implementation
URL: https://github.com/apache/airavata/pull/191
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ExperimentStatus.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ExperimentStatus.java
index 0cbf2e135d..3d7eb8bd31 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ExperimentStatus.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ExperimentStatus.java
@@ -44,6 +44,7 @@
   private static final org.apache.thrift.protocol.TField STATE_FIELD_DESC = new org.apache.thrift.protocol.TField("state", org.apache.thrift.protocol.TType.I32, (short)1);
   private static final org.apache.thrift.protocol.TField TIME_OF_STATE_CHANGE_FIELD_DESC = new org.apache.thrift.protocol.TField("timeOfStateChange", org.apache.thrift.protocol.TType.I64, (short)2);
   private static final org.apache.thrift.protocol.TField REASON_FIELD_DESC = new org.apache.thrift.protocol.TField("reason", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField STATUS_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("statusId", org.apache.thrift.protocol.TType.STRING, (short)4);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ExperimentStatusStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ExperimentStatusTupleSchemeFactory();
@@ -51,6 +52,7 @@
   private ExperimentState state; // required
   private long timeOfStateChange; // optional
   private java.lang.String reason; // optional
+  private java.lang.String statusId; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -60,7 +62,8 @@
      */
     STATE((short)1, "state"),
     TIME_OF_STATE_CHANGE((short)2, "timeOfStateChange"),
-    REASON((short)3, "reason");
+    REASON((short)3, "reason"),
+    STATUS_ID((short)4, "statusId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -81,6 +84,8 @@ public static _Fields findByThriftId(int fieldId) {
           return TIME_OF_STATE_CHANGE;
         case 3: // REASON
           return REASON;
+        case 4: // STATUS_ID
+          return STATUS_ID;
         default:
           return null;
       }
@@ -123,7 +128,7 @@ public short getThriftFieldId() {
   // isset id assignments
   private static final int __TIMEOFSTATECHANGE_ISSET_ID = 0;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON};
+  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON,_Fields.STATUS_ID};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -133,6 +138,8 @@ public short getThriftFieldId() {
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.REASON, new org.apache.thrift.meta_data.FieldMetaData("reason", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STATUS_ID, new org.apache.thrift.meta_data.FieldMetaData("statusId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ExperimentStatus.class, metaDataMap);
   }
@@ -159,6 +166,9 @@ public ExperimentStatus(ExperimentStatus other) {
     if (other.isSetReason()) {
       this.reason = other.reason;
     }
+    if (other.isSetStatusId()) {
+      this.statusId = other.statusId;
+    }
   }
 
   public ExperimentStatus deepCopy() {
@@ -171,6 +181,7 @@ public void clear() {
     setTimeOfStateChangeIsSet(false);
     this.timeOfStateChange = 0;
     this.reason = null;
+    this.statusId = null;
   }
 
   /**
@@ -249,6 +260,29 @@ public void setReasonIsSet(boolean value) {
     }
   }
 
+  public java.lang.String getStatusId() {
+    return this.statusId;
+  }
+
+  public void setStatusId(java.lang.String statusId) {
+    this.statusId = statusId;
+  }
+
+  public void unsetStatusId() {
+    this.statusId = null;
+  }
+
+  /** Returns true if field statusId is set (has been assigned a value) and false otherwise */
+  public boolean isSetStatusId() {
+    return this.statusId != null;
+  }
+
+  public void setStatusIdIsSet(boolean value) {
+    if (!value) {
+      this.statusId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case STATE:
@@ -275,6 +309,14 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
       }
       break;
 
+    case STATUS_ID:
+      if (value == null) {
+        unsetStatusId();
+      } else {
+        setStatusId((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -289,6 +331,9 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
     case REASON:
       return getReason();
 
+    case STATUS_ID:
+      return getStatusId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -306,6 +351,8 @@ public boolean isSet(_Fields field) {
       return isSetTimeOfStateChange();
     case REASON:
       return isSetReason();
+    case STATUS_ID:
+      return isSetStatusId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -352,6 +399,15 @@ public boolean equals(ExperimentStatus that) {
         return false;
     }
 
+    boolean this_present_statusId = true && this.isSetStatusId();
+    boolean that_present_statusId = true && that.isSetStatusId();
+    if (this_present_statusId || that_present_statusId) {
+      if (!(this_present_statusId && that_present_statusId))
+        return false;
+      if (!this.statusId.equals(that.statusId))
+        return false;
+    }
+
     return true;
   }
 
@@ -371,6 +427,10 @@ public int hashCode() {
     if (isSetReason())
       hashCode = hashCode * 8191 + reason.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetStatusId()) ? 131071 : 524287);
+    if (isSetStatusId())
+      hashCode = hashCode * 8191 + statusId.hashCode();
+
     return hashCode;
   }
 
@@ -412,6 +472,16 @@ public int compareTo(ExperimentStatus other) {
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetStatusId()).compareTo(other.isSetStatusId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStatusId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.statusId, other.statusId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -455,6 +525,16 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.
       }
       first = false;
     }
+    if (isSetStatusId()) {
+      if (!first) sb.append(", ");
+      sb.append("statusId:");
+      if (this.statusId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.statusId);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -528,6 +608,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, ExperimentStatus st
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // STATUS_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.statusId = iprot.readString();
+              struct.setStatusIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -558,6 +646,13 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, ExperimentStatus s
           oprot.writeFieldEnd();
         }
       }
+      if (struct.statusId != null) {
+        if (struct.isSetStatusId()) {
+          oprot.writeFieldBegin(STATUS_ID_FIELD_DESC);
+          oprot.writeString(struct.statusId);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -583,13 +678,19 @@ public void write(org.apache.thrift.protocol.TProtocol prot, ExperimentStatus st
       if (struct.isSetReason()) {
         optionals.set(1);
       }
-      oprot.writeBitSet(optionals, 2);
+      if (struct.isSetStatusId()) {
+        optionals.set(2);
+      }
+      oprot.writeBitSet(optionals, 3);
       if (struct.isSetTimeOfStateChange()) {
         oprot.writeI64(struct.timeOfStateChange);
       }
       if (struct.isSetReason()) {
         oprot.writeString(struct.reason);
       }
+      if (struct.isSetStatusId()) {
+        oprot.writeString(struct.statusId);
+      }
     }
 
     @Override
@@ -597,7 +698,7 @@ public void read(org.apache.thrift.protocol.TProtocol prot, ExperimentStatus str
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       struct.state = org.apache.airavata.model.status.ExperimentState.findByValue(iprot.readI32());
       struct.setStateIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(2);
+      java.util.BitSet incoming = iprot.readBitSet(3);
       if (incoming.get(0)) {
         struct.timeOfStateChange = iprot.readI64();
         struct.setTimeOfStateChangeIsSet(true);
@@ -606,6 +707,10 @@ public void read(org.apache.thrift.protocol.TProtocol prot, ExperimentStatus str
         struct.reason = iprot.readString();
         struct.setReasonIsSet(true);
       }
+      if (incoming.get(2)) {
+        struct.statusId = iprot.readString();
+        struct.setStatusIdIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/JobStatus.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/JobStatus.java
index 13d5510da5..6f9737d832 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/JobStatus.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/JobStatus.java
@@ -31,6 +31,7 @@
   private static final org.apache.thrift.protocol.TField JOB_STATE_FIELD_DESC = new org.apache.thrift.protocol.TField("jobState", org.apache.thrift.protocol.TType.I32, (short)1);
   private static final org.apache.thrift.protocol.TField TIME_OF_STATE_CHANGE_FIELD_DESC = new org.apache.thrift.protocol.TField("timeOfStateChange", org.apache.thrift.protocol.TType.I64, (short)2);
   private static final org.apache.thrift.protocol.TField REASON_FIELD_DESC = new org.apache.thrift.protocol.TField("reason", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField STATUS_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("statusId", org.apache.thrift.protocol.TType.STRING, (short)4);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new JobStatusStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new JobStatusTupleSchemeFactory();
@@ -38,6 +39,7 @@
   private JobState jobState; // required
   private long timeOfStateChange; // optional
   private java.lang.String reason; // optional
+  private java.lang.String statusId; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -47,7 +49,8 @@
      */
     JOB_STATE((short)1, "jobState"),
     TIME_OF_STATE_CHANGE((short)2, "timeOfStateChange"),
-    REASON((short)3, "reason");
+    REASON((short)3, "reason"),
+    STATUS_ID((short)4, "statusId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -68,6 +71,8 @@ public static _Fields findByThriftId(int fieldId) {
           return TIME_OF_STATE_CHANGE;
         case 3: // REASON
           return REASON;
+        case 4: // STATUS_ID
+          return STATUS_ID;
         default:
           return null;
       }
@@ -110,7 +115,7 @@ public short getThriftFieldId() {
   // isset id assignments
   private static final int __TIMEOFSTATECHANGE_ISSET_ID = 0;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON};
+  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON,_Fields.STATUS_ID};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -120,6 +125,8 @@ public short getThriftFieldId() {
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.REASON, new org.apache.thrift.meta_data.FieldMetaData("reason", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STATUS_ID, new org.apache.thrift.meta_data.FieldMetaData("statusId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(JobStatus.class, metaDataMap);
   }
@@ -146,6 +153,9 @@ public JobStatus(JobStatus other) {
     if (other.isSetReason()) {
       this.reason = other.reason;
     }
+    if (other.isSetStatusId()) {
+      this.statusId = other.statusId;
+    }
   }
 
   public JobStatus deepCopy() {
@@ -158,6 +168,7 @@ public void clear() {
     setTimeOfStateChangeIsSet(false);
     this.timeOfStateChange = 0;
     this.reason = null;
+    this.statusId = null;
   }
 
   /**
@@ -236,6 +247,29 @@ public void setReasonIsSet(boolean value) {
     }
   }
 
+  public java.lang.String getStatusId() {
+    return this.statusId;
+  }
+
+  public void setStatusId(java.lang.String statusId) {
+    this.statusId = statusId;
+  }
+
+  public void unsetStatusId() {
+    this.statusId = null;
+  }
+
+  /** Returns true if field statusId is set (has been assigned a value) and false otherwise */
+  public boolean isSetStatusId() {
+    return this.statusId != null;
+  }
+
+  public void setStatusIdIsSet(boolean value) {
+    if (!value) {
+      this.statusId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case JOB_STATE:
@@ -262,6 +296,14 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
       }
       break;
 
+    case STATUS_ID:
+      if (value == null) {
+        unsetStatusId();
+      } else {
+        setStatusId((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -276,6 +318,9 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
     case REASON:
       return getReason();
 
+    case STATUS_ID:
+      return getStatusId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -293,6 +338,8 @@ public boolean isSet(_Fields field) {
       return isSetTimeOfStateChange();
     case REASON:
       return isSetReason();
+    case STATUS_ID:
+      return isSetStatusId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -339,6 +386,15 @@ public boolean equals(JobStatus that) {
         return false;
     }
 
+    boolean this_present_statusId = true && this.isSetStatusId();
+    boolean that_present_statusId = true && that.isSetStatusId();
+    if (this_present_statusId || that_present_statusId) {
+      if (!(this_present_statusId && that_present_statusId))
+        return false;
+      if (!this.statusId.equals(that.statusId))
+        return false;
+    }
+
     return true;
   }
 
@@ -358,6 +414,10 @@ public int hashCode() {
     if (isSetReason())
       hashCode = hashCode * 8191 + reason.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetStatusId()) ? 131071 : 524287);
+    if (isSetStatusId())
+      hashCode = hashCode * 8191 + statusId.hashCode();
+
     return hashCode;
   }
 
@@ -399,6 +459,16 @@ public int compareTo(JobStatus other) {
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetStatusId()).compareTo(other.isSetStatusId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStatusId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.statusId, other.statusId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -442,6 +512,16 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.
       }
       first = false;
     }
+    if (isSetStatusId()) {
+      if (!first) sb.append(", ");
+      sb.append("statusId:");
+      if (this.statusId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.statusId);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -515,6 +595,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, JobStatus struct) t
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // STATUS_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.statusId = iprot.readString();
+              struct.setStatusIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -545,6 +633,13 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, JobStatus struct)
           oprot.writeFieldEnd();
         }
       }
+      if (struct.statusId != null) {
+        if (struct.isSetStatusId()) {
+          oprot.writeFieldBegin(STATUS_ID_FIELD_DESC);
+          oprot.writeString(struct.statusId);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -570,13 +665,19 @@ public void write(org.apache.thrift.protocol.TProtocol prot, JobStatus struct) t
       if (struct.isSetReason()) {
         optionals.set(1);
       }
-      oprot.writeBitSet(optionals, 2);
+      if (struct.isSetStatusId()) {
+        optionals.set(2);
+      }
+      oprot.writeBitSet(optionals, 3);
       if (struct.isSetTimeOfStateChange()) {
         oprot.writeI64(struct.timeOfStateChange);
       }
       if (struct.isSetReason()) {
         oprot.writeString(struct.reason);
       }
+      if (struct.isSetStatusId()) {
+        oprot.writeString(struct.statusId);
+      }
     }
 
     @Override
@@ -584,7 +685,7 @@ public void read(org.apache.thrift.protocol.TProtocol prot, JobStatus struct) th
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       struct.jobState = org.apache.airavata.model.status.JobState.findByValue(iprot.readI32());
       struct.setJobStateIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(2);
+      java.util.BitSet incoming = iprot.readBitSet(3);
       if (incoming.get(0)) {
         struct.timeOfStateChange = iprot.readI64();
         struct.setTimeOfStateChangeIsSet(true);
@@ -593,6 +694,10 @@ public void read(org.apache.thrift.protocol.TProtocol prot, JobStatus struct) th
         struct.reason = iprot.readString();
         struct.setReasonIsSet(true);
       }
+      if (incoming.get(2)) {
+        struct.statusId = iprot.readString();
+        struct.setStatusIdIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ProcessStatus.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ProcessStatus.java
index 9f4357c32f..dc426055f4 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ProcessStatus.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/ProcessStatus.java
@@ -31,6 +31,7 @@
   private static final org.apache.thrift.protocol.TField STATE_FIELD_DESC = new org.apache.thrift.protocol.TField("state", org.apache.thrift.protocol.TType.I32, (short)1);
   private static final org.apache.thrift.protocol.TField TIME_OF_STATE_CHANGE_FIELD_DESC = new org.apache.thrift.protocol.TField("timeOfStateChange", org.apache.thrift.protocol.TType.I64, (short)2);
   private static final org.apache.thrift.protocol.TField REASON_FIELD_DESC = new org.apache.thrift.protocol.TField("reason", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField STATUS_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("statusId", org.apache.thrift.protocol.TType.STRING, (short)4);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ProcessStatusStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ProcessStatusTupleSchemeFactory();
@@ -38,6 +39,7 @@
   private ProcessState state; // required
   private long timeOfStateChange; // optional
   private java.lang.String reason; // optional
+  private java.lang.String statusId; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -47,7 +49,8 @@
      */
     STATE((short)1, "state"),
     TIME_OF_STATE_CHANGE((short)2, "timeOfStateChange"),
-    REASON((short)3, "reason");
+    REASON((short)3, "reason"),
+    STATUS_ID((short)4, "statusId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -68,6 +71,8 @@ public static _Fields findByThriftId(int fieldId) {
           return TIME_OF_STATE_CHANGE;
         case 3: // REASON
           return REASON;
+        case 4: // STATUS_ID
+          return STATUS_ID;
         default:
           return null;
       }
@@ -110,7 +115,7 @@ public short getThriftFieldId() {
   // isset id assignments
   private static final int __TIMEOFSTATECHANGE_ISSET_ID = 0;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON};
+  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON,_Fields.STATUS_ID};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -120,6 +125,8 @@ public short getThriftFieldId() {
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.REASON, new org.apache.thrift.meta_data.FieldMetaData("reason", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STATUS_ID, new org.apache.thrift.meta_data.FieldMetaData("statusId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ProcessStatus.class, metaDataMap);
   }
@@ -146,6 +153,9 @@ public ProcessStatus(ProcessStatus other) {
     if (other.isSetReason()) {
       this.reason = other.reason;
     }
+    if (other.isSetStatusId()) {
+      this.statusId = other.statusId;
+    }
   }
 
   public ProcessStatus deepCopy() {
@@ -158,6 +168,7 @@ public void clear() {
     setTimeOfStateChangeIsSet(false);
     this.timeOfStateChange = 0;
     this.reason = null;
+    this.statusId = null;
   }
 
   /**
@@ -236,6 +247,29 @@ public void setReasonIsSet(boolean value) {
     }
   }
 
+  public java.lang.String getStatusId() {
+    return this.statusId;
+  }
+
+  public void setStatusId(java.lang.String statusId) {
+    this.statusId = statusId;
+  }
+
+  public void unsetStatusId() {
+    this.statusId = null;
+  }
+
+  /** Returns true if field statusId is set (has been assigned a value) and false otherwise */
+  public boolean isSetStatusId() {
+    return this.statusId != null;
+  }
+
+  public void setStatusIdIsSet(boolean value) {
+    if (!value) {
+      this.statusId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case STATE:
@@ -262,6 +296,14 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
       }
       break;
 
+    case STATUS_ID:
+      if (value == null) {
+        unsetStatusId();
+      } else {
+        setStatusId((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -276,6 +318,9 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
     case REASON:
       return getReason();
 
+    case STATUS_ID:
+      return getStatusId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -293,6 +338,8 @@ public boolean isSet(_Fields field) {
       return isSetTimeOfStateChange();
     case REASON:
       return isSetReason();
+    case STATUS_ID:
+      return isSetStatusId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -339,6 +386,15 @@ public boolean equals(ProcessStatus that) {
         return false;
     }
 
+    boolean this_present_statusId = true && this.isSetStatusId();
+    boolean that_present_statusId = true && that.isSetStatusId();
+    if (this_present_statusId || that_present_statusId) {
+      if (!(this_present_statusId && that_present_statusId))
+        return false;
+      if (!this.statusId.equals(that.statusId))
+        return false;
+    }
+
     return true;
   }
 
@@ -358,6 +414,10 @@ public int hashCode() {
     if (isSetReason())
       hashCode = hashCode * 8191 + reason.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetStatusId()) ? 131071 : 524287);
+    if (isSetStatusId())
+      hashCode = hashCode * 8191 + statusId.hashCode();
+
     return hashCode;
   }
 
@@ -399,6 +459,16 @@ public int compareTo(ProcessStatus other) {
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetStatusId()).compareTo(other.isSetStatusId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStatusId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.statusId, other.statusId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -442,6 +512,16 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.
       }
       first = false;
     }
+    if (isSetStatusId()) {
+      if (!first) sb.append(", ");
+      sb.append("statusId:");
+      if (this.statusId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.statusId);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -515,6 +595,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, ProcessStatus struc
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // STATUS_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.statusId = iprot.readString();
+              struct.setStatusIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -545,6 +633,13 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, ProcessStatus stru
           oprot.writeFieldEnd();
         }
       }
+      if (struct.statusId != null) {
+        if (struct.isSetStatusId()) {
+          oprot.writeFieldBegin(STATUS_ID_FIELD_DESC);
+          oprot.writeString(struct.statusId);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -570,13 +665,19 @@ public void write(org.apache.thrift.protocol.TProtocol prot, ProcessStatus struc
       if (struct.isSetReason()) {
         optionals.set(1);
       }
-      oprot.writeBitSet(optionals, 2);
+      if (struct.isSetStatusId()) {
+        optionals.set(2);
+      }
+      oprot.writeBitSet(optionals, 3);
       if (struct.isSetTimeOfStateChange()) {
         oprot.writeI64(struct.timeOfStateChange);
       }
       if (struct.isSetReason()) {
         oprot.writeString(struct.reason);
       }
+      if (struct.isSetStatusId()) {
+        oprot.writeString(struct.statusId);
+      }
     }
 
     @Override
@@ -584,7 +685,7 @@ public void read(org.apache.thrift.protocol.TProtocol prot, ProcessStatus struct
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       struct.state = org.apache.airavata.model.status.ProcessState.findByValue(iprot.readI32());
       struct.setStateIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(2);
+      java.util.BitSet incoming = iprot.readBitSet(3);
       if (incoming.get(0)) {
         struct.timeOfStateChange = iprot.readI64();
         struct.setTimeOfStateChangeIsSet(true);
@@ -593,6 +694,10 @@ public void read(org.apache.thrift.protocol.TProtocol prot, ProcessStatus struct
         struct.reason = iprot.readString();
         struct.setReasonIsSet(true);
       }
+      if (incoming.get(2)) {
+        struct.statusId = iprot.readString();
+        struct.setStatusIdIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/TaskStatus.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/TaskStatus.java
index 0c800df2b0..351205ce8f 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/TaskStatus.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/status/TaskStatus.java
@@ -31,6 +31,7 @@
   private static final org.apache.thrift.protocol.TField STATE_FIELD_DESC = new org.apache.thrift.protocol.TField("state", org.apache.thrift.protocol.TType.I32, (short)1);
   private static final org.apache.thrift.protocol.TField TIME_OF_STATE_CHANGE_FIELD_DESC = new org.apache.thrift.protocol.TField("timeOfStateChange", org.apache.thrift.protocol.TType.I64, (short)2);
   private static final org.apache.thrift.protocol.TField REASON_FIELD_DESC = new org.apache.thrift.protocol.TField("reason", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField STATUS_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("statusId", org.apache.thrift.protocol.TType.STRING, (short)4);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new TaskStatusStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new TaskStatusTupleSchemeFactory();
@@ -38,6 +39,7 @@
   private TaskState state; // required
   private long timeOfStateChange; // optional
   private java.lang.String reason; // optional
+  private java.lang.String statusId; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -47,7 +49,8 @@
      */
     STATE((short)1, "state"),
     TIME_OF_STATE_CHANGE((short)2, "timeOfStateChange"),
-    REASON((short)3, "reason");
+    REASON((short)3, "reason"),
+    STATUS_ID((short)4, "statusId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -68,6 +71,8 @@ public static _Fields findByThriftId(int fieldId) {
           return TIME_OF_STATE_CHANGE;
         case 3: // REASON
           return REASON;
+        case 4: // STATUS_ID
+          return STATUS_ID;
         default:
           return null;
       }
@@ -110,7 +115,7 @@ public short getThriftFieldId() {
   // isset id assignments
   private static final int __TIMEOFSTATECHANGE_ISSET_ID = 0;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON};
+  private static final _Fields optionals[] = {_Fields.TIME_OF_STATE_CHANGE,_Fields.REASON,_Fields.STATUS_ID};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -120,6 +125,8 @@ public short getThriftFieldId() {
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.REASON, new org.apache.thrift.meta_data.FieldMetaData("reason", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STATUS_ID, new org.apache.thrift.meta_data.FieldMetaData("statusId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TaskStatus.class, metaDataMap);
   }
@@ -146,6 +153,9 @@ public TaskStatus(TaskStatus other) {
     if (other.isSetReason()) {
       this.reason = other.reason;
     }
+    if (other.isSetStatusId()) {
+      this.statusId = other.statusId;
+    }
   }
 
   public TaskStatus deepCopy() {
@@ -158,6 +168,7 @@ public void clear() {
     setTimeOfStateChangeIsSet(false);
     this.timeOfStateChange = 0;
     this.reason = null;
+    this.statusId = null;
   }
 
   /**
@@ -236,6 +247,29 @@ public void setReasonIsSet(boolean value) {
     }
   }
 
+  public java.lang.String getStatusId() {
+    return this.statusId;
+  }
+
+  public void setStatusId(java.lang.String statusId) {
+    this.statusId = statusId;
+  }
+
+  public void unsetStatusId() {
+    this.statusId = null;
+  }
+
+  /** Returns true if field statusId is set (has been assigned a value) and false otherwise */
+  public boolean isSetStatusId() {
+    return this.statusId != null;
+  }
+
+  public void setStatusIdIsSet(boolean value) {
+    if (!value) {
+      this.statusId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case STATE:
@@ -262,6 +296,14 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
       }
       break;
 
+    case STATUS_ID:
+      if (value == null) {
+        unsetStatusId();
+      } else {
+        setStatusId((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -276,6 +318,9 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
     case REASON:
       return getReason();
 
+    case STATUS_ID:
+      return getStatusId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -293,6 +338,8 @@ public boolean isSet(_Fields field) {
       return isSetTimeOfStateChange();
     case REASON:
       return isSetReason();
+    case STATUS_ID:
+      return isSetStatusId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -339,6 +386,15 @@ public boolean equals(TaskStatus that) {
         return false;
     }
 
+    boolean this_present_statusId = true && this.isSetStatusId();
+    boolean that_present_statusId = true && that.isSetStatusId();
+    if (this_present_statusId || that_present_statusId) {
+      if (!(this_present_statusId && that_present_statusId))
+        return false;
+      if (!this.statusId.equals(that.statusId))
+        return false;
+    }
+
     return true;
   }
 
@@ -358,6 +414,10 @@ public int hashCode() {
     if (isSetReason())
       hashCode = hashCode * 8191 + reason.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetStatusId()) ? 131071 : 524287);
+    if (isSetStatusId())
+      hashCode = hashCode * 8191 + statusId.hashCode();
+
     return hashCode;
   }
 
@@ -399,6 +459,16 @@ public int compareTo(TaskStatus other) {
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetStatusId()).compareTo(other.isSetStatusId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStatusId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.statusId, other.statusId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -442,6 +512,16 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.
       }
       first = false;
     }
+    if (isSetStatusId()) {
+      if (!first) sb.append(", ");
+      sb.append("statusId:");
+      if (this.statusId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.statusId);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -515,6 +595,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TaskStatus struct)
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // STATUS_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.statusId = iprot.readString();
+              struct.setStatusIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -545,6 +633,13 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, TaskStatus struct)
           oprot.writeFieldEnd();
         }
       }
+      if (struct.statusId != null) {
+        if (struct.isSetStatusId()) {
+          oprot.writeFieldBegin(STATUS_ID_FIELD_DESC);
+          oprot.writeString(struct.statusId);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -570,13 +665,19 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TaskStatus struct)
       if (struct.isSetReason()) {
         optionals.set(1);
       }
-      oprot.writeBitSet(optionals, 2);
+      if (struct.isSetStatusId()) {
+        optionals.set(2);
+      }
+      oprot.writeBitSet(optionals, 3);
       if (struct.isSetTimeOfStateChange()) {
         oprot.writeI64(struct.timeOfStateChange);
       }
       if (struct.isSetReason()) {
         oprot.writeString(struct.reason);
       }
+      if (struct.isSetStatusId()) {
+        oprot.writeString(struct.statusId);
+      }
     }
 
     @Override
@@ -584,7 +685,7 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TaskStatus struct) t
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       struct.state = org.apache.airavata.model.status.TaskState.findByValue(iprot.readI32());
       struct.setStateIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(2);
+      java.util.BitSet incoming = iprot.readBitSet(3);
       if (incoming.get(0)) {
         struct.timeOfStateChange = iprot.readI64();
         struct.setTimeOfStateChangeIsSet(true);
@@ -593,6 +694,10 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TaskStatus struct) t
         struct.reason = iprot.readString();
         struct.setReasonIsSet(true);
       }
+      if (incoming.get(2)) {
+        struct.statusId = iprot.readString();
+        struct.setStatusIdIsSet(true);
+      }
     }
   }
 
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java
index e7ea3f61ba..194f63b0be 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java
@@ -21,36 +21,83 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 import java.util.List;
 
+/**
+ * The persistent class for the experiment database table.
+ */
 @Entity
-@Table(name = "EXPCAT_EXPERIMENT")
-public class ExperimentEntity {
+@Table(name = "EXPERIMENT")
+public class ExperimentEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "EXPERIMENT_ID")
     public String experimentId;
+
+    @Column(name = "PROJECT_ID")
     public String projectId;
+
+    @Column(name = "GATEWAY_ID")
     public String gatewayId;
+
+    @Column(name = "EXPERIMENT_TYPE")
     public String experimentType;
+
+    @Column(name = "USER_NAME")
     public String userName;
+
+    @Column(name = "EXPERIMENT_NAME")
     public String experimentName;
-    public long creationTime;
+
+    @Column(name = "CREATION_TIME")
+    public Timestamp creationTime;
+
+    @Column(name = "DESCRIPTION")
     public String description;
+
+    @Column(name = "EXECUTION_ID")
     public String executionId;
+
+    @Column(name = "GATEWAY_EXECUTION_ID")
     public String gatewayExecutionId;
-    public String gatewayInstanceId;
+
+    @Column(name = "ENABLE_EMAIL_NOTIFICATION")
     public boolean enableEmailNotification;
+
+    @Lob
+    @Column(name = "EMAIL_ADDRESSES")
     public List<String> emailAddresses;
 
+    @OneToOne(targetEntity = UserConfigurationDataEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "experiment", fetch = FetchType.EAGER)
+    private UserConfigurationDataEntity userConfigurationData;
+
+    @OneToMany(targetEntity = ExperimentInputEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "experiment", fetch = FetchType.EAGER)
     private List<ExperimentInputEntity> experimentInputs;
+
+    @OneToMany(targetEntity = ExperimentOutputEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "experiment", fetch = FetchType.EAGER)
     private List<ExperimentOutputEntity> experimentOutputs;
-    private List<ExperimentErrorEntity> experimentErrors;
-    private List<ExperimentStatusEntity> experimentStatuses;
 
-    private UserConfigurationEntity userConfigurationData;
+    @OneToMany(targetEntity = ExperimentStatusEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "experiment", fetch = FetchType.EAGER)
+    private List<ExperimentStatusEntity> experimentStatus;
 
+    @OneToMany(targetEntity = ExperimentErrorEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "experiment", fetch = FetchType.EAGER)
+    private List<ExperimentErrorEntity> errors;
+
+    @OneToMany(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "experiment", fetch = FetchType.EAGER)
     private List<ProcessEntity> processes;
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
+    public ExperimentEntity() {
+    }
+
     public String getExperimentId() {
         return experimentId;
     }
@@ -59,7 +106,6 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Column(name = "PROJECT_ID")
     public String getProjectId() {
         return projectId;
     }
@@ -68,7 +114,6 @@ public void setProjectId(String projectId) {
         this.projectId = projectId;
     }
 
-    @Column(name = "GATEWAY_ID")
     public String getGatewayId() {
         return gatewayId;
     }
@@ -77,7 +122,6 @@ public void setGatewayId(String gatewayId) {
         this.gatewayId = gatewayId;
     }
 
-    @Column(name = "EXPERIMENT_TYPE")
     public String getExperimentType() {
         return experimentType;
     }
@@ -86,7 +130,6 @@ public void setExperimentType(String experimentType) {
         this.experimentType = experimentType;
     }
 
-    @Column(name = "USER_NAME")
     public String getUserName() {
         return userName;
     }
@@ -95,7 +138,6 @@ public void setUserName(String userName) {
         this.userName = userName;
     }
 
-    @Column(name = "EXPERIMENT_NAME")
     public String getExperimentName() {
         return experimentName;
     }
@@ -104,16 +146,14 @@ public void setExperimentName(String experimentName) {
         this.experimentName = experimentName;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "DESCRIPTION")
     public String getDescription() {
         return description;
     }
@@ -122,7 +162,6 @@ public void setDescription(String description) {
         this.description = description;
     }
 
-    @Column(name = "EXECUTION_ID")
     public String getExecutionId() {
         return executionId;
     }
@@ -131,7 +170,6 @@ public void setExecutionId(String executionId) {
         this.executionId = executionId;
     }
 
-    @Column(name = "GATEWAY_EXECUTION_ID")
     public String getGatewayExecutionId() {
         return gatewayExecutionId;
     }
@@ -140,16 +178,6 @@ public void setGatewayExecutionId(String gatewayExecutionId) {
         this.gatewayExecutionId = gatewayExecutionId;
     }
 
-    @Column(name = "GATEWAY_INSTANCE_ID")
-    public String getGatewayInstanceId() {
-        return gatewayInstanceId;
-    }
-
-    public void setGatewayInstanceId(String gatewayInstanceId) {
-        this.gatewayInstanceId = gatewayInstanceId;
-    }
-
-    @Column(name = "ENABLE_EMAIL_NOTIFICATION")
     public boolean isEnableEmailNotification() {
         return enableEmailNotification;
     }
@@ -158,8 +186,6 @@ public void setEnableEmailNotification(boolean enableEmailNotification) {
         this.enableEmailNotification = enableEmailNotification;
     }
 
-    @ElementCollection
-    @CollectionTable(name="EXPCAT_EXPERIMENT_EMAIL", joinColumns = @JoinColumn(name="EXPERIMENT_ID"))
     public List<String> getEmailAddresses() {
         return emailAddresses;
     }
@@ -168,16 +194,14 @@ public void setEmailAddresses(List<String> emailAddresses) {
         this.emailAddresses = emailAddresses;
     }
 
-    @OneToOne(targetEntity = UserConfigurationEntity.class, cascade = CascadeType.ALL, mappedBy = "experiment")
-    public UserConfigurationEntity getUserConfigurationData() {
+    public UserConfigurationDataEntity getUserConfigurationData() {
         return userConfigurationData;
     }
 
-    public void setUserConfigurationData(UserConfigurationEntity userConfiguration) {
+    public void setUserConfigurationData(UserConfigurationDataEntity userConfiguration) {
         this.userConfigurationData = userConfiguration;
     }
 
-    @OneToMany(targetEntity = ExperimentInputEntity.class, cascade = CascadeType.ALL, mappedBy = "experiment")
     public List<ExperimentInputEntity> getExperimentInputs() {
         return experimentInputs;
     }
@@ -186,7 +210,6 @@ public void setExperimentInputs(List<ExperimentInputEntity> experimentInputs) {
         this.experimentInputs = experimentInputs;
     }
 
-    @OneToMany(targetEntity = ExperimentOutputEntity.class, cascade = CascadeType.ALL, mappedBy = "experiment")
     public List<ExperimentOutputEntity> getExperimentOutputs() {
         return experimentOutputs;
     }
@@ -195,25 +218,22 @@ public void setExperimentOutputs(List<ExperimentOutputEntity> experimentOutputs)
         this.experimentOutputs = experimentOutputs;
     }
 
-    @OneToMany(targetEntity = ExperimentErrorEntity.class, cascade = CascadeType.ALL, mappedBy = "experiment")
-    public List<ExperimentErrorEntity> getExperimentErrors() {
-        return experimentErrors;
+    public List<ExperimentErrorEntity> getErrors() {
+        return errors;
     }
 
-    public void setExperimentErrors(List<ExperimentErrorEntity> experimentErrors) {
-        this.experimentErrors = experimentErrors;
+    public void setErrors(List<ExperimentErrorEntity> errors) {
+        this.errors = errors;
     }
 
-    @OneToMany(targetEntity = ExperimentStatusEntity.class, cascade = CascadeType.ALL, mappedBy = "experiment")
-    public List<ExperimentStatusEntity> getExperimentStatuses() {
-        return experimentStatuses;
+    public List<ExperimentStatusEntity> getExperimentStatus() {
+        return experimentStatus;
     }
 
-    public void setExperimentStatuses(List<ExperimentStatusEntity> experimentStatuses) {
-        this.experimentStatuses = experimentStatuses;
+    public void setExperimentStatus(List<ExperimentStatusEntity> experimentStatus) {
+        this.experimentStatus = experimentStatus;
     }
 
-    @OneToMany(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, mappedBy = "experiment")
     public List<ProcessEntity> getProcesses() {
         return processes;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorEntity.java
index 37df525a9b..f2167c0db3 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorEntity.java
@@ -21,24 +21,52 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 import java.util.List;
 
+/**
+ * The persistent class for the experiment_error database table.
+ */
 @Entity
-@Table(name = "EXPCAT_EXPERIMENT_ERROR")
+@Table(name = "EXPERIMENT_ERROR")
 @IdClass(ExperimentErrorPK.class)
-public class ExperimentErrorEntity {
+public class ExperimentErrorEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "ERROR_ID")
     private String errorId;
+
+    @Id
+    @Column(name = "EXPERIMENT_ID")
     private String experimentId;
-    private long creationTime;
+
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    @Lob
+    @Column(name = "ACTUAL_ERROR_MESSAGE")
     private String actualErrorMessage;
+
+    @Lob
+    @Column(name = "USER_FRIENDLY_MESSAGE")
     private String userFriendlyMessage;
+
+    @Column(name = "TRANSIENT_OR_PERSISTENT")
     private boolean transientOrPersistent;
-    private List<String> rootCauseErrorIdList;
 
+    @Lob
+    @Column(name = "ROOT_CAUSE_ERROR_ID_LIST")
+    private String rootCauseErrorIdList;
+
+    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     private ExperimentEntity experiment;
 
-    @Id
-    @Column(name = "ERROR_ID")
+    public ExperimentErrorEntity() {
+    }
+
     public String getErrorId() {
         return errorId;
     }
@@ -47,8 +75,6 @@ public void setErrorId(String errorId) {
         this.errorId = errorId;
     }
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
     public String getExperimentId() {
         return experimentId;
     }
@@ -57,16 +83,14 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "ACTUAL_ERROR_MESSAGE")
     public String getActualErrorMessage() {
         return actualErrorMessage;
     }
@@ -75,7 +99,6 @@ public void setActualErrorMessage(String actualErrorMessage) {
         this.actualErrorMessage = actualErrorMessage;
     }
 
-    @Column(name = "USER_FRIENDLY_MESSAGE")
     public String getUserFriendlyMessage() {
         return userFriendlyMessage;
     }
@@ -85,7 +108,6 @@ public void setUserFriendlyMessage(String userFriendlyMessage) {
     }
 
 
-    @Column(name = "TRANSIENT_OR_PERSISTENT")
     public boolean isTransientOrPersistent() {
         return transientOrPersistent;
     }
@@ -94,20 +116,14 @@ public void setTransientOrPersistent(boolean transientOrPersistent) {
         this.transientOrPersistent = transientOrPersistent;
     }
 
-
-    @ElementCollection
-    @CollectionTable(name="EXPERIMENT_ERROR_ROOT_CAUSE_ERROR_ID", joinColumns = @JoinColumn(name="ERROR_ID"))
-    public List<String> getRootCauseErrorIdList() {
+    public String getRootCauseErrorIdList() {
         return rootCauseErrorIdList;
     }
 
-    public void setRootCauseErrorIdList(List<String> rootCauseErrorIdList) {
+    public void setRootCauseErrorIdList(String rootCauseErrorIdList) {
         this.rootCauseErrorIdList = rootCauseErrorIdList;
     }
 
-
-    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     public ExperimentEntity getExperiment() {
         return experiment;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorPK.java
index add5616391..da3274586a 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentErrorPK.java
@@ -20,20 +20,21 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the experiment_error database table.
+ */
 public class ExperimentErrorPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(ExperimentErrorPK.class);
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
     private String errorId;
     private String experimentId;
 
-    @Column(name = "ERROR_ID")
-    @Id
+    public ExperimentErrorPK() {
+    }
+
     public String getErrorId() {
         return errorId;
     }
@@ -42,8 +43,6 @@ public void setErrorId(String errorId) {
         this.errorId = errorId;
     }
 
-    @Column(name = "EXPERIMENT_ID")
-    @Id
     public String getExperimentId() {
         return experimentId;
     }
@@ -52,24 +51,25 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ExperimentErrorPK that = (ExperimentErrorPK) o;
-
-        if (getErrorId() != null ? !getErrorId().equals(that.getErrorId()) : that.getErrorId() != null) return false;
-        if (getExperimentId() != null ? !getExperimentId().equals(that.getExperimentId()) : that.getExperimentId() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ExperimentErrorPK)) {
+            return false;
+        }
+        ExperimentErrorPK castOther = (ExperimentErrorPK) other;
+        return
+                this.errorId.equals(castOther.errorId)
+                        && this.experimentId.equals(castOther.experimentId);
     }
 
-    @Override
     public int hashCode() {
-        int result = getErrorId() != null ? getErrorId().hashCode() : 0;
-        result = 31 * result + (getExperimentId() != null ? getExperimentId().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.errorId.hashCode();
+        hash = hash * prime + this.experimentId.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java
index 8869427aaa..f32bf6c27d 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java
@@ -21,29 +21,69 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
+/**
+ * The persistent class for the experiment_input database table.
+ */
 @Entity
-@Table(name = "EXPCAT_EXPERIMENT_INPUT")
+@Table(name = "EXPERIMENT_INPUT")
 @IdClass(ExperimentInputPK.class)
-public class ExperimentInputEntity {
+public class ExperimentInputEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "EXPERIMENT_ID")
     private String experimentId;
-    public String name;
-    public String value;
-    public String type;
-    public String applicationArgument;
-    public boolean standardInput;
-    public String userFriendlyDescription;
-    public String metaData;
-    public int inputOrder;
-    public boolean isRequired;
-    public boolean requiredToAddedToCommandLine;
-    public boolean dataStaged;
-    public String storageResourceId;
 
+    @Id
+    @Column(name = "INPUT_NAME")
+    private String name;
+
+    @Lob
+    @Column(name = "INPUT_VALUE")
+    private String value;
+
+    @Column(name = "DATA_TYPE")
+    private String type;
+
+    @Column(name = "APPLICATION_ARGUMENT")
+    private String applicationArgument;
+
+    @Column(name = "STANDARD_INPUT")
+    private boolean standardInput;
+
+    @Column(name = "USER_FRIENDLY_DESCRIPTION")
+    private String userFriendlyDescription;
+
+    @Column(name = "METADATA", length = 4096)
+    private String metaData;
+
+    @Column(name = "INPUT_ORDER")
+    private int inputOrder;
+
+    @Column(name = "IS_REQUIRED")
+    private boolean isRequired;
+
+    @Column(name = "REQUIRED_TO_ADDED_TO_CMD")
+    private boolean requiredToAddedToCommandLine;
+
+    @Column(name = "DATA_STAGED")
+    private boolean dataStaged;
+
+    @Column(name = "STORAGE_RESOURCE_ID")
+    private String storageResourceId;
+
+    @Column(name = "IS_READ_ONLY")
+    private boolean isReadOnly;
+
+    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     private ExperimentEntity experiment;
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
+    public ExperimentInputEntity() {
+    }
+
     public String getExperimentId() {
         return experimentId;
     }
@@ -52,8 +92,6 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Id
-    @Column(name = "INPUT_NAME")
     public String getName() {
         return name;
     }
@@ -62,7 +100,6 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Column(name = "INPUT_VALUE")
     public String getValue() {
         return value;
     }
@@ -71,7 +108,6 @@ public void setValue(String value) {
         this.value = value;
     }
 
-    @Column(name = "INPUT_TYPE")
     public String getType() {
         return type;
     }
@@ -80,7 +116,6 @@ public void setType(String type) {
         this.type = type;
     }
 
-    @Column(name = "APPLICATION_ARGUMENT")
     public String getApplicationArgument() {
         return applicationArgument;
     }
@@ -89,7 +124,6 @@ public void setApplicationArgument(String applicationArgument) {
         this.applicationArgument = applicationArgument;
     }
 
-    @Column(name = "STANDARD_INPUT")
     public boolean isStandardInput() {
         return standardInput;
     }
@@ -98,7 +132,6 @@ public void setStandardInput(boolean standardInput) {
         this.standardInput = standardInput;
     }
 
-    @Column(name = "USER_FRIENDLY_DESCRIPTION")
     public String getUserFriendlyDescription() {
         return userFriendlyDescription;
     }
@@ -107,7 +140,6 @@ public void setUserFriendlyDescription(String userFriendlyDescription) {
         this.userFriendlyDescription = userFriendlyDescription;
     }
 
-    @Column(name = "METADATA", length = 4096)
     public String getMetaData() {
         return metaData;
     }
@@ -116,7 +148,6 @@ public void setMetaData(String metaData) {
         this.metaData = metaData;
     }
 
-    @Column(name = "INPUT_ORDER")
     public int getInputOrder() {
         return inputOrder;
     }
@@ -125,7 +156,6 @@ public void setInputOrder(int inputOrder) {
         this.inputOrder = inputOrder;
     }
 
-    @Column(name = "REQUIRED")
     public boolean isRequired() {
         return isRequired;
     }
@@ -134,7 +164,6 @@ public void setRequired(boolean isRequired) {
         this.isRequired = isRequired;
     }
 
-    @Column(name = "REQUIRED_TO_ADDED_TO_COMMANDLINE")
     public boolean isRequiredToAddedToCommandLine() {
         return requiredToAddedToCommandLine;
     }
@@ -143,7 +172,6 @@ public void setRequiredToAddedToCommandLine(boolean requiredToAddedToCommandLine
         this.requiredToAddedToCommandLine = requiredToAddedToCommandLine;
     }
 
-    @Column(name = "DATA_STAGED")
     public boolean isDataStaged() {
         return dataStaged;
     }
@@ -152,7 +180,6 @@ public void setDataStaged(boolean dataStaged) {
         this.dataStaged = dataStaged;
     }
 
-    @Column(name = "STORAGE_RESOURCE_ID")
     public String getStorageResourceId() {
         return storageResourceId;
     }
@@ -161,8 +188,6 @@ public void setStorageResourceId(String storageResourceId) {
         this.storageResourceId = storageResourceId;
     }
 
-    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     public ExperimentEntity getExperiment() {
         return experiment;
     }
@@ -170,4 +195,10 @@ public ExperimentEntity getExperiment() {
     public void setExperiment(ExperimentEntity experiment) {
         this.experiment = experiment;
     }
+
+    public boolean getIsReadOnly() { return isReadOnly; }
+
+    public void setIsReadOnly(boolean isReadOnly) {
+        this.isReadOnly = isReadOnly;
+    }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputPK.java
index 3479878cd7..8adda728cc 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputPK.java
@@ -20,20 +20,21 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the experiment_input database table.
+ */
 public class ExperimentInputPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(ExperimentInputPK.class);
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
     private String experimentId;
     private String name;
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
+    public ExperimentInputPK() {
+    }
+
     public String getExperimentId() {
         return experimentId;
     }
@@ -42,8 +43,6 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Id
-    @Column(name = "INPUT_NAME")
     public String getName() {
         return name;
     }
@@ -52,23 +51,25 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ExperimentInputPK that = (ExperimentInputPK) o;
-
-        if (getExperimentId() != null ? !getExperimentId().equals(that.getExperimentId()) : that.getExperimentId() != null) return false;
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ExperimentInputPK)) {
+            return false;
+        }
+        ExperimentInputPK castOther = (ExperimentInputPK) other;
+        return
+                this.experimentId.equals(castOther.experimentId)
+                        && this.name.equals(castOther.name);
     }
 
-    @Override
     public int hashCode() {
-        int result = getExperimentId() != null ? getExperimentId().hashCode() : 0;
-        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.experimentId.hashCode();
+        hash = hash * prime + this.name.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java
index 871fcd78f3..cda94c4d03 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java
@@ -21,29 +21,63 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
+/**
+ * The persistent class for the experiment_output database table.
+ */
 @Entity
-@Table(name = "EXPCAT_EXPERIMENT_OUTPUT")
+@Table(name = "EXPERIMENT_OUTPUT")
 @IdClass(ExperimentOutputPK.class)
-public class ExperimentOutputEntity {
+public class ExperimentOutputEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "EXPERIMENT_ID")
     private String experimentId;
-    public String name;
-    public String value;
-    public String type;
-    public String applicationArgument;
-    public boolean isRequired;
-    public boolean requiredToAddedToCommandLine;
-    public boolean dataMovement;
-    public String location;
-    public String searchQuery;
-    public boolean outputStreaming;
-    public String storageResourceId;
 
+    @Id
+    @Column(name = "OUTPUT_NAME")
+    private String name;
+
+    @Lob
+    @Column(name = "OUTPUT_VALUE")
+    private String value;
+
+    @Column(name = "DATA_TYPE")
+    private String type;
+
+    @Column(name = "APPLICATION_ARGUMENT")
+    private String applicationArgument;
+
+    @Column(name = "IS_REQUIRED")
+    private boolean isRequired;
+
+    @Column(name = "REQUIRED_TO_ADDED_TO_CMD")
+    private boolean requiredToAddedToCommandLine;
+
+    @Column(name = "DATA_MOVEMENT")
+    private boolean dataMovement;
+
+    @Column(name = "LOCATION")
+    private String location;
+
+    @Column(name = "SEARCH_QUERY")
+    private String searchQuery;
+
+    @Column(name = "OUTPUT_STREAMING")
+    private boolean outputStreaming;
+
+    @Column(name = "STORAGE_RESOURCE_ID")
+    private String storageResourceId;
+
+    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     private ExperimentEntity experiment;
 
+    public ExperimentOutputEntity() {
+    }
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
     public String getExperimentId() {
         return experimentId;
     }
@@ -52,8 +86,6 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Id
-    @Column(name = "OUTPUT_NAME")
     public String getName() {
         return name;
     }
@@ -62,7 +94,6 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Column(name = "OUTPUT_VALUE")
     public String getValue() {
         return value;
     }
@@ -71,7 +102,6 @@ public void setValue(String value) {
         this.value = value;
     }
 
-    @Column(name = "OUTPUT_TYPE")
     public String getType() {
         return type;
     }
@@ -80,7 +110,6 @@ public void setType(String type) {
         this.type = type;
     }
 
-    @Column(name = "APPLICATION_ARGUMENT")
     public String getApplicationArgument() {
         return applicationArgument;
     }
@@ -89,7 +118,6 @@ public void setApplicationArgument(String applicationArgument) {
         this.applicationArgument = applicationArgument;
     }
 
-    @Column(name = "REQUIRED")
     public boolean isRequired() {
         return isRequired;
     }
@@ -99,7 +127,6 @@ public void setRequired(boolean isRequired) {
     }
 
 
-    @Column(name = "REQUIRED_TO_ADDED_TO_COMMANDLINE")
     public boolean isRequiredToAddedToCommandLine() {
         return requiredToAddedToCommandLine;
     }
@@ -108,7 +135,6 @@ public void setRequiredToAddedToCommandLine(boolean requiredToAddedToCommandLine
         this.requiredToAddedToCommandLine = requiredToAddedToCommandLine;
     }
 
-    @Column(name = "DATA_MOVEMENT")
     public boolean isDataMovement() {
         return dataMovement;
     }
@@ -117,7 +143,6 @@ public void setDataMovement(boolean dataMovement) {
         this.dataMovement = dataMovement;
     }
 
-    @Column(name = "LOCATION")
     public String getLocation() {
         return location;
     }
@@ -126,7 +151,6 @@ public void setLocation(String location) {
         this.location = location;
     }
 
-    @Column(name = "SEARCH_QUERY")
     public String getSearchQuery() {
         return searchQuery;
     }
@@ -135,7 +159,6 @@ public void setSearchQuery(String searchQuery) {
         this.searchQuery = searchQuery;
     }
 
-    @Column(name = "OUTPUT_STREAMING")
     public boolean isOutputStreaming() {
         return outputStreaming;
     }
@@ -144,7 +167,6 @@ public void setOutputStreaming(boolean outputStreaming) {
         this.outputStreaming = outputStreaming;
     }
 
-    @Column(name = "STORAGE_RESOURCE_ID")
     public String getStorageResourceId() {
         return storageResourceId;
     }
@@ -153,8 +175,6 @@ public void setStorageResourceId(String storageResourceId) {
         this.storageResourceId = storageResourceId;
     }
 
-    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     public ExperimentEntity getExperiment() {
         return experiment;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputPK.java
index da2864c320..d31ad96478 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputPK.java
@@ -20,20 +20,21 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the experiment_output database table.
+ */
 public class ExperimentOutputPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(ExperimentOutputPK.class);
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
     private String experimentId;
     private String name;
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
+    public ExperimentOutputPK() {
+    }
+
     public String getExperimentId() {
         return experimentId;
     }
@@ -42,8 +43,6 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Id
-    @Column(name = "OUTPUT_NAME")
     public String getName() {
         return name;
     }
@@ -52,23 +51,25 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ExperimentOutputPK that = (ExperimentOutputPK) o;
-
-        if (getExperimentId() != null ? !getExperimentId().equals(that.getExperimentId()) : that.getExperimentId() != null) return false;
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ExperimentOutputPK)) {
+            return false;
+        }
+        ExperimentOutputPK castOther = (ExperimentOutputPK) other;
+        return
+                this.experimentId.equals(castOther.experimentId)
+                        && this.name.equals(castOther.name);
     }
 
-    @Override
     public int hashCode() {
-        int result = getExperimentId() != null ? getExperimentId().hashCode() : 0;
-        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.experimentId.hashCode();
+        hash = hash * prime + this.name.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusEntity.java
index 7a73e78a4a..ee8fe8a8c4 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusEntity.java
@@ -21,20 +21,51 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 
+/**
+ * The persistent class for the experiment_status database table.
+ */
 @Entity
-@Table(name = "EXPCAT_EXPERIMENT_STATUS")
+@Table(name = "EXPERIMENT_STATUS")
 @IdClass(ExperimentStatusPK.class)
-public class ExperimentStatusEntity {
+public class ExperimentStatusEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "STATUS_ID")
+    private String statusId;
+
+    @Id
+    @Column(name = "EXPERIMENT_ID")
     private String experimentId;
+
+    @Column(name = "STATE")
     private String state;
-    private long timeOfStateChange;
+
+    @Column(name = "TIME_OF_STATE_CHANGE")
+    private Timestamp timeOfStateChange;
+
+    @Lob
+    @Column(name = "REASON")
     private String reason;
 
+    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     private ExperimentEntity experiment;
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
+    public ExperimentStatusEntity() {
+    }
+
+    public String getStatusId() {
+        return statusId;
+    }
+
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
+    }
+
     public String getExperimentId() {
         return experimentId;
     }
@@ -43,8 +74,6 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Id
-    @Column(name = "STATE")
     public String getState() {
         return state;
     }
@@ -53,16 +82,14 @@ public void setState(String state) {
         this.state = state;
     }
 
-    @Column(name = "TIME_OF_STATE_CHANGE")
-    public long getTimeOfStateChange() {
+    public Timestamp getTimeOfStateChange() {
         return timeOfStateChange;
     }
 
-    public void setTimeOfStateChange(long timeOfStateChange) {
+    public void setTimeOfStateChange(Timestamp timeOfStateChange) {
         this.timeOfStateChange = timeOfStateChange;
     }
 
-    @Column(name = "REASON")
     public String getReason() {
         return reason;
     }
@@ -71,8 +98,6 @@ public void setReason(String reason) {
         this.reason = reason;
     }
 
-    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     public ExperimentEntity getExperiment() {
         return experiment;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusPK.java
index 4c52ec62c4..7e2cba0e5d 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentStatusPK.java
@@ -20,30 +20,29 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the experiment_status database table.
+ */
 public class ExperimentStatusPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(ExperimentStatusPK.class);
-    private String state;
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String statusId;
     private String experimentId;
 
-    @Id
-    @Column(name = "STATUS_ID")
-    public String getState() {
-        return state;
+    public ExperimentStatusPK() {
+    }
+
+    public String getStatusId() {
+        return statusId;
     }
 
-    public void setState(String state) {
-        this.state = state;
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
     }
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
     public String getExperimentId() {
         return experimentId;
     }
@@ -52,23 +51,25 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ExperimentStatusPK that = (ExperimentStatusPK) o;
-
-        if (getState() != null ? !getState().equals(that.getState()) : that.getState() != null) return false;
-        if (getExperimentId() != null ? !getExperimentId().equals(that.getExperimentId()) : that.getExperimentId() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ExperimentStatusPK)) {
+            return false;
+        }
+        ExperimentStatusPK castOther = (ExperimentStatusPK) other;
+        return
+                this.statusId.equals(castOther.statusId)
+                        && this.experimentId.equals(castOther.experimentId);
     }
 
-    @Override
     public int hashCode() {
-        int result = getState() != null ? getState().hashCode() : 0;
-        result = 31 * result + (getExperimentId() != null ? getExperimentId().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.statusId.hashCode();
+        hash = hash * prime + this.experimentId.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentSummaryEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentSummaryEntity.java
new file mode 100644
index 0000000000..5080f6f572
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentSummaryEntity.java
@@ -0,0 +1,158 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * The class for the experiment_summary view.
+ */
+@Entity
+@Table(name = "EXPERIMENT_SUMMARY")
+public class ExperimentSummaryEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "EXPERIMENT_ID")
+    private String experimentId;
+
+    @Column(name = "PROJECT_ID")
+    private String projectId;
+
+    @Column(name = "GATEWAY_ID")
+    private String gatewayId;
+
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    @Column(name = "USER_NAME")
+    private String userName;
+
+    @Column(name = "EXPERIMENT_NAME")
+    private String name;
+
+    @Column(name = "DESCRIPTION")
+    private String description;
+
+    @Column(name = "EXECUTION_ID")
+    private String executionId;
+
+    @Column(name = "STATE")
+    private String state;
+
+    @Column(name = "RESOURCE_HOST_ID")
+    private String resourceHostId;
+
+    @Column(name = "TIME_OF_STATE_CHANGE")
+    private Timestamp statusUpdateTime;
+
+    public ExperimentSummaryEntity() {
+    }
+
+    public String getExperimentId() {
+        return experimentId;
+    }
+
+    public void setExperimentId(String experimentId) {
+        this.experimentId = experimentId;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public Timestamp getCreationTime() {
+        return creationTime;
+    }
+
+    public void setCreationTime(Timestamp creationTime) {
+        this.creationTime = creationTime;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getExecutionId() {
+        return executionId;
+    }
+
+    public void setExecutionId(String executionId) {
+        this.executionId = executionId;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getResourceHostId() {
+        return resourceHostId;
+    }
+
+    public void setResourceHostId(String resourceHostId) {
+        this.resourceHostId = resourceHostId;
+    }
+
+    public Timestamp getStatusUpdateTime() {
+        return statusUpdateTime;
+    }
+
+    public void setStatusUpdateTime(Timestamp statusUpdateTime) {
+        this.statusUpdateTime = statusUpdateTime;
+    }
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/GatewayEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayEntity.java
similarity index 83%
rename from modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/GatewayEntity.java
rename to modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayEntity.java
index c4f1f59b25..391f31da35 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/GatewayEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayEntity.java
@@ -18,35 +18,83 @@
  * under the License.
  *
 */
-package org.apache.airavata.registry.core.entities.workspacecatalog;
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import org.apache.airavata.model.workspace.GatewayApprovalStatus;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 
+/**
+ * The persistent class for the gateway database table.
+ */
 @Entity
-@Table(name="WORKSPACE_GATEWAY")
-public class GatewayEntity {
+@Table(name="GATEWAY")
+public class GatewayEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "GATEWAY_ID")
     private String gatewayId;
+
+    @Column(name = "GATEWAY_NAME")
     private String gatewayName;
+
+    @Column(name = "GATEWAY_DOMAIN")
     private String domain;
+
+    @Column(name = "EMAIL_ADDRESS")
     private String emailAddress;
-    private String gatewayApprovalStatus;
+
+    @Column(name = "GATEWAY_APPROVAL_STATUS")
+    private GatewayApprovalStatus gatewayApprovalStatus;
+
+    @Column(name = "GATEWAY_ACRONYM")
     private String gatewayAcronym;
+
+    @Column(name = "GATEWAY_URL")
     private String gatewayUrl;
+
+    @Column(name = "GATEWAY_PUBLIC_ABSTRACT")
     private String gatewayPublicAbstract;
+
+    @Column(name = "GATEWAY_REVIEW_PROPOSAL_DESCRIPTION")
     private String reviewProposalDescription;
+
+    @Column(name = "GATEWAY_ADMIN_FIRST_NAME")
     private String gatewayAdminFirstName;
-    private String getGatewayAdminLastName;
+
+    @Column(name = "GATEWAY_ADMIN_LAST_NAME")
+    private String gatewayAdminLastName;
+
+    @Column(name = "GATEWAY_ADMIN_EMAIL")
     private String gatewayAdminEmail;
+
+    @Column(name = "IDENTITY_SERVER_USERNAME")
     private String identityServerUserName;
+
+    @Column(name = "IDENTITY_SERVER_PASSWORD_TOKEN")
     private String identityServerPasswordToken;
+
+    @Column(name = "DECLINED_REASON")
     private String declinedReason;
+
+    @Column(name = "OAUTH_CLIENT_ID")
     private String oauthClientId;
+
+    @Column(name = "OAUTH_CLIENT_SECRET")
     private String getOauthClientSecret;
-    private long requestCreationTime;
+
+    @Column(name = "REQUEST_CREATION_TIME")
+    private Timestamp requestCreationTime;
+
+    @Column(name = "REQUESTER_USERNAME")
     private String requesterUsername;
 
-    @Id
-    @Column(name = "GATEWAY_ID")
+    public GatewayEntity() {
+    }
+
     public String getGatewayId() {
         return gatewayId;
     }
@@ -55,7 +103,6 @@ public void setGatewayId(String id) {
         this.gatewayId = id;
     }
 
-    @Column(name = "GATEWAY_NAME")
     public String getGatewayName() {
         return gatewayName;
     }
@@ -64,7 +111,6 @@ public void setGatewayName(String gatewayName) {
         this.gatewayName = gatewayName;
     }
 
-    @Column(name = "GATEWAY_DOMAIN")
     public String getDomain() {
         return domain;
     }
@@ -73,7 +119,6 @@ public void setDomain(String domain) {
         this.domain = domain;
     }
 
-    @Column(name = "EMAIL_ADDRESS")
     public String getEmailAddress() {
         return emailAddress;
     }
@@ -82,16 +127,14 @@ public void setEmailAddress(String emailAddress) {
         this.emailAddress = emailAddress;
     }
 
-    @Column(name = "GATEWAY_APPROVAL_STATUS")
-    public String getGatewayApprovalStatus() {
+    public GatewayApprovalStatus getGatewayApprovalStatus() {
         return gatewayApprovalStatus;
     }
 
-    public void setGatewayApprovalStatus(String gatewayApprovalStatus) {
+    public void setGatewayApprovalStatus(GatewayApprovalStatus gatewayApprovalStatus) {
         this.gatewayApprovalStatus = gatewayApprovalStatus;
     }
 
-    @Column(name = "GATEWAY_ACRONYM")
     public String getGatewayAcronym() {
         return gatewayAcronym;
     }
@@ -100,7 +143,6 @@ public void setGatewayAcronym(String gatewayAcronym) {
         this.gatewayAcronym = gatewayAcronym;
     }
 
-    @Column(name = "GATEWAY_URL")
     public String getGatewayUrl() {
         return gatewayUrl;
     }
@@ -109,8 +151,6 @@ public void setGatewayUrl(String gatewayUrl) {
         this.gatewayUrl = gatewayUrl;
     }
 
-    @Lob
-    @Column(name = "GATEWAY_PUBLIC_ABSTRACT")
     public String getGatewayPublicAbstract() {
         return gatewayPublicAbstract;
     }
@@ -119,8 +159,6 @@ public void setGatewayPublicAbstract(String gatewayPublicAbstract) {
         this.gatewayPublicAbstract = gatewayPublicAbstract;
     }
 
-    @Lob
-    @Column(name = "REVIEW_PROPOSAL_DESCRIPTION")
     public String getReviewProposalDescription() {
         return reviewProposalDescription;
     }
@@ -129,7 +167,6 @@ public void setReviewProposalDescription(String reviewProposalDescription) {
         this.reviewProposalDescription = reviewProposalDescription;
     }
 
-    @Column(name = "GATEWAY_ADMIN_FIRST_NAME")
     public String getGatewayAdminFirstName() {
         return gatewayAdminFirstName;
     }
@@ -138,16 +175,14 @@ public void setGatewayAdminFirstName(String gatewayAdminFirstName) {
         this.gatewayAdminFirstName = gatewayAdminFirstName;
     }
 
-    @Column(name = "GATEWAY_ADMIN_LAST_NAME")
-    public String getGetGatewayAdminLastName() {
-        return getGatewayAdminLastName;
+    public String getGatewayAdminLastName() {
+        return gatewayAdminLastName;
     }
 
-    public void setGetGatewayAdminLastName(String getGatewayAdminLastName) {
-        this.getGatewayAdminLastName = getGatewayAdminLastName;
+    public void setGatewayAdminLastName(String gatewayAdminLastName) {
+        this.gatewayAdminLastName = gatewayAdminLastName;
     }
 
-    @Column(name = "GATEWAY_ADMIN_EMAIL")
     public String getGatewayAdminEmail() {
         return gatewayAdminEmail;
     }
@@ -156,7 +191,6 @@ public void setGatewayAdminEmail(String gatewayAdminEmail) {
         this.gatewayAdminEmail = gatewayAdminEmail;
     }
 
-    @Column(name = "IDENTITY_SERVER_USERNAME")
     public String getIdentityServerUserName() {
         return identityServerUserName;
     }
@@ -165,7 +199,6 @@ public void setIdentityServerUserName(String identityServerUserName) {
         this.identityServerUserName = identityServerUserName;
     }
 
-    @Column(name = "IDENTITY_SERVER_PASSWORD_TOKEN")
     public String getIdentityServerPasswordToken() {
         return identityServerPasswordToken;
     }
@@ -174,7 +207,6 @@ public void setIdentityServerPasswordToken(String identityServerPasswordToken) {
         this.identityServerPasswordToken = identityServerPasswordToken;
     }
 
-    @Column(name = "REQUESTER_USERNAME")
     public String getRequesterUsername() {
         return requesterUsername;
     }
@@ -183,7 +215,6 @@ public void setRequesterUsername(String requesterUsername) {
         this.requesterUsername = requesterUsername;
     }
 
-    @Column(name = "DECLINED_REASON")
     public String getDeclinedReason() {
         return declinedReason;
     }
@@ -192,7 +223,7 @@ public void setDeclinedReason(String declinedReason) {
         this.declinedReason = declinedReason;
     }
 
-    @Column(name = "OAUTH_CLIENT_ID")
+
     public String getOauthClientId() {
         return oauthClientId;
     }
@@ -201,16 +232,6 @@ public void setOauthClientId(String oauthClientId) {
         this.oauthClientId = oauthClientId;
     }
 
-    @Column(name = "REQUEST_CREATION_TIME")
-    public long getRequestCreationTime() {
-        return requestCreationTime;
-    }
-
-    public void setRequestCreationTime(long requestCreationTime) {
-        this.requestCreationTime = requestCreationTime;
-    }
-
-    @Column(name = "OAUTH_CLIENT_SECRET")
     public String getGetOauthClientSecret() {
         return getOauthClientSecret;
     }
@@ -218,4 +239,13 @@ public String getGetOauthClientSecret() {
     public void setGetOauthClientSecret(String oauthClientSecret) {
         this.getOauthClientSecret = oauthClientSecret;
     }
+
+    public Timestamp getRequestCreationTime() {
+        return requestCreationTime;
+    }
+
+    public void setRequestCreationTime(Timestamp requestCreationTime) {
+        this.requestCreationTime = requestCreationTime;
+    }
+
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayWorkerEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayWorkerEntity.java
new file mode 100644
index 0000000000..332b7b76af
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayWorkerEntity.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * The persistent class for the gateway_worker database table.
+ */
+@Entity
+@Table(name="GATEWAY_WORKER")
+@IdClass(GatewayWorkerPK.class)
+public class GatewayWorkerEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "GATEWAY_ID")
+    private String gatewayId;
+
+    @Id
+    @Column(name = "USER_NAME")
+    private String userName;
+
+    public GatewayWorkerEntity() {
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayWorkerPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayWorkerPK.java
new file mode 100644
index 0000000000..5660da8a7a
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayWorkerPK.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import java.io.Serializable;
+
+/**
+ * The primary key class for the gateway_worker database table.
+ */
+public class GatewayWorkerPK implements Serializable {
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String gatewayId;
+    private String userName;
+
+    public GatewayWorkerPK() {
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof GatewayWorkerPK)) {
+            return false;
+        }
+        GatewayWorkerPK castOther = (GatewayWorkerPK) other;
+        return
+                this.gatewayId.equals(castOther.gatewayId)
+                        && this.userName.equals(castOther.userName);
+    }
+
+    public int hashCode() {
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.gatewayId.hashCode();
+        hash = hash * prime + this.userName.hashCode();
+
+        return hash;
+    }
+}
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 763f5dafff..c1df7494ab 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
@@ -21,29 +21,68 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 import java.util.List;
 
+/**
+ * The persistent class for the job database table.
+ */
 @Entity
-@Table(name = "EXPCAT_JOB")
-public class JobEntity {
+@Table(name = "JOB")
+@IdClass(JobPK.class)
+public class JobEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "JOB_ID")
     private String jobId;
+
+    @Id
+    @Column(name = "TASK_ID")
     private String taskId;
+
+    @Column(name = "PROCESS_ID")
     private String processId;
+
+    @Lob
+    @Column(name = "JOB_DESCRIPTION")
     private String jobDescription;
-    private long creationTime;
+
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    @Column(name = "COMPUTE_RESOURCE_CONSUMED")
     private String computeResourceConsumed;
+
+    @Column(name = "JOB_NAME")
     private String jobName;
+
+    @Column(name = "WORKING_DIR")
     private String workingDir;
+
+    @Lob
+    @Column(name = "STD_OUT")
     private String stdOut;
+
+    @Lob
+    @Column(name = "STD_ERR")
     private String stdErr;
+
+    @Column(name = "EXIT_CODE")
     private int exitCode;
 
+    @OneToMany(targetEntity = JobStatusEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "job", fetch = FetchType.EAGER)
     private List<JobStatusEntity> jobStatuses;
 
+    @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
     private TaskEntity task;
 
-    @Id
-    @Column(name = "JOB_ID")
+    public JobEntity() {
+    }
+
     public String getJobId() {
         return jobId;
     }
@@ -52,7 +91,6 @@ public void setJobId(String jobId) {
         this.jobId = jobId;
     }
 
-    @Column(name = "TASK_ID")
     public String getTaskId() {
         return taskId;
     }
@@ -61,7 +99,6 @@ public void setTaskId(String taskId) {
         this.taskId = taskId;
     }
 
-    @Column(name = "PROCESS_ID")
     public String getProcessId() {
         return processId;
     }
@@ -70,7 +107,6 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Column(name = "JOB_DESCRIPTION")
     public String getJobDescription() {
         return jobDescription;
     }
@@ -79,16 +115,14 @@ public void setJobDescription(String jobDescription) {
         this.jobDescription = jobDescription;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "COMPUTE_RESOURCE_CONSUMED")
     public String getComputeResourceConsumed() {
         return computeResourceConsumed;
     }
@@ -97,7 +131,6 @@ public void setComputeResourceConsumed(String computeResourceConsumed) {
         this.computeResourceConsumed = computeResourceConsumed;
     }
 
-    @Column(name = "JOB_NAME")
     public String getJobName() {
         return jobName;
     }
@@ -106,7 +139,6 @@ public void setJobName(String jobName) {
         this.jobName = jobName;
     }
 
-    @Column(name = "WORKING_DIR")
     public String getWorkingDir() {
         return workingDir;
     }
@@ -115,8 +147,6 @@ public void setWorkingDir(String workingDir) {
         this.workingDir = workingDir;
     }
 
-    @Lob
-    @Column(name = "STDOUT")
     public String getStdOut() {
         return stdOut;
     }
@@ -125,8 +155,6 @@ public void setStdOut(String stdOut) {
         this.stdOut = stdOut;
     }
 
-    @Lob
-    @Column(name = "STDERR")
     public String getStdErr() {
         return stdErr;
     }
@@ -135,7 +163,6 @@ public void setStdErr(String stdErr) {
         this.stdErr = stdErr;
     }
 
-    @Column(name = "EXIT_CODE")
     public int getExitCode() {
         return exitCode;
     }
@@ -144,17 +171,14 @@ public void setExitCode(int exitCode) {
         this.exitCode = exitCode;
     }
 
-    @OneToMany(targetEntity = JobStatusEntity.class, cascade = CascadeType.ALL, mappedBy = "job")
     public List<JobStatusEntity> getJobStatuses() {
         return jobStatuses;
     }
 
-    public void setJobStatuses(List<JobStatusEntity> jobStatus) {
-        this.jobStatuses = jobStatus;
+    public void setJobStatuses(List<JobStatusEntity> jobStatuses) {
+        this.jobStatuses = jobStatuses;
     }
 
-    @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
     public TaskEntity getTask() {
         return task;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobPK.java
new file mode 100644
index 0000000000..19bfeadc8f
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobPK.java
@@ -0,0 +1,76 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import java.io.Serializable;
+
+/**
+ * The primary key class for the job database table.
+ */
+public class JobPK implements Serializable {
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String jobId;
+    private String taskId;
+
+    public JobPK() {
+    }
+
+    public String getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(String jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof JobPK)) {
+            return false;
+        }
+        JobPK castOther = (JobPK) other;
+        return
+                this.jobId.equals(castOther.jobId)
+                        && this.taskId.equals(castOther.taskId);
+    }
+
+    public int hashCode() {
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.jobId.hashCode();
+        hash = hash * prime + this.taskId.hashCode();
+
+        return hash;
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java
index bcc902b97d..46d0743d52 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java
@@ -20,21 +20,58 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
+import org.apache.airavata.model.status.JobState;
+
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 
+/**
+ * The persistent class for the job_status database table.
+ */
 @Entity
-@Table(name = "EXPCAT_JOB_STATUS")
+@Table(name = "JOB_STATUS")
 @IdClass(JobStatusPK.class)
-public class JobStatusEntity {
+public class JobStatusEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "STATUS_ID")
+    private String statusId;
+
+    @Id
+    @Column(name = "JOB_ID")
     private String jobId;
-    private String state;
-    private long timeOfStateChange;
+
+    @Id
+    @Column(name = "TASK_ID")
+    private String taskId;
+
+    @Column(name = "STATE")
+    private JobState jobState;
+
+    @Column(name = "TIME_OF_STATE_CHANGE")
+    private Timestamp timeOfStateChange;
+
+    @Lob
+    @Column(name = "REASON")
     private String reason;
 
+    @ManyToOne(targetEntity = JobEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID")
     private JobEntity job;
 
-    @Id
-    @Column(name = "JOB_ID")
+    public JobStatusEntity() {
+    }
+
+    public String getStatusId() {
+        return statusId;
+    }
+
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
+    }
+
     public String getJobId() {
         return jobId;
     }
@@ -43,26 +80,30 @@ public void setJobId(String jobId) {
         this.jobId = jobId;
     }
 
-    @Id
-    @Column(name = "STATE")
-    public String getState() {
-        return state;
+    public String getTaskId() {
+        return taskId;
     }
 
-    public void setState(String state) {
-        this.state = state;
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
     }
 
-    @Column(name = "TIME_OF_STATE_CHANGE")
-    public long getTimeOfStateChange() {
+    public JobState getJobState() {
+        return jobState;
+    }
+
+    public void setJobState(JobState jobState) {
+        this.jobState = jobState;
+    }
+
+    public Timestamp getTimeOfStateChange() {
         return timeOfStateChange;
     }
 
-    public void setTimeOfStateChange(long timeOfStateChange) {
+    public void setTimeOfStateChange(Timestamp timeOfStateChange) {
         this.timeOfStateChange = timeOfStateChange;
     }
 
-    @Column(name = "REASON")
     public String getReason() {
         return reason;
     }
@@ -71,8 +112,6 @@ public void setReason(String reason) {
         this.reason = reason;
     }
 
-    @ManyToOne(targetEntity = JobEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID")
     public JobEntity getJob() {
         return job;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusPK.java
index fa8964f9d5..78c52b22c8 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusPK.java
@@ -20,30 +20,30 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the job_status database table.
+ */
 public class JobStatusPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(JobStatusPK.class);
-    private String state;
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String statusId;
     private String jobId;
+    private String taskId;
 
-    @Id
-    @Column(name = "STATUS_ID")
-    public String getState() {
-        return state;
+    public JobStatusPK() {
     }
 
-    public void setState(String state) {
-        this.state = state;
+    public String getStatusId() {
+        return statusId;
+    }
+
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
     }
 
-    @Id
-    @Column(name = "JOB_ID")
     public String getJobId() {
         return jobId;
     }
@@ -52,23 +52,36 @@ public void setJobId(String jobId) {
         this.jobId = jobId;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        JobStatusPK that = (JobStatusPK) o;
+    public String getTaskId() {
+        return taskId;
+    }
 
-        if (getState() != null ? !getState().equals(that.getState()) : that.getState() != null) return false;
-        if (getJobId() != null ? !getJobId().equals(that.getJobId()) : that.getJobId() != null) return false;
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
 
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof JobStatusPK)) {
+            return false;
+        }
+        JobStatusPK castOther = (JobStatusPK) other;
+        return
+                this.statusId.equals(castOther.statusId)
+                        && this.jobId.equals(castOther.jobId)
+                                && this.taskId.equals(castOther.taskId);
     }
 
-    @Override
     public int hashCode() {
-        int result = getState() != null ? getState().hashCode() : 0;
-        result = 31 * result + (getJobId() != null ? getJobId().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.statusId.hashCode();
+        hash = hash * prime + this.jobId.hashCode();
+        hash = hash * prime + this.taskId.hashCode();
+
+        return hash;
     }
+
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/NotificationEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/NotificationEntity.java
similarity index 64%
rename from modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/NotificationEntity.java
rename to modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/NotificationEntity.java
index 67f8af256b..515a999e7e 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/NotificationEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/NotificationEntity.java
@@ -18,24 +18,50 @@
  * under the License.
  *
 */
-package org.apache.airavata.registry.core.entities.workspacecatalog;
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import org.apache.airavata.model.workspace.NotificationPriority;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 
+/**
+ * The persistent class for the notification database table.
+ */
 @Entity
-@Table(name = "WORKSPACE_NOTIFICATION")
-public class NotificationEntity {
+@Table(name = "NOTIFICATION")
+public class NotificationEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "NOTIFICATION_ID")
     private String notificationId;
+
+    @Column(name = "GATEWAY_ID")
     private String gatewayId;
+
+    @Column(name = "TITLE")
     private String title;
+
+    @Column(name = "NOTIFICATION_MESSAGE", length = 4096)
     private String notificationMessage;
-    private long creationTime;
-    private long publishedTime;
-    private long expirationTime;
-    private String priority;
 
-    @Id
-    @Column(name = "NOTIFICATION_ID")
+    @Column(name = "CREATION_DATE")
+    private Timestamp creationTime;
+
+    @Column(name = "PUBLISHED_DATE")
+    private Timestamp publishedTime;
+
+    @Column(name = "EXPIRATION_DATE")
+    private Timestamp expirationTime;
+
+    @Column(name = "PRIORITY")
+    private NotificationPriority priority;
+
+    public NotificationEntity() {
+    }
+
     public String getNotificationId() {
         return notificationId;
     }
@@ -44,7 +70,6 @@ public void setNotificationId(String notificationId) {
         this.notificationId = notificationId;
     }
 
-    @Column(name = "GATEWAY_ID")
     public String getGatewayId() {
         return gatewayId;
     }
@@ -53,7 +78,6 @@ public void setGatewayId(String gatewayId) {
         this.gatewayId = gatewayId;
     }
 
-    @Column(name = "TITLE")
     public String getTitle() {
         return title;
     }
@@ -62,8 +86,6 @@ public void setTitle(String title) {
         this.title = title;
     }
 
-    @Lob
-    @Column(name = "NOTIFICATION_MESSAGE")
     public String getNotificationMessage() {
         return notificationMessage;
     }
@@ -72,39 +94,35 @@ public void setNotificationMessage(String notificationMessage) {
         this.notificationMessage = notificationMessage;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "PUBLISHED_TIME")
-    public long getPublishedTime() {
+    public Timestamp getPublishedTime() {
         return publishedTime;
     }
 
-    public void setPublishedTime(long publishedTime) {
+    public void setPublishedTime(Timestamp publishedTime) {
         this.publishedTime = publishedTime;
     }
 
-    @Column(name = "EXPIRATION_TIME")
-    public long getExpirationTime() {
+    public Timestamp getExpirationTime() {
         return expirationTime;
     }
 
-    public void setExpirationTime(long expirationTime) {
+    public void setExpirationTime(Timestamp expirationTime) {
         this.expirationTime = expirationTime;
     }
 
-    @Column(name = "PRIORITY")
-    public String getPriority() {
+    public NotificationPriority getPriority() {
         return priority;
     }
 
-    public void setPriority(String priority) {
+    public void setPriority(NotificationPriority priority) {
         this.priority = priority;
     }
 }
\ No newline at end of file
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 a379ef62a3..8872b4de52 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
@@ -22,40 +22,113 @@
 
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 import java.util.List;
 
+/**
+ * The persistent class for the process database table.
+ */
 @Entity
-@Table(name = "EXPCAT_PROCESS")
-public class ProcessEntity {
+@Table(name = "PROCESS")
+public class ProcessEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "PROCESS_ID")
     private String processId;
+
+    @Column(name = "EXPERIMENT_ID")
     private String experimentId;
-    private long creationTime;
-    private long lastUpdateTime;
+
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    @Column(name = "LAST_UPDATE_TIME")
+    private Timestamp lastUpdateTime;
+
+    @Lob
+    @Column(name = "PROCESS_DETAIL")
     private String processDetail;
+
+    @Column(name = "APPLICATION_INTERFACE_ID")
     private String applicationInterfaceId;
+
+    @Column(name = "APPLICATION_DEPLOYMENT_ID")
     private String applicationDeploymentId;
+
+    @Column(name = "COMPUTE_RESOURCE_ID")
     private String computeResourceId;
+
+    @Lob
+    @Column(name = "TASK_DAG")
     private String taskDag;
+
+    @Column(name = "GATEWAY_EXECUTION_ID")
     private String gatewayExecutionId;
+
+    @Column(name = "GATEWAY_INSTANCE_ID")
+    private String gatewayInstanceId;
+
+    @Column(name = "ENABLE_EMAIL_NOTIFICATION")
     private boolean enableEmailNotification;
+
+    @Lob
+    @Column(name = "EMAIL_ADDRESSES")
     private List<String> emailAddresses;
+
+    @Column(name = "STORAGE_RESOURCE_ID")
     private String storageResourceId;
+
+    @Column(name = "USER_DN")
     private String userDn;
+
+    @Column(name = "GENERATE_CERT")
     private boolean generateCert;
+
+    @Column(name = "EXPERIMENT_DATA_DIR", length = 512)
     private String experimentDataDir;
+
+    @Column(name = "USERNAME")
     private String userName;
 
+    @Column(name = "GROUP_RESOURCE_PROFILE_ID")
+    private String groupResourceProfileId;
+
+    @Column(name = "IS_USE_USER_CR_PREF")
+    private boolean useUserCRPref;
+
+    @OneToMany(targetEntity = ProcessStatusEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "process", fetch = FetchType.EAGER)
     private List<ProcessStatusEntity> processStatuses;
+
+    @OneToMany(targetEntity = ProcessErrorEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "process", fetch = FetchType.EAGER)
     private List<ProcessErrorEntity> processErrors;
+
+    @OneToMany(targetEntity = ProcessInputEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "process", fetch = FetchType.EAGER)
     private List<ProcessInputEntity> processInputs;
+
+    @OneToMany(targetEntity = ProcessOutputEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "process", fetch = FetchType.EAGER)
     private List<ProcessOutputEntity> processOutputs;
-    private ProcessResourceSchedulingEntity processResourceSchedule;
+
+    @OneToOne(targetEntity = ProcessResourceScheduleEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "process", fetch = FetchType.EAGER)
+    private ProcessResourceScheduleEntity processResourceSchedule;
+
+    @OneToMany(targetEntity = TaskEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "process", fetch = FetchType.EAGER)
     private List<TaskEntity> tasks;
 
+    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     private ExperimentEntity experiment;
 
-    @Id
-    @Column(name = "PROCESS_ID")
+    public ProcessEntity() {
+    }
+
     public String getProcessId() {
         return processId;
     }
@@ -64,7 +137,6 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Column(name = "EXPERIMENT_ID")
     public String getExperimentId() {
         return experimentId;
     }
@@ -73,25 +145,22 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "LAST_UPDATE_TIME")
-    public long getLastUpdateTime() {
+    public Timestamp getLastUpdateTime() {
         return lastUpdateTime;
     }
 
-    public void setLastUpdateTime(long lastUpdateTime) {
+    public void setLastUpdateTime(Timestamp lastUpdateTime) {
         this.lastUpdateTime = lastUpdateTime;
     }
 
-    @Column(name = "PROCESS_DETAIL")
     public String getProcessDetail() {
         return processDetail;
     }
@@ -100,7 +169,6 @@ public void setProcessDetail(String processDetail) {
         this.processDetail = processDetail;
     }
 
-    @Column(name = "APPLICATION_INTERFACE_ID")
     public String getApplicationInterfaceId() {
         return applicationInterfaceId;
     }
@@ -109,7 +177,6 @@ public void setApplicationInterfaceId(String applicationInterfaceId) {
         this.applicationInterfaceId = applicationInterfaceId;
     }
 
-    @Column(name = "APPLICATION_DEPLOYMENT_ID")
     public String getApplicationDeploymentId() {
         return applicationDeploymentId;
     }
@@ -118,8 +185,6 @@ public void setApplicationDeploymentId(String applicationDeploymentId) {
         this.applicationDeploymentId = applicationDeploymentId;
     }
 
-
-    @Column(name = "COMPUTE_RESOURCE_ID")
     public String getComputeResourceId() {
         return computeResourceId;
     }
@@ -128,7 +193,6 @@ public void setComputeResourceId(String computeResourceId) {
         this.computeResourceId = computeResourceId;
     }
 
-    @Column(name = "TASK_DAG")
     public String getTaskDag() {
         return taskDag;
     }
@@ -137,7 +201,6 @@ public void setTaskDag(String taskDag) {
         this.taskDag = taskDag;
     }
 
-    @Column(name = "GATEWAY_EXECUTION_ID")
     public String getGatewayExecutionId() {
         return gatewayExecutionId;
     }
@@ -146,7 +209,14 @@ public void setGatewayExecutionId(String gatewayExecutionId) {
         this.gatewayExecutionId = gatewayExecutionId;
     }
 
-    @Column(name = "ENABLE_EMAIL_NOTIFICATION")
+    public String getGatewayInstanceId() {
+        return gatewayInstanceId;
+    }
+
+    public void setGatewayInstanceId(String gatewayInstanceId) {
+        this.gatewayInstanceId = gatewayInstanceId;
+    }
+
     public boolean isEnableEmailNotification() {
         return enableEmailNotification;
     }
@@ -155,8 +225,6 @@ public void setEnableEmailNotification(boolean enableEmailNotification) {
         this.enableEmailNotification = enableEmailNotification;
     }
 
-    @ElementCollection
-    @CollectionTable(name="PROCESS_EMAIL", joinColumns = @JoinColumn(name="PROCESS_ID"))
     public List<String> getEmailAddresses() {
         return emailAddresses;
     }
@@ -165,7 +233,6 @@ public void setEmailAddresses(List<String> emailAddresses) {
         this.emailAddresses = emailAddresses;
     }
 
-    @Column(name = "STORAGE_RESOURCE_ID")
     public String getStorageResourceId() {
         return storageResourceId;
     }
@@ -174,7 +241,6 @@ public void setStorageResourceId(String storageResourceId) {
         this.storageResourceId = storageResourceId;
     }
 
-    @Column(name = "USER_DN")
     public String getUserDn() {
         return userDn;
     }
@@ -183,7 +249,6 @@ public void setUserDn(String userDn) {
         this.userDn = userDn;
     }
 
-    @Column(name = "GENERATE_CERT")
     public boolean isGenerateCert() {
         return generateCert;
     }
@@ -192,7 +257,6 @@ public void setGenerateCert(boolean generateCert) {
         this.generateCert = generateCert;
     }
 
-    @Column(name = "EXPERIMENT_DATA_DIR")
     public String getExperimentDataDir() {
         return experimentDataDir;
     }
@@ -201,7 +265,6 @@ public void setExperimentDataDir(String experimentDataDir) {
         this.experimentDataDir = experimentDataDir;
     }
 
-    @Column(name = "USER_NAME")
     public String getUserName() {
         return userName;
     }
@@ -210,25 +273,38 @@ public void setUserName(String userName) {
         this.userName = userName;
     }
 
-    @OneToMany(targetEntity = ProcessStatusEntity.class, cascade = CascadeType.ALL, mappedBy = "process")
+    public String getGroupResourceProfileId() {
+        return groupResourceProfileId;
+    }
+
+    public void setGroupResourceProfileId(String groupResourceProfileId) {
+        this.groupResourceProfileId = groupResourceProfileId;
+    }
+
+    public boolean isUseUserCRPref() {
+        return useUserCRPref;
+    }
+
+    public void setUseUserCRPref(boolean useUserCRPref) {
+        this.useUserCRPref = useUserCRPref;
+    }
+
     public List<ProcessStatusEntity> getProcessStatuses() {
         return processStatuses;
     }
 
-    public void setProcessStatuses(List<ProcessStatusEntity> processStatus) {
-        this.processStatuses = processStatus;
+    public void setProcessStatuses(List<ProcessStatusEntity> processStatuses) {
+        this.processStatuses = processStatuses;
     }
 
-    @OneToMany(targetEntity = ProcessErrorEntity.class, cascade = CascadeType.ALL, mappedBy = "process")
     public List<ProcessErrorEntity> getProcessErrors() {
         return processErrors;
     }
 
-    public void setProcessErrors(List<ProcessErrorEntity> processError) {
-        this.processErrors = processError;
+    public void setProcessErrors(List<ProcessErrorEntity> processErrors) {
+        this.processErrors = processErrors;
     }
 
-    @OneToMany(targetEntity = ProcessInputEntity.class, cascade = CascadeType.ALL, mappedBy = "process")
     public List<ProcessInputEntity> getProcessInputs() {
         return processInputs;
     }
@@ -237,7 +313,6 @@ public void setProcessInputs(List<ProcessInputEntity> processInputs) {
         this.processInputs = processInputs;
     }
 
-    @OneToMany(targetEntity = ProcessOutputEntity.class, cascade = CascadeType.ALL, mappedBy = "process")
     public List<ProcessOutputEntity> getProcessOutputs() {
         return processOutputs;
     }
@@ -246,16 +321,14 @@ public void setProcessOutputs(List<ProcessOutputEntity> processOutputs) {
         this.processOutputs = processOutputs;
     }
 
-    @OneToOne(targetEntity = ProcessResourceSchedulingEntity.class, cascade = CascadeType.ALL, mappedBy = "process")
-    public ProcessResourceSchedulingEntity getProcessResourceSchedule() {
+    public ProcessResourceScheduleEntity getProcessResourceSchedule() {
         return processResourceSchedule;
     }
 
-    public void setProcessResourceSchedule(ProcessResourceSchedulingEntity proceeResourceSchedule) {
-        this.processResourceSchedule = proceeResourceSchedule;
+    public void setProcessResourceSchedule(ProcessResourceScheduleEntity processResourceSchedule) {
+        this.processResourceSchedule = processResourceSchedule;
     }
 
-    @OneToMany(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, mappedBy = "process")
     public List<TaskEntity> getTasks() {
         return tasks;
     }
@@ -264,8 +337,6 @@ public void setTasks(List<TaskEntity> tasks) {
         this.tasks = tasks;
     }
 
-    @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     public ExperimentEntity getExperiment() {
         return experiment;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorEntity.java
index 60ad9b2f19..cdd946f195 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorEntity.java
@@ -21,24 +21,52 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 import java.util.List;
 
+/**
+ * The persistent class for the process_error database table.
+ */
 @Entity
-@Table(name = "EXPCAT_PROCESS_ERROR")
+@Table(name = "PROCESS_ERROR")
 @IdClass(ProcessErrorPK.class)
-public class ProcessErrorEntity {
+public class ProcessErrorEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "ERROR_ID")
     private String errorId;
+
+    @Id
+    @Column(name = "PROCESS_ID")
     private String processId;
-    private long creationTime;
+
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    @Lob
+    @Column(name = "ACTUAL_ERROR_MESSAGE")
     private String actualErrorMessage;
+
+    @Lob
+    @Column(name = "USER_FRIENDLY_MESSAGE")
     private String userFriendlyMessage;
+
+    @Column(name = "TRANSIENT_OR_PERSISTENT")
     private boolean transientOrPersistent;
-    private List<String> rootCauseErrorIdList;
 
+    @Lob
+    @Column(name = "ROOT_CAUSE_ERROR_ID_LIST")
+    private String rootCauseErrorIdList;
+
+    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
 
-    @Id
-    @Column(name = "ERROR_ID")
+    public ProcessErrorEntity() {
+    }
+
     public String getErrorId() {
         return errorId;
     }
@@ -47,8 +75,6 @@ public void setErrorId(String errorId) {
         this.errorId = errorId;
     }
 
-    @Id
-    @Column(name = "PROCESS_ID")
     public String getProcessId() {
         return processId;
     }
@@ -57,16 +83,14 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "ACTUAL_ERROR_MESSAGE")
     public String getActualErrorMessage() {
         return actualErrorMessage;
     }
@@ -75,7 +99,6 @@ public void setActualErrorMessage(String actualErrorMessage) {
         this.actualErrorMessage = actualErrorMessage;
     }
 
-    @Column(name = "USER_FRIENDLY_MESSAGE")
     public String getUserFriendlyMessage() {
         return userFriendlyMessage;
     }
@@ -84,8 +107,6 @@ public void setUserFriendlyMessage(String userFriendlyMessage) {
         this.userFriendlyMessage = userFriendlyMessage;
     }
 
-
-    @Column(name = "TRANSIENT_OR_PERSISTENT")
     public boolean isTransientOrPersistent() {
         return transientOrPersistent;
     }
@@ -94,20 +115,14 @@ public void setTransientOrPersistent(boolean transientOrPersistent) {
         this.transientOrPersistent = transientOrPersistent;
     }
 
-
-    @ElementCollection
-    @CollectionTable(name="EXPCAT_EXPERIMENT_ERROR_ROOT_CAUSE_ERROR_ID", joinColumns = @JoinColumn(name="ERROR_ID"))
-    public List<String> getRootCauseErrorIdList() {
+    public String getRootCauseErrorIdList() {
         return rootCauseErrorIdList;
     }
 
-    public void setRootCauseErrorIdList(List<String> rootCauseErrorIdList) {
+    public void setRootCauseErrorIdList(String rootCauseErrorIdList) {
         this.rootCauseErrorIdList = rootCauseErrorIdList;
     }
 
-
-    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     public ProcessEntity getProcess() {
         return process;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorPK.java
index e7cc6ee966..9638db0c6c 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessErrorPK.java
@@ -20,20 +20,21 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the process_error database table.
+ */
 public class ProcessErrorPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(ProcessErrorPK.class);
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
     private String errorId;
     private String processId;
 
-    @Column(name = "ERROR_ID")
-    @Id
+    public ProcessErrorPK() {
+    }
+
     public String getErrorId() {
         return errorId;
     }
@@ -42,8 +43,6 @@ public void setErrorId(String errorId) {
         this.errorId = errorId;
     }
 
-    @Column(name = "PROCESS_ID")
-    @Id
     public String getProcessId() {
         return processId;
     }
@@ -52,24 +51,25 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ProcessErrorPK that = (ProcessErrorPK) o;
-
-        if (getErrorId() != null ? !getErrorId().equals(that.getErrorId()) : that.getErrorId() != null) return false;
-        if (getProcessId() != null ? !getProcessId().equals(that.getProcessId()) : that.getProcessId() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ProcessErrorPK)) {
+            return false;
+        }
+        ProcessErrorPK castOther = (ProcessErrorPK) other;
+        return
+                this.errorId.equals(castOther.errorId)
+                        && this.processId.equals(castOther.processId);
     }
 
-    @Override
     public int hashCode() {
-        int result = getErrorId() != null ? getErrorId().hashCode() : 0;
-        result = 31 * result + (getProcessId() != null ? getProcessId().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.errorId.hashCode();
+        hash = hash * prime + this.processId.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java
index 850c4a91e0..383d4c7dea 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java
@@ -21,39 +21,77 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
+/**
+ * The primary key class for the process_input database table.
+ */
 @Entity
-@Table(name = "EXPCAT_PROCESS_INPUT")
+@Table(name = "PROCESS_INPUT")
 @IdClass(ProcessInputPK.class)
-public class ProcessInputEntity {
+public class ProcessInputEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "PROCESS_ID")
     private String processId;
-    public String name;
-    public String value;
-    public String type;
-    public String applicationArgument;
-    public boolean standardInput;
-    public String userFriendlyDescription;
-    public String metaData;
-    public int inputOrder;
-    public boolean isRequired;
-    public boolean requiredToAddedToCommandLine;
-    public boolean dataStaged;
-    public String storageResourceId;
 
+    @Id
+    @Column(name = "INPUT_NAME")
+    private String name;
+
+    @Lob
+    @Column(name = "INPUT_VALUE")
+    private String value;
+
+    @Column(name = "DATA_TYPE")
+    private String type;
+
+    @Column(name = "APPLICATION_ARGUMENT")
+    private String applicationArgument;
+
+    @Column(name = "STANDARD_INPUT")
+    private boolean standardInput;
+
+    @Column(name = "USER_FRIENDLY_DESCRIPTION")
+    private String userFriendlyDescription;
+
+    @Column(name = "METADATA")
+    private String metaData;
+
+    @Column(name = "INPUT_ORDER")
+    private int inputOrder;
+
+    @Column(name = "IS_REQUIRED")
+    private boolean isRequired;
+
+    @Column(name = "REQUIRED_TO_ADDED_TO_CMD")
+    private boolean requiredToAddedToCommandLine;
+
+    @Column(name = "DATA_STAGED")
+    private boolean dataStaged;
+
+    @Column(name = "STORAGE_RESOURCE_ID")
+    private String storageResourceId;
+
+    @Column(name = "IS_READ_ONLY")
+    private boolean isReadOnly;
+
+    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
 
-    @Id
-    @Column(name = "PROCESS_ID")
-    public String getProceesId() {
+    public ProcessInputEntity() {
+    }
+
+    public String getProcessId() {
         return processId;
     }
 
-    public void setProceseId(String processId) {
+    public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Id
-    @Column(name = "INPUT_NAME")
     public String getName() {
         return name;
     }
@@ -62,7 +100,6 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Column(name = "INPUT_VALUE")
     public String getValue() {
         return value;
     }
@@ -71,7 +108,6 @@ public void setValue(String value) {
         this.value = value;
     }
 
-    @Column(name = "INPUT_TYPE")
     public String getType() {
         return type;
     }
@@ -80,7 +116,6 @@ public void setType(String type) {
         this.type = type;
     }
 
-    @Column(name = "APPLICATION_ARGUMENT")
     public String getApplicationArgument() {
         return applicationArgument;
     }
@@ -89,7 +124,6 @@ public void setApplicationArgument(String applicationArgument) {
         this.applicationArgument = applicationArgument;
     }
 
-    @Column(name = "STANDARD_INPUT")
     public boolean isStandardInput() {
         return standardInput;
     }
@@ -98,7 +132,6 @@ public void setStandardInput(boolean standardInput) {
         this.standardInput = standardInput;
     }
 
-    @Column(name = "USER_FRIENDLY_DESCRIPTION")
     public String getUserFriendlyDescription() {
         return userFriendlyDescription;
     }
@@ -107,8 +140,6 @@ public void setUserFriendlyDescription(String userFriendlyDescription) {
         this.userFriendlyDescription = userFriendlyDescription;
     }
 
-    @Lob
-    @Column(name = "METADATA")
     public String getMetaData() {
         return metaData;
     }
@@ -117,7 +148,6 @@ public void setMetaData(String metaData) {
         this.metaData = metaData;
     }
 
-    @Column(name = "INPUT_ORDER")
     public int getInputOrder() {
         return inputOrder;
     }
@@ -126,16 +156,14 @@ public void setInputOrder(int inputOrder) {
         this.inputOrder = inputOrder;
     }
 
-    @Column(name = "REQUIRED")
     public boolean isRequired() {
         return isRequired;
     }
 
-    public void setRequired(boolean isRequired) {
-        this.isRequired = isRequired;
+    public void setRequired(boolean required) {
+        isRequired = required;
     }
 
-    @Column(name = "REQUIRED_TO_ADDED_TO_COMMANDLINE")
     public boolean isRequiredToAddedToCommandLine() {
         return requiredToAddedToCommandLine;
     }
@@ -144,7 +172,6 @@ public void setRequiredToAddedToCommandLine(boolean requiredToAddedToCommandLine
         this.requiredToAddedToCommandLine = requiredToAddedToCommandLine;
     }
 
-    @Column(name = "DATA_STAGED")
     public boolean isDataStaged() {
         return dataStaged;
     }
@@ -153,7 +180,6 @@ public void setDataStaged(boolean dataStaged) {
         this.dataStaged = dataStaged;
     }
 
-    @Column(name = "STORAGE_RESOURCE_ID")
     public String getStorageResourceId() {
         return storageResourceId;
     }
@@ -162,8 +188,14 @@ public void setStorageResourceId(String storageResourceId) {
         this.storageResourceId = storageResourceId;
     }
 
-    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
+    public boolean isReadOnly() {
+        return isReadOnly;
+    }
+
+    public void setReadOnly(boolean readOnly) {
+        isReadOnly = readOnly;
+    }
+
     public ProcessEntity getProcess() {
         return process;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputPK.java
index 188b35fd86..bd06413c53 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputPK.java
@@ -20,20 +20,21 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the process_input database table.
+ */
 public class ProcessInputPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(ProcessInputPK.class);
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
     private String processId;
     private String name;
 
-    @Id
-    @Column(name = "PROCESS_ID")
+    public ProcessInputPK() {
+    }
+
     public String getProcessId() {
         return processId;
     }
@@ -42,8 +43,6 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Id
-    @Column(name = "INPUT_NAME")
     public String getName() {
         return name;
     }
@@ -52,23 +51,25 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ProcessInputPK that = (ProcessInputPK) o;
-
-        if (getProcessId() != null ? !getProcessId().equals(that.getProcessId()) : that.getProcessId() != null) return false;
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ProcessInputPK)) {
+            return false;
+        }
+        ProcessInputPK castOther = (ProcessInputPK) other;
+        return
+                this.processId.equals(castOther.processId)
+                        && this.name.equals(castOther.name);
     }
 
-    @Override
     public int hashCode() {
-        int result = getProcessId() != null ? getProcessId().hashCode() : 0;
-        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.processId.hashCode();
+        hash = hash * prime + this.name.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java
index 4226f7a10a..3df8619d23 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java
@@ -21,29 +21,63 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
+/**
+ * The persistent class for the process_output database table.
+ */
 @Entity
-@Table(name = "EXPCAT_PROCESS_OUTPUT")
+@Table(name = "PROCESS_OUTPUT")
 @IdClass(ProcessOutputPK.class)
-public class ProcessOutputEntity {
+public class ProcessOutputEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "PROCESS_ID")
     private String processId;
-    public String name;
-    public String value;
-    public String type;
-    public String applicationArgument;
-    public boolean isRequired;
-    public boolean requiredToAddedToCommandLine;
-    public boolean dataMovement;
-    public String location;
-    public String searchQuery;
-    public boolean outputStreaming;
-    public String storageResourceId;
 
+    @Id
+    @Column(name = "OUTPUT_NAME")
+    private String name;
+
+    @Lob
+    @Column(name = "OUTPUT_VALUE")
+    private String value;
+
+    @Column(name = "DATA_TYPE")
+    private String type;
+
+    @Column(name = "APPLICATION_ARGUMENT")
+    private String applicationArgument;
+
+    @Column(name = "IS_REQUIRED")
+    private boolean isRequired;
+
+    @Column(name = "REQUIRED_TO_ADDED_TO_CMD")
+    private boolean requiredToAddedToCommandLine;
+
+    @Column(name = "DATA_MOVEMENT")
+    private boolean dataMovement;
+
+    @Column(name = "LOCATION")
+    private String location;
+
+    @Column(name = "SEARCH_QUERY")
+    private String searchQuery;
+
+    @Column(name = "OUTPUT_STREAMING")
+    private boolean outputStreaming;
+
+    @Column(name = "STORAGE_RESOURCE_ID")
+    private String storageResourceId;
+
+    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
 
+    public ProcessOutputEntity() {
+    }
 
-    @Id
-    @Column(name = "PROCESS_ID")
     public String getProcessId() {
         return processId;
     }
@@ -52,8 +86,6 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Id
-    @Column(name = "OUTPUT_NAME")
     public String getName() {
         return name;
     }
@@ -62,7 +94,6 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Column(name = "OUTPUT_VALUE")
     public String getValue() {
         return value;
     }
@@ -71,7 +102,6 @@ public void setValue(String value) {
         this.value = value;
     }
 
-    @Column(name = "OUTPUT_TYPE")
     public String getType() {
         return type;
     }
@@ -80,7 +110,6 @@ public void setType(String type) {
         this.type = type;
     }
 
-    @Column(name = "APPLICATION_ARGUMENT")
     public String getApplicationArgument() {
         return applicationArgument;
     }
@@ -89,17 +118,14 @@ public void setApplicationArgument(String applicationArgument) {
         this.applicationArgument = applicationArgument;
     }
 
-    @Column(name = "REQUIRED")
     public boolean isRequired() {
         return isRequired;
     }
 
-    public void setRequired(boolean isRequired) {
-        this.isRequired = isRequired;
+    public void setRequired(boolean required) {
+        isRequired = required;
     }
 
-
-    @Column(name = "REQUIRED_TO_ADDED_TO_COMMANDLINE")
     public boolean isRequiredToAddedToCommandLine() {
         return requiredToAddedToCommandLine;
     }
@@ -108,7 +134,6 @@ public void setRequiredToAddedToCommandLine(boolean requiredToAddedToCommandLine
         this.requiredToAddedToCommandLine = requiredToAddedToCommandLine;
     }
 
-    @Column(name = "DATA_MOVEMENT")
     public boolean isDataMovement() {
         return dataMovement;
     }
@@ -117,7 +142,6 @@ public void setDataMovement(boolean dataMovement) {
         this.dataMovement = dataMovement;
     }
 
-    @Column(name = "LOCATION")
     public String getLocation() {
         return location;
     }
@@ -126,7 +150,6 @@ public void setLocation(String location) {
         this.location = location;
     }
 
-    @Column(name = "SEARCH_QUERY")
     public String getSearchQuery() {
         return searchQuery;
     }
@@ -135,7 +158,6 @@ public void setSearchQuery(String searchQuery) {
         this.searchQuery = searchQuery;
     }
 
-    @Column(name = "OUTPUT_STREAMING")
     public boolean isOutputStreaming() {
         return outputStreaming;
     }
@@ -144,7 +166,6 @@ public void setOutputStreaming(boolean outputStreaming) {
         this.outputStreaming = outputStreaming;
     }
 
-    @Column(name = "STORAGE_RESOURCE_ID")
     public String getStorageResourceId() {
         return storageResourceId;
     }
@@ -153,8 +174,6 @@ public void setStorageResourceId(String storageResourceId) {
         this.storageResourceId = storageResourceId;
     }
 
-    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     public ProcessEntity getProcess() {
         return process;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputPK.java
index bde7c508c4..fbb200fa15 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputPK.java
@@ -20,16 +20,21 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the process_output database table.
+ */
 public class ProcessOutputPK implements Serializable {
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
     private String processId;
     private String name;
 
-    @Id
-    @Column(name = "PROCESS_ID")
+    public ProcessOutputPK() {
+    }
+
     public String getProcessId() {
         return processId;
     }
@@ -38,8 +43,6 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Id
-    @Column(name = "OUTPUT_NAME")
     public String getName() {
         return name;
     }
@@ -48,23 +51,25 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ProcessOutputPK that = (ProcessOutputPK) o;
-
-        if (getProcessId() != null ? !getProcessId().equals(that.getProcessId()) : that.getProcessId() != null) return false;
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ProcessOutputPK)) {
+            return false;
+        }
+        ProcessOutputPK castOther = (ProcessOutputPK) other;
+        return
+                this.processId.equals(castOther.processId)
+                        && this.name.equals(castOther.name);
     }
 
-    @Override
     public int hashCode() {
-        int result = getProcessId() != null ? getProcessId().hashCode() : 0;
-        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.processId.hashCode();
+        hash = hash * prime + this.name.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessResourceSchedulingEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessResourceScheduleEntity.java
similarity index 65%
rename from modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessResourceSchedulingEntity.java
rename to modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessResourceScheduleEntity.java
index 3a64f42c52..d91d97484c 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessResourceSchedulingEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessResourceScheduleEntity.java
@@ -21,27 +21,48 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
+/**
+ * The persistent class for the process_resource_schedule database table.
+ */
 @Entity
-@Table(name = "EXPCAT_PROCESS_RESOURCE_SCHEDULING")
-public class ProcessResourceSchedulingEntity {
+@Table(name = "PROCESS_RESOURCE_SCHEDULE")
+public class ProcessResourceScheduleEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "PROCESS_ID")
     private String processId;
+
+    @Column(name = "RESOURCE_HOST_ID")
     private String resourceHostId;
+
+    @Column(name = "TOTAL_CPU_COUNT")
     private int totalCPUCount;
+
+    @Column(name = "NODE_COUNT")
     private int nodeCount;
+
+    @Column(name = "NUMBER_OF_THREADS")
     private int numberOfThreads;
+
+    @Column(name = "QUEUE_NAME")
     private String queueName;
+
+    @Column(name = "WALL_TIME_LIMIT")
     private int wallTimeLimit;
+
+    @Column(name = "TOTAL_PHYSICAL_MEMORY")
     private int totalPhysicalMemory;
-    private String chessisNumber;
-    private String staticWorkingDir;
-    private String overrideLoginUserName;
-    private String overrideScratchLocation;
-    private String overrideAllocationProjectNumber;
+
+    @OneToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL)
+    @PrimaryKeyJoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
 
-    @Id
-    @Column(name = "PROCESS_ID")
+    public ProcessResourceScheduleEntity() {
+    }
+
     public String getProcessId() {
         return processId;
     }
@@ -50,7 +71,6 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Column(name = "RESOURCE_HOST_ID")
     public String getResourceHostId() {
         return resourceHostId;
     }
@@ -59,7 +79,6 @@ public void setResourceHostId(String resourceHostId) {
         this.resourceHostId = resourceHostId;
     }
 
-    @Column(name = "CPU_COUNT")
     public int getTotalCPUCount() {
         return totalCPUCount;
     }
@@ -68,7 +87,6 @@ public void setTotalCPUCount(int totalCPUCount) {
         this.totalCPUCount = totalCPUCount;
     }
 
-    @Column(name = "NODE_COUNT")
     public int getNodeCount() {
         return nodeCount;
     }
@@ -77,7 +95,6 @@ public void setNodeCount(int nodeCount) {
         this.nodeCount = nodeCount;
     }
 
-    @Column(name = "NUMBER_OF_THREADS")
     public int getNumberOfThreads() {
         return numberOfThreads;
     }
@@ -86,7 +103,6 @@ public void setNumberOfThreads(int numberOfThreads) {
         this.numberOfThreads = numberOfThreads;
     }
 
-    @Column(name = "QUEUE_NAME")
     public String getQueueName() {
         return queueName;
     }
@@ -95,7 +111,6 @@ public void setQueueName(String queueName) {
         this.queueName = queueName;
     }
 
-    @Column(name = "WALL_TIME_LIMIT")
     public int getWallTimeLimit() {
         return wallTimeLimit;
     }
@@ -104,7 +119,6 @@ public void setWallTimeLimit(int wallTimeLimit) {
         this.wallTimeLimit = wallTimeLimit;
     }
 
-    @Column(name = "TOTAL_PHYSICAL_MEMORY")
     public int getTotalPhysicalMemory() {
         return totalPhysicalMemory;
     }
@@ -113,53 +127,6 @@ public void setTotalPhysicalMemory(int totalPhysicalMemory) {
         this.totalPhysicalMemory = totalPhysicalMemory;
     }
 
-    @Column(name = "CHESSIS_NUMBER")
-    public String getChessisNumber() {
-        return chessisNumber;
-    }
-
-    public void setChessisNumber(String chessisNumber) {
-        this.chessisNumber = chessisNumber;
-    }
-
-    @Column(name = "STATIC_WORKING_DIRECTORY")
-    public String getStaticWorkingDir() {
-        return staticWorkingDir;
-    }
-
-    public void setStaticWorkingDir(String staticWorkingDir) {
-        this.staticWorkingDir = staticWorkingDir;
-    }
-
-    @Column(name = "OVERRIDE_LOGIN_USERNAME")
-    public String getOverrideLoginUserName() {
-        return overrideLoginUserName;
-    }
-
-    public void setOverrideLoginUserName(String overrideLoginUserName) {
-        this.overrideLoginUserName = overrideLoginUserName;
-    }
-
-    @Column(name = "OVERRIDE_SCRATCH_LOCATION")
-    public String getOverrideScratchLocation() {
-        return overrideScratchLocation;
-    }
-
-    public void setOverrideScratchLocation(String overrideScratchLocation) {
-        this.overrideScratchLocation = overrideScratchLocation;
-    }
-
-    @Column(name = "OVERRIDE_ALLOCATION_PROJECT_NUMBER")
-    public String getOverrideAllocationProjectNumber() {
-        return overrideAllocationProjectNumber;
-    }
-
-    public void setOverrideAllocationProjectNumber(String overrideAllocationProjectNumber) {
-        this.overrideAllocationProjectNumber = overrideAllocationProjectNumber;
-    }
-
-    @OneToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL)
-    @PrimaryKeyJoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     public ProcessEntity getProcess() {
         return process;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusEntity.java
index 7a3c30ef91..543fb84265 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusEntity.java
@@ -21,20 +21,51 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 
+/**
+ * The persistent class for the process_status database table.
+ */
 @Entity
-@Table(name = "EXPCAT_PROCESS_STATUS")
+@Table(name = "PROCESS_STATUS")
 @IdClass(ProcessStatusPK.class)
-public class ProcessStatusEntity {
+public class ProcessStatusEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "STATUS_ID")
+    private String statusId;
+
+    @Id
+    @Column(name = "PROCESS_ID")
     private String processId;
+
+    @Column(name = "STATE")
     private String state;
-    private long timeOfStateChange;
+
+    @Column(name = "TIME_OF_STATE_CHANGE")
+    private Timestamp timeOfStateChange;
+
+    @Lob
+    @Column(name = "REASON")
     private String reason;
 
+    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
 
-    @Id
-    @Column(name = "PROCESS_ID")
+    public ProcessStatusEntity() {
+    }
+
+    public String getStatusId() {
+        return statusId;
+    }
+
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
+    }
+
     public String getProcessId() {
         return processId;
     }
@@ -43,8 +74,6 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Id
-    @Column(name = "STATE")
     public String getState() {
         return state;
     }
@@ -53,16 +82,14 @@ public void setState(String state) {
         this.state = state;
     }
 
-    @Column(name = "TIME_OF_STATE_CHANGE")
-    public long getTimeOfStateChange() {
+    public Timestamp getTimeOfStateChange() {
         return timeOfStateChange;
     }
 
-    public void setTimeOfStateChange(long timeOfStateChange) {
+    public void setTimeOfStateChange(Timestamp timeOfStateChange) {
         this.timeOfStateChange = timeOfStateChange;
     }
 
-    @Column(name = "REASON")
     public String getReason() {
         return reason;
     }
@@ -71,8 +98,6 @@ public void setReason(String reason) {
         this.reason = reason;
     }
 
-    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     public ProcessEntity getProcess() {
         return process;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusPK.java
index dba568a522..43aa03edff 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessStatusPK.java
@@ -20,30 +20,29 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the process_status database table.
+ */
 public class ProcessStatusPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(ProcessStatusPK.class);
-    private String state;
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String statusId;
     private String processId;
 
-    @Id
-    @Column(name = "STATUS_ID")
-    public String getState() {
-        return state;
+    public ProcessStatusPK() {
+    }
+
+    public String getStatusId() {
+        return statusId;
     }
 
-    public void setState(String state) {
-        this.state = state;
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
     }
 
-    @Id
-    @Column(name = "PROCESS_ID")
     public String getProcessId() {
         return processId;
     }
@@ -52,23 +51,25 @@ public void setProcessId(String processId) {
         this.processId = processId;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ProcessStatusPK that = (ProcessStatusPK) o;
-
-        if (getState() != null ? !getState().equals(that.getState()) : that.getState() != null) return false;
-        if (getProcessId() != null ? !getProcessId().equals(that.getProcessId()) : that.getProcessId() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ProcessStatusPK)) {
+            return false;
+        }
+        ProcessStatusPK castOther = (ProcessStatusPK) other;
+        return
+                this.statusId.equals(castOther.statusId)
+                        && this.processId.equals(castOther.processId);
     }
 
-    @Override
     public int hashCode() {
-        int result = getState() != null ? getState().hashCode() : 0;
-        result = 31 * result + (getProcessId() != null ? getProcessId().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.statusId.hashCode();
+        hash = hash * prime + this.processId.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/ProjectEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectEntity.java
similarity index 77%
rename from modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/ProjectEntity.java
rename to modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectEntity.java
index 31e0868094..419f2d8656 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/workspacecatalog/ProjectEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectEntity.java
@@ -18,25 +18,43 @@
  * under the License.
  *
 */
-package org.apache.airavata.registry.core.entities.workspacecatalog;
+package org.apache.airavata.registry.core.entities.expcatalog;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
+import java.util.List;
+import java.io.Serializable;
+import java.sql.Timestamp;
 
+/**
+ * The persistent class for the project database table.
+ */
 @Entity
-@Table(name = "WORKSPACE_PROJECT")
-public class ProjectEntity {
+@Table(name = "PROJECT")
+public class ProjectEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "PROJECT_ID")
     private String projectID;
+
+    @Column(name = "USER_NAME")
     private String owner;
+
+    @Column(name = "GATEWAY_ID")
     private String gatewayId;
+
+    @Column(name = "PROJECT_NAME")
     private String name;
+
+    @Column(name = "DESCRIPTION")
     private String description;
-    private long creationTime;
 
-    @Id
-    @Column(name = "PROJECT_ID")
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    public ProjectEntity() {
+    }
+
     public String getProjectID() {
         return projectID;
     }
@@ -45,7 +63,6 @@ public void setProjectID(String projectID) {
         this.projectID = projectID;
     }
 
-    @Column(name = "OWNER")
     public String getOwner() {
         return owner;
     }
@@ -54,7 +71,6 @@ public void setOwner(String owner) {
         this.owner = owner;
     }
 
-    @Column(name = "GATEWAY_ID")
     public String getGatewayId() {
         return gatewayId;
     }
@@ -63,7 +79,6 @@ public void setGatewayId(String gatewayId) {
         this.gatewayId = gatewayId;
     }
 
-    @Column(name = "PROJECT_NAME")
     public String getName() {
         return name;
     }
@@ -72,7 +87,6 @@ public void setName(String name) {
         this.name = name;
     }
 
-    @Column(name = "DESCRIPTION")
     public String getDescription() {
         return description;
     }
@@ -81,12 +95,12 @@ public void setDescription(String description) {
         this.description = description;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
+
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectUserEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectUserEntity.java
new file mode 100644
index 0000000000..a371d2aae2
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectUserEntity.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * The persistent class for the project_user database table.
+ */
+@Entity
+@Table(name="PROJECT_USER")
+@IdClass(ProjectUserPK.class)
+public class ProjectUserEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "PROJECT_ID")
+    private String projectID;
+
+    @Id
+    @Column(name = "USER_NAME")
+    private String userName;
+
+    public ProjectUserEntity() {
+    }
+
+    public String getProjectID() {
+        return projectID;
+    }
+
+    public void setProjectID(String projectID) {
+        this.projectID = projectID;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectUserPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectUserPK.java
new file mode 100644
index 0000000000..4a0078212b
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProjectUserPK.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import java.io.Serializable;
+
+/**
+ * The primary key class for the project_user database table.
+ */
+public class ProjectUserPK implements Serializable {
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String projectID;
+    private String userName;
+
+    public ProjectUserPK() {
+    }
+
+    public String getProjectID() {
+        return projectID;
+    }
+
+    public void setProjectID(String projectID) {
+        this.projectID = projectID;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof ProjectUserPK)) {
+            return false;
+        }
+        ProjectUserPK castOther = (ProjectUserPK) other;
+        return
+                this.projectID.equals(castOther.projectID)
+                        && this.userName.equals(castOther.userName);
+    }
+
+    public int hashCode() {
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.projectID.hashCode();
+        hash = hash * prime + this.userName.hashCode();
+
+        return hash;
+    }
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/QueueStatusEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/QueueStatusEntity.java
new file mode 100644
index 0000000000..2f5987d36b
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/QueueStatusEntity.java
@@ -0,0 +1,109 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.sql.Timestamp;
+
+/**
+ * The persistent class for the queue_status database table.
+ */
+@Entity
+@Table(name = "QUEUE_STATUS")
+@IdClass(QueueStatusPK.class)
+public class QueueStatusEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "HOST_NAME")
+    private String hostName;
+
+    @Id
+    @Column(name = "QUEUE_NAME")
+    private String queueName;
+
+    @Id
+    @Column(name = "CREATED_TIME")
+    private BigInteger time;
+
+    @Column(name = "QUEUE_UP")
+    private boolean queueUp;
+
+    @Column(name = "RUNNING_JOBS")
+    private boolean runningJobs;
+
+    @Column(name = "QUEUED_JOBS")
+    private int queuedJobs;
+
+    public QueueStatusEntity() {
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public void setQueueName(String queueName) {
+        this.queueName = queueName;
+    }
+
+    public BigInteger getTime() {
+        return time;
+    }
+
+    public void setTime(BigInteger time) {
+        this.time = time;
+    }
+
+    public boolean isQueueUp() {
+        return queueUp;
+    }
+
+    public void setQueueUp(boolean queueUp) {
+        this.queueUp = queueUp;
+    }
+
+    public boolean isRunningJobs() {
+        return runningJobs;
+    }
+
+    public void setRunningJobs(boolean runningJobs) {
+        this.runningJobs = runningJobs;
+    }
+
+    public int getQueuedJobs() {
+        return queuedJobs;
+    }
+
+    public void setQueuedJobs(int queuedJobs) {
+        this.queuedJobs = queuedJobs;
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/QueueStatusPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/QueueStatusPK.java
new file mode 100644
index 0000000000..05b8097ac0
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/QueueStatusPK.java
@@ -0,0 +1,89 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.entities.expcatalog;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.sql.Timestamp;
+
+/**
+ * The primary key class for the queue_status database table.
+ */
+public class QueueStatusPK implements Serializable {
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String hostName;
+    private String queueName;
+    private BigInteger time;
+
+    public QueueStatusPK() {
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public void setQueueName(String queueName) {
+        this.queueName = queueName;
+    }
+
+    public BigInteger getTime() {
+        return time;
+    }
+
+    public void setTime(BigInteger time) {
+        this.time = time;
+    }
+
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof QueueStatusPK)) {
+            return false;
+        }
+        QueueStatusPK castOther = (QueueStatusPK) other;
+        return
+                this.hostName.equals(castOther.hostName)
+                        && this.queueName.equals(castOther.queueName)
+                                && this.time.equals(castOther.time);
+    }
+
+    public int hashCode() {
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.hostName.hashCode();
+        hash = hash * prime + this.queueName.hashCode();
+        hash = hash * prime + this.time.hashCode();
+
+        return hash;
+    }
+
+}
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 8e4be82925..0bda9b6833 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
@@ -23,28 +23,65 @@
 import org.apache.airavata.model.task.TaskTypes;
 
 import javax.persistence.*;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
+import java.sql.Timestamp;
 import java.util.List;
 
+/**
+ * The persistent class for the task database table.
+ */
 @Entity
-@Table(name = "EXPCAT_TASK")
-public class TaskEntity {
+@Table(name = "TASK")
+public class TaskEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "TASK_ID")
     private String taskId;
+
+    @Column(name = "TASK_TYPE")
     private TaskTypes taskType;
+
+    @Column(name = "PARENT_PROCESS_ID")
     private String parentProcessId;
-    private long creationTime;
-    private long lastUpdateTime;
+
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    @Column(name = "LAST_UPDATE_TIME")
+    private Timestamp lastUpdateTime;
+
+    @Lob
+    @Column(name = "TASK_DETAIL")
     private String taskDetail;
+
+    @Column(name = "TASK_INTERNAL_STORE")
+    private ByteBuffer taskInternalStore;
+
+    @Lob
+    @Column(name = "SUB_TASK_MODEL")
     private ByteBuffer subTaskModel;
 
+    @OneToMany(targetEntity = TaskStatusEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "task", fetch = FetchType.EAGER)
     private List<TaskStatusEntity> taskStatuses;
+
+    @OneToMany(targetEntity = TaskErrorEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "task", fetch = FetchType.EAGER)
     private List<TaskErrorEntity> taskErrors;
+
+    @OneToMany(targetEntity = JobEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "task", fetch = FetchType.EAGER)
     private List<JobEntity> jobs;
 
+    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "PARENT_PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
 
-    @Id
-    @Column(name = "TASK_ID")
+    public TaskEntity() {
+    }
+
     public String getTaskId() {
         return taskId;
     }
@@ -53,7 +90,6 @@ public void setTaskId(String taskId) {
         this.taskId = taskId;
     }
 
-    @Column(name = "TASK_TYPE")
     public TaskTypes getTaskType() {
         return taskType;
     }
@@ -62,7 +98,6 @@ public void setTaskType(TaskTypes taskType) {
         this.taskType = taskType;
     }
 
-    @Column(name = "PARENT_PROCESS_ID")
     public String getParentProcessId() {
         return parentProcessId;
     }
@@ -71,25 +106,22 @@ public void setParentProcessId(String parentProcessId) {
         this.parentProcessId = parentProcessId;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "LAST_UPDATE_TIME")
-    public long getLastUpdateTime() {
+    public Timestamp getLastUpdateTime() {
         return lastUpdateTime;
     }
 
-    public void setLastUpdateTime(long lastUpdateTime) {
+    public void setLastUpdateTime(Timestamp lastUpdateTime) {
         this.lastUpdateTime = lastUpdateTime;
     }
 
-    @Column(name = "TASK_DETAIL")
     public String getTaskDetail() {
         return taskDetail;
     }
@@ -98,8 +130,14 @@ public void setTaskDetail(String taskDetail) {
         this.taskDetail = taskDetail;
     }
 
-    @Lob
-    @Column(name = "SUB_TASK_MODEL")
+    public ByteBuffer getTaskInternalStore() {
+        return taskInternalStore;
+    }
+
+    public void setTaskInternalStore(ByteBuffer taskInternalStore) {
+        this.taskInternalStore = taskInternalStore;
+    }
+
     public ByteBuffer getSubTaskModel() {
         return subTaskModel;
     }
@@ -108,25 +146,22 @@ public void setSubTaskModel(ByteBuffer subTaskModel) {
         this.subTaskModel = subTaskModel;
     }
 
-    @OneToMany(targetEntity = TaskStatusEntity.class, cascade = CascadeType.ALL, mappedBy = "task")
     public List<TaskStatusEntity> getTaskStatuses() {
         return taskStatuses;
     }
 
-    public void setTaskStatuses(List<TaskStatusEntity> taskStatus) {
-        this.taskStatuses = taskStatus;
+    public void setTaskStatuses(List<TaskStatusEntity> taskStatuses) {
+        this.taskStatuses = taskStatuses;
     }
 
-    @OneToMany(targetEntity = TaskErrorEntity.class, cascade = CascadeType.ALL, mappedBy = "task")
     public List<TaskErrorEntity> getTaskErrors() {
         return taskErrors;
     }
 
-    public void setTaskErrors(List<TaskErrorEntity> taskError) {
-        this.taskErrors = taskError;
+    public void setTaskErrors(List<TaskErrorEntity> taskErrors) {
+        this.taskErrors = taskErrors;
     }
 
-    @OneToMany(targetEntity = JobEntity.class, cascade = CascadeType.ALL, mappedBy = "task")
     public List<JobEntity> getJobs() {
         return jobs;
     }
@@ -135,8 +170,6 @@ public void setJobs(List<JobEntity> jobs) {
         this.jobs = jobs;
     }
 
-    @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PARENT_PROCESS_ID", referencedColumnName = "PROCESS_ID")
     public ProcessEntity getProcess() {
         return process;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorEntity.java
index d269ab70fe..98fe6a0378 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorEntity.java
@@ -21,24 +21,52 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 import java.util.List;
 
+/**
+ * The persistent class for the task_error database table.
+ */
 @Entity
-@Table(name = "EXPCAT_TASK_ERROR")
+@Table(name = "TASK_ERROR")
 @IdClass(TaskErrorPK.class)
-public class TaskErrorEntity {
+public class TaskErrorEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "ERROR_ID")
     private String errorId;
+
+    @Id
+    @Column(name = "TASK_ID")
     private String taskId;
-    private long creationTime;
+
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
+    @Lob
+    @Column(name = "ACTUAL_ERROR_MESSAGE")
     private String actualErrorMessage;
+
+    @Lob
+    @Column(name = "USER_FRIENDLY_MESSAGE")
     private String userFriendlyMessage;
+
+    @Column(name = "TRANSIENT_OR_PERSISTENT")
     private boolean transientOrPersistent;
-    private List<String> rootCauseErrorIdList;
 
+    @Lob
+    @Column(name = "ROOT_CAUSE_ERROR_ID_LIST")
+    private String rootCauseErrorIdList;
+
+    @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
     private TaskEntity task;
 
-    @Id
-    @Column(name = "ERROR_ID")
+    public TaskErrorEntity() {
+    }
+
     public String getErrorId() {
         return errorId;
     }
@@ -47,8 +75,6 @@ public void setErrorId(String errorId) {
         this.errorId = errorId;
     }
 
-    @Id
-    @Column(name = "TASK_ID")
     public String getTaskId() {
         return taskId;
     }
@@ -57,16 +83,14 @@ public void setTaskId(String taskId) {
         this.taskId = taskId;
     }
 
-    @Column(name = "CREATION_TIME")
-    public long getCreationTime() {
+    public Timestamp getCreationTime() {
         return creationTime;
     }
 
-    public void setCreationTime(long creationTime) {
+    public void setCreationTime(Timestamp creationTime) {
         this.creationTime = creationTime;
     }
 
-    @Column(name = "ACTUAL_ERROR_MESSAGE")
     public String getActualErrorMessage() {
         return actualErrorMessage;
     }
@@ -75,7 +99,6 @@ public void setActualErrorMessage(String actualErrorMessage) {
         this.actualErrorMessage = actualErrorMessage;
     }
 
-    @Column(name = "USER_FRIENDLY_MESSAGE")
     public String getUserFriendlyMessage() {
         return userFriendlyMessage;
     }
@@ -84,8 +107,6 @@ public void setUserFriendlyMessage(String userFriendlyMessage) {
         this.userFriendlyMessage = userFriendlyMessage;
     }
 
-
-    @Column(name = "TRANSIENT_OR_PERSISTENT")
     public boolean isTransientOrPersistent() {
         return transientOrPersistent;
     }
@@ -94,20 +115,14 @@ public void setTransientOrPersistent(boolean transientOrPersistent) {
         this.transientOrPersistent = transientOrPersistent;
     }
 
-
-    @ElementCollection
-    @CollectionTable(name="EXPCAT_EXPERIMENT_ERROR_ROOT_CAUSE_ERROR_ID", joinColumns = @JoinColumn(name="ERROR_ID"))
-    public List<String> getRootCauseErrorIdList() {
+    public String getRootCauseErrorIdList() {
         return rootCauseErrorIdList;
     }
 
-    public void setRootCauseErrorIdList(List<String> rootCauseErrorIdList) {
+    public void setRootCauseErrorIdList(String rootCauseErrorIdList) {
         this.rootCauseErrorIdList = rootCauseErrorIdList;
     }
 
-
-    @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
     public TaskEntity getTask() {
         return task;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorPK.java
index e504f837c0..58b6618bb2 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskErrorPK.java
@@ -20,20 +20,21 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the task_error database table.
+ */
 public class TaskErrorPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(TaskErrorPK.class);
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
     private String errorId;
     private String taskId;
 
-    @Column(name = "ERROR_ID")
-    @Id
+    public TaskErrorPK() {
+    }
+
     public String getErrorId() {
         return errorId;
     }
@@ -42,8 +43,6 @@ public void setErrorId(String errorId) {
         this.errorId = errorId;
     }
 
-    @Column(name = "TASK_ID")
-    @Id
     public String getTaskId() {
         return taskId;
     }
@@ -52,24 +51,25 @@ public void setTaskId(String processId) {
         this.taskId = taskId;
     }
 
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        TaskErrorPK that = (TaskErrorPK) o;
-
-        if (getErrorId() != null ? !getErrorId().equals(that.getErrorId()) : that.getErrorId() != null) return false;
-        if (getTaskId() != null ? !getTaskId().equals(that.getTaskId()) : that.getTaskId() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof TaskErrorPK)) {
+            return false;
+        }
+        TaskErrorPK castOther = (TaskErrorPK) other;
+        return
+                this.errorId.equals(castOther.errorId)
+                        && this.taskId.equals(castOther.taskId);
     }
 
-    @Override
     public int hashCode() {
-        int result = getErrorId() != null ? getErrorId().hashCode() : 0;
-        result = 31 * result + (getTaskId() != null ? getTaskId().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.errorId.hashCode();
+        hash = hash * prime + this.taskId.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusEntity.java
index 2465b48cde..2f5b2ff5f8 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusEntity.java
@@ -21,20 +21,51 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
 
+/**
+ * The persistent class for the task_status database table.
+ */
 @Entity
-@Table(name = "EXPCAT_TASK_STATUS")
+@Table(name = "TASK_STATUS")
 @IdClass(TaskStatusPK.class)
-public class TaskStatusEntity {
+public class TaskStatusEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "STATUS_ID")
+    private String statusId;
+
+    @Id
+    @Column(name = "TASK_ID")
     private String taskId;
+
+    @Column(name = "STATE")
     private String state;
-    private long timeOfStateChange;
+
+    @Column(name = "TIME_OF_STATE_CHANGE")
+    private Timestamp timeOfStateChange;
+
+    @Lob
+    @Column(name = "REASON")
     private String reason;
 
+    @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
     private TaskEntity task;
 
-    @Id
-    @Column(name = "TASK_ID")
+    public TaskStatusEntity() {
+    }
+
+    public String getStatusId() {
+        return statusId;
+    }
+
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
+    }
+
     public String getTaskId() {
         return taskId;
     }
@@ -43,8 +74,6 @@ public void setTaskId(String taskId) {
         this.taskId = taskId;
     }
 
-    @Id
-    @Column(name = "STATE")
     public String getState() {
         return state;
     }
@@ -53,16 +82,14 @@ public void setState(String state) {
         this.state = state;
     }
 
-    @Column(name = "TIME_OF_STATE_CHANGE")
-    public long getTimeOfStateChange() {
+    public Timestamp getTimeOfStateChange() {
         return timeOfStateChange;
     }
 
-    public void setTimeOfStateChange(long timeOfStateChange) {
+    public void setTimeOfStateChange(Timestamp timeOfStateChange) {
         this.timeOfStateChange = timeOfStateChange;
     }
 
-    @Column(name = "REASON")
     public String getReason() {
         return reason;
     }
@@ -71,8 +98,6 @@ public void setReason(String reason) {
         this.reason = reason;
     }
 
-    @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
     public TaskEntity getTask() {
         return task;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusPK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusPK.java
index 167d8a70de..821c09e809 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusPK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/TaskStatusPK.java
@@ -20,30 +20,29 @@
 */
 package org.apache.airavata.registry.core.entities.expcatalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
 import java.io.Serializable;
 
+/**
+ * The primary key class for the task_status database table.
+ */
 public class TaskStatusPK implements Serializable {
-    private final static Logger logger = LoggerFactory.getLogger(TaskStatusPK.class);
-    private String state;
+    //default serial version id, required for serializable classes.
+    private static final long serialVersionUID = 1L;
+
+    private String statusId;
     private String taskId;
 
-    @Id
-    @Column(name = "STATUS_ID")
-    public String getState() {
-        return state;
+    public TaskStatusPK() {
+    }
+
+    public String getStatusId() {
+        return statusId;
     }
 
-    public void setState(String state) {
-        this.state = state;
+    public void setStatusId(String statusId) {
+        this.statusId = statusId;
     }
 
-    @Id
-    @Column(name = "TASK_ID")
     public String getTaskId() {
         return taskId;
     }
@@ -52,23 +51,25 @@ public void setTaskId(String taskId) {
         this.taskId = taskId;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        TaskStatusPK that = (TaskStatusPK) o;
-
-        if (getState() != null ? !getState().equals(that.getState()) : that.getState() != null) return false;
-        if (getTaskId() != null ? !getTaskId().equals(that.getTaskId()) : that.getTaskId() != null) return false;
-
-        return true;
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof TaskStatusPK)) {
+            return false;
+        }
+        TaskStatusPK castOther = (TaskStatusPK) other;
+        return
+                this.statusId.equals(castOther.statusId)
+                        && this.taskId.equals(castOther.taskId);
     }
 
-    @Override
     public int hashCode() {
-        int result = getState() != null ? getState().hashCode() : 0;
-        result = 31 * result + (getTaskId() != null ? getTaskId().hashCode() : 0);
-        return result;
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.statusId.hashCode();
+        hash = hash * prime + this.taskId.hashCode();
+
+        return hash;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ComputeResourceSchedulingEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/UserConfigurationDataEntity.java
similarity index 53%
rename from modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ComputeResourceSchedulingEntity.java
rename to modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/UserConfigurationDataEntity.java
index bfbb3e2046..70f5ec110a 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ComputeResourceSchedulingEntity.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/UserConfigurationDataEntity.java
@@ -21,27 +21,90 @@
 package org.apache.airavata.registry.core.entities.expcatalog;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
+/**
+ * The persistent class for the user_configuration_data database table.
+ */
 @Entity
-@Table(name = "EXPCAT_COMPUTE_RESOURCE_SCHEDULING")
-public class ComputeResourceSchedulingEntity {
+@Table(name = "USER_CONFIGURATION_DATA")
+public class UserConfigurationDataEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "EXPERIMENT_ID")
     private String experimentId;
+
+    @Column(name = "AIRAVATA_AUTO_SCHEDULE")
+    private boolean airavataAutoSchedule;
+
+    @Column(name = "OVERRIDE_MANUAL_SCHEDULED_PARAMS")
+    private boolean overrideManualScheduledParams;
+
+    @Column(name = "SHARE_EXPERIMENT_PUBLICALLY")
+    private boolean shareExperimentPublicly;
+
+    @Column(name = "THROTTLE_RESOURCES")
+    private boolean throttleResources;
+
+    @Column(name = "USER_DN")
+    private String userDN;
+
+    @Column(name = "GENERATE_CERT")
+    private boolean generateCert;
+
+    @Column(name = "RESOURCE_HOST_ID")
     private String resourceHostId;
+
+    @Column(name = "TOTAL_CPU_COUNT")
     private int totalCPUCount;
+
+    @Column(name = "NODE_COUNT")
     private int nodeCount;
+
+    @Column(name = "NUMBER_OF_THREADS")
     private int numberOfThreads;
+
+    @Column(name = "QUEUE_NAME")
     private String queueName;
+
+    @Column(name = "WALL_TIME_LIMIT")
     private int wallTimeLimit;
+
+    @Column(name = "TOTAL_PHYSICAL_MEMORY")
     private int totalPhysicalMemory;
-    private String chessisNumber;
+
+    @Column(name = "STATIC_WORKING_DIR")
     private String staticWorkingDir;
+
+    @Column(name = "OVERRIDE_LOGIN_USER_NAME")
     private String overrideLoginUserName;
+
+    @Column(name = "OVERRIDE_SCRATCH_LOCATION")
     private String overrideScratchLocation;
+
+    @Column(name = "OVERRIDE_ALLOCATION_PROJECT_NUMBER")
     private String overrideAllocationProjectNumber;
-    private UserConfigurationEntity userConfiguration;
 
-    @Id
-    @Column(name = "EXPERIMENT_ID")
+    @Column(name = "STORAGE_RESOURCE_ID")
+    private String storageId;
+
+    @Column(name = "EXPERIMENT_DATA_DIR", length = 512)
+    private String experimentDataDir;
+
+    @Column(name = "GROUP_RESOURCE_PROFILE_ID")
+    private String groupResourceProfileId;
+
+    @Column(name = "IS_USE_USER_CR_PREF")
+    private boolean useUserCRPref;
+
+    @OneToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL)
+    @PrimaryKeyJoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
+    private ExperimentEntity experiment;
+
+    public UserConfigurationDataEntity() {
+    }
+
     public String getExperimentId() {
         return experimentId;
     }
@@ -50,7 +113,54 @@ public void setExperimentId(String experimentId) {
         this.experimentId = experimentId;
     }
 
-    @Column(name = "RESOURCE_HOST_ID")
+    public boolean isAiravataAutoSchedule() {
+        return airavataAutoSchedule;
+    }
+
+    public void setAiravataAutoSchedule(boolean airavataAutoSchedule) {
+        this.airavataAutoSchedule = airavataAutoSchedule;
+    }
+
+    public boolean isOverrideManualScheduledParams() {
+        return overrideManualScheduledParams;
+    }
+
+    public void setOverrideManualScheduledParams(boolean overrideManualScheduledParams) {
+        this.overrideManualScheduledParams = overrideManualScheduledParams;
+    }
+
+    public boolean isShareExperimentPublicly() {
+        return shareExperimentPublicly;
+    }
+
+    public void setShareExperimentPublicly(boolean shareExperimentPublicly) {
+        this.shareExperimentPublicly = shareExperimentPublicly;
+    }
+
+    public boolean isThrottleResources() {
+        return throttleResources;
+    }
+
+    public void setThrottleResources(boolean throttleResources) {
+        this.throttleResources = throttleResources;
+    }
+
+    public String getUserDN() {
+        return userDN;
+    }
+
+    public void setUserDN(String userDN) {
+        this.userDN = userDN;
+    }
+
+    public boolean isGenerateCert() {
+        return generateCert;
+    }
+
+    public void setGenerateCert(boolean generateCert) {
+        this.generateCert = generateCert;
+    }
+
     public String getResourceHostId() {
         return resourceHostId;
     }
@@ -59,7 +169,6 @@ public void setResourceHostId(String resourceHostId) {
         this.resourceHostId = resourceHostId;
     }
 
-    @Column(name = "CPU_COUNT")
     public int getTotalCPUCount() {
         return totalCPUCount;
     }
@@ -68,7 +177,6 @@ public void setTotalCPUCount(int totalCPUCount) {
         this.totalCPUCount = totalCPUCount;
     }
 
-    @Column(name = "NODE_COUNT")
     public int getNodeCount() {
         return nodeCount;
     }
@@ -77,7 +185,6 @@ public void setNodeCount(int nodeCount) {
         this.nodeCount = nodeCount;
     }
 
-    @Column(name = "NUMBER_OF_THREADS")
     public int getNumberOfThreads() {
         return numberOfThreads;
     }
@@ -86,7 +193,6 @@ public void setNumberOfThreads(int numberOfThreads) {
         this.numberOfThreads = numberOfThreads;
     }
 
-    @Column(name = "QUEUE_NAME")
     public String getQueueName() {
         return queueName;
     }
@@ -95,7 +201,6 @@ public void setQueueName(String queueName) {
         this.queueName = queueName;
     }
 
-    @Column(name = "WALL_TIME_LIMIT")
     public int getWallTimeLimit() {
         return wallTimeLimit;
     }
@@ -104,7 +209,6 @@ public void setWallTimeLimit(int wallTimeLimit) {
         this.wallTimeLimit = wallTimeLimit;
     }
 
-    @Column(name = "TOTAL_PHYSICAL_MEMORY")
     public int getTotalPhysicalMemory() {
         return totalPhysicalMemory;
     }
@@ -113,16 +217,6 @@ public void setTotalPhysicalMemory(int totalPhysicalMemory) {
         this.totalPhysicalMemory = totalPhysicalMemory;
     }
 
-    @Column(name = "CHESSIS_NUMBER")
-    public String getChessisNumber() {
-        return chessisNumber;
-    }
-
-    public void setChessisNumber(String chessisNumber) {
-        this.chessisNumber = chessisNumber;
-    }
-
-    @Column(name = "STATIC_WORKING_DIRECTORY")
     public String getStaticWorkingDir() {
         return staticWorkingDir;
     }
@@ -131,7 +225,6 @@ public void setStaticWorkingDir(String staticWorkingDir) {
         this.staticWorkingDir = staticWorkingDir;
     }
 
-    @Column(name = "OVERRIDE_LOGIN_USERNAME")
     public String getOverrideLoginUserName() {
         return overrideLoginUserName;
     }
@@ -140,7 +233,6 @@ public void setOverrideLoginUserName(String overrideLoginUserName) {
         this.overrideLoginUserName = overrideLoginUserName;
     }
 
-    @Column(name = "OVERRIDE_SCRATCH_LOCATION")
     public String getOverrideScratchLocation() {
         return overrideScratchLocation;
     }
@@ -149,7 +241,6 @@ public void setOverrideScratchLocation(String overrideScratchLocation) {
         this.overrideScratchLocation = overrideScratchLocation;
     }
 
-    @Column(name = "OVERRIDE_ALLOCATION_PROJECT_NUMBER")
     public String getOverrideAllocationProjectNumber() {
         return overrideAllocationProjectNumber;
     }
@@ -158,13 +249,43 @@ public void setOverrideAllocationProjectNumber(String overrideAllocationProjectN
         this.overrideAllocationProjectNumber = overrideAllocationProjectNumber;
     }
 
-    @OneToOne(targetEntity = UserConfigurationEntity.class, cascade = CascadeType.ALL)
-    @PrimaryKeyJoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
-    public UserConfigurationEntity getUserConfiguration() {
-        return userConfiguration;
+    public String getStorageId() {
+        return storageId;
+    }
+
+    public void setStorageId(String storageId) {
+        this.storageId = storageId;
+    }
+
+    public String getExperimentDataDir() {
+        return experimentDataDir;
+    }
+
+    public void setExperimentDataDir(String experimentDataDir) {
+        this.experimentDataDir = experimentDataDir;
+    }
+
+    public String getGroupResourceProfileId() {
+        return groupResourceProfileId;
+    }
+
+    public void setGroupResourceProfileId(String groupResourceProfileId) {
+        this.groupResourceProfileId = groupResourceProfileId;
+    }
+
+    public boolean isUseUserCRPref() {
+        return useUserCRPref;
+    }
+
+    public void setUseUserCRPref(boolean useUserCRPref) {
+        this.useUserCRPref = useUserCRPref;
+    }
+
+    public ExperimentEntity getExperiment() {
+        return experiment;
     }
 
-    public void setUserConfiguration(UserConfigurationEntity userConfiguration) {
-        this.userConfiguration = userConfiguration;
+    public void setExperiment(ExperimentEntity experiment) {
+        this.experiment = experiment;
     }
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/UserConfigurationEntity.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/UserConfigurationEntity.java
deleted file mode 100644
index b685312515..0000000000
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/UserConfigurationEntity.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-package org.apache.airavata.registry.core.entities.expcatalog;
-
-import javax.persistence.*;
-
-@Entity
-@Table(name = "EXPCAT_USER_CONFIGURATION")
-public class UserConfigurationEntity {
-    private String experimentId;
-    private boolean airavataAutoSchedule;
-    private boolean overrideManualScheduledParams;
-    private boolean throttleResources;
-    private String userDN;
-    private boolean generateCert;
-    private String storageId;
-    private String experimentDataDir;
-
-    private ComputeResourceSchedulingEntity computeResourceSchedulingEntity;
-    private ExperimentEntity experiment;
-
-    @Id
-    @Column(name = "EXPERIMENT_ID")
-    public String getExperimentId() {
-        return experimentId;
-    }
-
-    public void setExperimentId(String experimentId) {
-        this.experimentId = experimentId;
-    }
-
-    @Column(name = "AIRAVATA_AUTO_SCHEDULE")
-    public boolean isAiravataAutoSchedule() {
-        return airavataAutoSchedule;
-    }
-
-    public void setAiravataAutoSchedule(boolean airavataAutoSchedule) {
-        this.airavataAutoSchedule = airavataAutoSchedule;
-    }
-
-    @Column(name = "OVERRIDE_MANUAL_SCHEDULED_PARAMS")
-    public boolean isOverrideManualScheduledParams() {
-        return overrideManualScheduledParams;
-    }
-
-    public void setOverrideManualScheduledParams(boolean overrideManualScheduledParams) {
-        this.overrideManualScheduledParams = overrideManualScheduledParams;
-    }
-
-    @Column(name = "THROTTLE_RESOURCE")
-    public boolean isThrottleResources() {
-        return throttleResources;
-    }
-
-    public void setThrottleResources(boolean throttleResources) {
-        this.throttleResources = throttleResources;
-    }
-
-    @Column(name = "USER_DN")
-    public String getUserDN() {
-        return userDN;
-    }
-
-    public void setUserDN(String userDN) {
-        this.userDN = userDN;
-    }
-
-    @Column(name = "GENERATE_CERT")
-    public boolean isGenerateCert() {
-        return generateCert;
-    }
-
-    public void setGenerateCert(boolean generateCert) {
-        this.generateCert = generateCert;
-    }
-
-    @Column(name = "STORAGE_ID")
-    public String getStorageId() {
-        return storageId;
-    }
-
-    public void setStorageId(String storageId) {
-        this.storageId = storageId;
-    }
-
-    @Column(name = "EXPERIMENT_DATA_DIR")
-    public String getExperimentDataDir() {
-        return experimentDataDir;
-    }
-
-    public void setExperimentDataDir(String experimentDataDir) {
-        this.experimentDataDir = experimentDataDir;
-    }
-
-    @OneToOne(targetEntity = ComputeResourceSchedulingEntity.class, cascade = CascadeType.ALL, mappedBy = "userConfiguration")
-    public ComputeResourceSchedulingEntity getComputeResourceSchedulingEntity() {
-        return computeResourceSchedulingEntity;
-    }
-
-    public void setComputeResourceSchedulingEntity(ComputeResourceSchedulingEntity computeResourceSchedulingEntity) {
-        this.computeResourceSchedulingEntity = computeResourceSchedulingEntity;
-    }
-
-    @OneToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL)
-    @PrimaryKeyJoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
-    public ExperimentEntity getExperiment() {
-        return experiment;
-    }
-
-    public void setExperiment(ExperimentEntity experiment) {
-        this.experiment = experiment;
-    }
-}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExpCatAbstractRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExpCatAbstractRepository.java
new file mode 100644
index 0000000000..f4e110b7c9
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExpCatAbstractRepository.java
@@ -0,0 +1,111 @@
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.registry.core.utils.Committer;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.JPAUtil.ExpCatalogJPAUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public abstract class ExpCatAbstractRepository<T, E, Id> {
+    private final static Logger logger = LoggerFactory.getLogger(ExpCatAbstractRepository.class);
+
+    private Class<T> thriftGenericClass;
+    private Class<E> dbEntityGenericClass;
+
+    public ExpCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
+        this.thriftGenericClass = thriftGenericClass;
+        this.dbEntityGenericClass = dbEntityGenericClass;
+    }
+
+    public T create(T t) {
+        return update(t);
+    }
+
+    public T update(T t) {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        E entity = mapper.map(t, dbEntityGenericClass);
+        E persistedCopy = execute(entityManager -> entityManager.merge(entity));
+        return mapper.map(persistedCopy, thriftGenericClass);
+    }
+
+    public boolean delete(Id id) {
+        execute(entityManager -> {
+            E entity = entityManager.find(dbEntityGenericClass, id);
+            entityManager.remove(entity);
+            return entity;
+        });
+        return true;
+    }
+
+    public T get(Id id) {
+        E entity = execute(entityManager -> entityManager
+                .find(dbEntityGenericClass, id));
+        if(entity == null)
+            return null;
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        return mapper.map(entity, thriftGenericClass);
+    }
+
+    public List<T> select(String query, int offset) {
+        List resultSet = (List) execute(entityManager -> entityManager.createQuery(query).setFirstResult(offset)
+                .getResultList());
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        List<T> gatewayList = new ArrayList<>();
+        resultSet.stream().forEach(rs -> gatewayList.add(mapper.map(rs, thriftGenericClass)));
+        return gatewayList;
+    }
+
+    public List<T> select(String query, int limit, int offset, Map<String, Object> queryParams) {
+        int newLimit = limit < 0 ? DBConstants.SELECT_MAX_ROWS: limit;
+
+        List resultSet = (List) execute(entityManager -> {
+            Query jpaQuery = entityManager.createQuery(query);
+
+            for (Map.Entry<String, Object> entry : queryParams.entrySet()) {
+
+                jpaQuery.setParameter(entry.getKey(), entry.getValue());
+            }
+
+            return jpaQuery.setFirstResult(offset).setMaxResults(newLimit).getResultList();
+
+        });
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        List<T> gatewayList = new ArrayList<>();
+        resultSet.stream().forEach(rs -> gatewayList.add(mapper.map(rs, thriftGenericClass)));
+        return gatewayList;
+    }
+
+    public boolean isExists(Id id) {
+        return get(id) != null;
+    }
+
+    public <R> R execute(Committer<EntityManager, R> committer){
+        EntityManager entityManager = null;
+        try {
+            entityManager = ExpCatalogJPAUtils.getEntityManager();
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to get Experiment Catalog EntityManager", e);
+        }
+        try {
+            entityManager.getTransaction().begin();
+            R r = committer.commit(entityManager);
+            entityManager.getTransaction().commit();
+            return  r;
+        }finally {
+            if (entityManager != null && entityManager.isOpen()) {
+                if (entityManager.getTransaction().isActive()) {
+                    entityManager.getTransaction().rollback();
+                }
+                entityManager.close();
+            }
+        }
+    }
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepository.java
new file mode 100644
index 0000000000..7ae2d42cf2
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepository.java
@@ -0,0 +1,76 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.ErrorModel;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentErrorEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentErrorPK;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class ExperimentErrorRepository extends ExpCatAbstractRepository<ErrorModel, ExperimentErrorEntity, ExperimentErrorPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ExperimentErrorRepository.class);
+
+    public ExperimentErrorRepository() {
+        super(ErrorModel.class, ExperimentErrorEntity.class);
+    }
+
+    protected String saveExperimentError(ErrorModel error, String experimentId) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        ExperimentErrorEntity experimentErrorEntity = mapper.map(error, ExperimentErrorEntity.class);
+
+        if (experimentErrorEntity.getExperimentId() == null) {
+            logger.debug("Setting the ExperimentErrorEntity's ExperimentId");
+            experimentErrorEntity.setExperimentId(experimentId);
+        }
+
+        execute(entityManager -> entityManager.merge(experimentErrorEntity));
+        return experimentErrorEntity.getErrorId();
+    }
+
+    public String addExperimentError(ErrorModel experimentError, String experimentId) throws RegistryException {
+
+        if (experimentError.getErrorId() == null) {
+            logger.debug("Setting the ExperimentError's ErrorId");
+            experimentError.setErrorId(ExpCatalogUtils.getID("ERROR"));
+        }
+
+        return saveExperimentError(experimentError, experimentId);
+    }
+
+    public String updateExperimentError(ErrorModel updatedExperimentError, String experimentId) throws RegistryException {
+        return saveExperimentError(updatedExperimentError, experimentId);
+    }
+
+    public List<ErrorModel> getExperimentErrors(String experimentId) throws RegistryException {
+        ExperimentRepository experimentRepository = new ExperimentRepository();
+        ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
+        return experimentModel.getErrors();
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepository.java
new file mode 100644
index 0000000000..9805830e37
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepository.java
@@ -0,0 +1,71 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentInputEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentInputPK;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class ExperimentInputRepository extends ExpCatAbstractRepository<InputDataObjectType, ExperimentInputEntity, ExperimentInputPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ExperimentInputRepository.class);
+
+    public ExperimentInputRepository() { super(InputDataObjectType.class, ExperimentInputEntity.class); }
+
+    protected void saveExperimentInput(List<InputDataObjectType> experimentInputs, String experimentId) throws RegistryException {
+
+        for (InputDataObjectType input : experimentInputs) {
+            Mapper mapper = ObjectMapperSingleton.getInstance();
+            ExperimentInputEntity experimentInputEntity = mapper.map(input, ExperimentInputEntity.class);
+
+            if (experimentInputEntity.getExperimentId() == null) {
+                logger.debug("Setting the ExperimentInputEntity's ExperimentId");
+                experimentInputEntity.setExperimentId(experimentId);
+            }
+
+            execute(entityManager -> entityManager.merge(experimentInputEntity));
+        }
+
+    }
+
+    public String addExperimentInputs(List<InputDataObjectType> experimentInputs, String experimentId) throws RegistryException {
+        saveExperimentInput(experimentInputs, experimentId);
+        return experimentId;
+    }
+
+    public void updateExperimentInputs(List<InputDataObjectType> updatedExperimentInputs, String experimentId) throws RegistryException {
+        saveExperimentInput(updatedExperimentInputs, experimentId);
+    }
+
+    public List<InputDataObjectType> getExperimentInputs(String experimentId) throws RegistryException {
+        ExperimentRepository experimentRepository = new ExperimentRepository();
+        ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
+        return experimentModel.getExperimentInputs();
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepository.java
new file mode 100644
index 0000000000..702e02da9d
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepository.java
@@ -0,0 +1,73 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentOutputEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentOutputPK;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class ExperimentOutputRepository extends ExpCatAbstractRepository<OutputDataObjectType, ExperimentOutputEntity, ExperimentOutputPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ExperimentOutputRepository.class);
+
+    public ExperimentOutputRepository() {
+        super(OutputDataObjectType.class, ExperimentOutputEntity.class);
+    }
+
+    protected void saveExperimentOutput(List<OutputDataObjectType> experimentOutputs, String experimentId) throws RegistryException {
+
+        for (OutputDataObjectType output : experimentOutputs) {
+            Mapper mapper = ObjectMapperSingleton.getInstance();
+            ExperimentOutputEntity experimentOutputEntity = mapper.map(output, ExperimentOutputEntity.class);
+
+            if (experimentOutputEntity.getExperimentId() == null) {
+                logger.debug("Setting the ExperimentOutputEntity's ExperimentId");
+                experimentOutputEntity.setExperimentId(experimentId);
+            }
+
+            execute(entityManager -> entityManager.merge(experimentOutputEntity));
+        }
+
+    }
+
+    public String addExperimentOutputs(List<OutputDataObjectType> experimentOutputs, String experimentId) throws RegistryException {
+        saveExperimentOutput(experimentOutputs, experimentId);
+        return experimentId;
+    }
+
+    public void updateExperimentOutputs(List<OutputDataObjectType> updatedExperimentOutputs, String experimentId) throws RegistryException {
+        saveExperimentOutput(updatedExperimentOutputs, experimentId);
+    }
+
+    public List<OutputDataObjectType> getExperimentOutputs(String experimentId) throws RegistryException {
+        ExperimentRepository experimentRepository = new ExperimentRepository();
+        ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
+        return experimentModel.getExperimentOutputs();
+    }
+
+}
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 a79a462fd2..3835a149cc 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
@@ -21,81 +21,161 @@
 package org.apache.airavata.registry.core.repositories.expcatalog;
 
 import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.registry.core.entities.expcatalog.ExperimentEntity;
-import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.apache.airavata.registry.core.utils.JPAUtils;
+import org.apache.airavata.model.experiment.UserConfigurationDataModel;
+import org.apache.airavata.registry.core.entities.expcatalog.*;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
 import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.*;
 import org.dozer.Mapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
+import java.sql.Timestamp;
+import java.util.*;
 
-public class ExperimentRepository extends AbstractRepository<ExperimentModel, ExperimentEntity, String> {
+public class ExperimentRepository extends ExpCatAbstractRepository<ExperimentModel, ExperimentEntity, String> {
     private final static Logger logger = LoggerFactory.getLogger(ExperimentRepository.class);
 
-    public ExperimentRepository(Class<ExperimentModel> thriftGenericClass, Class<ExperimentEntity> dbEntityGenericClass) {
-        super(thriftGenericClass, dbEntityGenericClass);
+    public ExperimentRepository() {
+        super(ExperimentModel.class, ExperimentEntity.class);
     }
 
-    @Override
-    public ExperimentModel create(ExperimentModel experiment){
-        return update(experiment);
+    protected String saveExperimentModelData(ExperimentModel experimentModel) throws RegistryException {
+        ExperimentEntity experimentEntity = saveExperiment(experimentModel);
+        return experimentEntity.getExperimentId();
     }
 
-    @Override
-    public ExperimentModel update(ExperimentModel experiment){
-        String experimentId = experiment.getExperimentId();
+    protected ExperimentEntity saveExperiment(ExperimentModel experimentModel) throws RegistryException {
+        if (experimentModel.getExperimentId() == null || experimentModel.getExperimentId().equals(airavata_commonsConstants.DEFAULT_ID)) {
+            logger.debug("Setting the Experiment's ExperimentId");
+            experimentModel.setExperimentId(ExpCatalogUtils.getID(experimentModel.getExperimentName()));
+        }
+
+        String experimentId = experimentModel.getExperimentId();
         Mapper mapper = ObjectMapperSingleton.getInstance();
-        ExperimentEntity entity = mapper.map(experiment, ExperimentEntity.class);
+        ExperimentEntity experimentEntity = mapper.map(experimentModel, ExperimentEntity.class);
+
+        if (experimentEntity.getUserConfigurationData() != null) {
+            logger.debug("Populating the Primary Key of UserConfigurationData object for the Experiment");
+            experimentEntity.getUserConfigurationData().setExperimentId(experimentId);
+        }
+
+        if (experimentEntity.getExperimentInputs() != null) {
+            logger.debug("Populating the Primary Key of ExperimentInput objects for the Experiment");
+            experimentEntity.getExperimentInputs().forEach(experimentInputEntity -> experimentInputEntity.setExperimentId(experimentId));
+        }
+
+        if (experimentEntity.getExperimentOutputs() != null) {
+            logger.debug("Populating the Primary Key of ExperimentOutput objects for the Experiment");
+            experimentEntity.getExperimentOutputs().forEach(experimentOutputEntity -> experimentOutputEntity.setExperimentId(experimentId));
+        }
+
+        if (experimentEntity.getExperimentStatus() != null) {
+            logger.debug("Populating the Primary Key of ExperimentStatus objects for the Experiment");
+            experimentEntity.getExperimentStatus().forEach(experimentStatusEntity -> experimentStatusEntity.setExperimentId(experimentId));
+        }
+
+        if (experimentEntity.getErrors() != null) {
+            logger.debug("Populating the Primary Key of ExperimentError objects for the Experiment");
+            experimentEntity.getErrors().forEach(experimentErrorEntity -> experimentErrorEntity.setExperimentId(experimentId));
+        }
+
+        if (experimentEntity.getProcesses() != null) {
+            logger.debug("Populating the Process objects' Experiment ID for the Experiment");
+            experimentEntity.getProcesses().forEach(processEntity -> processEntity.setExperimentId(experimentId));
+        }
+
+        if (!isExperimentExist(experimentId)) {
+            logger.debug("Checking if the Experiment already exists");
+            experimentEntity.setCreationTime(new Timestamp((System.currentTimeMillis())));
+        }
+
+        return execute(entityManager -> entityManager.merge(experimentEntity));
+    }
+
+    public String addExperiment(ExperimentModel experimentModel) throws RegistryException {
+        return saveExperimentModelData(experimentModel);
+    }
+
+    public void updateExperiment(ExperimentModel updatedExperimentModel, String experimentId) throws RegistryException {
+        saveExperimentModelData(updatedExperimentModel);
+    }
 
-        if(entity.getUserConfigurationData() != null) {
-            entity.getUserConfigurationData().setExperimentId(experimentId);
-            if (entity.getUserConfigurationData().getComputeResourceSchedulingEntity() != null)
-                entity.getUserConfigurationData().getComputeResourceSchedulingEntity().setExperimentId(experimentId);
+    public ExperimentModel getExperiment(String experimentId) throws RegistryException {
+        return get(experimentId);
+    }
+
+    public String addUserConfigurationData(UserConfigurationDataModel userConfigurationDataModel, String experimentId) throws RegistryException {
+        ExperimentModel experimentModel = getExperiment(experimentId);
+        experimentModel.setUserConfigurationData(userConfigurationDataModel);
+        updateExperiment(experimentModel, experimentId);
+        return experimentId;
+    }
+
+    public String updateUserConfigurationData(UserConfigurationDataModel updatedUserConfigurationDataModel, String experimentId) throws RegistryException {
+        return addUserConfigurationData(updatedUserConfigurationDataModel, experimentId);
+    }
+
+    public UserConfigurationDataModel getUserConfigurationData(String experimentId) throws RegistryException {
+        ExperimentModel experimentModel = getExperiment(experimentId);
+        return experimentModel.getUserConfigurationData();
+    }
+
+    public List<ExperimentModel> getExperimentList(String fieldName, Object value) throws RegistryException {
+        return getExperimentList(fieldName, value, -1, 0, null, null);
+    }
+
+    public List<ExperimentModel> getExperimentList(String fieldName, Object value, int limit, int offset,
+                                                   Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException {
+        List<ExperimentModel> experimentModelList;
+
+        if (fieldName.equals(DBConstants.Experiment.USER_NAME)) {
+            logger.debug("Search criteria is Username");
+            Map<String, Object> queryParameters = new HashMap<>();
+            queryParameters.put(DBConstants.Experiment.USER_NAME, value);
+            experimentModelList = select(QueryConstants.GET_EXPERIMENTS_FOR_USER, limit, offset, queryParameters);
         }
-        if(entity.getExperimentInputs() != null)
-            entity.getExperimentInputs().forEach(expIn->expIn.setExperimentId(experimentId));
-        if(entity.getExperimentOutputs() != null)
-            entity.getExperimentOutputs().forEach(expOut->expOut.setExperimentId(experimentId));
-        if(entity.getExperimentErrors() != null)
-            entity.getExperimentErrors().forEach(expErr->expErr.setExperimentId(experimentId));
-        if(entity.getExperimentStatuses() != null)
-            entity.getExperimentStatuses().forEach(expStatus->expStatus.setExperimentId(experimentId));
-
-        if(entity.getProcesses() != null){
-            entity.getProcesses().forEach(process->{
-                process.setExperimentId(experimentId);
-                String processId = process.getProcessId();
-                if(process.getProcessResourceSchedule() != null)
-                    process.getProcessResourceSchedule().setProcessId(processId);
-                if(process.getProcessInputs() != null)
-                    process.getProcessInputs().forEach(proInput->proInput.setProceseId(processId));
-                if(process.getProcessOutputs() != null)
-                    process.getProcessOutputs().forEach(proOutput->proOutput.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->{
-                        String taskId = task.getTaskId();
-                        task.setParentProcessId(processId);
-
-
-                    });
-                }
-            });
+
+        else if (fieldName.equals(DBConstants.Experiment.PROJECT_ID)) {
+            logger.debug("Search criteria is ProjectId");
+            Map<String, Object> queryParameters = new HashMap<>();
+            queryParameters.put(DBConstants.Experiment.PROJECT_ID, value);
+            experimentModelList = select(QueryConstants.GET_EXPERIMENTS_FOR_PROJECT_ID, limit, offset, queryParameters);
+        }
+
+        else if (fieldName.equals(DBConstants.Experiment.GATEWAY_ID)) {
+            logger.debug("Search criteria is GatewayId");
+            Map<String, Object> queryParameters = new HashMap<>();
+            queryParameters.put(DBConstants.Experiment.GATEWAY_ID, value);
+            experimentModelList = select(QueryConstants.GET_EXPERIMENTS_FOR_GATEWAY_ID, limit, offset, queryParameters);
         }
 
-        ExperimentEntity persistedCopy = JPAUtils.execute(entityManager -> entityManager.merge(entity));
-        return mapper.map(persistedCopy, ExperimentModel.class);
+        else {
+            logger.error("Unsupported field name for Experiment module.");
+            throw new IllegalArgumentException("Unsupported field name for Experiment module.");
+        }
+
+        return experimentModelList;
     }
 
-    @Override
-    public List<ExperimentModel> select(String criteria, int offset, int limit){
-        throw new UnsupportedOperationException("Due to performance overheads this method is not supported. Instead use" +
-                " ExperimentSummaryRepository");
+    public List<String> getExperimentIDs(String fieldName, Object value) throws RegistryException {
+        List<String> experimentIds = new ArrayList<>();
+        List<ExperimentModel> experimentModelList = getExperimentList(fieldName, value);
+        for (ExperimentModel experimentModel : experimentModelList) {
+            experimentIds.add(experimentModel.getExperimentId());
+        }
+        return experimentIds;
     }
+
+    public boolean isExperimentExist(String experimentId) throws RegistryException {
+        return isExists(experimentId);
+    }
+
+    public void removeExperiment(String experimentId) throws RegistryException {
+        delete(experimentId);
+    }
+
 }
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepository.java
new file mode 100644
index 0000000000..a2c0f79286
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepository.java
@@ -0,0 +1,103 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.status.ExperimentState;
+import org.apache.airavata.model.status.ExperimentStatus;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentStatusEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentStatusPK;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+public class ExperimentStatusRepository extends ExpCatAbstractRepository<ExperimentStatus, ExperimentStatusEntity, ExperimentStatusPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ExperimentStatusRepository.class);
+
+    public ExperimentStatusRepository() { super(ExperimentStatus.class, ExperimentStatusEntity.class); }
+
+    protected String saveExperimentStatus(ExperimentStatus experimentStatus, String experimentId) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        ExperimentStatusEntity experimentStatusEntity = mapper.map(experimentStatus, ExperimentStatusEntity.class);
+
+        if (experimentStatusEntity.getExperimentId() == null) {
+            logger.debug("Setting the ExperimentStatusEntity's ExperimentId");
+            experimentStatusEntity.setExperimentId(experimentId);
+        }
+
+        execute(entityManager -> entityManager.merge(experimentStatusEntity));
+        return experimentStatusEntity.getStatusId();
+    }
+
+    public String addExperimentStatus(ExperimentStatus experimentStatus, String experimentId) throws RegistryException {
+
+        if (experimentStatus.getStatusId() == null) {
+            logger.debug("Setting the ExperimentStatus's StatusId");
+            experimentStatus.setStatusId(ExpCatalogUtils.getID("STATUS"));
+        }
+
+        return saveExperimentStatus(experimentStatus, experimentId);
+    }
+
+    public String updateExperimentStatus(ExperimentStatus updatedExperimentStatus, String experimentId) throws RegistryException {
+        return saveExperimentStatus(updatedExperimentStatus, experimentId);
+    }
+
+    public ExperimentStatus getExperimentStatus(String experimentId) throws RegistryException {
+        ExperimentRepository experimentRepository = new ExperimentRepository();
+        ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
+        List<ExperimentStatus> experimentStatusList = experimentModel.getExperimentStatus();
+
+        if(experimentStatusList.size() == 0) {
+            logger.debug("ExperimentStatus list is empty");
+            return null;
+        }
+
+        else {
+            ExperimentStatus latestExperimentStatus = experimentStatusList.get(0);
+
+            for (int i = 1; i < experimentStatusList.size(); i++) {
+                Timestamp timeOfStateChange = new Timestamp(experimentStatusList.get(i).getTimeOfStateChange());
+
+                if (timeOfStateChange != null) {
+
+                    if (timeOfStateChange.after(new Timestamp(latestExperimentStatus.getTimeOfStateChange()))
+                            || (timeOfStateChange.equals(latestExperimentStatus.getTimeOfStateChange()) && experimentStatusList.get(i).getState().equals(ExperimentState.COMPLETED.toString()))
+                            || (timeOfStateChange.equals(latestExperimentStatus.getTimeOfStateChange()) && experimentStatusList.get(i).getState().equals(ExperimentState.FAILED.toString()))
+                            || (timeOfStateChange.equals(latestExperimentStatus.getTimeOfStateChange()) && experimentStatusList.get(i).getState().equals(ExperimentState.CANCELED.toString()))) {
+                        latestExperimentStatus = experimentStatusList.get(i);
+                    }
+
+                }
+
+            }
+
+            return latestExperimentStatus;
+        }
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
new file mode 100644
index 0000000000..584d6dbc2a
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
@@ -0,0 +1,291 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentStatistics;
+import org.apache.airavata.model.experiment.ExperimentSummaryModel;
+import org.apache.airavata.model.status.ExperimentState;
+import org.apache.airavata.registry.core.entities.expcatalog.ExperimentSummaryEntity;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.cpi.ResultOrderType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ExperimentSummaryRepository extends ExpCatAbstractRepository<ExperimentSummaryModel, ExperimentSummaryEntity, String> {
+    private final static Logger logger = LoggerFactory.getLogger(ExperimentSummaryRepository.class);
+
+    public ExperimentSummaryRepository() { super(ExperimentSummaryModel.class, ExperimentSummaryEntity.class); }
+
+    public List<ExperimentSummaryModel> searchExperiments(Map<String, String> filters, int limit,
+                                                          int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException {
+        return searchAllAccessibleExperiments(null, filters, limit, offset, orderByIdentifier, resultOrderType);
+    }
+
+    public List<ExperimentSummaryModel> searchAllAccessibleExperiments(List<String> accessibleExperimentIds, Map<String, String> filters, int limit,
+                                                                       int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException, IllegalArgumentException {
+        String query = "SELECT ES FROM " + ExperimentSummaryEntity.class.getSimpleName() + " ES WHERE ";
+        Map<String, Object> queryParameters = new HashMap<>();
+
+        if (filters == null || !filters.containsKey(DBConstants.Experiment.GATEWAY_ID)) {
+            logger.error("GatewayId is required");
+            throw new RegistryException("GatewayId is required");
+        }
+
+        if (filters.get(DBConstants.Experiment.USER_NAME) != null) {
+            logger.debug("Filter Experiments by User");
+            queryParameters.put(DBConstants.Experiment.USER_NAME, filters.get(DBConstants.Experiment.USER_NAME));
+            query += "ES.userName LIKE :" + DBConstants.Experiment.USER_NAME + " AND ";
+        }
+
+        if (filters.get(DBConstants.Experiment.GATEWAY_ID) != null) {
+            logger.debug("Filter Experiments by Gateway ID");
+            queryParameters.put(DBConstants.Experiment.GATEWAY_ID, filters.get(DBConstants.Experiment.GATEWAY_ID));
+            query += "ES.gatewayId LIKE :" + DBConstants.Experiment.GATEWAY_ID + " AND ";
+        }
+
+        if (filters.get(DBConstants.Experiment.PROJECT_ID) != null) {
+            logger.debug("Filter Experiments by Project ID");
+            queryParameters.put(DBConstants.Experiment.PROJECT_ID, filters.get(DBConstants.Experiment.PROJECT_ID));
+            query += "ES.projectId LIKE :" + DBConstants.Experiment.PROJECT_ID + " AND ";
+        }
+
+        if (filters.get(DBConstants.Experiment.EXPERIMENT_NAME) != null) {
+            logger.debug("Filter Experiments by Name");
+            queryParameters.put(DBConstants.Experiment.EXPERIMENT_NAME, filters.get(DBConstants.Experiment.EXPERIMENT_NAME));
+            query += "ES.name LIKE :" + DBConstants.Experiment.EXPERIMENT_NAME + " AND ";
+        }
+
+        if (filters.get(DBConstants.Experiment.DESCRIPTION) != null) {
+            logger.debug("Filter Experiments by Description");
+            queryParameters.put(DBConstants.Experiment.DESCRIPTION, filters.get(DBConstants.Experiment.DESCRIPTION));
+            query += "ES.description LIKE :" + DBConstants.Experiment.DESCRIPTION + " AND ";
+        }
+
+        if (filters.get(DBConstants.Experiment.EXECUTION_ID) != null) {
+            logger.debug("Filter Experiments by Execution ID");
+            queryParameters.put(DBConstants.Experiment.EXECUTION_ID, filters.get(DBConstants.Experiment.EXECUTION_ID));
+            query += "ES.executionId LIKE :" + DBConstants.Experiment.EXECUTION_ID + " AND ";
+        }
+
+        if (filters.get(DBConstants.ExperimentStatus.STATE) != null) {
+            logger.debug("Filter Experiments by State");
+            String state = ExperimentState.valueOf(filters.get(DBConstants.ExperimentStatus.STATE)).toString();
+            queryParameters.put(DBConstants.ExperimentStatus.STATE, state);
+            query += "ES.state LIKE :" + DBConstants.ExperimentStatus.STATE + " AND ";
+        }
+
+        if (filters.get(DBConstants.ExperimentSummary.FROM_DATE) != null
+                && filters.get(DBConstants.ExperimentSummary.TO_DATE) != null) {
+
+            Timestamp fromDate = Timestamp.valueOf(filters.get(DBConstants.ExperimentSummary.FROM_DATE));
+            Timestamp toDate = Timestamp.valueOf(filters.get(DBConstants.ExperimentSummary.TO_DATE));
+
+            if (toDate.after(fromDate)) {
+                logger.debug("Filter Experiments by CreationTime");
+                queryParameters.put(DBConstants.ExperimentSummary.FROM_DATE, fromDate);
+                queryParameters.put(DBConstants.ExperimentSummary.TO_DATE, toDate);
+                query += "ES.creationTime BETWEEN :" + DBConstants.ExperimentSummary.FROM_DATE + " AND :" + DBConstants.ExperimentSummary.TO_DATE + " AND ";
+            }
+
+        }
+
+        if (accessibleExperimentIds != null && !accessibleExperimentIds.isEmpty()) {
+            logger.debug("Filter Experiments by Accessible Experiment IDs");
+            queryParameters.put(DBConstants.Experiment.ACCESSIBLE_EXPERIMENT_IDS, accessibleExperimentIds);
+            query += " ES.experimentId IN :" + DBConstants.Experiment.ACCESSIBLE_EXPERIMENT_IDS;
+        }
+
+        else {
+            logger.debug("Removing the last operator from the query");
+            query = query.substring(0, query.length() - 5);
+        }
+
+        if (orderByIdentifier != null && resultOrderType != null && orderByIdentifier.equals(DBConstants.Experiment.CREATION_TIME)) {
+            String order = (resultOrderType == ResultOrderType.ASC) ? "ASC" : "DESC";
+            query += " ORDER BY ES." + DBConstants.Experiment.CREATION_TIME + " " + order;
+        }
+
+        List<ExperimentSummaryModel> experimentSummaryModelList = select(query, limit, offset, queryParameters);
+        return experimentSummaryModelList;
+    }
+
+    public ExperimentStatistics getExperimentStatistics(Map<String,String> filters) throws RegistryException {
+
+        try {
+
+            ExperimentStatistics experimentStatistics = new ExperimentStatistics();
+            String gatewayId = null;
+            String userName = null;
+            String applicationName = null;
+            String resourceHostName = null;
+            Timestamp fromDate = null;
+            Timestamp toDate = null;
+
+            if (filters == null || !filters.containsKey(DBConstants.Experiment.GATEWAY_ID)) {
+                logger.error("GatewayId is required");
+                throw new RegistryException("GatewayId is required");
+            }
+
+            for (String field : filters.keySet()) {
+
+                if (field.equals(DBConstants.Experiment.GATEWAY_ID)) {
+                    logger.debug("Set the GatewayId");
+                    gatewayId = filters.get(field);
+                }
+
+                if (field.equals(DBConstants.Experiment.USER_NAME)) {
+                    logger.debug("Set the UserName");
+                    userName = filters.get(field);
+                }
+
+                if (field.equals(DBConstants.Experiment.EXECUTION_ID)) {
+                    logger.debug("Set the ApplicationName");
+                    applicationName = filters.get(field);
+                }
+
+                if (field.equals(DBConstants.Experiment.RESOURCE_HOST_ID)) {
+                    logger.debug("Set the ResourceHostName");
+                    resourceHostName = filters.get(field);
+                }
+
+                if (field.equals(DBConstants.ExperimentSummary.FROM_DATE)) {
+                    logger.debug("Set the FromDate");
+                    fromDate = Timestamp.valueOf(filters.get(field));
+                }
+
+                if (field.equals(DBConstants.ExperimentSummary.TO_DATE)) {
+                    logger.debug("Set the ToDate");
+                    toDate = Timestamp.valueOf(filters.get(field));
+                }
+
+            }
+
+            List<ExperimentSummaryModel> allExperiments = getExperimentStatisticsForState(null, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName);
+            experimentStatistics.setAllExperimentCount(allExperiments.size());
+            experimentStatistics.setAllExperiments(allExperiments);
+
+            List<ExperimentSummaryModel> createdExperiments = getExperimentStatisticsForState(ExperimentState.CREATED, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName);
+            createdExperiments.addAll(getExperimentStatisticsForState(ExperimentState.VALIDATED, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName));
+            experimentStatistics.setCreatedExperimentCount(createdExperiments.size());
+            experimentStatistics.setCreatedExperiments(createdExperiments);
+
+            List<ExperimentSummaryModel> runningExperiments = getExperimentStatisticsForState(ExperimentState.EXECUTING, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName);
+            runningExperiments.addAll(getExperimentStatisticsForState(ExperimentState.SCHEDULED, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName));
+            runningExperiments.addAll(getExperimentStatisticsForState(ExperimentState.LAUNCHED, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName));
+            experimentStatistics.setRunningExperimentCount(runningExperiments.size());
+            experimentStatistics.setRunningExperiments(runningExperiments);
+
+            List<ExperimentSummaryModel> completedExperiments = getExperimentStatisticsForState(ExperimentState.COMPLETED, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName);
+            experimentStatistics.setCompletedExperimentCount(completedExperiments.size());
+            experimentStatistics.setCompletedExperiments(completedExperiments);
+
+            List<ExperimentSummaryModel> failedExperiments = getExperimentStatisticsForState(ExperimentState.FAILED, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName);
+            experimentStatistics.setFailedExperimentCount(failedExperiments.size());
+            experimentStatistics.setFailedExperiments(failedExperiments);
+
+            List<ExperimentSummaryModel> cancelledExperiments = getExperimentStatisticsForState(ExperimentState.CANCELED, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName);
+            cancelledExperiments.addAll(getExperimentStatisticsForState(ExperimentState.CANCELING, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName));
+            experimentStatistics.setCancelledExperimentCount(cancelledExperiments.size());
+            experimentStatistics.setCancelledExperiments(cancelledExperiments);
+
+            return experimentStatistics;
+        }
+
+        catch (RegistryException e) {
+            logger.error("Error while retrieving experiment statistics from registry", e);
+            throw new RegistryException(e);
+        }
+
+    }
+
+    protected List<ExperimentSummaryModel> getExperimentStatisticsForState(ExperimentState experimentState, String gatewayId, Timestamp fromDate, Timestamp toDate,
+                                                                           String userName, String applicationName, String resourceHostName) throws RegistryException, IllegalArgumentException {
+
+        String query = "SELECT ES FROM " + ExperimentSummaryEntity.class.getSimpleName() + " ES WHERE ";
+        Map<String, Object> queryParameters = new HashMap<>();
+
+        if (experimentState != null) {
+            logger.debug("Filter Experiments by Experiment State");
+            queryParameters.put(DBConstants.Experiment.EXPERIMENT_STATE, experimentState);
+            query += "ES.state LIKE :" + DBConstants.Experiment.EXPERIMENT_STATE + " AND ";
+        }
+
+        if (gatewayId != null) {
+            logger.debug("Filter Experiments by GatewayId");
+            queryParameters.put(DBConstants.Experiment.GATEWAY_ID, gatewayId);
+            query += "ES.gatewayId LIKE :" + DBConstants.Experiment.GATEWAY_ID + " AND ";
+        }
+
+        if (fromDate != null && toDate != null) {
+
+            if (toDate.after(fromDate)) {
+                logger.debug("Filter Experiments by CreationTime");
+                queryParameters.put(DBConstants.ExperimentSummary.FROM_DATE, fromDate);
+                queryParameters.put(DBConstants.ExperimentSummary.TO_DATE, toDate);
+                query += "ES.creationTime BETWEEN :" + DBConstants.ExperimentSummary.FROM_DATE + " AND :" + DBConstants.ExperimentSummary.TO_DATE + " AND ";
+            }
+        }
+
+        if (userName != null) {
+            logger.debug("Filter Experiments by UserName");
+            queryParameters.put(DBConstants.Experiment.USER_NAME, userName);
+            query += "ES.userName LIKE :" + DBConstants.Experiment.USER_NAME + " AND ";
+        }
+
+        if (applicationName != null) {
+            logger.debug("Filter Experiments by ApplicationName");
+            queryParameters.put(DBConstants.Experiment.EXECUTION_ID, applicationName);
+            query += "ES.executionId LIKE :" + DBConstants.Experiment.EXECUTION_ID + " AND ";
+        }
+
+        if (resourceHostName != null) {
+            logger.debug("Filter Experiments by ResourceHostName");
+            queryParameters.put(DBConstants.Experiment.RESOURCE_HOST_ID, resourceHostName);
+            query += "ES.resourceHostId LIKE :" + DBConstants.Experiment.RESOURCE_HOST_ID + " ";
+        }
+
+        else {
+            logger.debug("Removing the last operator from the query");
+            query = query.substring(0, query.length() - 4);
+        }
+
+        query += "ORDER BY ES.creationTime DESC";
+        List<ExperimentSummaryModel> experimentSummaryModelList = select(query, -1, 0, queryParameters);
+        return experimentSummaryModelList;
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepository.java
new file mode 100644
index 0000000000..f4a4a5deb0
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepository.java
@@ -0,0 +1,106 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.registry.core.entities.expcatalog.GatewayEntity;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class GatewayRepository extends ExpCatAbstractRepository<Gateway, GatewayEntity, String> {
+    private final static Logger logger = LoggerFactory.getLogger(GatewayRepository.class);
+
+    public GatewayRepository() { super(Gateway.class, GatewayEntity.class); }
+
+    protected String saveGatewayData(Gateway gateway) throws RegistryException {
+        GatewayEntity gatewayEntity = saveGateway(gateway);
+        return gatewayEntity.getGatewayId();
+    }
+
+    protected GatewayEntity saveGateway(Gateway gateway) throws RegistryException {
+        String gatewayId = gateway.getGatewayId();
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        GatewayEntity gatewayEntity = mapper.map(gateway, GatewayEntity.class);
+
+        if (!isGatewayExist(gatewayId)) {
+            logger.debug("Checking if the Gateway already exists");
+            gatewayEntity.setRequestCreationTime(new Timestamp(System.currentTimeMillis()));
+        }
+
+        return execute(entityManager -> entityManager.merge(gatewayEntity));
+    }
+
+    public String addGateway(Gateway gateway) throws RegistryException{
+        return saveGatewayData(gateway);
+    }
+
+    public void updateGateway(String gatewayId, Gateway updatedGateway) throws RegistryException{
+        saveGatewayData(updatedGateway);
+    }
+
+    public Gateway getGateway(String gatewayId) throws RegistryException{
+        return get(gatewayId);
+    }
+
+    public List<Gateway> getAllGateways() throws RegistryException {
+        List<Gateway> gatewayList = select(QueryConstants.GET_ALL_GATEWAYS, 0);
+        return gatewayList;
+    }
+
+    public Gateway getDefaultGateway() throws ApplicationSettingsException, RegistryException {
+        String defaultGatewayName = ServerSettings.getDefaultUserGateway();
+        return getExistingGateway(defaultGatewayName);
+    }
+
+    public Gateway getExistingGateway(String gatewayName) throws RegistryException {
+        Map<String, Object> queryParameters = new HashMap<>();
+        queryParameters.put(DBConstants.Gateway.GATEWAY_NAME, gatewayName);
+        List<Gateway> gatewayList = select(QueryConstants.GET_GATEWAY_FROM_GATEWAY_NAME, -1, 0, queryParameters);
+
+        if (gatewayList != null && !gatewayList.isEmpty()) {
+            logger.debug("Return the record (there is only one record)");
+            return gatewayList.get(0);
+        }
+
+        return null;
+    }
+
+    public boolean isGatewayExist(String gatewayId) throws RegistryException{
+        return isExists(gatewayId);
+    }
+
+    public boolean removeGateway(String gatewayId) throws RegistryException{
+        return delete(gatewayId);
+    }
+
+}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepository.java
new file mode 100644
index 0000000000..f759bf4b7b
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepository.java
@@ -0,0 +1,137 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.model.job.JobModel;
+import org.apache.airavata.registry.core.entities.expcatalog.JobEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.JobPK;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class JobRepository extends ExpCatAbstractRepository<JobModel, JobEntity, JobPK> {
+    private final static Logger logger = LoggerFactory.getLogger(JobRepository.class);
+
+    public JobRepository() { super(JobModel.class, JobEntity.class); }
+
+    protected String saveJobModelData(JobModel jobModel, JobPK jobPK) throws RegistryException {
+        JobEntity jobEntity = saveJob(jobModel, jobPK);
+        return jobEntity.getJobId();
+    }
+
+    protected JobEntity saveJob(JobModel jobModel, JobPK jobPK) throws RegistryException {
+        if (jobModel.getJobId() == null || jobModel.getJobId().equals(airavata_commonsConstants.DEFAULT_ID)) {
+            logger.debug("Setting the Job's JobId");
+            jobModel.setJobId(jobPK.getJobId());
+        }
+
+        String jobId = jobPK.getJobId();
+        String taskId = jobPK.getTaskId();
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        JobEntity jobEntity = mapper.map(jobModel, JobEntity.class);
+
+        if (jobEntity.getJobStatuses() != null) {
+            logger.debug("Populating the Primary Key of JobStatus objects for the Job");
+            jobEntity.getJobStatuses().forEach(jobStatusEntity -> {
+                jobStatusEntity.setJobId(jobId);
+                jobStatusEntity.setTaskId(taskId);
+            });
+        }
+
+        if (!isJobExist(jobPK)) {
+            logger.debug("Checking if the Job already exists");
+            jobEntity.setCreationTime(new Timestamp((System.currentTimeMillis())));
+        }
+
+        return execute(entityManager -> entityManager.merge(jobEntity));
+    }
+
+    public String addJob(JobModel job, String processId) throws RegistryException {
+        JobPK jobPK = new JobPK();
+        jobPK.setJobId(job.getJobId());
+        jobPK.setTaskId(job.getTaskId());
+        String jobId = saveJobModelData(job, jobPK);
+        return jobId;
+    }
+
+    public String updateJob(JobModel job, JobPK jobPK) throws RegistryException {
+        return saveJobModelData(job, jobPK);
+    }
+
+    public JobModel getJob(JobPK jobPK) throws RegistryException {
+        return get(jobPK);
+    }
+
+    public List<JobModel> getJobList(String fieldName, Object value) throws RegistryException {
+        JobRepository jobRepository = new JobRepository();
+        List<JobModel> jobModelList;
+
+        if (fieldName.equals(DBConstants.Job.PROCESS_ID)) {
+            logger.debug("Search criteria is ProcessId");
+            Map<String, Object> queryParameters = new HashMap<>();
+            queryParameters.put(DBConstants.Job.PROCESS_ID, value);
+            jobModelList = jobRepository.select(QueryConstants.GET_JOB_FOR_PROCESS_ID, -1, 0, queryParameters);
+        }
+
+        else if (fieldName.equals(DBConstants.Job.TASK_ID)) {
+            logger.debug("Search criteria is TaskId");
+            Map<String, Object> queryParameters = new HashMap<>();
+            queryParameters.put(DBConstants.Job.TASK_ID, value);
+            jobModelList = jobRepository.select(QueryConstants.GET_JOB_FOR_TASK_ID, -1, 0, queryParameters);
+        }
+
+        else {
+            logger.error("Unsupported field name for Job module.");
+            throw new IllegalArgumentException("Unsupported field name for Job module.");
+        }
+
+        return jobModelList;
+    }
+
+    public List<String> getJobIds(String fieldName, Object value) throws RegistryException {
+        List<String> jobIds = new ArrayList<>();
+        List<JobModel> jobModelList = getJobList(fieldName, value);
+        for (JobModel jobModel : jobModelList) {
+            jobIds.add(jobModel.getJobId());
+        }
+        return jobIds;
+    }
+
+    public boolean isJobExist(JobPK jobPK) throws RegistryException {
+        return isExists(jobPK);
+    }
+
+    public void removeJob(JobPK jobPK) throws RegistryException {
+        delete(jobPK);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepository.java
new file mode 100644
index 0000000000..6ad2acbcb3
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepository.java
@@ -0,0 +1,107 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.job.JobModel;
+import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.registry.core.entities.expcatalog.JobPK;
+import org.apache.airavata.registry.core.entities.expcatalog.JobStatusEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.JobStatusPK;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+public class JobStatusRepository extends ExpCatAbstractRepository<JobStatus, JobStatusEntity, JobStatusPK> {
+    private final static Logger logger = LoggerFactory.getLogger(JobStatusRepository.class);
+
+    public JobStatusRepository() { super(JobStatus.class, JobStatusEntity.class); }
+
+    protected String saveJobStatus(JobStatus jobStatus, JobPK jobPK) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        JobStatusEntity jobStatusEntity = mapper.map(jobStatus, JobStatusEntity.class);
+
+        if (jobStatusEntity.getJobId() == null) {
+            logger.debug("Setting the JobStatusEntity's JobId");
+            jobStatusEntity.setJobId(jobPK.getJobId());
+        }
+
+        if (jobStatusEntity.getTaskId() == null) {
+            logger.debug("Setting the JobStatusEntity's TaskId");
+            jobStatusEntity.setTaskId(jobPK.getTaskId());
+        }
+
+        execute(entityManager -> entityManager.merge(jobStatusEntity));
+        return jobStatusEntity.getStatusId();
+    }
+
+    public String addJobStatus(JobStatus jobStatus, JobPK jobPK) throws RegistryException {
+
+        if (jobStatus.getStatusId() == null) {
+            logger.debug("Setting the JobStatusEntity's StatusId");
+            jobStatus.setStatusId(ExpCatalogUtils.getID("STATUS"));
+        }
+
+        return saveJobStatus(jobStatus, jobPK);
+
+    }
+
+    public String updateJobStatus(JobStatus updatedJobStatus, JobPK jobPK) throws RegistryException {
+        return saveJobStatus(updatedJobStatus, jobPK);
+    }
+
+    public JobStatus getJobStatus(JobPK jobPK) throws RegistryException {
+        JobRepository jobRepository = new JobRepository();
+        JobModel jobModel = jobRepository.getJob(jobPK);
+        List<JobStatus> jobStatusList = jobModel.getJobStatuses();
+
+        if(jobStatusList.size() == 0) {
+            logger.debug("JobStatus list is empty");
+            return null;
+        }
+
+        else {
+            JobStatus latestJobStatus = jobStatusList.get(0);
+
+            for(int i = 1; i < jobStatusList.size(); i++) {
+                Timestamp timeOfStateChange = new Timestamp(jobStatusList.get(i).getTimeOfStateChange());
+
+                if (timeOfStateChange.after(new Timestamp(latestJobStatus.getTimeOfStateChange()))
+                        || (timeOfStateChange.equals(latestJobStatus.getTimeOfStateChange()) && jobStatusList.get(i).getJobState().equals(JobState.COMPLETE.toString()))
+                        || (timeOfStateChange.equals(latestJobStatus.getTimeOfStateChange()) && jobStatusList.get(i).getJobState().equals(JobState.FAILED.toString()))
+                        || (timeOfStateChange.equals(latestJobStatus.getTimeOfStateChange()) && jobStatusList.get(i).getJobState().equals(JobState.CANCELED.toString()))) {
+                    latestJobStatus = jobStatusList.get(i);
+                }
+
+            }
+
+            return latestJobStatus;
+        }
+    }
+
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepository.java
new file mode 100644
index 0000000000..ff74666a22
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepository.java
@@ -0,0 +1,104 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.workspace.Notification;
+import org.apache.airavata.registry.core.entities.expcatalog.NotificationEntity;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class NotificationRepository extends ExpCatAbstractRepository<Notification, NotificationEntity, String> {
+    private final static Logger logger = LoggerFactory.getLogger(NotificationRepository.class);
+
+    public NotificationRepository() { super(Notification.class, NotificationEntity.class); }
+
+    protected String saveNotificationData(Notification notification) throws RegistryException {
+        NotificationEntity notificationEntity = saveNotification(notification);
+        return notificationEntity.getNotificationId();
+    }
+
+    protected NotificationEntity saveNotification(Notification notification) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        NotificationEntity notificationEntity = mapper.map(notification, NotificationEntity.class);
+
+        if (notificationEntity.getCreationTime() != null) {
+            logger.debug("Setting the Notification's creation time");
+            notificationEntity.setCreationTime(new Timestamp(notification.getCreationTime()));
+        }
+
+        else {
+            logger.debug("Setting the Notification's creation time to current time");
+            notificationEntity.setCreationTime(new Timestamp(System.currentTimeMillis()));
+        }
+
+        if (notificationEntity.getPublishedTime() != null) {
+            logger.debug("Setting the Notification's published time");
+            notificationEntity.setPublishedTime(new Timestamp(notification.getPublishedTime()));
+        }
+
+        if (notificationEntity.getExpirationTime() != null) {
+            logger.debug("Setting the Notification's expiration time");
+            notificationEntity.setExpirationTime(new Timestamp(notification.getExpirationTime()));
+        }
+
+        return execute(entityManager -> entityManager.merge(notificationEntity));
+    }
+
+    public String createNotification(Notification notification) throws RegistryException {
+        notification.setNotificationId(getNotificationId());
+        return saveNotificationData(notification);
+    }
+
+    public void updateNotification(Notification notification) throws RegistryException {
+        saveNotificationData(notification);
+    }
+
+    public Notification getNotification(String notificationId) throws RegistryException{
+        return get(notificationId);
+    }
+
+    public List<Notification> getAllGatewayNotifications(String gatewayId) throws RegistryException {
+        Map<String, Object> queryParameters = new HashMap<>();
+        queryParameters.put(DBConstants.Notification.GATEWAY_ID, gatewayId);
+        List<Notification> notificationList = select(QueryConstants.GET_ALL_GATEWAY_NOTIFICATIONS, -1, 0, queryParameters);
+        return notificationList;
+    }
+
+    private String getNotificationId() {
+        return UUID.randomUUID().toString();
+    }
+
+    public void deleteNotification(String notificationId) throws RegistryException {
+        delete(notificationId);
+    }
+
+}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepository.java
new file mode 100644
index 0000000000..df4a5c78c2
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepository.java
@@ -0,0 +1,74 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessErrorEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessErrorPK;
+import org.apache.airavata.model.commons.ErrorModel;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+public class ProcessErrorRepository extends ExpCatAbstractRepository<ErrorModel, ProcessErrorEntity, ProcessErrorPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ProcessErrorRepository.class);
+
+    public ProcessErrorRepository() { super(ErrorModel.class, ProcessErrorEntity.class); }
+
+    protected String saveProcessError(ErrorModel error, String processId) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        ProcessErrorEntity processErrorEntity = mapper.map(error, ProcessErrorEntity.class);
+
+        if (processErrorEntity.getProcessId() == null) {
+            logger.debug("Setting the ProcessErrorEntity's ProcessId");
+            processErrorEntity.setProcessId(processId);
+        }
+
+        execute(entityManager -> entityManager.merge(processErrorEntity));
+        return processErrorEntity.getErrorId();
+    }
+
+    public String addProcessError(ErrorModel processError, String processId) throws RegistryException {
+
+        if (processError.getErrorId() == null) {
+            logger.debug("Setting the ProcessError's ErrorId");
+            processError.setErrorId(ExpCatalogUtils.getID("ERROR"));
+        }
+
+        return saveProcessError(processError, processId);
+    }
+
+    public String updateProcessError(ErrorModel updatedProcessError, String processId) throws RegistryException {
+        return saveProcessError(updatedProcessError, processId);
+    }
+
+    public List<ErrorModel> getProcessError(String processId) throws RegistryException {
+        ProcessRepository processRepository = new ProcessRepository();
+        ProcessModel processModel = processRepository.getProcess(processId);
+        return processModel.getProcessErrors();
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepository.java
new file mode 100644
index 0000000000..70b2790f5d
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepository.java
@@ -0,0 +1,71 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessInputEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessInputPK;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+public class ProcessInputRepository extends ExpCatAbstractRepository<InputDataObjectType, ProcessInputEntity, ProcessInputPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ProcessInputRepository.class);
+
+    public ProcessInputRepository() { super(InputDataObjectType.class, ProcessInputEntity.class); }
+
+    protected void saveProcessInput(List<InputDataObjectType> processInputs, String processId) throws RegistryException {
+
+        for (InputDataObjectType input : processInputs) {
+            Mapper mapper = ObjectMapperSingleton.getInstance();
+            ProcessInputEntity processInputEntity = mapper.map(input, ProcessInputEntity.class);
+
+            if (processInputEntity.getProcessId() == null) {
+                logger.debug("Setting the ProcessInputEntity's ProcessId");
+                processInputEntity.setProcessId(processId);
+            }
+
+            execute(entityManager -> entityManager.merge(processInputEntity));
+        }
+
+    }
+
+    public String addProcessInputs(List<InputDataObjectType> processInputs, String processId) throws RegistryException {
+        saveProcessInput(processInputs, processId);
+        return processId;
+    }
+
+    public void updateProcessInputs(List<InputDataObjectType> updatedProcessInputs, String processId) throws RegistryException {
+        saveProcessInput(updatedProcessInputs, processId);
+    }
+
+    public List<InputDataObjectType> getProcessInputs(String processId) throws RegistryException {
+        ProcessRepository processRepository = new ProcessRepository();
+        ProcessModel processModel = processRepository.getProcess(processId);
+        return processModel.getProcessInputs();
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepository.java
new file mode 100644
index 0000000000..8f0f54154b
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepository.java
@@ -0,0 +1,71 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessOutputEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessOutputPK;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+public class ProcessOutputRepository extends ExpCatAbstractRepository<OutputDataObjectType, ProcessOutputEntity, ProcessOutputPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ProcessOutputRepository.class);
+
+    public ProcessOutputRepository() { super(OutputDataObjectType.class, ProcessOutputEntity.class); }
+
+    protected void saveProcessOutput(List<OutputDataObjectType> processOutputs, String processId) throws RegistryException {
+
+        for (OutputDataObjectType output : processOutputs) {
+            Mapper mapper = ObjectMapperSingleton.getInstance();
+            ProcessOutputEntity processOutputEntity = mapper.map(output, ProcessOutputEntity.class);
+
+            if (processOutputEntity.getProcessId() == null) {
+                logger.debug("Setting the ProcessOutputEntity's ProcesstId");
+                processOutputEntity.setProcessId(processId);
+            }
+
+            execute(entityManager -> entityManager.merge(processOutputEntity));
+        }
+
+    }
+
+    public String addProcessOutputs(List<OutputDataObjectType> processOutputs, String processId) throws RegistryException {
+        saveProcessOutput(processOutputs, processId);
+        return processId;
+    }
+
+    public void updateProcessOutputs(List<OutputDataObjectType> updatedProcessOutputs, String processId) throws RegistryException {
+        saveProcessOutput(updatedProcessOutputs, processId);
+    }
+
+    public List<OutputDataObjectType> getProcessOutputs(String processId) throws RegistryException {
+        ProcessRepository processRepository = new ProcessRepository();
+        ProcessModel processModel = processRepository.getProcess(processId);
+        return processModel.getProcessOutputs();
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepository.java
new file mode 100644
index 0000000000..2fde4ea694
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepository.java
@@ -0,0 +1,165 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessEntity;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.*;
+
+public class ProcessRepository extends ExpCatAbstractRepository<ProcessModel, ProcessEntity, String> {
+    private final static Logger logger = LoggerFactory.getLogger(ProcessRepository.class);
+
+    public ProcessRepository() { super(ProcessModel.class, ProcessEntity.class); }
+
+    protected String saveProcessModelData(ProcessModel processModel) throws RegistryException {
+        ProcessEntity processEntity = saveProcess(processModel);
+        return processEntity.getProcessId();
+    }
+
+    protected ProcessEntity saveProcess(ProcessModel processModel) throws RegistryException {
+        if (processModel.getProcessId() == null || processModel.getProcessId().equals(airavata_commonsConstants.DEFAULT_ID)) {
+            logger.debug("Setting the Process's ProcessId");
+            processModel.setProcessId(ExpCatalogUtils.getID("PROCESS"));
+        }
+
+        String processId = processModel.getProcessId();
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        ProcessEntity processEntity = mapper.map(processModel, ProcessEntity.class);
+
+        if (processEntity.getProcessResourceSchedule() != null) {
+            logger.debug("Populating the Primary Key of ProcessResourceSchedule object for the Process");
+            processEntity.getProcessResourceSchedule().setProcessId(processId);
+        }
+
+        if (processEntity.getProcessInputs() != null) {
+            logger.debug("Populating the Primary Key of ProcessInput objects for the Process");
+            processEntity.getProcessInputs().forEach(processInputEntity -> processInputEntity.setProcessId(processId));
+        }
+
+        if (processEntity.getProcessOutputs() != null) {
+            logger.debug("Populating the Primary Key of ProcessOutput objects for the Process");
+            processEntity.getProcessOutputs().forEach(processOutputEntity -> processOutputEntity.setProcessId(processId));
+        }
+
+        if (processEntity.getProcessStatuses() != null) {
+            logger.debug("Populating the Primary Key of ProcessStatus objects for the Process");
+            processEntity.getProcessStatuses().forEach(processStatusEntity -> processStatusEntity.setProcessId(processId));
+        }
+
+        if (processEntity.getProcessErrors() != null) {
+            logger.debug("Populating the Primary Key of ProcessError objects for the Process");
+            processEntity.getProcessErrors().forEach(processErrorEntity -> processErrorEntity.setProcessId(processId));
+        }
+
+        if (processEntity.getTasks() != null) {
+            logger.debug("Populating the Process objects' Process ID for the Process");
+            processEntity.getTasks().forEach(taskEntity -> taskEntity.setParentProcessId(processId));
+        }
+
+        if (!isProcessExist(processId)) {
+            logger.debug("Checking if the Process already exists");
+            processEntity.setCreationTime(new Timestamp((System.currentTimeMillis())));
+        }
+
+        processEntity.setLastUpdateTime(new Timestamp((System.currentTimeMillis())));
+        return execute(entityManager -> entityManager.merge(processEntity));
+    }
+
+    public String addProcess(ProcessModel process, String experimentId) throws RegistryException {
+        process.setExperimentId(experimentId);
+        String processId = saveProcessModelData(process);
+        return processId;
+    }
+
+    public void updateProcess(ProcessModel updatedProcess, String processId) throws RegistryException {
+        saveProcessModelData(updatedProcess);
+    }
+
+    public ProcessModel getProcess(String processId) throws RegistryException {
+        ProcessRepository processRepository = new ProcessRepository();
+        return processRepository.get(processId);
+    }
+
+    public String addProcessResourceSchedule(ComputationalResourceSchedulingModel computationalResourceSchedulingModel, String processId) throws RegistryException {
+        ProcessModel processModel = getProcess(processId);
+        processModel.setProcessResourceSchedule(computationalResourceSchedulingModel);
+        updateProcess(processModel, processId);
+        return processId;
+    }
+
+    public String updateProcessResourceSchedule(ComputationalResourceSchedulingModel computationalResourceSchedulingModel, String processId) throws RegistryException {
+        return addProcessResourceSchedule(computationalResourceSchedulingModel, processId);
+    }
+
+    public ComputationalResourceSchedulingModel getProcessResourceSchedule(String processId) throws RegistryException {
+        ProcessModel processModel = getProcess(processId);
+        return processModel.getProcessResourceSchedule();
+    }
+
+    public List<ProcessModel> getProcessList(String fieldName, Object value) throws RegistryException {
+        ProcessRepository processRepository = new ProcessRepository();
+        List<ProcessModel> processModelList;
+
+        if (fieldName.equals(DBConstants.Process.EXPERIMENT_ID)) {
+            logger.debug("Search criteria is ExperimentId");
+            Map<String, Object> queryParameters = new HashMap<>();
+            queryParameters.put(DBConstants.Process.EXPERIMENT_ID, value);
+            processModelList = processRepository.select(QueryConstants.GET_PROCESS_FOR_EXPERIMENT_ID, -1, 0, queryParameters);
+        }
+
+        else {
+            logger.error("Unsupported field name for Process module.");
+            throw new IllegalArgumentException("Unsupported field name for Process module.");
+        }
+
+        return processModelList;
+    }
+
+    public List<String> getProcessIds(String fieldName, Object value) throws RegistryException {
+        List<String> processIds = new ArrayList<>();
+        List<ProcessModel> processModelList = getProcessList(fieldName, value);
+        for (ProcessModel processModel : processModelList) {
+            processIds.add(processModel.getProcessId());
+        }
+        return processIds;
+    }
+
+    public boolean isProcessExist(String processId) throws RegistryException {
+        return isExists(processId);
+    }
+
+    public void removeProcess(String processId) throws RegistryException {
+        delete(processId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepository.java
new file mode 100644
index 0000000000..2ed71d0683
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepository.java
@@ -0,0 +1,102 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessStatusEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.ProcessStatusPK;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.status.ProcessState;
+import org.apache.airavata.model.status.ProcessStatus;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.*;
+
+public class ProcessStatusRepository extends ExpCatAbstractRepository<ProcessStatus, ProcessStatusEntity, ProcessStatusPK> {
+    private final static Logger logger = LoggerFactory.getLogger(ProcessStatusRepository.class);
+
+    public ProcessStatusRepository() { super(ProcessStatus.class, ProcessStatusEntity.class); }
+
+    protected String saveProcessStatus(ProcessStatus processStatus, String processId) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        ProcessStatusEntity processStatusEntity = mapper.map(processStatus, ProcessStatusEntity.class);
+
+        if (processStatusEntity.getProcessId() == null) {
+            logger.debug("Setting the ProcessStatusEntity's ProcessId");
+            processStatusEntity.setProcessId(processId);
+        }
+
+        execute(entityManager -> entityManager.merge(processStatusEntity));
+        return processStatusEntity.getStatusId();
+    }
+
+    public String addProcessStatus(ProcessStatus processStatus, String processId) throws RegistryException {
+
+        if (processStatus.getStatusId() == null) {
+            logger.debug("Setting the ProcessStatus's StatusId");
+            processStatus.setStatusId(ExpCatalogUtils.getID("STATUS"));
+        }
+
+        return saveProcessStatus(processStatus, processId);
+    }
+
+    public String updateProcessStatus(ProcessStatus updatedProcessStatus, String processId) throws RegistryException {
+        return saveProcessStatus(updatedProcessStatus, processId);
+    }
+
+    public ProcessStatus getProcessStatus(String processId) throws RegistryException {
+        ProcessRepository processRepository = new ProcessRepository();
+        ProcessModel processModel = processRepository.getProcess(processId);
+        List<ProcessStatus> processStatusList = processModel.getProcessStatuses();
+
+        if(processStatusList.size() == 0) {
+            logger.debug("ProcessStatus list is empty");
+            return null;
+        }
+
+        else {
+            ProcessStatus latestProcessStatus = processStatusList.get(0);
+
+            for(int i = 1; i < processStatusList.size(); i++){
+                Timestamp timeOfStateChange = new Timestamp(processStatusList.get(i).getTimeOfStateChange());
+
+                if (timeOfStateChange != null) {
+
+                    if (timeOfStateChange.after(new Timestamp(latestProcessStatus.getTimeOfStateChange()))
+                            || (timeOfStateChange.equals(latestProcessStatus.getTimeOfStateChange()) && processStatusList.get(i).getState().equals(ProcessState.COMPLETED.toString()))
+                            || (timeOfStateChange.equals(latestProcessStatus.getTimeOfStateChange()) && processStatusList.get(i).getState().equals(ProcessState.FAILED.toString()))
+                            || (timeOfStateChange.equals(latestProcessStatus.getTimeOfStateChange()) && processStatusList.get(i).getState().equals(ProcessState.CANCELED.toString()))) {
+                        latestProcessStatus = processStatusList.get(i);
+                    }
+
+                }
+
+            }
+            return latestProcessStatus;
+        }
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
new file mode 100644
index 0000000000..c3a231e5b9
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
@@ -0,0 +1,205 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.entities.expcatalog.ProjectEntity;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.cpi.ResultOrderType;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.*;
+
+public class ProjectRepository extends ExpCatAbstractRepository<Project, ProjectEntity, String> {
+    private final static Logger logger = LoggerFactory.getLogger(ProjectRepository.class);
+
+    public ProjectRepository() { super(Project.class, ProjectEntity.class); }
+
+    protected String saveProjectData(Project project, String gatewayId) throws RegistryException {
+        ProjectEntity projectEntity = saveProject(project, gatewayId);
+        return projectEntity.getProjectID();
+    }
+
+    protected ProjectEntity saveProject(Project project, String gatewayId) throws RegistryException {
+        if (project.getProjectID() == null || project.getProjectID().equals(airavata_commonsConstants.DEFAULT_ID)) {
+            logger.debug("Setting the Project's ProjectId");
+            project.setProjectID(getProjectId(project.getName()));
+        }
+
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        ProjectEntity projectEntity = mapper.map(project, ProjectEntity.class);
+
+        if (project.getGatewayId() == null) {
+            logger.debug("Setting the Project's GatewayId");
+            projectEntity.setGatewayId(gatewayId);
+        }
+
+        if (!isProjectExist(projectEntity.getProjectID())) {
+            logger.debug("Checking if the Project already exists");
+            projectEntity.setCreationTime(new Timestamp((System.currentTimeMillis())));
+        }
+
+        return execute(entityManager -> entityManager.merge(projectEntity));
+    }
+
+    public String addProject(Project project, String gatewayId) throws RegistryException {
+        return saveProjectData(project, gatewayId);
+    }
+
+    public void updateProject(Project project, String projectId) throws RegistryException {
+        saveProjectData(project, projectId);
+    }
+
+    private String getProjectId(String projectName){
+        String pro = projectName.replaceAll("\\s", "");
+        return pro + "_" + UUID.randomUUID();
+    }
+
+    public Project getProject(String projectId) throws RegistryException {
+        return get(projectId);
+    }
+
+    public List<Project> getProjectList(String fieldName, Object value) throws RegistryException {
+        return getProjectList(fieldName, value, -1, 0, null, null);
+    }
+
+    public List<Project> getProjectList(String fieldName, Object value, int limit, int offset,
+                                         Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException{
+        Map<String, Object> queryParameters = new HashMap<>();
+
+        if (fieldName.equals(DBConstants.Project.OWNER)) {
+            logger.debug("Checking if the field name is owner");
+            queryParameters.put(DBConstants.Project.OWNER, value);
+            List<Project> projectList = select(QueryConstants.GET_ALL_PROJECTS_FOR_OWNER, limit, offset, queryParameters);
+
+            if (projectList != null && !projectList.isEmpty()) {
+                logger.debug("The retrieved list is not empty or null");
+                return projectList;
+            }
+
+        }
+
+        else {
+            logger.error("Unsupported field name for Project module.");
+            throw new IllegalArgumentException("Unsupported field name for Project module.");
+        }
+
+        return null;
+    }
+
+    public List<String> getProjectIDs(String fieldName, Object value) throws RegistryException {
+        List<Project> projectList = getProjectList(fieldName, value);
+        List<String> projectIds = new ArrayList<>();
+
+        if (projectList != null && !projectList.isEmpty()) {
+            logger.debug("The retrieved list is not empty or null");
+            for (Project project : projectList) {
+                projectIds.add(project.getProjectID());
+            }
+        }
+
+        return projectIds;
+    }
+
+    public List<Project> searchProjects(Map<String, String> filters, int limit,
+                                        int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException {
+        return searchAllAccessibleProjects(null, filters, limit, offset, orderByIdentifier, resultOrderType);
+    }
+
+    public List<Project> searchAllAccessibleProjects(List<String> accessibleProjectIds, Map<String, String> filters, int limit,
+                                                     int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException {
+        String query = "SELECT P FROM " + ProjectEntity.class.getSimpleName() + " P WHERE ";
+        Map<String, Object> queryParameters = new HashMap<>();
+
+        if (filters == null || !filters.containsKey(DBConstants.Project.GATEWAY_ID)) {
+            logger.error("GatewayId is required");
+            throw new RegistryException("GatewayId is required");
+        }
+
+        for (String field : filters.keySet()) {
+
+            if (field.equals(DBConstants.Project.GATEWAY_ID)) {
+                logger.debug("Filter Projects by Gateway ID");
+                queryParameters.put(DBConstants.Project.GATEWAY_ID, filters.get(field));
+                query += "P.gatewayId LIKE :" + DBConstants.Project.GATEWAY_ID + " AND ";
+            }
+
+            else if (field.equals(DBConstants.Project.OWNER)) {
+                logger.debug("Filter Projects by Owner");
+                queryParameters.put(DBConstants.Project.OWNER, filters.get(field));
+                query += "P.owner LIKE :" + DBConstants.Project.OWNER + " AND ";
+            }
+
+            else if (field.equals(DBConstants.Project.PROJECT_NAME)) {
+                logger.debug("Filter Projects by Project Name");
+                queryParameters.put(DBConstants.Project.PROJECT_NAME, filters.get(field));
+                query += "P.name LIKE :" + DBConstants.Project.PROJECT_NAME + " AND ";
+            }
+
+            else if (field.equals(DBConstants.Project.DESCRIPTION)) {
+                logger.debug("Filter Projects by Description");
+                queryParameters.put(DBConstants.Project.DESCRIPTION, filters.get(field));
+                query += "P.description LIKE :" + DBConstants.Project.DESCRIPTION + " AND ";
+            }
+
+            else {
+                logger.error("Unsupported field name for Project module.");
+                throw new IllegalArgumentException("Unsupported field name for Project module.");
+            }
+
+        }
+
+        if (accessibleProjectIds != null && !accessibleProjectIds.isEmpty()) {
+            logger.debug("Filter Projects by Accessible Project IDs");
+            queryParameters.put(DBConstants.Project.ACCESSIBLE_PROJECT_IDS, accessibleProjectIds);
+            query += "P.projectID IN :" + DBConstants.Project.ACCESSIBLE_PROJECT_IDS;
+        }
+
+        else {
+            logger.debug("Removing the last operator from the query");
+            query = query.substring(0, query.length() - 5);
+        }
+
+        if (orderByIdentifier != null && resultOrderType != null && orderByIdentifier.equals(DBConstants.Project.CREATION_TIME)) {
+            String order = (resultOrderType == ResultOrderType.ASC) ? "ASC" : "DESC";
+            query += " ORDER BY P." + DBConstants.Project.CREATION_TIME + " " + order;
+        }
+
+        List<Project> projectList = select(query, limit, offset, queryParameters);
+        return projectList;
+    }
+
+    public boolean isProjectExist(String projectId) throws RegistryException {
+        return isExists(projectId);
+    }
+
+    public void removeProject(String projectId) throws RegistryException {
+        delete(projectId);
+    }
+
+}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepository.java
new file mode 100644
index 0000000000..3c827d6328
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepository.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.status.QueueStatusModel;
+import org.apache.airavata.registry.core.entities.expcatalog.QueueStatusEntity;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class QueueStatusRepository extends ExpCatAbstractRepository<QueueStatusModel, QueueStatusEntity, String> {
+    private final static Logger logger = LoggerFactory.getLogger(QueueStatusRepository.class);
+
+    public QueueStatusRepository() { super(QueueStatusModel.class, QueueStatusEntity.class); }
+
+    public boolean createQueueStatuses(List<QueueStatusModel> queueStatusModels) throws RegistryException {
+
+        for (QueueStatusModel queueStatusModel : queueStatusModels) {
+            Mapper mapper = ObjectMapperSingleton.getInstance();
+            QueueStatusEntity queueStatusEntity = mapper.map(queueStatusModel, QueueStatusEntity.class);
+            execute(entityManager -> entityManager.merge(queueStatusEntity));
+        }
+
+        return true;
+    }
+
+    public List<QueueStatusModel> getLatestQueueStatuses() throws RegistryException {
+        List<QueueStatusModel> queueStatusModelList = select(QueryConstants.GET_ALL_QUEUE_STATUS_MODELS, 0);
+        return queueStatusModelList;
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepository.java
new file mode 100644
index 0000000000..66140dd789
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepository.java
@@ -0,0 +1,54 @@
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.ErrorModel;
+import org.apache.airavata.model.task.TaskModel;
+import org.apache.airavata.registry.core.entities.expcatalog.TaskErrorEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.TaskErrorPK;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class TaskErrorRepository extends ExpCatAbstractRepository<ErrorModel, TaskErrorEntity, TaskErrorPK> {
+    private final static Logger logger = LoggerFactory.getLogger(TaskErrorRepository.class);
+
+    public TaskErrorRepository() { super(ErrorModel.class, TaskErrorEntity.class); }
+
+    protected String saveTaskError(ErrorModel error, String taskId) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        TaskErrorEntity taskErrorEntity = mapper.map(error, TaskErrorEntity.class);
+
+        if (taskErrorEntity.getTaskId() == null) {
+            logger.debug("Setting the TaskErrorEntity's TaskId");
+            taskErrorEntity.setTaskId(taskId);
+        }
+
+        execute(entityManager -> entityManager.merge(taskErrorEntity));
+        return taskErrorEntity.getErrorId();
+    }
+
+    public String addTaskError(ErrorModel taskError, String taskId) throws RegistryException {
+
+        if (taskError.getErrorId() == null) {
+            logger.debug("Setting the TaskError's ErrorId");
+            taskError.setErrorId(ExpCatalogUtils.getID("ERROR"));
+        }
+
+        return saveTaskError(taskError, taskId);
+    }
+
+    public String updateTaskError(ErrorModel updatedTaskError, String taskId) throws RegistryException {
+        return saveTaskError(updatedTaskError, taskId);
+    }
+
+    public List<ErrorModel> getTaskError(String taskId) throws RegistryException {
+        TaskRepository taskRepository = new TaskRepository();
+        TaskModel taskModel = taskRepository.getTask(taskId);
+        return taskModel.getTaskErrors();
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepository.java
new file mode 100644
index 0000000000..737ffe0209
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepository.java
@@ -0,0 +1,133 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.model.task.TaskModel;
+import org.apache.airavata.registry.core.entities.expcatalog.TaskEntity;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.core.utils.QueryConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.*;
+
+public class TaskRepository extends ExpCatAbstractRepository<TaskModel, TaskEntity, String> {
+    private final static Logger logger = LoggerFactory.getLogger(TaskRepository.class);
+
+    public TaskRepository() { super(TaskModel.class, TaskEntity.class); }
+
+    protected String saveTaskModelData(TaskModel taskModel) throws RegistryException {
+        TaskEntity taskEntity = saveTask(taskModel);
+        return taskEntity.getTaskId();
+    }
+
+    protected TaskEntity saveTask(TaskModel taskModel) throws RegistryException {
+        if (taskModel.getTaskId() == null || taskModel.getTaskId().equals(airavata_commonsConstants.DEFAULT_ID)) {
+            logger.debug("Setting the Task's TaskId");
+            taskModel.setTaskId(ExpCatalogUtils.getID("TASK"));
+        }
+
+        String taskId = taskModel.getTaskId();
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        TaskEntity taskEntity = mapper.map(taskModel, TaskEntity.class);
+
+        if (taskEntity.getTaskStatuses() != null) {
+            logger.debug("Populating the Primary Key of TaskStatus objects for the Task");
+            taskEntity.getTaskStatuses().forEach(taskStatusEntity -> taskStatusEntity.setTaskId(taskId));
+        }
+
+        if (taskEntity.getTaskErrors() != null) {
+            logger.debug("Populating the Primary Key of TaskError objects for the Task");
+            taskEntity.getTaskErrors().forEach(taskErrorEntity -> taskErrorEntity.setTaskId(taskId));
+        }
+
+        if (taskEntity.getJobs() != null) {
+            logger.debug("Populating the Job objects' Task ID for the Task");
+            taskEntity.getJobs().forEach(jobEntity -> jobEntity.setTaskId(taskId));
+        }
+
+        if (!isTaskExist(taskId)) {
+            logger.debug("Checking if the Task already exists");
+            taskEntity.setCreationTime(new Timestamp((System.currentTimeMillis())));
+        }
+
+        taskEntity.setLastUpdateTime(new Timestamp((System.currentTimeMillis())));
+        return execute(entityManager -> entityManager.merge(taskEntity));
+    }
+
+    public String addTask(TaskModel task, String processId) throws RegistryException {
+        task.setParentProcessId(processId);
+        String taskId = saveTaskModelData(task);
+        return taskId;
+    }
+
+    public String updateTask(TaskModel task, String taskId) throws RegistryException {
+        return saveTaskModelData(task);
+    }
+
+    public TaskModel getTask(String taskId) throws RegistryException {
+        TaskRepository taskRepository = new TaskRepository();
+        return taskRepository.get(taskId);
+    }
+
+    public List<TaskModel> getTaskList(String fieldName, Object value) throws RegistryException {
+        TaskRepository taskRepository = new TaskRepository();
+        List<TaskModel> taskModelList;
+
+        if (fieldName.equals(DBConstants.Task.PARENT_PROCESS_ID)) {
+            logger.debug("Search criteria is ParentProcessId");
+            Map<String, Object> queryParameters = new HashMap<>();
+            queryParameters.put(DBConstants.Task.PARENT_PROCESS_ID, value);
+            taskModelList = taskRepository.select(QueryConstants.GET_TASK_FOR_PARENT_PROCESS_ID, -1, 0, queryParameters);
+        }
+
+        else {
+            logger.error("Unsupported field name for Task module.");
+            throw new IllegalArgumentException("Unsupported field name for Task module.");
+        }
+
+        return taskModelList;
+    }
+
+    public List<String> getTaskIds(String fieldName, Object value) throws RegistryException {
+        List<String> taskIds = new ArrayList<>();
+        List<TaskModel> taskModelList = getTaskList(fieldName, value);
+        for (TaskModel taskModel : taskModelList) {
+            taskIds.add(taskModel.getTaskId());
+        }
+        return taskIds;
+    }
+
+    public boolean isTaskExist(String taskId) throws RegistryException {
+        return isExists(taskId);
+    }
+
+    public void removeTask(String taskId) throws RegistryException {
+        delete(taskId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepository.java
new file mode 100644
index 0000000000..fe5f1adb89
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepository.java
@@ -0,0 +1,79 @@
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.status.TaskState;
+import org.apache.airavata.model.status.TaskStatus;
+import org.apache.airavata.model.task.TaskModel;
+import org.apache.airavata.registry.core.entities.expcatalog.TaskStatusEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.TaskStatusPK;
+import org.apache.airavata.registry.core.utils.ExpCatalogUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+public class TaskStatusRepository extends ExpCatAbstractRepository<TaskStatus, TaskStatusEntity, TaskStatusPK> {
+    private final static Logger logger = LoggerFactory.getLogger(TaskStatusRepository.class);
+
+    public TaskStatusRepository() { super(TaskStatus.class, TaskStatusEntity.class); }
+
+    protected String saveTaskStatus(TaskStatus taskStatus, String taskId) throws RegistryException {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        TaskStatusEntity taskStatusEntity = mapper.map(taskStatus, TaskStatusEntity.class);
+
+        if (taskStatusEntity.getTaskId() == null) {
+            logger.debug("Setting the TaskStatusEntity's TaskId");
+            taskStatusEntity.setTaskId(taskId);
+        }
+
+        execute(entityManager -> entityManager.merge(taskStatusEntity));
+        return taskStatusEntity.getStatusId();
+    }
+
+    public String addTaskStatus(TaskStatus taskStatus, String taskId) throws RegistryException {
+
+        if (taskStatus.getStatusId() == null) {
+            logger.debug("Setting the TaskStatus's StatusId");
+            taskStatus.setStatusId(ExpCatalogUtils.getID("STATUS"));
+        }
+
+        return saveTaskStatus(taskStatus, taskId);
+    }
+
+    public String updateTaskStatus(TaskStatus updatedTaskStatus, String taskId) throws RegistryException {
+        return saveTaskStatus(updatedTaskStatus, taskId);
+    }
+
+    public TaskStatus getTaskStatus(String taskId) throws RegistryException {
+        TaskRepository taskRepository = new TaskRepository();
+        TaskModel taskModel = taskRepository.getTask(taskId);
+        List<TaskStatus> taskStatusList = taskModel.getTaskStatuses();
+
+        if(taskStatusList.size() == 0) {
+            logger.debug("TaskStatus list is empty");
+            return null;
+        }
+
+        else {
+            TaskStatus latestTaskStatus = taskStatusList.get(0);
+
+            for(int i = 1; i < taskStatusList.size(); i++) {
+                Timestamp timeOfStateChange = new Timestamp(taskStatusList.get(i).getTimeOfStateChange());
+
+                if (timeOfStateChange.after(new Timestamp(latestTaskStatus.getTimeOfStateChange()))
+                        || (timeOfStateChange.equals(latestTaskStatus.getTimeOfStateChange()) && taskStatusList.get(i).getState().equals(TaskState.COMPLETED.toString()))
+                        || (timeOfStateChange.equals(latestTaskStatus.getTimeOfStateChange()) && taskStatusList.get(i).getState().equals(TaskState.FAILED.toString()))
+                        || (timeOfStateChange.equals(latestTaskStatus.getTimeOfStateChange()) && taskStatusList.get(i).getState().equals(TaskState.CANCELED.toString()))) {
+                    latestTaskStatus = taskStatusList.get(i);
+                }
+
+            }
+
+            return latestTaskStatus;
+        }
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/GatewayRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/GatewayRepository.java
deleted file mode 100644
index 9a1c6d6479..0000000000
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/GatewayRepository.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-package org.apache.airavata.registry.core.repositories.workspacecatalog;
-
-import org.apache.airavata.model.workspace.Gateway;
-import org.apache.airavata.registry.core.entities.workspacecatalog.GatewayEntity;
-import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GatewayRepository extends AbstractRepository<Gateway, GatewayEntity, String> {
-    private final static Logger logger = LoggerFactory.getLogger(GatewayRepository.class);
-
-    public GatewayRepository(Class<Gateway> thriftGenericClass, Class<GatewayEntity> dbEntityGenericClass) {
-        super(thriftGenericClass, dbEntityGenericClass);
-
-    }
-}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/NotificationRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/NotificationRepository.java
deleted file mode 100644
index 833202456c..0000000000
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/NotificationRepository.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-package org.apache.airavata.registry.core.repositories.workspacecatalog;
-
-import org.apache.airavata.model.workspace.Notification;
-import org.apache.airavata.registry.core.entities.workspacecatalog.NotificationEntity;
-import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NotificationRepository extends AbstractRepository<Notification, NotificationEntity, String> {
-    private final static Logger logger = LoggerFactory.getLogger(NotificationRepository.class);
-
-    public NotificationRepository(Class thriftGenericClass, Class dbEntityGenericClass) {
-        super(thriftGenericClass, dbEntityGenericClass);
-    }
-}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java
index 7634104a1e..68b098f016 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java
@@ -83,6 +83,61 @@
         public static final String GATEWAY_ID = "gatewayId";
     }
 
+    public static class Gateway {
+        public static final String GATEWAY_NAME = "gatewayName";
+    }
+
+    public static class Notification {
+        public static final String GATEWAY_ID = "gatewayId";
+    }
+
+    public static class Project {
+        public static final String GATEWAY_ID = "gatewayId";
+        public static final String OWNER = "owner";
+        public static final String PROJECT_NAME = "name";
+        public static final String DESCRIPTION = "description";
+        public static final String ACCESSIBLE_PROJECT_IDS = "accessibleProjectIds";
+        public static final String CREATION_TIME = "creationTime";
+    }
+
+    public static class Experiment {
+        public static final String USER_NAME = "userName";
+        public static final String PROJECT_ID = "projectId";
+        public static final String GATEWAY_ID = "gatewayId";
+        public static final String EXPERIMENT_ID = "experimentId";
+        public static final String EXPERIMENT_NAME = "experimentName";
+        public static final String DESCRIPTION = "description";
+        public static final String EXECUTION_ID = "executionId";
+        public static final String CREATION_TIME = "creationTime";
+        public static final String RESOURCE_HOST_ID = "resourceHostId";
+        public static final String ACCESSIBLE_EXPERIMENT_IDS = "accessibleExperimentIds";
+        public static final String EXPERIMENT_STATE = "experimentState";
+    }
+
+    public final class ExperimentStatus {
+        public static final String EXPERIMENT_ID = "experimentId";
+        public static final String STATE = "state";
+        public static final String REASON = "reason";
+    }
+
+    public static class Process {
+        public static final String EXPERIMENT_ID = "experimentId";
+    }
+
+    public static class Task {
+        public static final String PARENT_PROCESS_ID = "parentProcessId";
+    }
+
+    public static class Job {
+        public static final String PROCESS_ID = "processId";
+        public static final String TASK_ID = "taskId";
+    }
+
+    public static class ExperimentSummary {
+        public static final String FROM_DATE = "fromDate";
+        public static final String TO_DATE = "toDate";
+    }
+
     public static class UserComputeResourcePreference {
         public static final String USER_ID = "userId";
         public static final String GATEWAY_ID = "gatewayId";
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/ProjectRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/ExpCatalogUtils.java
similarity index 53%
rename from modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/ProjectRepository.java
rename to modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/ExpCatalogUtils.java
index eebf5fbe60..1ffcc95f41 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/workspacecatalog/ProjectRepository.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/ExpCatalogUtils.java
@@ -1,4 +1,4 @@
-/*
+/**
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -16,20 +16,14 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
-*/
-package org.apache.airavata.registry.core.repositories.workspacecatalog;
-
-import org.apache.airavata.model.workspace.Project;
-import org.apache.airavata.registry.core.entities.workspacecatalog.ProjectEntity;
-import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+ */
+package org.apache.airavata.registry.core.utils;
 
-public class ProjectRepository extends AbstractRepository<Project, ProjectEntity, String> {
-    private final static Logger logger = LoggerFactory.getLogger(ProjectRepository.class);
+import java.util.UUID;
 
-    public ProjectRepository(Class<Project> thriftGenericClass, Class<ProjectEntity> dbEntityGenericClass) {
-        super(thriftGenericClass, dbEntityGenericClass);
+public class ExpCatalogUtils {
+    public static String getID (String name){
+        String pro = name.replaceAll("\\s", "");
+        return pro + "_" + UUID.randomUUID();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/ExpCatalogJPAUtils.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/ExpCatalogJPAUtils.java
new file mode 100644
index 0000000000..d83733a177
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/ExpCatalogJPAUtils.java
@@ -0,0 +1,84 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.airavata.registry.core.utils.JPAUtil;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.*;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ExpCatalogJPAUtils {
+    private final static Logger logger = LoggerFactory.getLogger(ExpCatalogJPAUtils.class);
+
+    private static final String PERSISTENCE_UNIT_NAME = "experiment_data_new";
+    private static final String EXPCATALOG_JDBC_DRIVER = "registry.jdbc.driver";
+    private static final String EXPCATALOG_JDBC_URL = "registry.jdbc.url";
+    private static final String EXPCATALOG_JDBC_USER = "registry.jdbc.user";
+    private static final String EXPCATALOG_JDBC_PASSWORD = "registry.jdbc.password";
+    private static final String EXPCATALOG_VALIDATION_QUERY = "validationQuery";
+    private static final String JPA_CACHE_SIZE = "jpa.cache.size";
+    private static final String JPA_CACHE_ENABLED = "cache.enable";
+    @PersistenceUnit(unitName=PERSISTENCE_UNIT_NAME)
+    protected static EntityManagerFactory factory;
+    @PersistenceContext(unitName=PERSISTENCE_UNIT_NAME)
+    private static EntityManager expCatEntityManager;
+
+
+    public static EntityManager getEntityManager() throws ApplicationSettingsException {
+        if (factory == null) {
+            String connectionProperties = "DriverClassName=" + readServerProperties(EXPCATALOG_JDBC_DRIVER) + "," +
+                    "Url=" + readServerProperties(EXPCATALOG_JDBC_URL) + "?autoReconnect=true," +
+                    "Username=" + readServerProperties(EXPCATALOG_JDBC_USER) + "," +
+                    "Password=" + readServerProperties(EXPCATALOG_JDBC_PASSWORD) +
+                    ",validationQuery=" + readServerProperties(EXPCATALOG_VALIDATION_QUERY);
+            System.out.println(connectionProperties);
+            Map<String, String> properties = new HashMap<>();
+            properties.put("openjpa.ConnectionDriverName", "org.apache.commons.dbcp.BasicDataSource");
+            properties.put("openjpa.ConnectionProperties", connectionProperties);
+            properties.put("openjpa.DynamicEnhancementAgent", "true");
+            properties.put("openjpa.RuntimeUnenhancedClasses", "unsupported");
+//            properties.put("openjpa.DataCache","" + Utils.isCachingEnabled() + "(CacheSize=" + Utils.getJPACacheSize() + ", SoftReferenceSize=0)");
+//            properties.put("openjpa.QueryCache","" + Utils.isCachingEnabled() + "(CacheSize=" + Utils.getJPACacheSize() + ", SoftReferenceSize=0)");
+//            properties.put("javax.persistence.sharedCache.mode","ALL");
+            properties.put("openjpa.RemoteCommitProvider", "sjvm");
+            properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=INFO");
+            properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
+            properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72, PrintParameters=true, MaxActive=10, MaxIdle=5, MinIdle=2, MaxWait=31536000,  autoReconnect=true");
+//			properties.put("openjpa.jdbc.QuerySQLCache", "false");
+            factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, properties);
+        }
+        expCatEntityManager = factory.createEntityManager();
+        return expCatEntityManager;
+    }
+
+    private static String readServerProperties(String propertyName) throws ApplicationSettingsException {
+        try {
+            return ServerSettings.getSetting(propertyName);
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read airavata-server.properties...", e);
+            throw new ApplicationSettingsException("Unable to read airavata-server.properties...");
+        }
+    }
+
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java
index 8cc4444b72..85aca5de85 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java
@@ -19,10 +19,13 @@
  */
 package org.apache.airavata.registry.core.utils;
 
+import org.apache.airavata.model.experiment.ExperimentModel;
 import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.registry.core.entities.appcatalog.*;
+import org.apache.airavata.registry.core.entities.expcatalog.*;
 import org.apache.airavata.registry.core.entities.replicacatalog.DataProductEntity;
 import org.apache.airavata.registry.core.entities.workflowcatalog.WorkflowEntity;
+import org.apache.openjpa.kernel.exps.Exp;
 
 public interface QueryConstants {
 
@@ -103,6 +106,36 @@
     String GET_ALL_GATEWAY_ID = "SELECT DISTINCT URP FROM " + UserResourceProfileEntity.class.getSimpleName() + " URP " +
             "WHERE URP.gatewayId LIKE :" + DBConstants.UserResourceProfile.GATEWAY_ID;
 
+    String GET_ALL_GATEWAYS = "SELECT G FROM " + GatewayEntity.class.getSimpleName() + " G";
+    String GET_GATEWAY_FROM_GATEWAY_NAME = "SELECT G FROM " + GatewayEntity.class.getSimpleName() + " G " +
+            "WHERE G.gatewayName LIKE :" + DBConstants.Gateway.GATEWAY_NAME;
+
+    String GET_ALL_GATEWAY_NOTIFICATIONS = "SELECT N FROM " + NotificationEntity.class.getSimpleName() + " N " +
+            "WHERE N.gatewayId LIKE :" + DBConstants.Notification.GATEWAY_ID;
+
+    String GET_ALL_PROJECTS_FOR_OWNER = "SELECT P FROM " + ProjectEntity.class.getSimpleName() + " P " +
+            "WHERE P.owner LIKE :" + DBConstants.Project.OWNER;
+
+    String GET_EXPERIMENTS_FOR_USER = "SELECT E FROM " + ExperimentEntity.class.getSimpleName() + " E " +
+            "WHERE E.userName LIKE :" + DBConstants.Experiment.USER_NAME;
+    String GET_EXPERIMENTS_FOR_PROJECT_ID = "SELECT E FROM " + ExperimentEntity.class.getSimpleName() + " E " +
+            "WHERE E.projectId LIKE :" + DBConstants.Experiment.PROJECT_ID;
+    String GET_EXPERIMENTS_FOR_GATEWAY_ID = "SELECT E FROM " + ExperimentEntity.class.getSimpleName() + " E " +
+            "WHERE E.gatewayId LIKE :" + DBConstants.Experiment.GATEWAY_ID;
+
+    String GET_PROCESS_FOR_EXPERIMENT_ID = "SELECT P FROM " + ProcessEntity.class.getSimpleName() + " P " +
+            "WHERE P.experimentId LIKE :" + DBConstants.Process.EXPERIMENT_ID;
+
+    String GET_TASK_FOR_PARENT_PROCESS_ID = "SELECT T FROM " + TaskEntity.class.getSimpleName() + " T " +
+            "WHERE T.parentProcessId LIKE :" + DBConstants.Task.PARENT_PROCESS_ID;
+
+    String GET_JOB_FOR_PROCESS_ID = "SELECT J FROM " + JobEntity.class.getSimpleName() + " J " +
+            "WHERE J.processId LIKE :" + DBConstants.Job.PROCESS_ID;
+    String GET_JOB_FOR_TASK_ID = "SELECT J FROM " + JobEntity.class.getSimpleName() + " J " +
+            "WHERE J.taskId LIKE :" + DBConstants.Job.TASK_ID;
+
+    String GET_ALL_QUEUE_STATUS_MODELS = "SELECT QSM FROM " + QueueStatusEntity.class.getSimpleName() + " QSM";
+
     String GET_ALL_USER_COMPUTE_RESOURCE_PREFERENCE = "SELECT UCRP FROM " + UserComputeResourcePreferenceEntity.class.getSimpleName() + " UCRP " +
             "WHERE UCRP.userId LIKE :" + DBConstants.UserComputeResourcePreference.USER_ID + " AND UCRP.gatewayId LIKE :" +
             DBConstants.UserComputeResourcePreference.GATEWAY_ID;
diff --git a/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml b/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml
index d8d52ffa86..8abc6628e3 100644
--- a/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml
+++ b/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml
@@ -81,13 +81,6 @@
         <class>org.apache.airavata.registry.core.entities.replicacatalog.DataReplicaMetadataEntity</class>
         <exclude-unlisted-classes>true</exclude-unlisted-classes>
     </persistence-unit>
-    <persistence-unit name="workspacecatalog_data">
-        <class>org.apache.airavata.registry.core.entities.workspacecatalog.GatewayEntity</class>
-        <class>org.apache.airavata.registry.core.entities.workspacecatalog.UserProfileEntity</class>
-        <class>org.apache.airavata.registry.core.entities.workspacecatalog.NSFDemographicsEntity</class>
-        <class>org.apache.airavata.registry.core.entities.workspacecatalog.NotificationEntity</class>
-        <class>org.apache.airavata.registry.core.entities.workspacecatalog.ProjectEntity</class>
-    </persistence-unit>
     <persistence-unit name="workflowcatalog_data">
         <class>org.apache.airavata.registry.core.entities.workflowcatalog.WorkflowEntity</class>
         <class>org.apache.airavata.registry.core.entities.workflowcatalog.EdgeEntity</class>
@@ -99,23 +92,29 @@
         <class>org.apache.airavata.registry.core.entities.workflowcatalog.WorkflowStatusEntity</class>
     </persistence-unit>
     <persistence-unit name="experiment_data_new">
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ComputeResourceSchedulingEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentErrorEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentInputEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentOutputEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.UserConfigurationEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentSummaryEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.GatewayEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.GatewayWorkerEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.JobEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.JobStatusEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.NotificationEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessErrorEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessInputEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessOutputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessResourceSchedulingEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessResourceScheduleEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessStatusEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.ProjectEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.ProjectUserEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.QueueStatusEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.TaskEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.TaskErrorEntity</class>
         <class>org.apache.airavata.registry.core.entities.expcatalog.TaskStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.JobEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.JobStatusEntity</class>
+        <class>org.apache.airavata.registry.core.entities.expcatalog.UserConfigurationDataEntity</class>
     </persistence-unit>
 </persistence>
diff --git a/modules/registry-refactoring/src/main/resources/expcatalog-derby.sql b/modules/registry-refactoring/src/main/resources/expcatalog-derby.sql
new file mode 100644
index 0000000000..d513284131
--- /dev/null
+++ b/modules/registry-refactoring/src/main/resources/expcatalog-derby.sql
@@ -0,0 +1,397 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+CREATE TABLE GATEWAY
+(
+        GATEWAY_ID VARCHAR(255),
+        GATEWAY_NAME VARCHAR(255),
+	      DOMAIN VARCHAR(255),
+	      EMAIL_ADDRESS VARCHAR(255),
+        GATEWAY_ACRONYM varchar(255),
+        GATEWAY_ADMIN_EMAIL varchar(255),
+        GATEWAY_ADMIN_FIRST_NAME varchar(255),
+        GATEWAY_APPROVAL_STATUS varchar(255),
+        GATEWAY_PUBLIC_ABSTRACT varchar(255),
+        GATEWAY_URL varchar(255),
+        GATEWAY_ADMIN_LAST_NAME varchar(255),
+        IDENTITY_SERVER_PASSWORD_TOKEN varchar(255),
+        IDENTITY_SERVER_USERNAME varchar(255),
+        GATEWAY_REVIEW_PROPOSAL_DESCRIPTION varchar(255),
+        DECLINED_REASON varchar(255),
+        OAUTH_CLIENT_SECRET varchar(255),
+        OAUTH_CLIENT_ID varchar(255),
+        REQUEST_CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        REQUESTER_USERNAME VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID)
+);
+
+CREATE TABLE NOTIFICATION
+(
+        NOTIFICATION_ID VARCHAR(255),
+        GATEWAY_ID VARCHAR(255),
+        TITLE VARCHAR(255),
+        PRIORITY VARCHAR(255),
+	      NOTIFICATION_MESSAGE VARCHAR(4096),
+	      PUBLISHED_DATE TIMESTAMP,
+	      EXPIRATION_DATE TIMESTAMP,
+	      CREATION_DATE TIMESTAMP,
+        PRIMARY KEY (NOTIFICATION_ID)
+);
+
+CREATE TABLE USERS
+(
+        AIRAVATA_INTERNAL_USER_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PASSWORD VARCHAR(255),
+        GATEWAY_ID VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, USER_NAME),
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GATEWAY_WORKER
+(
+        GATEWAY_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, USER_NAME),
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROJECT
+(
+        GATEWAY_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PROJECT_NAME VARCHAR(255),
+        PROJECT_ID VARCHAR(255),
+        DESCRIPTION VARCHAR(255),
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        PRIMARY KEY (PROJECT_ID),
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROJECT_USER
+(
+        PROJECT_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PRIMARY KEY (PROJECT_ID,USER_NAME),
+        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE EXPERIMENT (
+        EXPERIMENT_ID varchar(255),
+        PROJECT_ID varchar(255),
+        GATEWAY_ID varchar(255),
+        EXPERIMENT_TYPE varchar(255),
+        USER_NAME varchar(255),
+        EXPERIMENT_NAME varchar(255),
+        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        DESCRIPTION varchar(255),
+        EXECUTION_ID varchar(255),
+        GATEWAY_EXECUTION_ID varchar(255),
+        GATEWAY_INSTANCE_ID varchar(255),
+        ENABLE_EMAIL_NOTIFICATION SMALLINT,
+        EMAIL_ADDRESSES CLOB,
+        PRIMARY KEY (EXPERIMENT_ID),
+        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE EXPERIMENT_INPUT
+(
+        EXPERIMENT_ID varchar(255),
+        INPUT_NAME varchar(255),
+        INPUT_VALUE CLOB,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        STANDARD_INPUT SMALLINT,
+        USER_FRIENDLY_DESCRIPTION varchar(255),
+        METADATA varchar(255),
+        INPUT_ORDER INT,
+        IS_REQUIRED SMALLINT,
+        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
+        DATA_STAGED SMALLINT,
+        STORAGE_RESOURCE_ID varchar(255),
+        IS_READ_ONLY SMALLINT,
+        PRIMARY KEY(EXPERIMENT_ID,INPUT_NAME),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE EXPERIMENT_OUTPUT
+(
+        EXPERIMENT_ID varchar(255),
+        OUTPUT_NAME varchar(255),
+        OUTPUT_VALUE CLOB,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        IS_REQUIRED SMALLINT,
+        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
+        DATA_MOVEMENT SMALLINT,
+        LOCATION varchar(255),
+        SEARCH_QUERY varchar(255),
+        OUTPUT_STREAMING SMALLINT,
+        STORAGE_RESOURCE_ID varchar(255),
+        PRIMARY KEY(EXPERIMENT_ID,OUTPUT_NAME),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE EXPERIMENT_STATUS (
+        STATUS_ID varchar(255),
+        EXPERIMENT_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        REASON CLOB,
+        PRIMARY KEY (STATUS_ID, EXPERIMENT_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE EXPERIMENT_ERROR (
+        ERROR_ID varchar(255),
+        EXPERIMENT_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        ACTUAL_ERROR_MESSAGE CLOB,
+        USER_FRIENDLY_MESSAGE CLOB,
+        TRANSIENT_OR_PERSISTENT SMALLINT,
+        ROOT_CAUSE_ERROR_ID_LIST CLOB,
+        PRIMARY KEY (ERROR_ID, EXPERIMENT_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE USER_CONFIGURATION_DATA (
+        EXPERIMENT_ID varchar(255),
+        AIRAVATA_AUTO_SCHEDULE SMALLINT,
+        OVERRIDE_MANUAL_SCHEDULED_PARAMS SMALLINT,
+        SHARE_EXPERIMENT_PUBLICALLY SMALLINT,
+        THROTTLE_RESOURCES SMALLINT,
+        USER_DN varchar(255),
+        GENERATE_CERT SMALLINT,
+        RESOURCE_HOST_ID varchar(255),
+        TOTAL_CPU_COUNT INT,
+        NODE_COUNT INT,
+        NUMBER_OF_THREADS INT,
+        QUEUE_NAME varchar(255),
+        WALL_TIME_LIMIT INT,
+        TOTAL_PHYSICAL_MEMORY INT,
+        STATIC_WORKING_DIR varchar(255),
+        OVERRIDE_LOGIN_USER_NAME varchar(255),
+        OVERRIDE_SCRATCH_LOCATION varchar(255),
+        OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255),
+        STORAGE_RESOURCE_ID varchar(255),
+        EXPERIMENT_DATA_DIR VARCHAR (512),
+        GROUP_RESOURCE_PROFILE_ID VARCHAR(255) DEFAULT NULL,
+        IS_USE_USER_CR_PREF BOOLEAN,
+        PRIMARY KEY (EXPERIMENT_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+CREATE VIEW LATEST_EXPERIMENT_STATUS AS
+  select ES1.EXPERIMENT_ID AS EXPERIMENT_ID, ES1.STATE AS STATE, ES1.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
+  from EXPERIMENT_STATUS ES1 LEFT JOIN EXPERIMENT_STATUS ES2 ON (ES1.EXPERIMENT_ID = ES2.EXPERIMENT_ID
+    AND ES1.TIME_OF_STATE_CHANGE < ES2.TIME_OF_STATE_CHANGE)  WHERE ES2.TIME_OF_STATE_CHANGE is NULL;
+
+CREATE VIEW EXPERIMENT_SUMMARY AS
+  select E.EXPERIMENT_ID AS EXPERIMENT_ID, E.PROJECT_ID AS PROJECT_ID, E.GATEWAY_ID AS GATEWAY_ID,
+  E.USER_NAME AS USER_NAME, E.EXECUTION_ID AS EXECUTION_ID, E.EXPERIMENT_NAME AS EXPERIMENT_NAME,
+  E.CREATION_TIME AS CREATION_TIME, E.DESCRIPTION AS DESCRIPTION, ES.STATE AS STATE, UD.RESOURCE_HOST_ID
+  AS RESOURCE_HOST_ID, ES.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
+    from ((EXPERIMENT E left join LATEST_EXPERIMENT_STATUS ES on((E.EXPERIMENT_ID = ES.EXPERIMENT_ID)))
+    left join USER_CONFIGURATION_DATA UD on((E.EXPERIMENT_ID = UD.EXPERIMENT_ID))) where true;
+
+CREATE TABLE PROCESS (
+        PROCESS_ID varchar(255),
+        EXPERIMENT_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        LAST_UPDATE_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        PROCESS_DETAIL CLOB,
+        APPLICATION_INTERFACE_ID varchar(255),
+        TASK_DAG CLOB,
+        APPLICATION_DEPLOYMENT_ID varchar(255),
+        COMPUTE_RESOURCE_ID varchar(255),
+        GATEWAY_EXECUTION_ID varchar(255),
+        ENABLE_EMAIL_NOTIFICATION SMALLINT,
+        EMAIL_ADDRESSES CLOB,
+        STORAGE_RESOURCE_ID varchar(255),
+        USER_DN varchar(255),
+        GENERATE_CERT SMALLINT,
+        EXPERIMENT_DATA_DIR VARCHAR (512),
+        USERNAME VARCHAR (255),
+        GROUP_RESOURCE_PROFILE_ID VARCHAR (255) DEFAULT NULL,
+        PRIMARY KEY (PROCESS_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROCESS_INPUT
+(
+        PROCESS_ID varchar(255),
+        INPUT_NAME varchar(255),
+        INPUT_VALUE CLOB,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        STANDARD_INPUT SMALLINT,
+        USER_FRIENDLY_DESCRIPTION varchar(255),
+        METADATA varchar(255),
+        INPUT_ORDER INT,
+        IS_REQUIRED SMALLINT,
+        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
+        DATA_STAGED SMALLINT,
+        STORAGE_RESOURCE_ID varchar(255),
+        IS_READ_ONLY SMALLINT,
+        PRIMARY KEY(PROCESS_ID,INPUT_NAME),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROCESS_OUTPUT
+(
+        PROCESS_ID varchar(255),
+        OUTPUT_NAME varchar(255),
+        OUTPUT_VALUE CLOB,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        IS_REQUIRED SMALLINT,
+        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
+        DATA_MOVEMENT SMALLINT,
+        LOCATION varchar(255),
+        SEARCH_QUERY varchar(255),
+        OUTPUT_STREAMING SMALLINT,
+        STORAGE_RESOURCE_ID varchar(255),
+        PRIMARY KEY(PROCESS_ID,OUTPUT_NAME),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE PROCESS_STATUS (
+        STATUS_ID varchar(255),
+        PROCESS_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        REASON CLOB,
+        PRIMARY KEY (STATUS_ID, PROCESS_ID),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE PROCESS_ERROR (
+        ERROR_ID varchar(255),
+        PROCESS_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        ACTUAL_ERROR_MESSAGE CLOB,
+        USER_FRIENDLY_MESSAGE CLOB,
+        TRANSIENT_OR_PERSISTENT SMALLINT,
+        ROOT_CAUSE_ERROR_ID_LIST CLOB,
+        PRIMARY KEY (ERROR_ID, PROCESS_ID),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROCESS_RESOURCE_SCHEDULE (
+        PROCESS_ID varchar(255),
+        RESOURCE_HOST_ID varchar(255),
+        TOTAL_CPU_COUNT INT,
+        NODE_COUNT INT,
+        NUMBER_OF_THREADS INT,
+        QUEUE_NAME varchar(255),
+        WALL_TIME_LIMIT INT,
+        TOTAL_PHYSICAL_MEMORY INT,
+        STATIC_WORKING_DIR varchar(255),
+        PRIMARY KEY (PROCESS_ID),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE TASK (
+        TASK_ID varchar(255),
+        TASK_TYPE varchar(255),
+        PARENT_PROCESS_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        LAST_UPDATE_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        TASK_DETAIL CLOB,
+        TASK_INTERNAL_STORE CHAR,
+        PRIMARY KEY (TASK_ID),
+        FOREIGN KEY (PARENT_PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE TASK_STATUS (
+        STATUS_ID varchar(255),
+        TASK_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        REASON CLOB,
+        PRIMARY KEY (STATUS_ID, TASK_ID),
+        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE TASK_ERROR (
+        ERROR_ID varchar(255),
+        TASK_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
+        ACTUAL_ERROR_MESSAGE CLOB,
+        USER_FRIENDLY_MESSAGE CLOB,
+        TRANSIENT_OR_PERSISTENT SMALLINT,
+        ROOT_CAUSE_ERROR_ID_LIST CLOB,
+        PRIMARY KEY (ERROR_ID, TASK_ID),
+        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE JOB (
+        JOB_ID varchar(255),
+        TASK_ID varchar(255),
+        PROCESS_ID varchar(255),
+        JOB_DESCRIPTION CLOB NOT NULL,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        COMPUTE_RESOURCE_CONSUMED varchar(255),
+        JOB_NAME varchar(255),
+        WORKING_DIR varchar(255),
+        STD_OUT CLOB,
+        STD_ERR CLOB,
+        EXIT_CODE INT,
+        PRIMARY KEY (JOB_ID, TASK_ID),
+        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE JOB_STATUS (
+        STATUS_ID varchar(255),
+        JOB_ID varchar(255),
+        TASK_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        REASON CLOB,
+        PRIMARY KEY (STATUS_ID, JOB_ID, TASK_ID),
+        FOREIGN KEY (JOB_ID, TASK_ID) REFERENCES JOB(JOB_ID, TASK_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE QUEUE_STATUS(
+        HOST_NAME VARCHAR(255),
+        QUEUE_NAME VARCHAR(255),
+        CREATED_TIME BIGINT,
+        QUEUE_UP BOOLEAN,
+        RUNNING_JOBS INT,
+        QUEUED_JOBS INT,
+        PRIMARY KEY (HOST_NAME, QUEUE_NAME, CREATED_TIME)
+);
+
+CREATE TABLE CONFIGURATION
+(
+        CONFIG_KEY VARCHAR(255),
+        CONFIG_VAL VARCHAR(255),
+        EXPIRE_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        CATEGORY_ID VARCHAR (255),
+        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL, CATEGORY_ID)
+);
+
+INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL, EXPIRE_DATE, CATEGORY_ID) VALUES('registry.version', '0.16', CURRENT_TIMESTAMP ,'SYSTEM');
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/resources/expcatalog-mysql.sql b/modules/registry-refactoring/src/main/resources/expcatalog-mysql.sql
new file mode 100644
index 0000000000..d078cad674
--- /dev/null
+++ b/modules/registry-refactoring/src/main/resources/expcatalog-mysql.sql
@@ -0,0 +1,400 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+CREATE TABLE GATEWAY
+(
+        GATEWAY_ID VARCHAR(255),
+        GATEWAY_NAME VARCHAR(255),
+	      DOMAIN VARCHAR(255),
+	      EMAIL_ADDRESS VARCHAR(255),
+        GATEWAY_ACRONYM varchar(255),
+        GATEWAY_ADMIN_EMAIL varchar(255),
+        GATEWAY_ADMIN_FIRST_NAME varchar(255),
+        GATEWAY_APPROVAL_STATUS varchar(255),
+        GATEWAY_PUBLIC_ABSTRACT varchar(255),
+        GATEWAY_URL varchar(255),
+        GATEWAY_ADMIN_LAST_NAME varchar(255),
+        IDENTITY_SERVER_PASSWORD_TOKEN varchar(255),
+        IDENTITY_SERVER_USERNAME varchar(255),
+        GATEWAY_REVIEW_PROPOSAL_DESCRIPTION varchar(255),
+        DECLINED_REASON varchar(255),
+        OAUTH_CLIENT_SECRET varchar(255),
+        OAUTH_CLIENT_ID varchar(255),
+        REQUEST_CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        REQUESTER_USERNAME VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID)
+);
+
+CREATE TABLE NOTIFICATION
+(
+        NOTIFICATION_ID VARCHAR(255),
+        GATEWAY_ID VARCHAR(255),
+        TITLE VARCHAR(255),
+        PRIORITY VARCHAR(255),
+	      NOTIFICATION_MESSAGE VARCHAR(4096),
+	      PUBLISHED_DATE TIMESTAMP,
+	      EXPIRATION_DATE TIMESTAMP,
+	      CREATION_DATE TIMESTAMP,
+        PRIMARY KEY (NOTIFICATION_ID)
+);
+
+CREATE TABLE USERS
+(
+        AIRAVATA_INTERNAL_USER_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PASSWORD VARCHAR(255),
+        GATEWAY_ID VARCHAR(255),
+        PRIMARY KEY(USER_NAME, GATEWAY_ID)
+);
+
+CREATE TABLE GATEWAY_WORKER
+(
+        GATEWAY_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, USER_NAME),
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE,
+        FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
+CREATE TABLE PROJECT
+(
+        GATEWAY_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PROJECT_NAME VARCHAR(255),
+        PROJECT_ID VARCHAR(255),
+        DESCRIPTION VARCHAR(255),
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        PRIMARY KEY (PROJECT_ID),
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE,
+        FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
+CREATE TABLE PROJECT_USER
+(
+        PROJECT_ID VARCHAR(255),
+        USER_NAME VARCHAR(255),
+        PRIMARY KEY (PROJECT_ID,USER_NAME),
+        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE,
+        FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
+CREATE TABLE EXPERIMENT (
+        EXPERIMENT_ID varchar(255),
+        PROJECT_ID varchar(255),
+        GATEWAY_ID varchar(255),
+        EXPERIMENT_TYPE varchar(255),
+        USER_NAME varchar(255),
+        EXPERIMENT_NAME varchar(255),
+        CREATION_TIME timestamp DEFAULT NOW(),
+        DESCRIPTION varchar(255),
+        EXECUTION_ID varchar(255),
+        GATEWAY_EXECUTION_ID varchar(255),
+        ENABLE_EMAIL_NOTIFICATION tinyint(1),
+        EMAIL_ADDRESSES text,
+        PRIMARY KEY (EXPERIMENT_ID),
+        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE EXPERIMENT_INPUT
+(
+        EXPERIMENT_ID varchar(255),
+        INPUT_NAME varchar(255),
+        INPUT_VALUE text,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        STANDARD_INPUT tinyint(1),
+        USER_FRIENDLY_DESCRIPTION varchar(255),
+        METADATA varchar(255),
+        INPUT_ORDER int(11),
+        IS_REQUIRED tinyint(1),
+        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
+        DATA_STAGED tinyint(1),
+        STORAGE_RESOURCE_ID varchar(255),
+        IS_READ_ONLY SMALLINT,
+        PRIMARY KEY(EXPERIMENT_ID,INPUT_NAME),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE EXPERIMENT_OUTPUT
+(
+        EXPERIMENT_ID varchar(255),
+        OUTPUT_NAME varchar(255),
+        OUTPUT_VALUE text,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        IS_REQUIRED tinyint(1),
+        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
+        DATA_MOVEMENT tinyint(1),
+        LOCATION varchar(255),
+        SEARCH_QUERY varchar(255),
+        OUTPUT_STREAMING SMALLINT,
+        STORAGE_RESOURCE_ID varchar(255),
+        PRIMARY KEY(EXPERIMENT_ID,OUTPUT_NAME),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE EXPERIMENT_STATUS (
+        STATUS_ID varchar(255),
+        EXPERIMENT_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
+        REASON LONGTEXT,
+        PRIMARY KEY (STATUS_ID, EXPERIMENT_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE EXPERIMENT_ERROR (
+        ERROR_ID varchar(255),
+        EXPERIMENT_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT NOW(),
+        ACTUAL_ERROR_MESSAGE text,
+        USER_FRIENDLY_MESSAGE text,
+        TRANSIENT_OR_PERSISTENT tinyint(1),
+        ROOT_CAUSE_ERROR_ID_LIST text,
+        PRIMARY KEY (ERROR_ID, EXPERIMENT_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE USER_CONFIGURATION_DATA (
+        EXPERIMENT_ID varchar(255),
+        AIRAVATA_AUTO_SCHEDULE tinyint(1),
+        OVERRIDE_MANUAL_SCHEDULED_PARAMS tinyint(1),
+        SHARE_EXPERIMENT_PUBLICALLY tinyint(1),
+        THROTTLE_RESOURCES tinyint(1),
+        USER_DN varchar(255),
+        GENERATE_CERT tinyint(1),
+        RESOURCE_HOST_ID varchar(255),
+        TOTAL_CPU_COUNT int(11),
+        NODE_COUNT int(11),
+        NUMBER_OF_THREADS int(11),
+        QUEUE_NAME varchar(255),
+        WALL_TIME_LIMIT int(11),
+        TOTAL_PHYSICAL_MEMORY int(11),
+        STATIC_WORKING_DIR varchar(255),
+        OVERRIDE_LOGIN_USER_NAME varchar(255),
+        OVERRIDE_SCRATCH_LOCATION varchar(255),
+        OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255),
+        STORAGE_RESOURCE_ID varchar(255),
+        EXPERIMENT_DATA_DIR VARCHAR (512),
+        GROUP_RESOURCE_PROFILE_ID VARCHAR(255) DEFAULT NULL,
+        IS_USE_USER_CR_PREF TINYINT(1),
+        PRIMARY KEY (EXPERIMENT_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+
+CREATE VIEW LATEST_EXPERIMENT_STATUS AS
+  select ES1.EXPERIMENT_ID AS EXPERIMENT_ID, ES1.STATE AS STATE, ES1.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
+  from EXPERIMENT_STATUS ES1 LEFT JOIN EXPERIMENT_STATUS ES2 ON (ES1.EXPERIMENT_ID = ES2.EXPERIMENT_ID
+    AND ES1.TIME_OF_STATE_CHANGE < ES2.TIME_OF_STATE_CHANGE)  WHERE ES2.TIME_OF_STATE_CHANGE is NULL;
+
+CREATE VIEW EXPERIMENT_SUMMARY AS
+  select E.EXPERIMENT_ID AS EXPERIMENT_ID, E.PROJECT_ID AS PROJECT_ID, E.GATEWAY_ID AS GATEWAY_ID,
+  E.USER_NAME AS USER_NAME, E.EXECUTION_ID AS EXECUTION_ID, E.EXPERIMENT_NAME AS EXPERIMENT_NAME,
+  E.CREATION_TIME AS CREATION_TIME, E.DESCRIPTION AS DESCRIPTION, ES.STATE AS STATE, UD.RESOURCE_HOST_ID
+  AS RESOURCE_HOST_ID, ES.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
+    from ((EXPERIMENT E left join LATEST_EXPERIMENT_STATUS ES on((E.EXPERIMENT_ID = ES.EXPERIMENT_ID)))
+    left join USER_CONFIGURATION_DATA UD on((E.EXPERIMENT_ID = UD.EXPERIMENT_ID))) where 1;
+
+
+CREATE TABLE PROCESS (
+        PROCESS_ID varchar(255),
+        EXPERIMENT_ID varchar(255),
+        CREATION_TIME  TIMESTAMP DEFAULT NOW(),
+        LAST_UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PROCESS_DETAIL text,
+        APPLICATION_INTERFACE_ID varchar(255),
+        TASK_DAG TEXT,
+        APPLICATION_DEPLOYMENT_ID varchar(255),
+        COMPUTE_RESOURCE_ID varchar(255),
+        GATEWAY_EXECUTION_ID varchar(255),
+        GATEWAY_INSTANCE_ID varchar(255),
+        ENABLE_EMAIL_NOTIFICATION BOOLEAN,
+        EMAIL_ADDRESSES TEXT,
+        STORAGE_RESOURCE_ID varchar(255),
+        USER_DN varchar(255),
+        GENERATE_CERT SMALLINT,
+        EXPERIMENT_DATA_DIR VARCHAR (512),
+        USERNAME VARCHAR (255),
+        GROUP_RESOURCE_PROFILE_ID VARCHAR (255) DEFAULT NULL,
+        PRIMARY KEY (PROCESS_ID),
+        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROCESS_INPUT
+(
+        PROCESS_ID varchar(255),
+        INPUT_NAME varchar(255),
+        INPUT_VALUE text,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        STANDARD_INPUT tinyint(1),
+        USER_FRIENDLY_DESCRIPTION varchar(255),
+        METADATA varchar(255),
+        INPUT_ORDER int(11),
+        IS_REQUIRED tinyint(1),
+        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
+        DATA_STAGED tinyint(1),
+        STORAGE_RESOURCE_ID varchar(255),
+        IS_READ_ONLY SMALLINT,
+        PRIMARY KEY(PROCESS_ID,INPUT_NAME),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROCESS_OUTPUT
+(
+        PROCESS_ID varchar(255),
+        OUTPUT_NAME varchar(255),
+        OUTPUT_VALUE LONGTEXT,
+        DATA_TYPE varchar(255),
+        APPLICATION_ARGUMENT varchar(255),
+        IS_REQUIRED tinyint(1),
+        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
+        DATA_MOVEMENT tinyint(1),
+        LOCATION varchar(255),
+        SEARCH_QUERY varchar(255),
+        OUTPUT_STREAMING SMALLINT,
+        STORAGE_RESOURCE_ID varchar(255),
+        PRIMARY KEY(PROCESS_ID,OUTPUT_NAME),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE PROCESS_STATUS (
+        STATUS_ID varchar(255),
+        PROCESS_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
+        REASON LONGTEXT,
+        PRIMARY KEY (STATUS_ID, PROCESS_ID),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE PROCESS_ERROR (
+        ERROR_ID varchar(255),
+        PROCESS_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT NOW(),
+        ACTUAL_ERROR_MESSAGE text,
+        USER_FRIENDLY_MESSAGE text,
+        TRANSIENT_OR_PERSISTENT tinyint(1),
+        ROOT_CAUSE_ERROR_ID_LIST text,
+        PRIMARY KEY (ERROR_ID, PROCESS_ID),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PROCESS_RESOURCE_SCHEDULE (
+        PROCESS_ID varchar(255),
+        RESOURCE_HOST_ID varchar(255),
+        TOTAL_CPU_COUNT int(11),
+        NODE_COUNT int(11),
+        NUMBER_OF_THREADS int(11),
+        QUEUE_NAME varchar(255),
+        WALL_TIME_LIMIT int(11),
+        TOTAL_PHYSICAL_MEMORY int(11),
+        PRIMARY KEY (PROCESS_ID),
+        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE TASK (
+        TASK_ID varchar(255),
+        TASK_TYPE varchar(255),
+        PARENT_PROCESS_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT NOW(),
+        LAST_UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        TASK_DETAIL text,
+        TASK_INTERNAL_STORE tinyint(4),
+        PRIMARY KEY (TASK_ID),
+        FOREIGN KEY (PARENT_PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE TASK_STATUS (
+        STATUS_ID varchar(255),
+        TASK_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
+        REASON LONGTEXT,
+        PRIMARY KEY (STATUS_ID, TASK_ID),
+        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
+);
+
+
+CREATE TABLE TASK_ERROR (
+        ERROR_ID varchar(255),
+        TASK_ID varchar(255),
+        CREATION_TIME timestamp DEFAULT NOW(),
+        ACTUAL_ERROR_MESSAGE text,
+        USER_FRIENDLY_MESSAGE text,
+        TRANSIENT_OR_PERSISTENT tinyint(1),
+        ROOT_CAUSE_ERROR_ID_LIST text,
+        PRIMARY KEY (ERROR_ID, TASK_ID),
+        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE JOB (
+        JOB_ID varchar(255),
+        TASK_ID varchar(255),
+        PROCESS_ID varchar(255),
+        JOB_DESCRIPTION LONGTEXT NOT NULL,
+        CREATION_TIME timestamp DEFAULT NOW(),
+        COMPUTE_RESOURCE_CONSUMED varchar(255),
+        JOB_NAME varchar(255),
+        WORKING_DIR varchar(255),
+        STD_OUT LONGTEXT,
+        STD_ERR LONGTEXT,
+        EXIT_CODE INT(11),
+        PRIMARY KEY (JOB_ID, TASK_ID),
+        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE JOB_STATUS (
+        STATUS_ID varchar(255),
+        JOB_ID varchar(255),
+        TASK_ID varchar(255),
+        STATE varchar(255),
+        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
+        REASON LONGTEXT,
+        PRIMARY KEY (STATUS_ID, JOB_ID, TASK_ID),
+        FOREIGN KEY (JOB_ID, TASK_ID) REFERENCES JOB(JOB_ID, TASK_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE QUEUE_STATUS(
+        HOST_NAME VARCHAR(255),
+        QUEUE_NAME VARCHAR(255),
+        CREATED_TIME BIGINT(20),
+        QUEUE_UP     BIT(1),
+        RUNNING_JOBS INT(11),
+        QUEUED_JOBS INT(11),
+        PRIMARY KEY (HOST_NAME, QUEUE_NAME, CREATED_TIME)
+);
+
+CREATE TABLE CONFIGURATION
+(
+        CONFIG_KEY VARCHAR(255),
+        CONFIG_VAL VARCHAR(255),
+        EXPIRE_DATE TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
+        CATEGORY_ID VARCHAR (255),
+        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL, CATEGORY_ID)
+);
+
+INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL, EXPIRE_DATE, CATEGORY_ID) VALUES('registry.version', '0.16', NOW() ,'SYSTEM');
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/resources/experiment_catalog.sql b/modules/registry-refactoring/src/main/resources/experiment_catalog.sql
deleted file mode 100644
index 3140cd1c76..0000000000
--- a/modules/registry-refactoring/src/main/resources/experiment_catalog.sql
+++ /dev/null
@@ -1,285 +0,0 @@
-
-CREATE TABLE IF NOT EXISTS EXPCAT_EXPERIMENT(
-    EXPERIMENT_ID VARCHAR (255),
-    PROJECT_ID VARCHAR (255),
-    GATEWAY_ID VARCHAR (255),
-    EXPERIMENT_TYPE VARCHAR (255),
-    USER_NAME VARCHAR (255),
-    EXPERIMENT_NAME VARCHAR (255),
-    CREATION_TIME BIGINT,
-    DESCRIPTION VARCHAR (255),
-    EXECUTION_ID VARCHAR (255),
-    GATEWAY_EXECUTION_ID VARCHAR (255),
-    GATEWAY_INSTANCE_ID VARCHAR (255),
-    ENABLE_EMAIL_NOTIFICATION TINYINT(1),
-    PRIMARY KEY (EXPERIMENT_ID),
-    FOREIGN KEY (PROJECT_ID) REFERENCES WORKSPACE_PROJECT(PROJECT_ID) ON DELETE CASCADE,
-    FOREIGN KEY (GATEWAY_ID) REFERENCES WORKSPACE_GATEWAY(GATEWAY_ID) ON DELETE CASCADE,
-    FOREIGN KEY (USER_NAME) REFERENCES WORKSPACE_USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_EXPERIMENT_EMAIL (
-    EXPERIMENT_ID VARCHAR (255),
-    EMAIL VARCHAR (255),
-    PRIMARY KEY (EXPERIMENT_ID, EMAIL),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_USER_CONFIGURATION(
-    EXPERIMENT_ID VARCHAR (255),
-    AIRAVATA_AUTO_SCHEDULE TINYINT(1),
-    OVERRIDE_MANUAL_SCHEDULED_PARAMS TINYINT(1),
-    THROTTLE_RESOURCE TINYINT(1),
-    USER_DN VARCHAR (255),
-    GENERATE_CERT TINYINT(1),
-    STORAGE_ID VARCHAR (255),
-    EXPERIMENT_DATA_DIR VARCHAR (255),
-    PRIMARY KEY (EXPERIMENT_ID),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_COMPUTE_RESOURCE_SCHEDULING(
-    EXPERIMENT_ID VARCHAR (255),
-    RESOURCE_HOST_ID VARCHAR (255),
-    CPU_COUNT INT,
-    NODE_COUNT INT,
-    NUMBER_OF_THREADS INT,
-    QUEUE_NAME VARCHAR (255),
-    WALL_TIME_LIMIT INT,
-    TOTAL_PHYSICAL_MEMORY INT,
-    CHESSIS_NUMBER VARCHAR (255),
-    STATIC_WORKING_DIRECTORY VARCHAR (255),
-    OVERRIDE_LOGIN_USERNAME VARCHAR (255),
-    OVERRIDE_SCRATCH_LOCATION VARCHAR (255),
-    OVERRIDE_ALLOCATION_PROJECT_NUMBER VARCHAR (255),
-    PRIMARY KEY (EXPERIMENT_ID),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_USER_CONFIGURATION(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_EXPERIMENT_INPUT(
-    EXPERIMENT_ID VARCHAR (255),
-    INPUT_NAME VARCHAR (255),
-    INPUT_VALUE VARCHAR (255),
-    INPUT_TYPE VARCHAR (255),
-    APPLICATION_ARGUMENT VARCHAR (255),
-    STANDARD_INPUT TINYINT(1),
-    USER_FRIENDLY_DESCRIPTION VARCHAR (255),
-    METADATA VARCHAR (4096),
-    INPUT_ORDER INT,
-    REQUIRED TINYINT(1),
-    REQUIRED_TO_ADDED_TO_COMMANDLINE TINYINT(1),
-    DATA_STAGED TINYINT(1),
-    STORAGE_RESOURCE_ID VARCHAR (255),
-    PRIMARY KEY (EXPERIMENT_ID,INPUT_NAME),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_EXPERIMENT_OUTPUT(
-    EXPERIMENT_ID VARCHAR (255),
-    OUTPUT_NAME VARCHAR (255),
-    OUTPUT_VALUE VARCHAR (255),
-    OUTPUT_TYPE VARCHAR (255),
-    APPLICATION_ARGUMENT VARCHAR (255),
-    REQUIRED TINYINT(1),
-    REQUIRED_TO_ADDED_TO_COMMANDLINE TINYINT(1),
-    DATA_MOVEMENT TINYINT(1),
-    LOCATION VARCHAR (255),
-    SEARCH_QUERY VARCHAR (255),
-    OUTPUT_STREAMING TINYINT(1),
-    STORAGE_RESOURCE_ID VARCHAR (255),
-    PRIMARY KEY (EXPERIMENT_ID,OUTPUT_NAME),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_EXPERIMENT_ERROR(
-    ERROR_ID VARCHAR (255),
-    EXPERIMENT_ID VARCHAR (255),
-    CREATION_TIME BIGINT,
-    ACTUAL_ERROR_MESSAGE VARCHAR (255),
-    USER_FRIENDLY_MESSAGE VARCHAR (255),
-    TRANSIENT_OR_PERSISTENT TINYINT,
-    PRIMARY KEY (ERROR_ID, EXPERIMENT_ID),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_EXPERIMENT_ERROR_ROOT_CAUSE_ERROR_ID(
-    ERROR_ID VARCHAR (255),
-    ROOT_CAUSE_ERROR_ID VARCHAR (255),
-    PRIMARY KEY (ERROR_ID, ROOT_CAUSE_ERROR_ID),
-    FOREIGN KEY(ERROR_ID) REFERENCES EXPCAT_EXPERIMENT_ERROR(ERROR_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_EXPERIMENT_STATUS(
-    EXPERIMENT_ID VARCHAR (255),
-    STATE VARCHAR (255),
-    TIME_OF_STATE_CHANGE BIGINT,
-    REASON VARCHAR (255),
-    PRIMARY KEY (EXPERIMENT_ID, STATE),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS(
-    PROCESS_ID VARCHAR (255),
-    EXPERIMENT_ID VARCHAR (255),
-    CREATION_TIME BIGINT,
-    LAST_UPDATE_TIME BIGINT,
-    PROCESS_DETAIL VARCHAR (255),
-    APPLICATION_INTERFACE_ID VARCHAR (255),
-    APPLICATION_DEPLOYMENT_ID VARCHAR (255),
-    COMPUTE_RESOURCE_ID VARCHAR (255),
-    TASK_DAG VARCHAR (255),
-    GATEWAY_EXECUTION_ID VARCHAR (255),
-    ENABLE_EMAIL_NOTIFICATION TINYINT(1),
-    STORAGE_RESOURCE_ID VARCHAR (255),
-    USER_DN VARCHAR (255),
-    GENERATE_CERT VARCHAR (255),
-    EXPERIMENT_DATA_DIR VARCHAR (255),
-    USER_NAME VARCHAR (255),
-    PRIMARY KEY (PROCESS_ID),
-    FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPCAT_EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS_EMAIL (
-    PROCESS_ID VARCHAR (255),
-    EMAIL VARCHAR (255),
-    PRIMARY KEY (PROCESS_ID, EMAIL),
-    FOREIGN KEY (PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS_RESOURCE_SCHEDULING(
-    PROCESS_ID VARCHAR (255),
-    RESOURCE_HOST_ID VARCHAR (255),
-    CPU_COUNT INT,
-    NODE_COUNT INT,
-    NUMBER_OF_THREADS INT,
-    QUEUE_NAME VARCHAR (255),
-    WALL_TIME_LIMIT INT,
-    TOTAL_PHYSICAL_MEMORY INT,
-    CHESSIS_NUMBER VARCHAR (255),
-    STATIC_WORKING_DIRECTORY VARCHAR (255),
-    OVERRIDE_LOGIN_USERNAME VARCHAR (255),
-    OVERRIDE_SCRATCH_LOCATION VARCHAR (255),
-    OVERRIDE_ALLOCATION_PROJECT_NUMBER VARCHAR (255),
-    PRIMARY KEY (PROCESS_ID),
-    FOREIGN KEY (PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS_INPUT(
-    PROCESS_ID VARCHAR (255),
-    INPUT_NAME VARCHAR (255),
-    INPUT_VALUE VARCHAR (255),
-    INPUT_TYPE VARCHAR (255),
-    APPLICATION_ARGUMENT VARCHAR (255),
-    STANDARD_INPUT TINYINT(1),
-    USER_FRIENDLY_DESCRIPTION VARCHAR (255),
-    METADATA VARCHAR (4096),
-    INPUT_ORDER INT,
-    REQUIRED TINYINT(1),
-    REQUIRED_TO_ADDED_TO_COMMANDLINE TINYINT(1),
-    DATA_STAGED TINYINT(1),
-    STORAGE_RESOURCE_ID VARCHAR (255),
-    PRIMARY KEY (PROCESS_ID,INPUT_NAME),
-    FOREIGN KEY (PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS_OUTPUT(
-    PROCESS_ID VARCHAR (255),
-    OUTPUT_NAME VARCHAR (255),
-    OUTPUT_VALUE VARCHAR (255),
-    OUTPUT_TYPE VARCHAR (255),
-    APPLICATION_ARGUMENT VARCHAR (255),
-    REQUIRED TINYINT(1),
-    REQUIRED_TO_ADDED_TO_COMMANDLINE TINYINT(1),
-    DATA_MOVEMENT TINYINT(1),
-    LOCATION VARCHAR (255),
-    SEARCH_QUERY VARCHAR (255),
-    OUTPUT_STREAMING TINYINT(1),
-    STORAGE_RESOURCE_ID VARCHAR (255),
-    PRIMARY KEY (PROCESS_ID,OUTPUT_NAME),
-    FOREIGN KEY (PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS_ERROR(
-    ERROR_ID VARCHAR (255),
-    PROCESS_ID VARCHAR (255),
-    CREATION_TIME BIGINT,
-    ACTUAL_ERROR_MESSAGE VARCHAR (255),
-    USER_FRIENDLY_MESSAGE VARCHAR (255),
-    TRANSIENT_OR_PERSISTENT TINYINT,
-    PRIMARY KEY (ERROR_ID, PROCESS_ID),
-    FOREIGN KEY (PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS_ERROR_ROOT_CAUSE_ERROR_ID(
-    ERROR_ID VARCHAR (255),
-    ROOT_CAUSE_ERROR_ID VARCHAR (255),
-    PRIMARY KEY (ERROR_ID, ROOT_CAUSE_ERROR_ID),
-    FOREIGN KEY(ERROR_ID) REFERENCES EXPCAT_PROCESS_ERROR(ERROR_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_PROCESS_STATUS(
-    PROCESS_ID VARCHAR (255),
-    STATE VARCHAR (255),
-    TIME_OF_STATE_CHANGE BIGINT,
-    REASON VARCHAR (255),
-    PRIMARY KEY (PROCESS_ID, STATE),
-    FOREIGN KEY (PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_TASK(
-    TASK_ID VARCHAR (255),
-    TASK_TYPE VARCHAR (255),
-    PARENT_PROCESS_ID VARCHAR (255),
-    CREATION_TIME BIGINT,
-    LAST_UPDATE_TIME BIGINT,
-    TASK_DETAIL VARCHAR (255),
-    SUB_TASK_MODEL BLOB,
-    PRIMARY KEY (TASK_ID),
-    FOREIGN KEY (PARENT_PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID)
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_TASK_ERROR(
-    ERROR_ID VARCHAR (255),
-    TASK_ID VARCHAR (255),
-    CREATION_TIME BIGINT,
-    ACTUAL_ERROR_MESSAGE VARCHAR (255),
-    USER_FRIENDLY_MESSAGE VARCHAR (255),
-    TRANSIENT_OR_PERSISTENT TINYINT,
-    PRIMARY KEY (ERROR_ID, TASK_ID),
-    FOREIGN KEY (TASK_ID) REFERENCES EXPCAT_TASK(TASK_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_TASK_STATUS(
-    TASK_ID VARCHAR (255),
-    STATE VARCHAR (255),
-    TIME_OF_STATE_CHANGE BIGINT,
-    REASON VARCHAR (255),
-    PRIMARY KEY (TASK_ID, STATE),
-    FOREIGN KEY (TASK_ID) REFERENCES EXPCAT_TASK(TASK_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_JOB(
-    JOB_ID VARCHAR (255),
-    TASK_ID VARCHAR (255),
-    PROCESS_ID VARCHAR (255),
-    JOB_DESCRIPTION VARCHAR (255),
-    CREATION_TIME BIGINT,
-    COMPUTE_RESOURCE_CONSUMED VARCHAR (255),
-    JOB_NAME VARCHAR (255),
-    WORKING_DIR VARCHAR (255),
-    STDOUT TEXT,
-    STDERR TEXT,
-    EXIT_CODE INT(11),
-    PRIMARY KEY(JOB_ID),
-    FOREIGN KEY(TASK_ID) REFERENCES EXPCAT_TASK(TASK_ID),
-    FOREIGN KEY(PROCESS_ID) REFERENCES EXPCAT_PROCESS(PROCESS_ID)
-);
-
-CREATE TABLE IF NOT EXISTS EXPCAT_JOB_STATUS(
-    JOB_ID VARCHAR (255),
-    STATE VARCHAR (255),
-    TIME_OF_STATE_CHANGE BIGINT,
-    REASON VARCHAR (255),
-    PRIMARY KEY (JOB_ID, STATE),
-    FOREIGN KEY (JOB_ID) REFERENCES EXPCAT_JOB(JOB_ID) ON DELETE CASCADE
-);
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/main/resources/workspace_catalog.sql b/modules/registry-refactoring/src/main/resources/workspace_catalog.sql
deleted file mode 100644
index debdba4531..0000000000
--- a/modules/registry-refactoring/src/main/resources/workspace_catalog.sql
+++ /dev/null
@@ -1,125 +0,0 @@
-
-CREATE TABLE IF NOT  EXISTS WORKSPACE_GATEWAY(
-    GATEWAY_ID VARCHAR (255),
-    GATEWAY_NAME VARCHAR (255),
-    GATEWAY_DOMAIN VARCHAR (255),
-    EMAIL_ADDRESS VARCHAR (255),
-    GATEWAY_APPROVAL_STATUS VARCHAR (255),
-    GATEWAY_ACRONYM VARCHAR (255),
-    GATEWAY_URL VARCHAR (255),
-    GATEWAY_PUBLIC_ABSTRACT TEXT,
-    REVIEW_PROPOSAL_DESCRIPTION TEXT,
-    GATEWAY_ADMIN_FIRST_NAME VARCHAR(255),
-    GATEWAY_ADMIN_LAST_NAME VARCHAR(255),
-    GATEWAY_ADMIN_EMAIL VARCHAR(255),
-    IDENTITY_SERVER_USERNAME VARCHAR(255),
-    IDENTITY_SERVER_PASSWORD_TOKEN VARCHAR(255),
-    DECLINED_REASON VARCHAR(255),
-    OAUTH_CLIENT_ID VARCHAR(255),
-    OAUTH_CLIENT_SECRET VARCHAR(255),
-    REQUEST_CREATION_TIME BIGINT,
-    REQUESTER_USERNAME VARCHAR(255),
-    PRIMARY KEY (GATEWAY_ID)
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_NOTIFICATION (
-    NOTIFICATION_ID VARCHAR (255),
-    GATEWAY_ID VARCHAR (255),
-    TITLE VARCHAR (255),
-    NOTIFICATION_MESSAGE TEXT,
-    CREATION_TIME BIGINT,
-    PUBLISHED_TIME BIGINT,
-    EXPIRATION_TIME BIGINT,
-    PRIORITY VARCHAR (255),
-    PRIMARY KEY (NOTIFICATION_ID),
-    FOREIGN KEY (GATEWAY_ID) REFERENCES WORKSPACE_GATEWAY(GATEWAY_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_USER_PROFILE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    USER_ID VARCHAR (255),
-    GATEWAY_ID VARCHAR (255),
-    USER_MODEL_VERSION VARCHAR (255),
-    USER_NAME VARCHAR (255),
-    ORCID_ID VARCHAR (255),
-    COUNTRY VARCHAR (255),
-    HOME_ORGANIZATION VARCHAR (255),
-    ORIGINATION_AFFILIATION VARCHAR (255),
-    CREATION_TIME BIGINT,
-    LAST_ACCESS_TIME BIGINT,
-    VALID_UNTIL BIGINT,
-    STATE VARCHAR (255),
-    COMMENTS TEXT,
-    GPG_KEY VARCHAR (8192),
-    TIME_ZONE VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID),
-    FOREIGN KEY (GATEWAY_ID) REFERENCES WORKSPACE_GATEWAY(GATEWAY_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_USER_PROFILE_EMAIL (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    EMAIL VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, EMAIL),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_USER_PROFILE_PHONE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    PHONE VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, PHONE ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_USER_PROFILE_NATIONALITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    NATIONALITY VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, NATIONALITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_USER_PROFILE_LABELED_URI (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    LABELED_URI VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, LABELED_URI ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_NSF_DEMOGRAPHIC (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    GENDER VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_NSF_DEMOGRAPHIC_ETHNICITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    ETHNICITY VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, ETHNICITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_NSF_DEMOGRAPHIC_RACE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    RACE VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, RACE ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_NSF_DEMOGRAPHIC_DISABILITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
-    DISABILITY VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, DISABILITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES WORKSPACE_NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS WORKSPACE_PROJECT(
-    PROJECT_ID VARCHAR (255),
-    OWNER VARCHAR (255),
-    GATEWAY_ID VARCHAR (255),
-    PROJECT_NAME VARCHAR (255),
-    DESCRIPTION VARCHAR (255),
-    CREATION_TIME BIGINT,
-    PRIMARY KEY (PROJECT_ID),
-    FOREIGN KEY(OWNER) REFERENCES WORKSPACE_USER_PROFILE(AIRAVATA_INTERNAL_USER_ID),
-    FOREIGN KEY(GATEWAY_ID) REFERENCES WORKSPACE_GATEWAY(GATEWAY_ID) ON DELETE CASCADE
-);
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/ExperimentRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/ExperimentRepositoryTest.java
deleted file mode 100644
index 24fde20a92..0000000000
--- a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/ExperimentRepositoryTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-package org.apache.airavata.registry.core.repositories;
-
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.model.workspace.Gateway;
-import org.apache.airavata.model.workspace.GatewayApprovalStatus;
-import org.apache.airavata.model.workspace.Project;
-import org.apache.airavata.registry.core.entities.expcatalog.ExperimentEntity;
-import org.apache.airavata.registry.core.entities.workspacecatalog.GatewayEntity;
-import org.apache.airavata.registry.core.entities.workspacecatalog.ProjectEntity;
-import org.apache.airavata.registry.core.entities.workspacecatalog.UserProfileEntity;
-import org.apache.airavata.registry.core.repositories.expcatalog.ExperimentRepository;
-import org.apache.airavata.registry.core.repositories.workspacecatalog.GatewayRepository;
-import org.apache.airavata.registry.core.repositories.workspacecatalog.ProjectRepository;
-import org.apache.airavata.registry.core.repositories.workspacecatalog.UserProfileRepository;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ExperimentRepositoryTest {
-    private final static Logger logger = LoggerFactory.getLogger(ExperimentRepositoryTest.class);
-
-    private GatewayRepository gatewayRepository;
-    private UserProfileRepository userProfileRepository;
-    private ProjectRepository projectRepository;
-    private ExperimentRepository experimentRepository;
-    private String gatewayId;
-    private String userId;
-    private String projectId;
-    private String experimentId;
-
-    private final String GATEWAY_DOMAIN = "test1.com";
-    private final String EXPERIMENT_NAME = "sample experiment";
-    private final String EXPERIMENT_DESCRIPTION = "sample description";
-
-
-    @Before
-    public void setupRepository() {
-
-        gatewayRepository = new GatewayRepository(Gateway.class, GatewayEntity.class);
-        userProfileRepository = new UserProfileRepository(UserProfile.class, UserProfileEntity.class);
-        projectRepository = new ProjectRepository(Project.class, ProjectEntity.class);
-        experimentRepository = new ExperimentRepository(ExperimentModel.class, ExperimentEntity.class);
-
-        gatewayId = "test.com" + System.currentTimeMillis();
-        userId = "testuser" + System.currentTimeMillis();
-        projectId = "project" + System.currentTimeMillis();
-        experimentId = "exp" + System.currentTimeMillis();
-    }
-
-    @Test
-    public void experimentRepositoryTest() {
-
-		/*
-         * Creating Gateway required for UserProfile & Project creation
-		 */
-//        Gateway gateway = new Gateway();
-//        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.ACTIVE);
-//        gateway.setGatewayId(gatewayId);
-//        gateway.setDomain(GATEWAY_DOMAIN);
-//        gateway = gatewayRepository.create(gateway);
-//        Assert.assertTrue(!gateway.getGatewayId().isEmpty());
-
-		/*
-         * UserProfile Instance creation required for Project Creation
-		 */
-//        UserProfile userProfile = new UserProfile();
-//        userProfile.setAiravataInternalUserId(userId);
-//        userProfile.setGatewayId(gateway.getGatewayId());
-//        userProfile = userProfileRepository.create(userProfile);
-//        Assert.assertTrue(!userProfile.getAiravataInternalUserId().isEmpty());
-
-        /*
-         * Project Instance creation
-         */
-//        Project project = new Project();
-//        project.setGatewayId(gatewayId);
-//        project.setOwner(userId);
-//        project.setProjectID(projectId);
-//        project.setGatewayIdIsSet(true);
-//        project = projectRepository.create(project);
-//        Assert.assertTrue(!project.getProjectID().isEmpty());
-
-        /*
-         * Experiment Instance Creation
-         */
-
-//        ExperimentModel experiment = new ExperimentModel();
-//        experiment.setExperimentId(experimentId);
-//        experiment.setExperimentName(EXPERIMENT_NAME);
-//        experiment.setGatewayId(gatewayId);
-//        experiment.setUserName(userId);
-//        experiment.setProjectId(projectId);
-
-        /*
-         * Experiment Repository Insert Operation Test
-		 */
-//        experiment = experimentRepository.create(experiment);
-//        Assert.assertTrue(!experiment.getExperimentId().isEmpty());
-
-
-        /*
-         * Experiment Repository Update Operation Test
-		 */
-//        experiment.setDescription(EXPERIMENT_DESCRIPTION);
-//        experimentRepository.update(experiment);
-//        experiment = experimentRepository.get(experimentId);
-//        Assert.assertEquals(experiment.getDescription(), EXPERIMENT_DESCRIPTION);
-
-		/*
-         * Workspace Project Repository Select Operation Test
-		 */
-//        experiment = experimentRepository.get(experimentId);
-//        Assert.assertNotNull(experiment);
-
-		/*
-         * Experiment Repository Delete Operation
-		 */
-
-//        boolean deleteResult = experimentRepository.delete(experimentId);
-//        Assert.assertTrue(deleteResult);
-//
-//        deleteResult = projectRepository.delete(projectId);
-//        Assert.assertTrue(deleteResult);
-//
-//        deleteResult = userProfileRepository.delete(userId);
-//        Assert.assertTrue(deleteResult);
-//
-//        deleteResult = gatewayRepository.delete(gatewayId);
-//        Assert.assertTrue(deleteResult);
-
-
-    }
-
-}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/WorkspaceRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/WorkspaceRepositoryTest.java
deleted file mode 100644
index 97150fbcda..0000000000
--- a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/WorkspaceRepositoryTest.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-package org.apache.airavata.registry.core.repositories;
-
-import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.model.workspace.Gateway;
-import org.apache.airavata.model.workspace.GatewayApprovalStatus;
-import org.apache.airavata.model.workspace.Notification;
-import org.apache.airavata.model.workspace.Project;
-import org.apache.airavata.registry.core.entities.workspacecatalog.GatewayEntity;
-import org.apache.airavata.registry.core.entities.workspacecatalog.NotificationEntity;
-import org.apache.airavata.registry.core.entities.workspacecatalog.ProjectEntity;
-import org.apache.airavata.registry.core.entities.workspacecatalog.UserProfileEntity;
-import org.apache.airavata.registry.core.repositories.workspacecatalog.GatewayRepository;
-import org.apache.airavata.registry.core.repositories.workspacecatalog.NotificationRepository;
-import org.apache.airavata.registry.core.repositories.workspacecatalog.ProjectRepository;
-import org.apache.airavata.registry.core.repositories.workspacecatalog.UserProfileRepository;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.UUID;
-
-public class WorkspaceRepositoryTest {
-    private final static Logger logger = LoggerFactory.getLogger(WorkspaceRepositoryTest.class);
-
-    private GatewayRepository gatewayRepository;
-    private NotificationRepository notificationRepository;
-    private UserProfileRepository userProfileRepository;
-    private ProjectRepository projectRepository;
-    private String gatewayId;
-    private String notificationId;
-    private String userId;
-    private String projectId;
-
-    private final String GATEWAY_DOMAIN = "test1.com";
-    private final String NOTIFY_MESSAGE = "NotifyMe";
-    private final String USER_COMMENT = "TestComment";
-    private final String PROJECT_DESCRIPTION = "Test Description";
-
-
-    @Before
-    public void setupRepository() {
-
-        gatewayRepository = new GatewayRepository(Gateway.class, GatewayEntity.class);
-        notificationRepository = new NotificationRepository(Notification.class,
-                NotificationEntity.class);
-        userProfileRepository = new UserProfileRepository(UserProfile.class, UserProfileEntity.class);
-        projectRepository = new ProjectRepository(Project.class, ProjectEntity.class);
-
-        gatewayId = "test.com" + System.currentTimeMillis();
-        notificationId = UUID.randomUUID().toString();
-        userId = "testuser" + System.currentTimeMillis();
-        projectId = "project" + System.currentTimeMillis();
-    }
-
-
-    @Test
-    public void gateWayRepositoryTest() {
-//        Gateway gateway = new Gateway();
-//        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.ACTIVE);
-//        gateway.setGatewayId(gatewayId);
-
-		/*
-         * GateWay Repository Insert Operation Test
-		 */
-//        gateway = gatewayRepository.create(gateway);
-//        Assert.assertTrue(!gateway.getGatewayId().isEmpty());
-
-		/*
-         * GateWay Repository Update Operation Test
-		 */
-//        gateway.setDomain(GATEWAY_DOMAIN);
-//        gatewayRepository.update(gateway);
-//        gateway = gatewayRepository.get(gateway.getGatewayId());
-//        Assert.assertEquals(gateway.getDomain(), GATEWAY_DOMAIN);
-
-		/*
-         * GateWay Repository Select Operation Test
-		 */
-//        gateway = null;
-//        gateway = gatewayRepository.get(gatewayId);
-//        Assert.assertNotNull(gateway);
-
-		/*
-         * GateWay Repository Delete Operation
-		 */
-//        boolean deleteResult = gatewayRepository.delete(gatewayId);
-//        Assert.assertTrue(deleteResult);
-
-    }
-
-    @Test
-    public void notificationRepositoryTest() {
-
-//        String tempNotificationId = null;
-//        Gateway gateway = new Gateway();
-//        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.ACTIVE);
-//        gateway.setGatewayId(gatewayId);
-//        gateway.setDomain(GATEWAY_DOMAIN);
-//        gateway = gatewayRepository.create(gateway);
-//
-//        Notification notification = new Notification();
-//        notification.setGatewayId(gateway.getGatewayId());
-//        notification.setNotificationId(notificationId);
-
-		/*
-         * Notification INSERT Operation Test
-		 */
-//        notification = notificationRepository.create(notification);
-//        Assert.assertTrue(!notification.getNotificationId().isEmpty());
-
-		/*
-         * Notification SELECT Operation Test
-		 */
-//        tempNotificationId = notification.getNotificationId();
-//        notification = null;
-//        notification = notificationRepository.get(tempNotificationId);
-//        Assert.assertNotNull(notification);
-
-
-		/*
-         * Notification UPDATE Operation Test
-		 */
-//        notification.setNotificationMessage(NOTIFY_MESSAGE);
-//        notificationRepository.update(notification);
-//        notification = notificationRepository.get(notification.getNotificationId());
-//        Assert.assertEquals(NOTIFY_MESSAGE, notification.getNotificationMessage());
-
-		/*
-         * Notification DELETE Operation Test
-		 */
-//        boolean result = notificationRepository.delete(tempNotificationId);
-//        Assert.assertTrue(result);
-//
-//        gatewayRepository.delete(gatewayId);
-    }
-
-    @Test
-    public void userProfileRepositoryTest() {
-
-		/*
-         * Creating Gateway required for UserProfile creation
-		 */
-//        Gateway gateway = new Gateway();
-//        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.ACTIVE);
-//        gateway.setGatewayId(gatewayId);
-//        gateway.setDomain(GATEWAY_DOMAIN);
-//        gateway = gatewayRepository.create(gateway);
-//        Assert.assertTrue(!gateway.getGatewayId().isEmpty());
-
-
-
-		/*
-         * UserProfile Instance creation
-		 */
-//        UserProfile userProfile = new UserProfile();
-//        userProfile.setAiravataInternalUserId(userId);
-//        userProfile.setGatewayId(gateway.getGatewayId());
-
-        /*
-         * Workspace UserProfile Repository Insert Operation Test
-		 */
-//        userProfile = userProfileRepository.create(userProfile);
-//        Assert.assertTrue(!userProfile.getAiravataInternalUserId().isEmpty());
-
-        /*
-         * Workspace UserProfile Repository Update Operation Test
-		 */
-//        userProfile.setComments(USER_COMMENT);
-//        userProfileRepository.update(userProfile);
-//        userProfile = userProfileRepository.get(userId);
-//        System.out.println(userProfile.getComments());
-//        Assert.assertEquals(userProfile.getComments(), USER_COMMENT);
-
-		/*
-         * Workspace UserProfile Repository Select Operation Test
-		 */
-//        userProfile = userProfileRepository.get(userId);
-//        Assert.assertNotNull(userProfile);
-
-		/*
-         * Workspace UserProfile Repository Delete Operation
-		 */
-//        boolean deleteResult = userProfileRepository.delete(userId);
-//        Assert.assertTrue(deleteResult);
-//        deleteResult = gatewayRepository.delete(gatewayId);
-//        Assert.assertTrue(deleteResult);
-
-
-    }
-
-    @Test
-    public void projectRepositoryTest() {
-
-		/*
-         * Creating Gateway required for UserProfile & Project creation
-		 */
-//        Gateway gateway = new Gateway();
-//        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.ACTIVE);
-//        gateway.setGatewayId(gatewayId);
-//        gateway.setDomain(GATEWAY_DOMAIN);
-//        gateway = gatewayRepository.create(gateway);
-//        Assert.assertTrue(!gateway.getGatewayId().isEmpty());
-
-		/*
-         * UserProfile Instance creation required for Project Creation
-		 */
-//        UserProfile userProfile = new UserProfile();
-//        userProfile.setAiravataInternalUserId(userId);
-//        userProfile.setGatewayId(gateway.getGatewayId());
-//        userProfile = userProfileRepository.create(userProfile);
-//        Assert.assertTrue(!userProfile.getAiravataInternalUserId().isEmpty());
-
-        /*
-         * Project Instance creation
-         */
-//        Project project = new Project();
-//        project.setGatewayId(gatewayId);
-//        project.setOwner(userId);
-//        project.setProjectID(projectId);
-//        project.setGatewayIdIsSet(true);
-
-
-        /*
-         * Workspace Project Repository Insert Operation Test
-		 */
-//        project = projectRepository.create(project);
-//        Assert.assertTrue(!project.getProjectID().isEmpty());
-
-        /*
-         * Workspace Project Repository Update Operation Test
-		 */
-//        project.setDescription(PROJECT_DESCRIPTION);
-//        projectRepository.update(project);
-//        project = projectRepository.get(projectId);
-//        Assert.assertEquals(project.getDescription(), PROJECT_DESCRIPTION);
-
-		/*
-         * Workspace Project Repository Select Operation Test
-		 */
-//        project = projectRepository.get(projectId);
-//        Assert.assertNotNull(project);
-
-		/*
-         * Workspace Project Repository Delete Operation
-		 */
-//        boolean deleteResult = projectRepository.delete(projectId);
-//        Assert.assertTrue(deleteResult);
-//
-//        deleteResult = userProfileRepository.delete(userId);
-//        Assert.assertTrue(deleteResult);
-//
-//        deleteResult = gatewayRepository.delete(gatewayId);
-//        Assert.assertTrue(deleteResult);
-
-
-    }
-}
\ No newline at end of file
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepositoryTest.java
new file mode 100644
index 0000000000..b7adf565b6
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepositoryTest.java
@@ -0,0 +1,113 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.ErrorModel;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ExperimentErrorRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ExperimentErrorRepository experimentErrorRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ExperimentErrorRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            experimentErrorRepository = new ExperimentErrorRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ExperimentRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+        assertTrue(experimentId != null);
+
+        ErrorModel errorModel = new ErrorModel();
+        errorModel.setErrorId("error");
+
+        String experimentErrorId = experimentErrorRepository.addExperimentError(errorModel, experimentId);
+        assertTrue(experimentErrorId != null);
+        assertTrue(experimentRepository.getExperiment(experimentId).getErrors().size() == 1);
+
+        errorModel.setActualErrorMessage("message");
+        experimentErrorRepository.updateExperimentError(errorModel, experimentId);
+
+        List<ErrorModel> retrievedErrorList = experimentErrorRepository.getExperimentErrors(experimentId);
+        assertTrue(retrievedErrorList.size() == 1);
+        assertEquals("message", retrievedErrorList.get(0).getActualErrorMessage());
+
+        experimentRepository.removeExperiment(experimentId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepositoryTest.java
new file mode 100644
index 0000000000..2a557c50db
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepositoryTest.java
@@ -0,0 +1,116 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ExperimentInputRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ExperimentInputRepository experimentInputRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ExperimentInputRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            experimentInputRepository = new ExperimentInputRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ExperimentInputRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+        assertTrue(experimentId != null);
+
+        InputDataObjectType inputDataObjectTypeExp = new InputDataObjectType();
+        inputDataObjectTypeExp.setName("inputE");
+
+        List<InputDataObjectType> inputDataObjectTypeExpList = new ArrayList<>();
+        inputDataObjectTypeExpList.add(inputDataObjectTypeExp);
+
+        assertEquals(experimentId, experimentInputRepository.addExperimentInputs(inputDataObjectTypeExpList, experimentId));
+        assertTrue(experimentRepository.getExperiment(experimentId).getExperimentInputs().size() == 1);
+
+        inputDataObjectTypeExp.setValue("iValueE");
+        experimentInputRepository.updateExperimentInputs(inputDataObjectTypeExpList, experimentId);
+
+        List<InputDataObjectType> retrievedExpInputsList = experimentInputRepository.getExperimentInputs(experimentId);
+        assertTrue(retrievedExpInputsList.size() == 1);
+        assertEquals("iValueE", retrievedExpInputsList.get(0).getValue());
+
+        experimentRepository.removeExperiment(experimentId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepositoryTest.java
new file mode 100644
index 0000000000..ed6e672ea1
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepositoryTest.java
@@ -0,0 +1,116 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ExperimentOutputRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ExperimentOutputRepository experimentOutputRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ExperimentOutputRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            experimentOutputRepository = new ExperimentOutputRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ExperimentInputRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+        assertTrue(experimentId != null);
+
+        OutputDataObjectType outputDataObjectTypeExp = new OutputDataObjectType();
+        outputDataObjectTypeExp.setName("outputE");
+
+        List<OutputDataObjectType> outputDataObjectTypeExpList = new ArrayList<>();
+        outputDataObjectTypeExpList.add(outputDataObjectTypeExp);
+
+        assertEquals(experimentId, experimentOutputRepository.addExperimentOutputs(outputDataObjectTypeExpList, experimentId));
+        assertTrue(experimentRepository.getExperiment(experimentId).getExperimentOutputs().size() == 1);
+
+        outputDataObjectTypeExp.setValue("oValueE");
+        experimentOutputRepository.updateExperimentOutputs(outputDataObjectTypeExpList, experimentId);
+
+        List<OutputDataObjectType> retrievedExpOutputList = experimentOutputRepository.getExperimentOutputs(experimentId);
+        assertTrue(retrievedExpOutputList.size() == 1);
+        assertEquals("oValueE", retrievedExpOutputList.get(0).getValue());
+
+        experimentRepository.removeExperiment(experimentId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepositoryTest.java
new file mode 100644
index 0000000000..57d0351a2e
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepositoryTest.java
@@ -0,0 +1,121 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.experiment.UserConfigurationDataModel;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class ExperimentRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ExperimentRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ExperimentRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+        assertTrue(experimentId != null);
+
+        experimentModel.setDescription("description");
+        experimentRepository.updateExperiment(experimentModel, experimentId);
+
+        ExperimentModel retrievedExperimentModel = experimentRepository.getExperiment(experimentId);
+        assertEquals(experimentModel.getDescription(), retrievedExperimentModel.getDescription());
+
+        UserConfigurationDataModel userConfigurationDataModel = new UserConfigurationDataModel();
+        userConfigurationDataModel.setAiravataAutoSchedule(true);
+        userConfigurationDataModel.setOverrideManualScheduledParams(false);
+        assertEquals(experimentId, experimentRepository.addUserConfigurationData(userConfigurationDataModel, experimentId));
+
+        userConfigurationDataModel.setStorageId("storage2");
+        experimentRepository.updateUserConfigurationData(userConfigurationDataModel, experimentId);
+
+        assertEquals("storage2", experimentRepository.getUserConfigurationData(experimentId).getStorageId());
+
+        List<String> experimentIdList = experimentRepository.getExperimentIDs(DBConstants.Experiment.GATEWAY_ID, gatewayId);
+        assertTrue(experimentIdList.size() == 1);
+        assertTrue(experimentIdList.get(0).equals(experimentId));
+
+        experimentRepository.removeExperiment(experimentId);
+        assertFalse(experimentRepository.isExperimentExist(experimentId));
+
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepositoryTest.java
new file mode 100644
index 0000000000..4cfbec295d
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepositoryTest.java
@@ -0,0 +1,110 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.status.ExperimentState;
+import org.apache.airavata.model.status.ExperimentStatus;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ExperimentStatusRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ExperimentStatusRepository experimentStatusRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ExperimentStatusRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            experimentStatusRepository = new ExperimentStatusRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ExperimentStatusRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+        assertTrue(experimentId != null);
+
+        ExperimentStatus experimentStatus = new ExperimentStatus(ExperimentState.CREATED);
+        String experimentStatusId = experimentStatusRepository.addExperimentStatus(experimentStatus, experimentId);
+        assertTrue(experimentStatusId != null);
+        assertTrue(experimentRepository.getExperiment(experimentId).getExperimentStatus().size() == 1);
+
+        experimentStatus.setState(ExperimentState.EXECUTING);
+        experimentStatusRepository.updateExperimentStatus(experimentStatus, experimentId);
+
+        ExperimentStatus retrievedExpStatus = experimentStatusRepository.getExperimentStatus(experimentId);
+        assertEquals(ExperimentState.EXECUTING, retrievedExpStatus.getState());
+
+        experimentRepository.removeExperiment(experimentId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepositoryTest.java
new file mode 100644
index 0000000000..264145290b
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepositoryTest.java
@@ -0,0 +1,208 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentStatistics;
+import org.apache.airavata.model.experiment.ExperimentSummaryModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.status.ExperimentState;
+import org.apache.airavata.model.status.ExperimentStatus;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.cpi.ResultOrderType;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.util.*;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ExperimentSummaryRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ExperimentStatusRepository experimentStatusRepository;
+    ExperimentSummaryRepository experimentSummaryRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ExperimentSummaryRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            experimentStatusRepository = new ExperimentStatusRepository();
+            experimentSummaryRepository = new ExperimentSummaryRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ExperimentSummaryRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModelOne = new ExperimentModel();
+        experimentModelOne.setProjectId(projectId);
+        experimentModelOne.setGatewayId(gatewayId);
+        experimentModelOne.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModelOne.setUserName("userOne");
+        experimentModelOne.setExperimentName("nameOne");
+        experimentModelOne.setDescription("descriptionOne");
+        experimentModelOne.setExecutionId("executionIdOne");
+
+        ExperimentModel experimentModelTwo = new ExperimentModel();
+        experimentModelTwo.setProjectId(projectId);
+        experimentModelTwo.setGatewayId(gatewayId);
+        experimentModelTwo.setExperimentType(ExperimentType.WORKFLOW);
+        experimentModelTwo.setUserName("userTwo");
+        experimentModelTwo.setExperimentName("nameTwo");
+        experimentModelTwo.setDescription("descriptionTwo");
+        experimentModelTwo.setExecutionId("executionIdTwo");
+
+        String experimentIdOne = experimentRepository.addExperiment(experimentModelOne);
+        assertTrue(experimentIdOne != null);
+
+        String expertimentIdTwo = experimentRepository.addExperiment(experimentModelTwo);
+        assertTrue(expertimentIdTwo != null);
+
+        Timestamp timeOne = Timestamp.valueOf("2010-01-01 09:00:00");
+        experimentModelOne.setCreationTime(timeOne.getTime());
+        experimentRepository.updateExperiment(experimentModelOne, experimentIdOne);
+
+        Timestamp timeTwo = Timestamp.valueOf("2018-01-01 09:00:00");
+        experimentModelTwo.setCreationTime(timeTwo.getTime());
+        experimentRepository.updateExperiment(experimentModelTwo, expertimentIdTwo);
+
+        Map<String, String> filters = new HashMap<>();
+        filters.put(DBConstants.Experiment.GATEWAY_ID, gatewayId);
+        filters.put(DBConstants.Experiment.PROJECT_ID, projectId);
+
+        List<ExperimentSummaryModel> experimentSummaryModelList = experimentSummaryRepository.
+                searchExperiments(filters, -1, 0, null, null);
+        assertTrue(experimentSummaryModelList.size() == 2);
+
+        filters.put(DBConstants.Experiment.EXECUTION_ID, "executionIdTwo");
+
+        experimentSummaryModelList = experimentSummaryRepository.
+                searchExperiments(filters, -1, 0, null, null);
+        assertTrue(experimentSummaryModelList.size() == 1);
+        assertEquals(expertimentIdTwo, experimentSummaryModelList.get(0).getExperimentId());
+
+        String fromDate = String.valueOf(Timestamp.valueOf("2010-10-10 09:00:00"));
+        String toDate = String.valueOf(new Timestamp(System.currentTimeMillis()));
+
+        filters.put(DBConstants.ExperimentSummary.FROM_DATE, fromDate);
+        filters.put(DBConstants.ExperimentSummary.TO_DATE, toDate);
+        experimentSummaryModelList = experimentSummaryRepository.
+                searchExperiments(filters, -1, 0, null, null);
+        assertTrue(experimentSummaryModelList.size() == 1);
+        assertEquals(expertimentIdTwo, experimentSummaryModelList.get(0).getExperimentId());
+
+        filters.remove(DBConstants.ExperimentSummary.FROM_DATE);
+        filters.remove(DBConstants.ExperimentSummary.TO_DATE);
+
+        List<String> accessibleExperimentIds = new ArrayList<>();
+        accessibleExperimentIds.add(experimentIdOne);
+        filters.put(DBConstants.Experiment.EXECUTION_ID, "executionIdOne");
+
+        experimentSummaryModelList = experimentSummaryRepository.
+                searchAllAccessibleExperiments(accessibleExperimentIds, filters, -1, 0, DBConstants.Experiment.CREATION_TIME, ResultOrderType.ASC);
+        assertTrue(experimentSummaryModelList.size() == 1);
+        assertEquals(experimentIdOne, experimentSummaryModelList.get(0).getExperimentId());
+
+        filters = new HashMap<>();
+        filters.put(DBConstants.Experiment.GATEWAY_ID, gatewayId);
+        filters.put(DBConstants.Experiment.USER_NAME, "userTwo");
+        filters.put(DBConstants.Experiment.RESOURCE_HOST_ID, "resourceHost");
+        filters.put(DBConstants.Experiment.EXECUTION_ID, "executionIdTwo");
+        filters.put(DBConstants.ExperimentSummary.FROM_DATE, fromDate);
+        filters.put(DBConstants.ExperimentSummary.TO_DATE, toDate);
+
+        ExperimentStatistics experimentStatistics = experimentSummaryRepository.getExperimentStatistics(filters);
+        assertTrue(experimentStatistics.getAllExperimentCount() == 0);
+
+        filters.remove(DBConstants.Experiment.RESOURCE_HOST_ID);
+
+        experimentStatistics = experimentSummaryRepository.getExperimentStatistics(filters);
+        assertTrue(experimentStatistics.getAllExperimentCount() == 1);
+        assertEquals(experimentStatistics.getAllExperiments().get(0).getExperimentId(), expertimentIdTwo);
+
+        filters.remove(DBConstants.Experiment.USER_NAME);
+        filters.remove(DBConstants.Experiment.EXECUTION_ID);
+
+        ExperimentStatus experimentStatusOne = new ExperimentStatus(ExperimentState.CREATED);
+        String statusIdOne = experimentStatusRepository.addExperimentStatus(experimentStatusOne, experimentIdOne);
+        assertTrue(statusIdOne != null);
+
+        ExperimentStatus experimentStatusTwo = new ExperimentStatus(ExperimentState.EXECUTING);
+        String statusIdTwo = experimentStatusRepository.addExperimentStatus(experimentStatusTwo, expertimentIdTwo);
+        assertTrue(statusIdTwo != null);
+
+        experimentStatistics = experimentSummaryRepository.getExperimentStatistics(filters);
+        assertTrue(experimentStatistics.getAllExperimentCount() == 1);
+        assertTrue(experimentStatistics.getRunningExperimentCount() == 1);
+        assertEquals(expertimentIdTwo, experimentStatistics.getAllExperiments().get(0).getExperimentId());
+
+        filters.remove(DBConstants.ExperimentSummary.FROM_DATE);
+        filters.remove(DBConstants.ExperimentSummary.TO_DATE);
+
+        experimentStatistics = experimentSummaryRepository.getExperimentStatistics(filters);
+        assertTrue(experimentStatistics.getAllExperimentCount() == 2);
+        assertTrue(experimentStatistics.getCreatedExperimentCount() == 1);
+
+        experimentRepository.removeExperiment(experimentIdOne);
+        experimentRepository.removeExperiment(expertimentIdTwo);
+
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepositoryTest.java
new file mode 100644
index 0000000000..12a7090b92
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepositoryTest.java
@@ -0,0 +1,83 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class GatewayRepositoryTest {
+
+    private static Initialize initialize;
+    private String testGatewayId = "testGateway";
+    GatewayRepository gatewayRepository;
+    private static final Logger logger = LoggerFactory.getLogger(GatewayRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void GatewayRepositoryTest() throws ApplicationSettingsException, RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId(testGatewayId);
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+
+        String gatewayId = gatewayRepository.addGateway(gateway);
+        assertEquals(testGatewayId, gatewayId);
+
+        gateway.setGatewayAdminFirstName("ABC");
+        gatewayRepository.updateGateway(testGatewayId, gateway);
+
+        Gateway retrievedGateway = gatewayRepository.getGateway(gatewayId);
+        assertEquals(gateway.getGatewayAdminFirstName(), retrievedGateway.getGatewayAdminFirstName());
+
+        assertTrue(gatewayRepository.getAllGateways().size() == 1);
+
+        gatewayRepository.removeGateway(gatewayId);
+        assertFalse(gatewayRepository.isGatewayExist(gatewayId));
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepositoryTest.java
new file mode 100644
index 0000000000..203ef7ee68
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepositoryTest.java
@@ -0,0 +1,147 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.job.JobModel;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.task.TaskModel;
+import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.entities.expcatalog.JobPK;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class JobRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    TaskRepository taskRepository;
+    JobRepository jobRepository;
+    private static final Logger logger = LoggerFactory.getLogger(JobRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            taskRepository = new TaskRepository();
+            jobRepository = new JobRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void JobRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+
+        TaskModel taskModel = new TaskModel();
+        taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
+        taskModel.setParentProcessId(processId);
+
+        String taskId = taskRepository.addTask(taskModel, processId);
+        assertTrue(taskId != null);
+
+        taskModel.setTaskType(TaskTypes.MONITORING);
+        taskRepository.updateTask(taskModel, taskId);
+
+        JobModel jobModel = new JobModel();
+        jobModel.setJobId("job");
+        jobModel.setTaskId(taskId);
+        jobModel.setJobDescription("jobDescription");
+
+        String jobId = jobRepository.addJob(jobModel, processId);
+        assertTrue(jobId != null);
+        assertTrue(taskRepository.getTask(taskId).getJobs().size() == 1);
+
+        JobPK jobPK = new JobPK();
+        jobPK.setJobId(jobId);
+        jobPK.setTaskId(taskId);
+
+        jobModel.setJobName("jobName");
+        jobRepository.updateJob(jobModel, jobPK);
+        assertEquals("jobName", jobRepository.getJob(jobPK).getJobName());
+
+        List<String> jobIdList = jobRepository.getJobIds(DBConstants.Job.TASK_ID, taskId);
+        assertTrue(jobIdList.size() == 1);
+        assertTrue(jobIdList.get(0).equals(jobId));
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        taskRepository.removeTask(taskId);
+        jobRepository.removeJob(jobPK);
+        assertFalse(jobRepository.isJobExist(jobPK));
+
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepositoryTest.java
new file mode 100644
index 0000000000..0e319f1298
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepositoryTest.java
@@ -0,0 +1,148 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+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.task.TaskModel;
+import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.entities.expcatalog.JobPK;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class JobStatusRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    TaskRepository taskRepository;
+    JobRepository jobRepository;
+    JobStatusRepository jobStatusRepository;
+    private static final Logger logger = LoggerFactory.getLogger(JobStatusRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            taskRepository = new TaskRepository();
+            jobRepository = new JobRepository();
+            jobStatusRepository = new JobStatusRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void JobStatusRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+
+        TaskModel taskModel = new TaskModel();
+        taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
+        taskModel.setParentProcessId(processId);
+
+        String taskId = taskRepository.addTask(taskModel, processId);
+        assertTrue(taskId != null);
+
+        taskModel.setTaskType(TaskTypes.MONITORING);
+        taskRepository.updateTask(taskModel, taskId);
+
+        JobPK jobPK = new JobPK();
+        jobPK.setJobId("job");
+        jobPK.setTaskId(taskId);
+
+        JobModel jobModel = new JobModel();
+        jobModel.setJobId(jobPK.getJobId());
+        jobModel.setTaskId(jobPK.getTaskId());
+        jobModel.setJobDescription("jobDescription");
+
+        String jobId = jobRepository.addJob(jobModel, processId);
+        assertTrue(jobId != null);
+
+        JobStatus jobStatus = new JobStatus(JobState.QUEUED);
+        String jobStatusId = jobStatusRepository.addJobStatus(jobStatus, jobPK);
+        assertTrue(jobStatusId != null);
+        assertTrue(jobRepository.getJob(jobPK).getJobStatuses().size() == 1);
+
+        jobStatus.setJobState(JobState.ACTIVE);
+        jobStatusRepository.updateJobStatus(jobStatus, jobPK);
+
+        JobStatus retrievedJobStatus = jobStatusRepository.getJobStatus(jobPK);
+        assertEquals(JobState.ACTIVE, retrievedJobStatus.getJobState());
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        taskRepository.removeTask(taskId);
+        jobRepository.removeJob(jobPK);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepositoryTest.java
new file mode 100644
index 0000000000..56dd6e8a14
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepositoryTest.java
@@ -0,0 +1,82 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.workspace.Notification;
+import org.apache.airavata.model.workspace.NotificationPriority;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class NotificationRepositoryTest {
+
+    private static Initialize initialize;
+    private String testGateway = "testGateway";
+    NotificationRepository notificationRepository;
+    private static final Logger logger = LoggerFactory.getLogger(NotificationRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            notificationRepository = new NotificationRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void NotificationRepositoryTest() throws RegistryException {
+        Notification notification = new Notification();
+        notification.setNotificationId("notificationId");
+        notification.setGatewayId(testGateway);
+        notification.setTitle("notificationTitle");
+        notification.setNotificationMessage("notificationMessage");
+
+        String notificationId = notificationRepository.createNotification(notification);
+        assertEquals(notification.getNotificationId(), notificationId);
+
+        notification.setPriority(NotificationPriority.NORMAL);
+        notificationRepository.updateNotification(notification);
+
+        Notification retrievedNotification = notificationRepository.getNotification(notificationId);
+        assertEquals(NotificationPriority.NORMAL, retrievedNotification.getPriority());
+
+        assertTrue(notificationRepository.getAllGatewayNotifications(testGateway).size() == 1);
+
+        notificationRepository.deleteNotification(notificationId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepositoryTest.java
new file mode 100644
index 0000000000..c3a46013bf
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepositoryTest.java
@@ -0,0 +1,119 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.ErrorModel;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ProcessErrorRepositoryTest {
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    ProcessErrorRepository processErrorRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ProcessErrorRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            processErrorRepository = new ProcessErrorRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ProcessErrorRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+        assertTrue(processId != null);
+
+        ErrorModel errorModel = new ErrorModel();
+        errorModel.setErrorId("error");
+
+        String processErrorId = processErrorRepository.addProcessError(errorModel, processId);
+        assertTrue(processErrorId != null);
+        assertTrue(processRepository.getProcess(processId).getProcessErrors().size() == 1);
+
+        errorModel.setActualErrorMessage("message");
+        processErrorRepository.updateProcessError(errorModel, processId);
+
+        List<ErrorModel> retrievedErrorList = processErrorRepository.getProcessError(processId);
+        assertTrue(retrievedErrorList.size() == 1);
+        assertEquals("message", retrievedErrorList.get(0).getActualErrorMessage());
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+
+    }
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepositoryTest.java
new file mode 100644
index 0000000000..590d46907c
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepositoryTest.java
@@ -0,0 +1,122 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ProcessInputRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    ProcessInputRepository processInputRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ProcessInputRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            processInputRepository = new ProcessInputRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ProcessInputRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+        assertTrue(processId != null);
+
+        InputDataObjectType inputDataObjectProType = new InputDataObjectType();
+        inputDataObjectProType.setName("inputP");
+
+        List<InputDataObjectType> inputDataObjectTypeProList = new ArrayList<>();
+        inputDataObjectTypeProList.add(inputDataObjectProType);
+
+        assertEquals(processId, processInputRepository.addProcessInputs(inputDataObjectTypeProList, processId));
+        assertTrue(processRepository.getProcess(processId).getProcessInputs().size() == 1);
+
+        inputDataObjectProType.setValue("iValueP");
+        processInputRepository.updateProcessInputs(inputDataObjectTypeProList, processId);
+
+        List<InputDataObjectType> retrievedProInputsList = processInputRepository.getProcessInputs(processId);
+        assertTrue(retrievedProInputsList.size() == 1);
+        assertEquals("iValueP", retrievedProInputsList.get(0).getValue());
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepositoryTest.java
new file mode 100644
index 0000000000..68b286dcbd
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepositoryTest.java
@@ -0,0 +1,123 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ProcessOutputRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    ProcessOutputRepository processOutputRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ProcessOutputRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            processOutputRepository = new ProcessOutputRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ProcessOutputRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+        assertTrue(processId != null);
+
+        OutputDataObjectType outputDataObjectProType = new OutputDataObjectType();
+        outputDataObjectProType.setName("outputP");
+
+        List<OutputDataObjectType> outputDataObjectTypeProList = new ArrayList<>();
+        outputDataObjectTypeProList.add(outputDataObjectProType);
+
+        assertEquals(processId, processOutputRepository.addProcessOutputs(outputDataObjectTypeProList, processId));
+        assertTrue(processRepository.getProcess(processId).getProcessOutputs().size() == 1);
+
+        outputDataObjectProType.setValue("oValueP");
+        processOutputRepository.updateProcessOutputs(outputDataObjectTypeProList, processId);
+
+        List<OutputDataObjectType> retrievedProOutputList = processOutputRepository.getProcessOutputs(processId);
+        assertTrue(retrievedProOutputList.size() == 1);
+        assertEquals("oValueP", retrievedProOutputList.get(0).getValue());
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepositoryTest.java
new file mode 100644
index 0000000000..fb6d7ca243
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepositoryTest.java
@@ -0,0 +1,127 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class ProcessRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ProcessRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ProcessRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+        assertTrue(processId != null);
+        assertTrue(experimentRepository.getExperiment(experimentId).getProcesses().size() == 1);
+
+        processModel.setProcessDetail("detail");
+        processRepository.updateProcess(processModel, processId);
+
+        ProcessModel retrievedProcessModel = processRepository.getProcess(processId);
+        assertEquals(experimentId, retrievedProcessModel.getExperimentId());
+        assertEquals("detail", retrievedProcessModel.getProcessDetail());
+
+        ComputationalResourceSchedulingModel computationalResourceSchedulingModel = new ComputationalResourceSchedulingModel();
+        assertEquals(processId, processRepository.addProcessResourceSchedule(computationalResourceSchedulingModel, processId));
+
+        computationalResourceSchedulingModel.setQueueName("queue");
+        processRepository.updateProcessResourceSchedule(computationalResourceSchedulingModel, processId);
+        assertEquals("queue", processRepository.getProcessResourceSchedule(processId).getQueueName());
+
+        List<String> processIdList = processRepository.getProcessIds(DBConstants.Process.EXPERIMENT_ID, experimentId);
+        assertTrue(processIdList.size() == 1);
+        assertTrue(processIdList.get(0).equals(processId));
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        assertFalse(processRepository.isProcessExist(processId));
+
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepositoryTest.java
new file mode 100644
index 0000000000..0b51f8a81b
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepositoryTest.java
@@ -0,0 +1,117 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.status.ProcessState;
+import org.apache.airavata.model.status.ProcessStatus;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ProcessStatusRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    ProcessStatusRepository processStatusRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ProcessStatusRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            processStatusRepository = new ProcessStatusRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ProcessStatusRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+        assertTrue(processId != null);
+
+        ProcessStatus processStatus = new ProcessStatus(ProcessState.CREATED);
+        String processStatusId = processStatusRepository.addProcessStatus(processStatus, processId);
+        assertTrue(processStatusId != null);
+        assertTrue(processRepository.getProcess(processId).getProcessStatuses().size() == 1);
+
+        processStatus.setState(ProcessState.EXECUTING);
+        processStatusRepository.updateProcessStatus(processStatus, processId);
+
+        ProcessStatus retrievedStatus = processStatusRepository.getProcessStatus(processId);
+        assertEquals(ProcessState.EXECUTING, retrievedStatus.getState());
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepositoryTest.java
new file mode 100644
index 0000000000..44f480056d
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepositoryTest.java
@@ -0,0 +1,111 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class ProjectRepositoryTest {
+
+    private static Initialize initialize;
+    private String testGateway = "testGateway";
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    private static final Logger logger = LoggerFactory.getLogger(ProjectRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void ProjectRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId(testGateway);
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+        assertTrue(projectId != null);
+
+        project.setDescription("projectDescription");
+        projectRepository.updateProject(project, null);
+
+        Project retrievedProject = projectRepository.getProject(projectId);
+        assertEquals(gatewayId, retrievedProject.getGatewayId());
+
+        assertTrue(projectRepository.getProjectIDs(DBConstants.Project.OWNER, "user").contains(projectId));
+
+        List<String> accessibleProjectIds = new ArrayList<>();
+        accessibleProjectIds.add(projectId);
+
+        Map<String, String> filters = new HashMap<>();
+        filters.put(DBConstants.Project.GATEWAY_ID, retrievedProject.getGatewayId());
+        filters.put(DBConstants.Project.OWNER, retrievedProject.getOwner());
+        filters.put(DBConstants.Project.PROJECT_NAME, retrievedProject.getName());
+        filters.put(DBConstants.Project.DESCRIPTION, retrievedProject.getDescription());
+
+        assertTrue(projectRepository.searchAllAccessibleProjects(accessibleProjectIds, filters,
+                -1, 0, null, null).size() == 1);
+
+        projectRepository.removeProject(projectId);
+        assertFalse(projectRepository.isProjectExist(projectId));
+
+        gatewayRepository.removeGateway(gatewayId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepositoryTest.java
new file mode 100644
index 0000000000..59c0acb0a4
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepositoryTest.java
@@ -0,0 +1,78 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.status.QueueStatusModel;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class QueueStatusRepositoryTest {
+
+    private static Initialize initialize;
+    QueueStatusRepository queueStatusRepository;
+    private static final Logger logger = LoggerFactory.getLogger(QueueStatusRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            queueStatusRepository = new QueueStatusRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void QueueStatusRepositoryTest() throws RegistryException {
+        QueueStatusModel queueStatusModel = new QueueStatusModel();
+        queueStatusModel.setHostName("host");
+        queueStatusModel.setQueueName("queue");
+        queueStatusModel.setQueueUp(true);
+        queueStatusModel.setRunningJobs(1);
+        queueStatusModel.setQueuedJobs(2);
+        queueStatusModel.setTime(System.currentTimeMillis());
+
+        boolean returnValue = queueStatusRepository.createQueueStatuses(Arrays.asList(queueStatusModel));
+        assertTrue(returnValue);
+
+        List<QueueStatusModel> queueStatusModelList = queueStatusRepository.getLatestQueueStatuses();
+        assertTrue(queueStatusModelList.size() == 1);
+        assertEquals(queueStatusModel.getHostName(), queueStatusModelList.get(0).getHostName());
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepositoryTest.java
new file mode 100644
index 0000000000..948c31db2c
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepositoryTest.java
@@ -0,0 +1,131 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.commons.ErrorModel;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.task.TaskModel;
+import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class TaskErrorRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    TaskRepository taskRepository;
+    TaskErrorRepository taskErrorRepository;
+    private static final Logger logger = LoggerFactory.getLogger(TaskErrorRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            taskRepository = new TaskRepository();
+            taskErrorRepository = new TaskErrorRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void TaskErrorRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+
+        TaskModel taskModel = new TaskModel();
+        taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
+        taskModel.setParentProcessId(processId);
+
+        String taskId = taskRepository.addTask(taskModel, processId);
+        assertTrue(taskId != null);
+
+        ErrorModel errorModel = new ErrorModel();
+        errorModel.setErrorId("error");
+
+        String taskErrorId = taskErrorRepository.addTaskError(errorModel, taskId);
+        assertTrue(taskErrorId != null);
+        assertTrue(taskRepository.getTask(taskId).getTaskErrors().size() == 1);
+
+        errorModel.setActualErrorMessage("message");
+        taskErrorRepository.updateTaskError(errorModel, taskId);
+
+        List<ErrorModel> retrievedErrorList = taskErrorRepository.getTaskError(taskId);
+        assertTrue(retrievedErrorList.size() == 1);
+        assertEquals("message", retrievedErrorList.get(0).getActualErrorMessage());
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        taskRepository.removeTask(taskId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepositoryTest.java
new file mode 100644
index 0000000000..9ad51ca24c
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepositoryTest.java
@@ -0,0 +1,127 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.task.TaskModel;
+import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class TaskRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    TaskRepository taskRepository;
+    private static final Logger logger = LoggerFactory.getLogger(TaskRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            taskRepository = new TaskRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void TaskRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+
+        TaskModel taskModel = new TaskModel();
+        taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
+        taskModel.setParentProcessId(processId);
+
+        String taskId = taskRepository.addTask(taskModel, processId);
+        assertTrue(taskId != null);
+        assertTrue(processRepository.getProcess(processId).getTasks().size() == 1);
+
+        taskModel.setTaskType(TaskTypes.MONITORING);
+        taskRepository.updateTask(taskModel, taskId);
+        assertEquals(TaskTypes.MONITORING, taskRepository.getTask(taskId).getTaskType());
+
+        List<String> taskIdList = taskRepository.getTaskIds(DBConstants.Task.PARENT_PROCESS_ID, processId);
+        assertTrue(taskIdList.size() == 1);
+        assertTrue(taskIdList.get(0).equals(taskId));
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        taskRepository.removeTask(taskId);
+        assertFalse(taskRepository.isTaskExist(taskId));
+
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepositoryTest.java
new file mode 100644
index 0000000000..df03d061fa
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepositoryTest.java
@@ -0,0 +1,108 @@
+package org.apache.airavata.registry.core.repositories.expcatalog;
+
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.status.TaskState;
+import org.apache.airavata.model.status.TaskStatus;
+import org.apache.airavata.model.task.TaskModel;
+import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.registry.core.repositories.expcatalog.util.Initialize;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class TaskStatusRepositoryTest {
+
+    private static Initialize initialize;
+    GatewayRepository gatewayRepository;
+    ProjectRepository projectRepository;
+    ExperimentRepository experimentRepository;
+    ProcessRepository processRepository;
+    TaskRepository taskRepository;
+    TaskStatusRepository taskStatusRepository;
+    private static final Logger logger = LoggerFactory.getLogger(TaskStatusRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("expcatalog-derby.sql");
+            initialize.initializeDB();
+            gatewayRepository = new GatewayRepository();
+            projectRepository = new ProjectRepository();
+            experimentRepository = new ExperimentRepository();
+            processRepository = new ProcessRepository();
+            taskRepository = new TaskRepository();
+            taskStatusRepository = new TaskStatusRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void TaskStatusRepositoryTest() throws RegistryException {
+        Gateway gateway = new Gateway();
+        gateway.setGatewayId("gateway");
+        gateway.setDomain("SEAGRID");
+        gateway.setEmailAddress("abc@d.com");
+        String gatewayId = gatewayRepository.addGateway(gateway);
+
+        Project project = new Project();
+        project.setName("projectName");
+        project.setOwner("user");
+        project.setGatewayId(gatewayId);
+
+        String projectId = projectRepository.addProject(project, gatewayId);
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+
+        ProcessModel processModel = new ProcessModel(null, experimentId);
+        String processId = processRepository.addProcess(processModel, experimentId);
+
+        TaskModel taskModel = new TaskModel();
+        taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
+        taskModel.setParentProcessId(processId);
+
+        String taskId = taskRepository.addTask(taskModel, processId);
+        assertTrue(taskId != null);
+
+        TaskStatus taskStatus = new TaskStatus(TaskState.EXECUTING);
+        String taskStatusId = taskStatusRepository.addTaskStatus(taskStatus, taskId);
+        assertTrue(taskStatusId != null);
+        assertTrue(taskRepository.getTask(taskId).getTaskStatuses().size() == 1);
+
+        taskStatus.setState(TaskState.CREATED);
+        taskStatusRepository.updateTaskStatus(taskStatus, taskId);
+
+        TaskStatus retrievedTaskStatus = taskStatusRepository.getTaskStatus(taskId);
+        assertEquals(TaskState.CREATED, retrievedTaskStatus.getState());
+
+        experimentRepository.removeExperiment(experimentId);
+        processRepository.removeProcess(processId);
+        taskRepository.removeTask(taskId);
+        gatewayRepository.removeGateway(gatewayId);
+        projectRepository.removeProject(projectId);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/util/Initialize.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/util/Initialize.java
new file mode 100644
index 0000000000..c21928a878
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/util/Initialize.java
@@ -0,0 +1,293 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.airavata.registry.core.repositories.expcatalog.util;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.derby.drda.NetworkServerControl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.sql.*;
+import java.util.StringTokenizer;
+
+public class Initialize {
+    private static final Logger logger = LoggerFactory.getLogger(Initialize.class);
+    public static final String DERBY_SERVER_MODE_SYS_PROPERTY = "derby.drda.startNetworkServer";
+    public  String scriptName = "expcatalog-derby.sql";
+    private NetworkServerControl server;
+    private static final String delimiter = ";";
+    private String jdbcUrl = null;
+    private String jdbcDriver = null;
+    private String jdbcUser = null;
+    private String jdbcPassword = null;
+
+    public Initialize(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public static boolean checkStringBufferEndsWith(StringBuffer buffer, String suffix) {
+        if (suffix.length() > buffer.length()) {
+            return false;
+        }
+        // this loop is done on purpose to avoid memory allocation performance
+        // problems on various JDKs
+        // StringBuffer.lastIndexOf() was introduced in jdk 1.4 and
+        // implementation is ok though does allocation/copying
+        // StringBuffer.toString().endsWith() does massive memory
+        // allocation/copying on JDK 1.5
+        // See http://issues.apache.org/bugzilla/show_bug.cgi?id=37169
+        int endIndex = suffix.length() - 1;
+        int bufferIndex = buffer.length() - 1;
+        while (endIndex >= 0) {
+            if (buffer.charAt(bufferIndex) != suffix.charAt(endIndex)) {
+                return false;
+            }
+            bufferIndex--;
+            endIndex--;
+        }
+        return true;
+    }
+
+    private static boolean isServerStarted(NetworkServerControl server, int ntries)
+    {
+        for (int i = 1; i <= ntries; i ++)
+        {
+            try {
+                Thread.sleep(500);
+                server.ping();
+                return true;
+            }
+            catch (Exception e) {
+                if (i == ntries)
+                    return false;
+            }
+        }
+        return false;
+    }
+
+    public void initializeDB() throws SQLException{
+        try{
+            jdbcDriver = ServerSettings.getSetting("registry.jdbc.driver");
+            jdbcUrl = ServerSettings.getSetting("registry.jdbc.url");
+            jdbcUser = ServerSettings.getSetting("registry.jdbc.user");
+            jdbcPassword = ServerSettings.getSetting("registry.jdbc.password");
+            jdbcUrl = jdbcUrl + "?" + "user=" + jdbcUser + "&" + "password=" + jdbcPassword;
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read properties", e);
+        }
+        startDerbyInServerMode();
+        if(!isServerStarted(server, 20)){
+            throw new RuntimeException("Derby server cound not started within five seconds...");
+        }
+
+        Connection conn = null;
+        try {
+            Class.forName(jdbcDriver).newInstance();
+            conn = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
+            if (!isDatabaseStructureCreated(DBConstants.CONFIGURATION, conn)) {
+                executeSQLScript(conn);
+                logger.info("New Database created for Registry");
+            } else {
+                logger.debug("Database already created for Registry!");
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            throw new RuntimeException("Database failure", e);
+        } finally {
+            try {
+                if (conn != null){
+                    if (!conn.getAutoCommit()) {
+                        conn.commit();
+                    }
+                    conn.close();
+                }
+            } catch (SQLException e) {
+                logger.error(e.getMessage(), e);
+            }
+        }
+    }
+
+    public static boolean isDatabaseStructureCreated(String tableName, Connection conn) {
+        try {
+            System.out.println("Running a query to test the database tables existence.");
+            // check whether the tables are already created with a query
+            Statement statement = null;
+            try {
+                statement = conn.createStatement();
+                ResultSet rs = statement.executeQuery("select * from " + tableName);
+                if (rs != null) {
+                    rs.close();
+                }
+            } finally {
+                try {
+                    if (statement != null) {
+                        statement.close();
+                    }
+                } catch (SQLException e) {
+                    return false;
+                }
+            }
+        } catch (SQLException e) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void executeSQLScript(Connection conn) throws Exception {
+        StringBuffer sql = new StringBuffer();
+        BufferedReader reader = null;
+        try{
+
+            InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(scriptName);
+            reader = new BufferedReader(new InputStreamReader(inputStream));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                line = line.trim();
+                if (line.startsWith("//")) {
+                    continue;
+                }
+                if (line.startsWith("--")) {
+                    continue;
+                }
+                StringTokenizer st = new StringTokenizer(line);
+                if (st.hasMoreTokens()) {
+                    String token = st.nextToken();
+                    if ("REM".equalsIgnoreCase(token)) {
+                        continue;
+                    }
+                }
+                sql.append(" ").append(line);
+
+                // SQL defines "--" as a comment to EOL
+                // and in Oracle it may contain a hint
+                // so we cannot just remove it, instead we must end it
+                if (line.indexOf("--") >= 0) {
+                    sql.append("\n");
+                }
+                if ((checkStringBufferEndsWith(sql, delimiter))) {
+                    executeSQL(sql.substring(0, sql.length() - delimiter.length()), conn);
+                    sql.replace(0, sql.length(), "");
+                }
+            }
+            // Catch any statements not followed by ;
+            if (sql.length() > 0) {
+                executeSQL(sql.toString(), conn);
+            }
+        }catch (IOException e){
+            logger.error("Error occurred while executing SQL script for creating Airavata database", e);
+            throw new Exception("Error occurred while executing SQL script for creating Airavata database", e);
+        }finally {
+            if (reader != null) {
+                reader.close();
+            }
+
+        }
+
+    }
+
+    private static void executeSQL(String sql, Connection conn) throws Exception {
+        // Check and ignore empty statements
+        if ("".equals(sql.trim())) {
+            return;
+        }
+
+        Statement statement = null;
+        try {
+            logger.debug("SQL : " + sql);
+
+            boolean ret;
+            int updateCount = 0, updateCountTotal = 0;
+            statement = conn.createStatement();
+            ret = statement.execute(sql);
+            updateCount = statement.getUpdateCount();
+            do {
+                if (!ret) {
+                    if (updateCount != -1) {
+                        updateCountTotal += updateCount;
+                    }
+                }
+                ret = statement.getMoreResults();
+                if (ret) {
+                    updateCount = statement.getUpdateCount();
+                }
+            } while (ret);
+
+            logger.debug(sql + " : " + updateCountTotal + " rows affected");
+
+            SQLWarning warning = conn.getWarnings();
+            while (warning != null) {
+                logger.warn(warning + " sql warning");
+                warning = warning.getNextWarning();
+            }
+            conn.clearWarnings();
+        } catch (SQLException e) {
+            if (e.getSQLState().equals("X0Y32")) {
+                // eliminating the table already exception for the derby
+                // database
+                logger.info("Table Already Exists", e);
+            } else {
+                throw new Exception("Error occurred while executing : " + sql, e);
+            }
+        } finally {
+            if (statement != null) {
+                try {
+                    statement.close();
+                } catch (SQLException e) {
+                    logger.error("Error occurred while closing result set.", e);
+                }
+            }
+        }
+    }
+
+    private void startDerbyInServerMode() {
+        try {
+            System.setProperty(DERBY_SERVER_MODE_SYS_PROPERTY, "true");
+            server = new NetworkServerControl(InetAddress.getByName("0.0.0.0"),
+                    20000,
+                    jdbcUser, jdbcPassword);
+            java.io.PrintWriter consoleWriter = new java.io.PrintWriter(System.out, true);
+            server.start(consoleWriter);
+        } catch (IOException e) {
+            logger.error("Unable to start Apache derby in the server mode! Check whether " +
+                    "specified port is available");
+        } catch (Exception e) {
+            logger.error("Unable to start Apache derby in the server mode! Check whether " +
+                    "specified port is available");
+        }
+
+    }
+
+    public void stopDerbyServer() throws SQLException{
+        try {
+            server.shutdown();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            throw new SQLException("Error while stopping derby server", e);
+        }
+    }
+}
diff --git a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
index 5cce58b063..e979820791 100644
--- a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
+++ b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
@@ -19,7 +19,6 @@
  */
 package org.apache.airavata.registry.api.service.handler;
 
-import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.model.WorkflowModel;
@@ -97,8 +96,8 @@
 import org.apache.airavata.registry.core.app.catalog.resources.UnicoreDataMovementResource;
 import org.apache.airavata.registry.core.app.catalog.resources.UnicoreJobSubmissionResource;
 import org.apache.airavata.registry.core.app.catalog.util.AppCatalogThriftConversion;
+import org.apache.airavata.registry.core.entities.expcatalog.JobPK;
 import org.apache.airavata.registry.core.experiment.catalog.ExpCatResourceUtils;
-import org.apache.airavata.registry.core.experiment.catalog.impl.RegistryFactory;
 import org.apache.airavata.registry.core.experiment.catalog.resources.AbstractExpCatResource;
 import org.apache.airavata.registry.core.repositories.appcatalog.ApplicationDeploymentRepository;
 import org.apache.airavata.registry.core.repositories.appcatalog.ApplicationInterfaceRepository;
@@ -107,18 +106,15 @@
 import org.apache.airavata.registry.core.repositories.appcatalog.GwyResourceProfileRepository;
 import org.apache.airavata.registry.core.repositories.appcatalog.StorageResourceRepository;
 import org.apache.airavata.registry.core.repositories.appcatalog.UserResourceProfileRepository;
+import org.apache.airavata.registry.core.repositories.expcatalog.*;
 import org.apache.airavata.registry.core.repositories.replicacatalog.DataProductRepository;
 import org.apache.airavata.registry.core.repositories.replicacatalog.DataReplicaLocationRepository;
 import org.apache.airavata.registry.core.repositories.workflowcatalog.WorkflowRepository;
 import org.apache.airavata.registry.core.utils.DBConstants;
 import org.apache.airavata.registry.cpi.AppCatalogException;
-import org.apache.airavata.registry.cpi.CompositeIdentifier;
 import org.apache.airavata.registry.cpi.ComputeResource;
 import org.apache.airavata.registry.cpi.ExpCatChildDataType;
-import org.apache.airavata.registry.cpi.ExpCatParentDataType;
-import org.apache.airavata.registry.cpi.ExperimentCatalog;
 import org.apache.airavata.registry.cpi.ExperimentCatalogException;
-import org.apache.airavata.registry.cpi.ExperimentCatalogModelType;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.apache.airavata.registry.cpi.ResultOrderType;
 import org.apache.airavata.registry.cpi.WorkflowCatalogException;
@@ -137,14 +133,32 @@
 public class RegistryServerHandler implements RegistryService.Iface {
     private final static Logger logger = LoggerFactory.getLogger(RegistryServerHandler.class);
 
-    private ExperimentCatalog experimentCatalog;
     private ApplicationDeploymentRepository applicationDeploymentRepository = new ApplicationDeploymentRepository();
     private ApplicationInterfaceRepository applicationInterfaceRepository = new ApplicationInterfaceRepository();
+    private StorageResourceRepository storageResourceRepository = new StorageResourceRepository();
     private UserResourceProfileRepository userResourceProfileRepository = new UserResourceProfileRepository();
+    private GatewayRepository gatewayRepository = new GatewayRepository();
+    private ProjectRepository projectRepository = new ProjectRepository();
+    private NotificationRepository notificationRepository = new NotificationRepository();
+    private ExperimentSummaryRepository experimentSummaryRepository = new ExperimentSummaryRepository();
+    private ExperimentRepository experimentRepository = new ExperimentRepository();
+    private ExperimentOutputRepository experimentOutputRepository = new ExperimentOutputRepository();
+    private ExperimentStatusRepository experimentStatusRepository = new ExperimentStatusRepository();
+    private ExperimentErrorRepository experimentErrorRepository = new ExperimentErrorRepository();
+    private ProcessRepository processRepository = new ProcessRepository();
+    private ProcessOutputRepository processOutputRepository = new ProcessOutputRepository();
+    private ProcessStatusRepository processStatusRepository = new ProcessStatusRepository();
+    private ProcessErrorRepository processErrorRepository = new ProcessErrorRepository();
+    private TaskRepository taskRepository = new TaskRepository();
+    private TaskStatusRepository taskStatusRepository = new TaskStatusRepository();
+    private TaskErrorRepository taskErrorRepository = new TaskErrorRepository();
+    private JobRepository jobRepository = new JobRepository();
+    private JobStatusRepository jobStatusRepository = new JobStatusRepository();
+    private QueueStatusRepository queueStatusRepository = new QueueStatusRepository();
     private DataProductRepository dataProductRepository = new DataProductRepository();
     private DataReplicaLocationRepository dataReplicaLocationRepository = new DataReplicaLocationRepository();
     private WorkflowRepository workflowRepository = new WorkflowRepository();
-    private StorageResourceRepository storageResourceRepository = new StorageResourceRepository();
+
 
     /**
      * Fetch Apache Registry API version
@@ -202,14 +216,13 @@ public boolean isUserExists(String gatewayId, String userName) throws RegistrySe
     @Override
     public Gateway getGateway(String gatewayId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.GATEWAY, gatewayId)){
+            if (!gatewayRepository.isGatewayExist(gatewayId)){
                 logger.error("Gateway does not exist in the system. Please provide a valid gateway ID...");
                 AiravataSystemException exception = new AiravataSystemException();
                 exception.setMessage("Gateway does not exist in the system. Please provide a valid gateway ID...");
                 throw exception;
             }
-            Gateway gateway = (Gateway) experimentCatalog.get(ExperimentCatalogModelType.GATEWAY, gatewayId);
+            Gateway gateway = gatewayRepository.getGateway(gatewayId);
             logger.debug("Airavata retrieved gateway with gateway id : " + gateway.getGatewayId());
             return gateway;
         } catch (RegistryException e) {
@@ -230,14 +243,13 @@ public Gateway getGateway(String gatewayId) throws RegistryServiceException, TEx
     @Override
     public boolean deleteGateway(String gatewayId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.GATEWAY, gatewayId)){
+            if (!gatewayRepository.isGatewayExist(gatewayId)){
                 logger.error("Gateway does not exist in the system. Please provide a valid gateway ID...");
                 AiravataSystemException exception = new AiravataSystemException();
                 exception.setMessage("Gateway does not exist in the system. Please provide a valid gateway ID...");
                 throw exception;
             }
-            experimentCatalog.remove(ExperimentCatalogModelType.GATEWAY, gatewayId);
+            gatewayRepository.removeGateway(gatewayId);
             logger.debug("Airavata deleted gateway with gateway id : " + gatewayId);
             return true;
         } catch (RegistryException e) {
@@ -254,12 +266,7 @@ public boolean deleteGateway(String gatewayId) throws RegistryServiceException,
     @Override
     public List<Gateway> getAllGateways() throws RegistryServiceException, TException {
         try {
-            List<Gateway> gateways = new ArrayList<Gateway>();
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            List<Object> list = experimentCatalog.get(ExperimentCatalogModelType.GATEWAY, null, null);
-            for (Object gateway : list){
-                gateways.add((Gateway)gateway);
-            }
+            List<Gateway> gateways = gatewayRepository.getAllGateways();
             logger.debug("Airavata retrieved all available gateways...");
             return gateways;
         } catch (RegistryException e) {
@@ -280,8 +287,7 @@ public boolean deleteGateway(String gatewayId) throws RegistryServiceException,
     @Override
     public boolean isGatewayExist(String gatewayId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            return experimentCatalog.isExist(ExperimentCatalogModelType.GATEWAY, gatewayId);
+            return gatewayRepository.isGatewayExist(gatewayId);
         } catch (RegistryException e) {
             logger.error("Error while getting gateway", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -293,8 +299,7 @@ public boolean isGatewayExist(String gatewayId) throws RegistryServiceException,
     @Override
     public boolean deleteNotification(String gatewayId, String notificationId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            experimentCatalog.remove(ExperimentCatalogModelType.NOTIFICATION, notificationId);
+            notificationRepository.deleteNotification(notificationId);
             return true;
         } catch (RegistryException e) {
             logger.error("Error while deleting notification", e);
@@ -307,8 +312,7 @@ public boolean deleteNotification(String gatewayId, String notificationId) throw
     @Override
     public Notification getNotification(String gatewayId, String notificationId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            return (Notification)experimentCatalog.get(ExperimentCatalogModelType.NOTIFICATION, notificationId);
+            return notificationRepository.getNotification(notificationId);
         } catch (RegistryException e) {
             logger.error("Error while retrieving notification", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -320,11 +324,7 @@ public Notification getNotification(String gatewayId, String notificationId) thr
     @Override
     public List<Notification> getAllNotifications(String gatewayId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            List<Object> objectList = experimentCatalog.get(ExperimentCatalogModelType.NOTIFICATION, null, gatewayId);
-            List<Notification> notifications = new ArrayList<>();
-            for(Object o : objectList)
-                notifications.add((Notification) o);
+            List<Notification> notifications = notificationRepository.getAllGatewayNotifications(gatewayId);
             return notifications;
         } catch (RegistryException e) {
             logger.error("Error while getting all notifications", e);
@@ -345,8 +345,7 @@ public Notification getNotification(String gatewayId, String notificationId) thr
     @Override
     public Project getProject(String projectId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.PROJECT, projectId)){
+            if (!projectRepository.isProjectExist(projectId)){
                 logger.error("Project does not exist in the system. Please provide a valid project ID...");
                 ProjectNotFoundException exception = new ProjectNotFoundException();
                 exception.setMessage("Project does not exist in the system. Please provide a valid project ID...");
@@ -354,7 +353,7 @@ public Project getProject(String projectId) throws RegistryServiceException, TEx
             }
             logger.debug("Airavata retrieved project with project Id : " + projectId );
 
-            Project project = (Project) experimentCatalog.get(ExperimentCatalogModelType.PROJECT, projectId);
+            Project project = projectRepository.getProject(projectId);
             return project;
         } catch (RegistryException e) {
             logger.error("Error while retrieving the project", e);
@@ -377,15 +376,14 @@ public Project getProject(String projectId) throws RegistryServiceException, TEx
     @Override
     public boolean deleteProject(String projectId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.PROJECT, projectId)) {
+            if (!projectRepository.isProjectExist(projectId)) {
                 logger.error("Project does not exist in the system. Please provide a valid project ID...");
                 ProjectNotFoundException exception = new ProjectNotFoundException();
                 exception.setMessage("Project does not exist in the system. Please provide a valid project ID...");
                 throw exception;
             }
 
-            experimentCatalog.remove(ExperimentCatalogModelType.PROJECT, projectId);
+            projectRepository.removeProject(projectId);
             logger.debug("Airavata deleted project with project Id : " + projectId );
             return true;
         } catch (RegistryException e) {
@@ -417,23 +415,17 @@ public boolean deleteProject(String projectId) throws RegistryServiceException,
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
         }
-        List<Project> projects = new ArrayList<Project>();
+        List<Project> projects = new ArrayList<>();
         try {
             if (!ExpCatResourceUtils.isUserExist(userName, gatewayId)){
                 logger.warn("User does not exist in the system. Please provide a valid user..");
                 return projects;
             }
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            Map<String, String> filters = new HashMap<String, String>();
+            Map<String, String> filters = new HashMap<>();
             filters.put(Constants.FieldConstants.ProjectConstants.OWNER, userName);
             filters.put(Constants.FieldConstants.ProjectConstants.GATEWAY_ID, gatewayId);
-            List<Object> list = experimentCatalog.search(ExperimentCatalogModelType.PROJECT, filters, limit, offset,
+            projects = projectRepository.searchProjects(filters, limit, offset,
                     Constants.FieldConstants.ProjectConstants.CREATION_TIME, ResultOrderType.DESC);
-            if (list != null && !list.isEmpty()){
-                for (Object o : list){
-                    projects.add((Project) o);
-                }
-            }
             logger.debug("Airavata retrieved projects for user : " + userName + " and gateway id : " + gatewayId );
             return projects;
         } catch (RegistryException e) {
@@ -473,9 +465,9 @@ public ExperimentStatistics getExperimentStatistics(String gatewayId, long fromT
                 filters.put(Constants.FieldConstants.ExperimentConstants.RESOURCE_HOST_ID, resourceHostName);
             }
 
-            List<Object> results = experimentCatalog.search(ExperimentCatalogModelType.EXPERIMENT_STATISTICS, filters);
+            ExperimentStatistics result = experimentSummaryRepository.getExperimentStatistics(filters);
             logger.debug("Airavata retrieved experiments for gateway id : " + gatewayId + " between : " + AiravataUtils.getTime(fromTime) + " and " + AiravataUtils.getTime(toTime));
-            return (ExperimentStatistics) results.get(0);
+            return result;
         }catch (Exception e) {
             logger.error("Error while retrieving experiments", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -501,23 +493,16 @@ public ExperimentStatistics getExperimentStatistics(String gatewayId, long fromT
             throw exception;
         }
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.PROJECT, projectId)){
+            if (!projectRepository.isProjectExist(projectId)){
                 logger.error("Project does not exist in the system. Please provide a valid project ID...");
                 ProjectNotFoundException exception = new ProjectNotFoundException();
                 exception.setMessage("Project does not exist in the system. Please provide a valid project ID...");
                 throw exception;
             }
 
-            List<ExperimentModel> experiments = new ArrayList<ExperimentModel>();
-            List<Object> list = experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT,
+            List<ExperimentModel> experiments = experimentRepository.getExperimentList(
                     Constants.FieldConstants.ExperimentConstants.PROJECT_ID, projectId, limit, offset,
                     Constants.FieldConstants.ExperimentConstants.CREATION_TIME, ResultOrderType.DESC);
-            if (list != null && !list.isEmpty()) {
-                for (Object o : list) {
-                    experiments.add((ExperimentModel) o);
-                }
-            }
             logger.debug("Airavata retrieved experiments for project : " + projectId);
             return experiments;
         } catch (Exception e) {
@@ -556,15 +541,9 @@ public ExperimentStatistics getExperimentStatistics(String gatewayId, long fromT
                 logger.warn("User does not exist in the system. Please provide a valid user..");
                 return experiments;
             }
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            List<Object> list = experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT,
+            experiments = experimentRepository.getExperimentList(
                     Constants.FieldConstants.ExperimentConstants.USER_NAME, userName, limit, offset,
                     Constants.FieldConstants.ExperimentConstants.CREATION_TIME, ResultOrderType.DESC);
-            if (list != null && !list.isEmpty()){
-                for (Object o : list){
-                    experiments.add((ExperimentModel)o);
-                }
-            }
             logger.debug("Airavata retrieved experiments for user : " + userName);
             return experiments;
         } catch (Exception e) {
@@ -585,17 +564,16 @@ public ExperimentStatistics getExperimentStatistics(String gatewayId, long fromT
     @Override
     public boolean deleteExperiment(String experimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, experimentId)){
+            if (!experimentRepository.isExperimentExist(experimentId)){
                 throw new ExperimentNotFoundException("Requested experiment id " + experimentId + " does not exist in the system..");
             }
-            ExperimentModel experimentModel = (ExperimentModel) experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT, experimentId);
+            ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
 
             if(!(experimentModel.getExperimentStatus().get(0).getState() == ExperimentState.CREATED)){
                 logger.error("Error while deleting the experiment");
                 throw new ExperimentCatalogException("Experiment is not in CREATED state. Hence cannot deleted. ID:"+ experimentId);
             }
-            experimentCatalog.remove(ExperimentCatalogModelType.EXPERIMENT, experimentId);
+            experimentRepository.removeExperiment(experimentId);
             logger.debug("Airavata removed experiment with experiment id : " + experimentId);
             return true;
         } catch (Exception e) {
@@ -679,20 +657,16 @@ public ExperimentModel getExperiment(String airavataExperimentId) throws Registr
     public ExperimentModel getDetailedExperimentTree(String airavataExperimentId) throws RegistryServiceException, TException {
         try {
             ExperimentModel experimentModel =  getExperimentInternal(airavataExperimentId);
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            List<Object> processObjects  = experimentCatalog.get(ExperimentCatalogModelType.PROCESS,
+            List<ProcessModel> processList  = processRepository.getProcessList(
                     Constants.FieldConstants.ExperimentConstants.EXPERIMENT_ID, experimentModel.getExperimentId());
-            List<ProcessModel> processList = new ArrayList<>();
-            if(processObjects != null){
-                processObjects.stream().forEach(p -> {
+            if(processList != null){
+                processList.stream().forEach(p -> {
                     //Process already has the task object
-                    ((ProcessModel)p).getTasks().stream().forEach(t->{
+                    (p).getTasks().stream().forEach(t->{
                         try {
-                            List<Object> jobObjects = experimentCatalog.get(ExperimentCatalogModelType.JOB,
+                            List<JobModel> jobList = jobRepository.getJobList(
                                     Constants.FieldConstants.JobConstants.TASK_ID, ((TaskModel)t).getTaskId());
-                            List<JobModel> jobList  = new ArrayList<JobModel>();
-                            if(jobObjects != null){
-                                jobObjects.stream().forEach(j -> jobList.add((JobModel)j));
+                            if(jobList != null){
                                 Collections.sort(jobList, new Comparator<JobModel>() {
                                     @Override
                                     public int compare(JobModel o1, JobModel o2) {
@@ -705,7 +679,6 @@ public int compare(JobModel o1, JobModel o2) {
                             logger.error(e.getMessage(), e);
                         }
                     });
-                    processList.add((ProcessModel)p);
                 });
                 experimentModel.setProcesses(processList);
             }
@@ -746,13 +719,12 @@ public ExperimentStatus getExperimentStatus(String airavataExperimentId) throws
     @Override
     public List<OutputDataObjectType> getExperimentOutputs(String airavataExperimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)){
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)){
                 logger.error(airavataExperimentId, "Get experiment outputs failed, experiment {} doesn't exit.", airavataExperimentId);
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
             logger.debug("Airavata retrieved experiment outputs for experiment id : " + airavataExperimentId);
-            return (List<OutputDataObjectType>) experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT_OUTPUT, airavataExperimentId);
+            return experimentOutputRepository.getExperimentOutputs(airavataExperimentId);
         } catch (Exception e) {
             logger.error(airavataExperimentId, "Error while retrieving the experiment outputs", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -784,24 +756,21 @@ public ExperimentStatus getExperimentStatus(String airavataExperimentId) throws
     @Override
     public Map<String, JobStatus> getJobStatuses(String airavataExperimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)){
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)){
                 logger.error(airavataExperimentId, "Error while retrieving job details, experiment {} doesn't exist.", airavataExperimentId);
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
-            List<Object> processModels = experimentCatalog.get(ExperimentCatalogModelType.PROCESS, Constants.FieldConstants.ProcessConstants.EXPERIMENT_ID, airavataExperimentId);
+            List<ProcessModel> processModels = processRepository.getProcessList(Constants.FieldConstants.ProcessConstants.EXPERIMENT_ID, airavataExperimentId);
             Map<String, JobStatus> jobStatus = new HashMap<String, JobStatus>();
             if (processModels != null && !processModels.isEmpty()){
-                for (Object process : processModels) {
-                    ProcessModel processModel = (ProcessModel) process;
+                for (ProcessModel processModel : processModels) {
                     List<TaskModel> tasks = processModel.getTasks();
                     if (tasks != null && !tasks.isEmpty()){
                         for (TaskModel task : tasks){
                             String taskId =  task.getTaskId();
-                            List<Object> jobs = experimentCatalog.get(ExperimentCatalogModelType.JOB, Constants.FieldConstants.JobConstants.TASK_ID, taskId);
+                            List<JobModel> jobs = jobRepository.getJobList(Constants.FieldConstants.JobConstants.TASK_ID, taskId);
                             if (jobs != null && !jobs.isEmpty()){
-                                for (Object jobObject : jobs) {
-                                    JobModel jobModel = (JobModel) jobObject;
+                                for (JobModel jobModel : jobs) {
                                     String jobID = jobModel.getJobId();
                                     List<JobStatus> status = jobModel.getJobStatuses();
                                     if (status != null && status.size()>0){
@@ -828,12 +797,11 @@ public ExperimentStatus getExperimentStatus(String airavataExperimentId) throws
     public void addExperimentProcessOutputs(String outputType, List<OutputDataObjectType> outputs, String id) throws RegistryServiceException, TException {
 
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
             if (ExpCatChildDataType.PROCESS_OUTPUT.equals(ExpCatChildDataType.valueOf(outputType))) {
-                experimentCatalog.add(ExpCatChildDataType.PROCESS_OUTPUT, outputs, id);
+                processOutputRepository.addProcessOutputs(outputs, id);
             }
             else if(ExpCatChildDataType.EXPERIMENT_OUTPUT.equals(ExpCatChildDataType.valueOf(outputType))) {
-                experimentCatalog.add(ExpCatChildDataType.EXPERIMENT_OUTPUT, outputs, id);
+                experimentOutputRepository.addExperimentOutputs(outputs, id);
             }
         } catch (Exception e) {
             logger.error(id, "Error while adding outputs", e);
@@ -848,15 +816,14 @@ else if(ExpCatChildDataType.EXPERIMENT_OUTPUT.equals(ExpCatChildDataType.valueOf
     public void addErrors(String errorType, ErrorModel errorModel, String id) throws RegistryServiceException, TException {
 
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
             if (ExpCatChildDataType.EXPERIMENT_ERROR.equals(ExpCatChildDataType.valueOf(errorType))) {
-                experimentCatalog.add(ExpCatChildDataType.EXPERIMENT_ERROR, errorModel, id);
+                experimentErrorRepository.addExperimentError(errorModel, id);
             }
             else if (ExpCatChildDataType.TASK_ERROR.equals(ExpCatChildDataType.valueOf(errorType))) {
-                experimentCatalog.add(ExpCatChildDataType.TASK_ERROR, errorModel, id);
+                taskErrorRepository.addTaskError(errorModel, id);
             }
             else if (ExpCatChildDataType.PROCESS_ERROR.equals(ExpCatChildDataType.valueOf(errorType))) {
-                experimentCatalog.add(ExpCatChildDataType.PROCESS_ERROR, errorModel, id);
+                processErrorRepository.addProcessError(errorModel, id);
             }
         } catch (Exception e) {
             logger.error(id, "Error while adding error", e);
@@ -870,8 +837,7 @@ else if (ExpCatChildDataType.PROCESS_ERROR.equals(ExpCatChildDataType.valueOf(er
     @Override
     public void addTaskStatus(TaskStatus taskStatus, String taskId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            experimentCatalog.add(ExpCatChildDataType.TASK_STATUS, taskStatus, taskId);
+            taskStatusRepository.addTaskStatus(taskStatus, taskId);
         } catch (Exception e) {
             logger.error(taskId, "Error while adding task status", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -884,8 +850,7 @@ public void addTaskStatus(TaskStatus taskStatus, String taskId) throws RegistryS
     @Override
     public void addProcessStatus(ProcessStatus processStatus, String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            experimentCatalog.add(ExpCatChildDataType.PROCESS_STATUS, processStatus, processId);
+            processStatusRepository.addProcessStatus(processStatus, processId);
         } catch (Exception e) {
             logger.error(processId, "Error while adding process status", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -898,8 +863,7 @@ public void addProcessStatus(ProcessStatus processStatus, String processId) thro
     @Override
     public void updateProcessStatus(ProcessStatus processStatus, String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            experimentCatalog.update(ExperimentCatalogModelType.PROCESS_STATUS, processStatus, processId);
+            processStatusRepository.updateProcessStatus(processStatus, processId);
         } catch (Exception e) {
             logger.error(processId, "Error while updating process status", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -912,8 +876,7 @@ public void updateProcessStatus(ProcessStatus processStatus, String processId) t
     @Override
     public void updateExperimentStatus(ExperimentStatus experimentStatus, String experimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            experimentCatalog.update(ExperimentCatalogModelType.EXPERIMENT_STATUS, experimentStatus, experimentId);
+            experimentStatusRepository.updateExperimentStatus(experimentStatus, experimentId);
         } catch (Exception e) {
             logger.error(experimentId, "Error while updating experiment status", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -926,9 +889,10 @@ public void updateExperimentStatus(ExperimentStatus experimentStatus, String exp
     @Override
     public void addJobStatus(JobStatus jobStatus, String taskId, String jobId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            CompositeIdentifier ids = new CompositeIdentifier(taskId, jobId);
-            experimentCatalog.add(ExpCatChildDataType.JOB_STATUS, jobStatus, ids);
+            JobPK jobPK = new JobPK();
+            jobPK.setJobId(jobId);
+            jobPK.setTaskId(taskId);
+            jobStatusRepository.addJobStatus(jobStatus, jobPK);
         } catch (Exception e) {
             logger.error(jobId, "Error while adding job status", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -941,8 +905,7 @@ public void addJobStatus(JobStatus jobStatus, String taskId, String jobId) throw
     @Override
     public void addJob(JobModel jobModel, String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            experimentCatalog.add(ExpCatChildDataType.JOB, jobModel, processId);
+            jobRepository.addJob(jobModel, processId);
         } catch (Exception e) {
             logger.error(processId, "Error while adding job ", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -955,8 +918,7 @@ public void addJob(JobModel jobModel, String processId) throws RegistryServiceEx
     @Override
     public String addProcess(ProcessModel processModel, String experimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            return (String)experimentCatalog.add(ExpCatChildDataType.PROCESS, processModel, experimentId);
+            return processRepository.addProcess(processModel, experimentId);
         } catch (Exception e) {
             logger.error(experimentId, "Error while adding process ", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -969,8 +931,7 @@ public String addProcess(ProcessModel processModel, String experimentId) throws
     @Override
     public void updateProcess(ProcessModel processModel, String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            experimentCatalog.update(ExperimentCatalogModelType.PROCESS, processModel, processId);
+            processRepository.updateProcess(processModel, processId);
         } catch (Exception e) {
             logger.error(processId, "Error while updating process ", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -983,8 +944,7 @@ public void updateProcess(ProcessModel processModel, String processId) throws Re
     @Override
     public String addTask(TaskModel taskModel, String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            return (String)experimentCatalog.add(ExpCatChildDataType.TASK, taskModel, processId);
+            return taskRepository.addTask(taskModel, processId);
         } catch (Exception e) {
             logger.error(processId, "Error while adding task ", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -997,8 +957,7 @@ public String addTask(TaskModel taskModel, String processId) throws RegistryServ
     @Override
     public UserConfigurationDataModel getUserConfigurationData(String experimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            return (UserConfigurationDataModel) experimentCatalog.get(ExperimentCatalogModelType.USER_CONFIGURATION_DATA, experimentId);
+            return experimentRepository.getUserConfigurationData(experimentId);
         }
         catch (Exception e) {
             logger.error(experimentId, "Error while getting user configuration ", e);
@@ -1012,8 +971,7 @@ public UserConfigurationDataModel getUserConfigurationData(String experimentId)
     @Override
     public ProcessModel getProcess(String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            return (ProcessModel) experimentCatalog.get(ExperimentCatalogModelType.PROCESS, processId);
+            return processRepository.getProcess(processId);
         } catch (Exception e) {
             logger.error(processId, "Error while retrieving user configuration ", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -1026,16 +984,7 @@ public ProcessModel getProcess(String processId) throws RegistryServiceException
     @Override
     public List<ProcessModel> getProcessList(String experimentId) throws RegistryServiceException, TException {
         try {
-            List<ProcessModel> processModels = new ArrayList<ProcessModel>();
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            List<Object> processList = experimentCatalog.get(ExperimentCatalogModelType.PROCESS, Constants.FieldConstants.ExperimentConstants.EXPERIMENT_ID, experimentId);
-
-            if (processList != null && !processList.isEmpty()) {
-                for (Object processObject : processList) {
-                    ProcessModel processModel = (ProcessModel)processObject;
-                    processModels.add(processModel);
-                }
-            }
+            List<ProcessModel> processModels = processRepository.getProcessList(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_ID, experimentId);
             return processModels;
 
         } catch (Exception e) {
@@ -1050,8 +999,7 @@ public ProcessModel getProcess(String processId) throws RegistryServiceException
     @Override
     public ProcessStatus getProcessStatus(String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            return (ProcessStatus) experimentCatalog.get(ExperimentCatalogModelType.PROCESS_STATUS, processId);
+            return processStatusRepository.getProcessStatus(processId);
         } catch (Exception e) {
             logger.error(processId, "Error while retrieving process status", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -1099,13 +1047,10 @@ public JobModel getJob(String queryType, String id) throws RegistryServiceExcept
     }
 
     private JobModel fetchJobModel(String queryType, String id) throws RegistryException {
-        experimentCatalog = RegistryFactory.getDefaultExpCatalog();
         if (queryType.equals(Constants.FieldConstants.JobConstants.TASK_ID)) {
-            List<Object> jobs = experimentCatalog.get(ExperimentCatalogModelType.JOB, Constants.FieldConstants.JobConstants.TASK_ID, id);
-            JobModel jobModel = null;
+            List<JobModel> jobs = jobRepository.getJobList(Constants.FieldConstants.JobConstants.TASK_ID, id);
             if (jobs != null) {
-                for (Object object : jobs) {
-                    jobModel = ((JobModel) object);
+                for (JobModel jobModel : jobs) {
                     if (jobModel.getJobId() != null || !jobModel.equals("")) {
                         return jobModel;
                     }
@@ -1113,12 +1058,9 @@ private JobModel fetchJobModel(String queryType, String id) throws RegistryExcep
             }
         }
         else if (queryType.equals(Constants.FieldConstants.JobConstants.PROCESS_ID)) {
-            List<Object> objects = experimentCatalog.get(ExperimentCatalogModelType.JOB,
-                    Constants.FieldConstants.JobConstants.PROCESS_ID, id);
-            JobModel jobModel = null;
-            if (objects != null) {
-                for (Object object : objects) {
-                    jobModel = ((JobModel) object);
+            List<JobModel> jobs = jobRepository.getJobList(Constants.FieldConstants.JobConstants.PROCESS_ID, id);
+            if (jobs != null) {
+                for (JobModel jobModel : jobs) {
                     if (jobModel.getJobId() != null || !jobModel.equals("")) {
                         return jobModel;
                     }
@@ -1131,8 +1073,7 @@ else if (queryType.equals(Constants.FieldConstants.JobConstants.PROCESS_ID)) {
     @Override
     public List<OutputDataObjectType> getProcessOutputs(String processId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            return (List<OutputDataObjectType> )experimentCatalog.get(ExperimentCatalogModelType.PROCESS_OUTPUT, processId);
+            return processOutputRepository.getProcessOutputs(processId);
         } catch (Exception e) {
             logger.error(processId, "Error while retrieving process outputs", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -1145,8 +1086,7 @@ else if (queryType.equals(Constants.FieldConstants.JobConstants.PROCESS_ID)) {
     @Override
     public List<String> getProcessIds(String experimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            return experimentCatalog.getIds(ExperimentCatalogModelType.PROCESS, AbstractExpCatResource.ProcessConstants.EXPERIMENT_ID, experimentId);
+            return processRepository.getProcessIds(AbstractExpCatResource.ProcessConstants.EXPERIMENT_ID, experimentId);
         } catch (Exception e) {
             logger.error(experimentId, "Error while retrieving process ids", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -1166,24 +1106,19 @@ else if (queryType.equals(Constants.FieldConstants.JobConstants.PROCESS_ID)) {
     @Override
     public List<JobModel> getJobDetails(String airavataExperimentId) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)){
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)){
                 logger.error(airavataExperimentId, "Error while retrieving job details, experiment {} doesn't exist.", airavataExperimentId);
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
-            List<Object> processModels = experimentCatalog.get(ExperimentCatalogModelType.PROCESS, Constants.FieldConstants.ProcessConstants.EXPERIMENT_ID, airavataExperimentId);
+            List<ProcessModel> processModels = processRepository.getProcessList(Constants.FieldConstants.ProcessConstants.EXPERIMENT_ID, airavataExperimentId);
             List<JobModel> jobList = new ArrayList<>();
             if (processModels != null && !processModels.isEmpty()){
-                for (Object process : processModels) {
-                    ProcessModel processModel = (ProcessModel) process;
+                for (ProcessModel processModel : processModels) {
                     List<TaskModel> tasks = processModel.getTasks();
                     if (tasks != null && !tasks.isEmpty()){
                         for (TaskModel taskModel : tasks){
                             String taskId =  taskModel.getTaskId();
-                            List<Object> jobs = experimentCatalog.get(ExperimentCatalogModelType.JOB, Constants.FieldConstants.JobConstants.TASK_ID, taskId);
-                            for (Object jobObject : jobs) {
-                                jobList.add ((JobModel)jobObject);
-                            }
+                            jobList = jobRepository.getJobList(Constants.FieldConstants.JobConstants.TASK_ID, taskId);
                         }
                     }
                 }
@@ -3650,8 +3585,7 @@ public String registerApplicationModule(String gatewayId, ApplicationModule appl
     @Override
     public void updateResourceScheduleing(String airavataExperimentId, ComputationalResourceSchedulingModel resourceScheduling) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)){
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)){
                 logger.debug(airavataExperimentId, "Update resource scheduling failed, experiment {} doesn't exist.", airavataExperimentId);
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
@@ -3660,7 +3594,7 @@ public void updateResourceScheduleing(String airavataExperimentId, Computational
                 ExperimentState experimentState = experimentStatus.getState();
                 switch (experimentState){
                     case CREATED: case VALIDATED: case CANCELED: case FAILED:
-                        experimentCatalog.add(ExpCatChildDataType.PROCESS_RESOURCE_SCHEDULE, resourceScheduling, airavataExperimentId);
+                        processRepository.addProcessResourceSchedule(resourceScheduling, airavataExperimentId);
                         logger.debug(airavataExperimentId, "Successfully updated resource scheduling for the experiment {}.", airavataExperimentId);
                         break;
                     default:
@@ -3689,8 +3623,7 @@ public void updateResourceScheduleing(String airavataExperimentId, Computational
     @Override
     public void updateExperimentConfiguration(String airavataExperimentId, UserConfigurationDataModel userConfiguration) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)){
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)){
                 logger.error(airavataExperimentId, "Update experiment configuration failed, experiment {} doesn't exist.", airavataExperimentId);
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
@@ -3699,7 +3632,7 @@ public void updateExperimentConfiguration(String airavataExperimentId, UserConfi
                 ExperimentState experimentState = experimentStatus.getState();
                 switch (experimentState){
                     case CREATED: case VALIDATED: case CANCELED: case FAILED:
-                        experimentCatalog.add(ExpCatChildDataType.USER_CONFIGURATION_DATA, userConfiguration, airavataExperimentId);
+                        experimentRepository.addUserConfigurationData(userConfiguration, airavataExperimentId);
                         logger.debug(airavataExperimentId, "Successfully updated experiment configuration for experiment {}.", airavataExperimentId);
                         break;
                     default:
@@ -3752,8 +3685,7 @@ public void updateExperimentConfiguration(String airavataExperimentId, UserConfi
     @Override
     public void updateExperiment(String airavataExperimentId, ExperimentModel experiment) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)) {
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.error(airavataExperimentId, "Update request failed, Experiment {} doesn't exist.", airavataExperimentId);
                 throw new RegistryServiceException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
@@ -3777,7 +3709,7 @@ public void updateExperiment(String airavataExperimentId, ExperimentModel experi
                                 throw exception;
                             }
                         }
-                        experimentCatalog.update(ExperimentCatalogModelType.EXPERIMENT, experiment, airavataExperimentId);
+                        experimentRepository.updateExperiment(experiment, airavataExperimentId);
                         logger.debug(airavataExperimentId, "Successfully updated experiment {} ", experiment.getExperimentName());
                         break;
                     default:
@@ -3852,7 +3784,6 @@ public void updateExperiment(String airavataExperimentId, ExperimentModel experi
     @Override
     public String createExperiment(String gatewayId, ExperimentModel experiment) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
             if (!validateString(experiment.getExperimentName())){
                 logger.error("Cannot create experiments with empty experiment name");
                 AiravataSystemException exception = new AiravataSystemException();
@@ -3881,7 +3812,8 @@ public String createExperiment(String gatewayId, ExperimentModel experiment) thr
                 }
             }
 
-            String experimentId = (String) experimentCatalog.add(ExpCatParentDataType.EXPERIMENT, experiment, gatewayId);
+            experiment.setGatewayId(gatewayId);
+            String experimentId = experimentRepository.addExperiment(experiment);
             logger.debug(experimentId, "Created new experiment with experiment name {}", experiment.getExperimentName());
             return experimentId;
         } catch (Exception e) {
@@ -3927,7 +3859,6 @@ public String createExperiment(String gatewayId, ExperimentModel experiment) thr
                 throw exception;
             }
             List<ExperimentSummaryModel> summaries = new ArrayList<ExperimentSummaryModel>();
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
             Map<String, String> regFilters = new HashMap();
             regFilters.put(Constants.FieldConstants.ExperimentConstants.GATEWAY_ID, gatewayId);
             for(Map.Entry<ExperimentSearchFields, String> entry : filters.entrySet())
@@ -3954,12 +3885,9 @@ public String createExperiment(String gatewayId, ExperimentModel experiment) thr
                     regFilters.put(AbstractExpCatResource.ExperimentConstants.USER_NAME, userName);
                 }
             }
-            List<Object> results = experimentCatalog.searchAllAccessible(ExperimentCatalogModelType.EXPERIMENT,
+            summaries = experimentSummaryRepository.searchAllAccessibleExperiments(
                     accessibleExpIds, regFilters, limit,
                     offset, Constants.FieldConstants.ExperimentConstants.CREATION_TIME, ResultOrderType.DESC);
-            for (Object object : results) {
-                summaries.add((ExperimentSummaryModel) object);
-            }
             logger.debug("Airavata retrieved experiments for user : " + userName + " and gateway id : " + gatewayId );
             return summaries;
         }catch (Exception e) {
@@ -4003,9 +3931,8 @@ public String createExperiment(String gatewayId, ExperimentModel experiment) thr
                 exception.setMessage("User does not exist in the system. Please provide a valid user..");
                 throw exception;
             }
-            List<Project> projects = new ArrayList<Project>();
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            Map<String, String> regFilters = new HashMap<String, String>();
+            List<Project> projects = new ArrayList<>();
+            Map<String, String> regFilters = new HashMap<>();
             regFilters.put(Constants.FieldConstants.ProjectConstants.GATEWAY_ID, gatewayId);
             for(Map.Entry<ProjectSearchFields, String> entry : filters.entrySet())
             {
@@ -4022,11 +3949,8 @@ public String createExperiment(String gatewayId, ExperimentModel experiment) thr
                 }
             }
 
-            List<Object> results = experimentCatalog.searchAllAccessible(ExperimentCatalogModelType.PROJECT, accessibleProjIds,
+            projects = projectRepository.searchAllAccessibleProjects(accessibleProjIds,
                     regFilters, limit, offset, Constants.FieldConstants.ProjectConstants.CREATION_TIME, ResultOrderType.DESC);
-            for (Object object : results) {
-                projects.add((Project)object);
-            }
             logger.debug("Airavata retrieved projects for user : " + userName + " and gateway id : " + gatewayId);
             return projects;
         }catch (Exception e) {
@@ -4055,15 +3979,14 @@ public void updateProject(String projectId, Project updatedProject) throws Regis
             throw exception;
         }
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(updatedProject.getGatewayId());
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.PROJECT, projectId)){
+            if (!projectRepository.isProjectExist(projectId)){
                 logger.error("Project does not exist in the system. Please provide a valid project ID...");
                 ProjectNotFoundException exception = new ProjectNotFoundException();
                 exception.setMessage("Project does not exist in the system. Please provide a valid project ID...");
                 throw exception;
             }
 
-            experimentCatalog.update(ExperimentCatalogModelType.PROJECT, updatedProject, projectId);
+            projectRepository.updateProject(updatedProject, projectId);
             logger.debug("Airavata updated project with project Id : " + projectId );
         } catch (RegistryException e) {
             logger.error("Error while updating the project", e);
@@ -4083,7 +4006,6 @@ public void updateProject(String projectId, Project updatedProject) throws Regis
     @Override
     public String createProject(String gatewayId, Project project) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
             if (!validateString(project.getName()) || !validateString(project.getOwner())){
                 logger.error("Project name and owner cannot be empty...");
                 throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
@@ -4096,7 +4018,7 @@ public String createProject(String gatewayId, Project project) throws RegistrySe
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
                 throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             }
-            String projectId = (String) experimentCatalog.add(ExpCatParentDataType.PROJECT, project, gatewayId);
+            String projectId = projectRepository.addProject(project, gatewayId);
             return projectId;
         } catch (Exception e) {
             logger.error("Error while creating the project", e);
@@ -4109,8 +4031,7 @@ public String createProject(String gatewayId, Project project) throws RegistrySe
     @Override
     public boolean updateNotification(Notification notification) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(notification.getGatewayId());
-            experimentCatalog.update(ExperimentCatalogModelType.NOTIFICATION, notification, notification.getGatewayId());
+            notificationRepository.updateNotification(notification);
             return true;
         } catch (RegistryException e) {
             logger.error("Error while updating notification", e);
@@ -4129,8 +4050,7 @@ public boolean updateNotification(Notification notification) throws RegistryServ
     @Override
     public String createNotification(Notification notification) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(notification.getGatewayId());
-            return (String) experimentCatalog.add(ExpCatParentDataType.NOTIFICATION, notification, notification.getGatewayId());
+            return notificationRepository.createNotification(notification);
         } catch (RegistryException e) {
             logger.error("Error while creating notification", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -4151,14 +4071,13 @@ public String createNotification(Notification notification) throws RegistryServi
     @Override
     public boolean updateGateway(String gatewayId, Gateway updatedGateway) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.GATEWAY, gatewayId)){
+            if (!gatewayRepository.isGatewayExist(gatewayId)){
                 logger.error("Gateway does not exist in the system. Please provide a valid gateway ID...");
                 AiravataSystemException exception = new AiravataSystemException();
                 exception.setMessage("Gateway does not exist in the system. Please provide a valid gateway ID...");
                 throw exception;
             }
-            experimentCatalog.update(ExperimentCatalogModelType.GATEWAY, updatedGateway, gatewayId);
+            gatewayRepository.updateGateway(gatewayId, updatedGateway);
 
             // check if gatewayprofile exists and check if the identity server password token equals the admin password token, if not update
             GatewayResourceProfile existingGwyResourceProfile = new GwyResourceProfileRepository().getGatewayProfile(gatewayId);
@@ -4192,7 +4111,6 @@ public boolean updateGateway(String gatewayId, Gateway updatedGateway) throws Re
     @Override
     public String addGateway(Gateway gateway) throws RegistryServiceException, DuplicateEntryException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
             if (!validateString(gateway.getGatewayId())){
                 logger.error("Gateway id cannot be empty...");
                 throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
@@ -4206,8 +4124,8 @@ public String addGateway(Gateway gateway) throws RegistryServiceException, Dupli
                 throw new DuplicateEntryException("GatewayResourceProfile with gatewayId: " + gateway.getGatewayId() + ", already exists in AppCatalog.");
             }
 
-            // add gateway in experimentCatalog
-            String gatewayId = (String) experimentCatalog.add(ExpCatParentDataType.GATEWAY, gateway, gateway.getGatewayId());
+            // add gateway in experiment catalog
+            String gatewayId = gatewayRepository.addGateway(gateway);
 
             // add gatewayresourceprofile in appCatalog
             GatewayResourceProfile gatewayResourceProfile = new GatewayResourceProfile();
@@ -4242,8 +4160,7 @@ private boolean validateString(String name){
     private boolean isGatewayExistInternal(String gatewayId) throws InvalidRequestException, AiravataClientException,
             AiravataSystemException, AuthorizationException, TException{
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(gatewayId);
-            return experimentCatalog.isExist(ExperimentCatalogModelType.GATEWAY, gatewayId);
+            return gatewayRepository.isGatewayExist(gatewayId);
         } catch (RegistryException e) {
             logger.error("Error while getting gateway", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -4257,11 +4174,10 @@ private boolean isGatewayExistInternal(String gatewayId) throws InvalidRequestEx
     private ExperimentModel getExperimentInternal(String airavataExperimentId) throws InvalidRequestException,
             ExperimentNotFoundException, AiravataClientException, AiravataSystemException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)){
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)){
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
-            return (ExperimentModel) experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId);
+            return experimentRepository.getExperiment(airavataExperimentId);
         } catch (RegistryException e) {
             logger.error("Error while retrieving the experiment", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -4274,13 +4190,12 @@ private ExperimentModel getExperimentInternal(String airavataExperimentId) throw
     private ExperimentStatus getExperimentStatusInternal(String airavataExperimentId) throws InvalidRequestException,
             ExperimentNotFoundException, AiravataClientException, AiravataSystemException, TException {
         try {
-            experimentCatalog = RegistryFactory.getDefaultExpCatalog();
-            if (!experimentCatalog.isExist(ExperimentCatalogModelType.EXPERIMENT, airavataExperimentId)){
+            if (!experimentRepository.isExperimentExist(airavataExperimentId)){
                 logger.error(airavataExperimentId, "Error while retrieving experiment status, experiment {} doesn't exist.", airavataExperimentId);
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId +
                         " does not exist in the system..");
             }
-            return (ExperimentStatus) experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT_STATUS, airavataExperimentId);
+            return experimentStatusRepository.getExperimentStatus(airavataExperimentId);
         } catch (Exception e) {
             logger.error(airavataExperimentId, "Error while retrieving the experiment status", e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -4821,14 +4736,9 @@ public boolean deleteUserStoragePreference(String userId, String gatewayID, Stri
     @Override
     public List<QueueStatusModel> getLatestQueueStatuses() throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(ServerSettings.getDefaultUserGateway());
-            List<Object> temp = experimentCatalog.get(ExperimentCatalogModelType.QUEUE_STATUS, null, null, -1, 0, null, null);
-            List<QueueStatusModel> queueStatusModels = new ArrayList<>();
-            temp.stream().forEach(t->{
-                queueStatusModels.add((QueueStatusModel)t);
-            });
+            List<QueueStatusModel> queueStatusModels = queueStatusRepository.getLatestQueueStatuses();
             return queueStatusModels;
-        } catch (RegistryException | ApplicationSettingsException e) {
+        } catch (RegistryException e) {
             logger.error("Error while reading queue status models....", e);
             RegistryServiceException exception = new RegistryServiceException();
             exception.setMessage("Error while reading queue status models.... : " + e.getMessage());
@@ -4839,9 +4749,8 @@ public boolean deleteUserStoragePreference(String userId, String gatewayID, Stri
     @Override
     public void registerQueueStatuses(List<QueueStatusModel> queueStatuses) throws RegistryServiceException, TException {
         try {
-            experimentCatalog = RegistryFactory.getExperimentCatalog(ServerSettings.getDefaultUserGateway());
-            experimentCatalog.add(ExpCatParentDataType.QUEUE_STATUS, queueStatuses, null);
-        } catch (RegistryException | ApplicationSettingsException e) {
+            queueStatusRepository.createQueueStatuses(queueStatuses);
+        } catch (RegistryException e) {
             logger.error("Error while storing queue status models....", e);
             RegistryServiceException exception = new RegistryServiceException();
             exception.setMessage("Error while storing queue status models.... : " + e.getMessage());
diff --git a/thrift-interface-descriptions/data-models/experiment-catalog-models/status_models.thrift b/thrift-interface-descriptions/data-models/experiment-catalog-models/status_models.thrift
index 001a30261b..9c95651723 100644
--- a/thrift-interface-descriptions/data-models/experiment-catalog-models/status_models.thrift
+++ b/thrift-interface-descriptions/data-models/experiment-catalog-models/status_models.thrift
@@ -87,25 +87,29 @@ enum JobState {
 struct ExperimentStatus {
     1: required ExperimentState state,
     2: optional i64 timeOfStateChange,
-    3: optional string reason
+    3: optional string reason,
+    4: optional string statusId
 }
 
 struct ProcessStatus {
     1: required ProcessState state,
     2: optional i64 timeOfStateChange,
-    3: optional string reason
+    3: optional string reason,
+    4: optional string statusId
 }
 
 struct TaskStatus {
     1: required TaskState state,
     2: optional i64 timeOfStateChange,
-    3: optional string reason
+    3: optional string reason,
+    4: optional string statusId
 }
 
 struct JobStatus {
     1: required JobState jobState,
     2: optional i64 timeOfStateChange,
-    3: optional string reason
+    3: optional string reason,
+    4: optional string statusId
 }
 
 struct QueueStatusModel {


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> Refactoring Experiment Catalog Implementation
> ---------------------------------------------
>
>                 Key: AIRAVATA-2728
>                 URL: https://issues.apache.org/jira/browse/AIRAVATA-2728
>             Project: Airavata
>          Issue Type: Improvement
>          Components: Registry API
>            Reporter: Sneha Tilak
>            Assignee: Sneha Tilak
>            Priority: Major
>




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)