diff --git a/src/components/CONCORDIA.js b/src/components/CONCORDIA.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8783542665e262ed55ce2c75acb54af55fd98a4
--- /dev/null
+++ b/src/components/CONCORDIA.js
@@ -0,0 +1,13 @@
+import React from "react";
+
+export default function CONCORDIA() {
+  return (
+    <div className="embed-responsive embed-responsive-16by9">
+      <iframe
+        title="concordia"
+        className="embed-responsive-item"
+        allowFullScreen
+      ></iframe>
+    </div>
+  );
+}
diff --git a/src/components/query/QueryCatalogs.js b/src/components/query/QueryCatalogs.js
index 6bd0909f9b4caa37b175ed5c8ab63dc3bf00cc2c..1a5833929cec95b27fe1a84d6c48b86000114527 100644
--- a/src/components/query/QueryCatalogs.js
+++ b/src/components/query/QueryCatalogs.js
@@ -48,6 +48,9 @@ export default function QueryCatalogs() {
       case "ivoa":
         setConfigName("esap_ivoa");
         break;
+      case "esap_concordia":
+        setConfigName("esap_concordia");
+        break;
 
       default:
         break;
diff --git a/src/components/services/query_results/CONCORDIAResults.js b/src/components/services/query_results/CONCORDIAResults.js
new file mode 100644
index 0000000000000000000000000000000000000000..61cf088a7007accf873c878b47999d7e1029570c
--- /dev/null
+++ b/src/components/services/query_results/CONCORDIAResults.js
@@ -0,0 +1,50 @@
+import React, { useContext } from "react";
+import { Table, Alert, Form } from "react-bootstrap";
+import { QueryContext } from "../../../contexts/QueryContext";
+import LoadingSpinner from "../../LoadingSpinner";
+import Paginate from "../../Paginate";
+import AddToBasket from "../../basket/AddToBasketCheckBox";
+
+export default function DIRACResults({ catalog }) {
+  const context = useContext(QueryContext);
+  const { queryMap, page, setPage } = context;
+  const regex = /(<([^>]+)>)/ig;
+
+  if (!context.queryMap) return null;
+
+  if (context.queryMap.get(catalog).status === "fetched") {
+    if (context.queryMap.get(catalog).length === 0)
+      return <Alert variant="warning">No matching results found!</Alert>;
+    else if (catalog === "concordia") {
+      const concordiaResults = queryMap.get("concordia").results.results.map((hits, counter) => (
+
+           <>
+           Job submitted:
+           <br/>
+           JobID: {hits.JobID}
+           <br/>
+           Status: {hits.Status}
+           <br/>
+           Minor Status: {hits.MinorStatus}
+           <br/>
+           Site: {hits.Site}
+           </>
+
+
+      ));
+
+      return (
+
+       <>
+         {concordiaResults}
+       </>
+
+      ); 
+
+    }
+  }
+  else {
+    return <LoadingSpinner />;
+  }
+}
+
diff --git a/src/components/services/query_results/QueryResults.js b/src/components/services/query_results/QueryResults.js
index 79c2e3529ed97674df5fa37b9043d0a1d64c5c36..ed8c7ecb702c14f48e6077c4b7ab5c2033d1758f 100644
--- a/src/components/services/query_results/QueryResults.js
+++ b/src/components/services/query_results/QueryResults.js
@@ -7,6 +7,7 @@ import LOFARResults from "./LOFARResults";
 import RucioResults from "./RucioResults";
 import ZenodoResults from "./ZenodoResults";
 import SampResults from "./SampResults";
+import CONCORDIAResults from "./CONCORDIAResults";
 
 export default function QueryResults({ catalog }) {
   switch (catalog) {
@@ -26,6 +27,8 @@ export default function QueryResults({ catalog }) {
       return <RucioResults catalog={catalog} />;
     case "zenodo":
       return <ZenodoResults catalog={catalog} />;
+    case "concordia":
+      return <CONCORDIAResults catalog={catalog} />;
     case "samp":
       return <SampResults catalog={catalog} />;
     default:
diff --git a/src/utils/form/parseCONCORDIAForm.js b/src/utils/form/parseCONCORDIAForm.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b860e7cd6772a2c78eec319ee8823b6fb9eb663
--- /dev/null
+++ b/src/utils/form/parseCONCORDIAForm.js
@@ -0,0 +1,21 @@
+export default function parseCONCORDIAForm(formData) {
+  let formInput = Object.entries(formData);
+
+  let query = "";
+
+  for (let [key, value] of formInput) {
+    query += `${`${query}` ? "&" : ""}` + key + "=" + value;
+  }
+
+  let esapquery = [
+    query,
+    "archive_uri=esap_concordia",
+    `catalog=concordia`,
+  ].join("&");
+
+  console.log("CONCORDIA Job Submission (helloworld):", query);
+  return [{
+    catalog: "concordia",
+    esapquery: esapquery
+  }];
+}
diff --git a/src/utils/form/parseQueryForm.js b/src/utils/form/parseQueryForm.js
index 9a8b196c84180601e0040c99c96bd6d7378d7310..d2cf0892219975cbef5b45c09ce45ef42d42507c 100644
--- a/src/utils/form/parseQueryForm.js
+++ b/src/utils/form/parseQueryForm.js
@@ -7,6 +7,7 @@ import parseASTRONVOForm from "./parseASTRONVOForm";
 import parseRucioForm from "./parseRucioForm";
 import parseZenodoForm from "./parseZenodoForm";
 import parseMultipleArchivesForm from "./parseMultipleArchivesForm";
+import parseCONCORDIAForm from "./parseCONCORDIAForm";
 
 export default function parseQueryForm(gui, formData) {
   switch (gui) {
@@ -28,6 +29,8 @@ export default function parseQueryForm(gui, formData) {
         return parseZenodoForm(formData);
     case "multiple_archives":
         return parseMultipleArchivesForm(formData);
+    case "concordia":
+        return parseCONCORDIAForm(formData);
     default:
       return null;
   }