diff --git a/src/components/query/QueryCatalogs.js b/src/components/query/QueryCatalogs.js
index 898bbc6a76b0b2f8940a43182d4b9d930a8fdc68..0adc7688eb8de8fafcdb5557ef40d75db3aefe8c 100644
--- a/src/components/query/QueryCatalogs.js
+++ b/src/components/query/QueryCatalogs.js
@@ -36,6 +36,9 @@ export default function QueryCatalogs() {
       case "zooniverse":
         setConfigName("zooniverse");
         break;
+      case "esap_rucio":
+        setConfigName("esap_rucio");
+        break;
       case "astron_vo":
         setConfigName("astron_vo");
         break;
diff --git a/src/components/query/QueryResults.js b/src/components/query/QueryResults.js
index 9350c83c30aedc7977b4ebdbb74c8587a15b1016..69e23c17de7eb00bbe9e39e62a16a18c98bbbd0b 100644
--- a/src/components/query/QueryResults.js
+++ b/src/components/query/QueryResults.js
@@ -4,6 +4,7 @@ import ASTRONVOResults from "./ASTRONVOResults";
 import ZooniverseResults from "./ZooniverseResults";
 import VORegListResults from "./VORegListResults";
 import LOFARResults from "./LOFARResults";
+import RucioResults from "./RucioResults";
 
 export default function QueryResults({ catalog }) {
   switch (catalog) {
@@ -19,6 +20,8 @@ export default function QueryResults({ catalog }) {
       return <VORegListResults catalog={catalog} />;
     case "lofar":
       return <LOFARResults catalog={catalog} />;
+    case "rucio":
+      return <RucioResults catalog={catalog} />;
     default:
       return null;
   }
diff --git a/src/components/query/RucioResults.js b/src/components/query/RucioResults.js
new file mode 100644
index 0000000000000000000000000000000000000000..8620405f7410720041a3ffc83be7ab38dc5310f1
--- /dev/null
+++ b/src/components/query/RucioResults.js
@@ -0,0 +1,132 @@
+import React, { useContext, useState } from "react";
+import { Table, Alert, Form, Button } from "react-bootstrap";
+import * as deepEqual from "deep-equal";
+import { QueryContext } from "../../contexts/QueryContext";
+// import { BasketContext } from "../../contexts/BasketContext";
+import LoadingSpinner from "../LoadingSpinner";
+import Paginate, { pagination_fields } from "../Paginate";
+// import SaveBasket from "../basket/savebasket";
+
+function titleCase(string) {
+  var sentence = string.toLowerCase().split(" ");
+  for (var i = 0; i < sentence.length; i++) {
+    sentence[i] = sentence[i][0].toUpperCase() + sentence[i].slice(1);
+  }
+  return sentence.join(" ");
+}
+
+function newPageCallback(setPage) {
+  return (args) => {
+    if (args.target) {
+      setPage(parseFloat(args.target.text));
+    }
+  };
+}
+
+export default function RucioResults({ catalog }) {
+  const context = useContext(QueryContext);
+  // const basketContext = useContext(BasketContext);
+  const { queryMap, page, setPage } = context;
+
+  // console.log(queryMap, page, context.queryMap.get(catalog).status);
+
+  if (!context.queryMap) return null;
+  if (context.queryMap.get(catalog).status === "fetched") {
+    if (context.queryMap.get(catalog).results.results.length === 0)
+      return <Alert variant="warning">No matching results found!</Alert>;
+    else if (catalog === "rucio") {
+      const result = queryMap.get("rucio").results.results[0];
+      const numPages = queryMap.get("rucio").results.pages;
+
+      const fields = Object.keys(result).map(
+        (key) => key
+      );
+      const headers = Object.keys(result).map((field) => {
+        const title = titleCase(field.replace("_", " "));
+        return <th key={`header_${field}`}>{title}</th>;
+      });
+
+      return (
+        <>
+          <Paginate
+            getNewPage={newPageCallback(setPage)}
+            currentPage={page}
+            numAdjacent={3}
+            numPages={numPages}
+          />
+          <Form>
+            {/*<SaveBasket />*/}
+            <Table className="mt-3" responsive>
+              <thead>
+                <tr className="bg-light">
+                  {/* <th>
+                <InputGroup>
+                  <InputGroup.Checkbox />
+                </InputGroup>
+              </th> */}
+                  {headers}
+                </tr>
+              </thead>
+              <tbody>
+                {queryMap
+                  .get("rucio")
+                  .results.results.map((result, resultCounter) => {
+                    const cells = fields.map((field) => {
+                      const reactKey = `item_${resultCounter}_${field}`;
+                      return (
+                        <td key={reactKey}>
+                          {result[field]}
+                        </td>
+                      );
+                    });
+                    return (
+                      <tr key={`item_${resultCounter}`}>
+                        {/* <th>
+                    <InputGroup>
+                      <InputGroup.Checkbox />
+                    </InputGroup>
+                  </th> */}
+                        {/*<td>
+                        <Form.Check id={`selectClassifications_${result.project_id}`} type="checkbox" onChange={(event) => {
+                          const action = event.target.checked ? addToBasket : removeFromBasket;
+                          action(result.project_id, basketContext, "project", "classifications");
+                        }} checked={isInBasket(result.project_id, basketContext, "project", "classifications") ? "checked" : ""} />
+                      </td>
+                      <td>
+                        <Form.Check id={`selectSubjects_${result.project_id}`} type="checkbox" onChange={(event) => {
+                          const action = event.target.checked ? addToBasket : removeFromBasket;
+                          action(result.project_id, basketContext, "project", "subjects");
+                        }} checked={isInBasket(result.project_id, basketContext, "project", "subjects") ? "checked" : ""} />
+                      </td>*/}
+                        {/*<td>{result.project_id}</td>
+                      <td>{result.display_name}</td>
+                      <td>{created_at}</td>
+                      <td>{updated_at}</td>
+                      <td>{launch_date}</td>
+                      <td>{live}</td>
+                      <td>
+                        <a href={`https://zooniverse.org/projects/${result.slug}`}>
+                          Link
+                      </a>
+                      </td>*/}
+                        {cells}
+                      </tr>
+                    );
+                  })}
+              </tbody>
+            </Table>
+          </Form>
+          <Paginate
+            getNewPage={newPageCallback(setPage)}
+            currentPage={page}
+            numAdjacent={3}
+            numPages={numPages}
+          />
+        </>
+      );
+    }
+  }
+  else {
+    return <LoadingSpinner />;
+  }
+}
diff --git a/src/utils/form/parseQueryForm.js b/src/utils/form/parseQueryForm.js
index 08c3162b9737e8e0a72772702312f88c60d0951b..62d7ec47344ccab0d0631caf302fb3369b441a42 100644
--- a/src/utils/form/parseQueryForm.js
+++ b/src/utils/form/parseQueryForm.js
@@ -4,6 +4,7 @@ import parseLOFARForm from "./parseLOFARForm";
 import parseIVOAForm from "./parseIVOAForm";
 import parseApertifForm from "./parseApertifForm";
 import parseASTRONVOForm from "./parseASTRONVOForm";
+import parseRucioForm from "./parseRucioForm";
 
 export default function parseQueryForm(gui, formData, page) {
   switch (gui) {
@@ -19,6 +20,8 @@ export default function parseQueryForm(gui, formData, page) {
       return parseASTRONVOForm(formData, page);
     case "ivoa":
       return parseIVOAForm(formData, page);
+    case "rucio":
+        return parseRucioForm(formData, page);
     default:
       return null;
   }
diff --git a/src/utils/form/parseRucioForm.js b/src/utils/form/parseRucioForm.js
new file mode 100644
index 0000000000000000000000000000000000000000..a0571bb15f2f15432fc230ea49a9d0309eaa281c
--- /dev/null
+++ b/src/utils/form/parseRucioForm.js
@@ -0,0 +1,21 @@
+export default function parseRucioForm(formData, page) {
+  let formInput = Object.entries(formData);
+
+  let query = "";
+
+  for (let [key, value] of formInput) {
+    query += `${`${query}` ? "&" : ""}` + key + "=" + value;
+  }
+
+  let esapquery = [
+    query,
+    "archive_uri=esap_rucio",
+    `catalog=rucio`,
+  ].join("&");
+
+  console.log("Rucio Query", query);
+  return [{
+    catalog: "rucio",
+    esapquery: esapquery + `&page=${page}`
+  }];
+}