diff --git a/src/components/Interactive.js b/src/components/Interactive.js
index b3508f3beaf43e391098e289588ba751960d6a54..e219659de3e859639ca23cd1d4825e69099fceb4 100644
--- a/src/components/Interactive.js
+++ b/src/components/Interactive.js
@@ -3,6 +3,13 @@ import { Alert } from "react-bootstrap";
 
 export default function Interactive() {
   return (
+    // <div class="embed-responsive embed-responsive-16by9">
+    //   <iframe
+    //     class="embed-responsive-item"
+    //     src="http://130.246.212.44/escape/"
+    //     allowfullscreen
+    //   ></iframe>
+    // </div>
     <Alert variant="warning">
       <p>You will leave ESAP GUI and be redirected to</p>
       <a
diff --git a/src/components/Rucio.js b/src/components/Rucio.js
index 6dd2613edf49f20b5644027270190debe7f9ff91..5c774b321cc77f3d06a808226f0fb9e36b5e248e 100644
--- a/src/components/Rucio.js
+++ b/src/components/Rucio.js
@@ -1,17 +1,13 @@
 import React from "react";
-import { Alert } from "react-bootstrap";
 
 export default function Rucio() {
   return (
-    <Alert variant="warning">
-      <p>You will leave ESAP GUI and be redirected to</p>
-      <a
-        target="_blank"
-        rel="noopener noreferrer"
-        href="https://escape-dios-dl.cern.ch/ui/"
-      >
-        Rucio Web UI
-      </a>
-    </Alert>
+    <div class="embed-responsive embed-responsive-16by9">
+      <iframe
+        class="embed-responsive-item"
+        src="https://escape-rucio.cern.ch"
+        allowfullscreen
+      ></iframe>
+    </div>
   );
 }
diff --git a/src/components/query/ASTRONVOResults.js b/src/components/query/ASTRONVOResults.js
index 1a5735b385b6690444b403f2acf21d0739a5773a..4afee0463dd113272be9b02b5adf32caecb8babd 100644
--- a/src/components/query/ASTRONVOResults.js
+++ b/src/components/query/ASTRONVOResults.js
@@ -5,14 +5,26 @@ import LoadingSpinner from "../LoadingSpinner";
 import Paginate from "../Paginate";
 
 export default function ASTRONVOResults({ catalog }) {
-  const { queryMap } = useContext(QueryContext);
+  const { queryMap, page, setPage } = useContext(QueryContext);
   if (!queryMap) return null;
   if (queryMap.get(catalog).status === "fetched") {
+    if (!("results" in queryMap.get(catalog).results))
+      return <Alert variant="warning">{queryMap.get(catalog).results}</Alert>;
     if (queryMap.get(catalog).results.results.length === 0)
       return <Alert variant="warning">No matching results found!</Alert>;
+
+    const numPages = queryMap.get(catalog).results.pages;
     console.log(queryMap.get(catalog).results.results);
     return (
       <>
+        <Paginate
+          getNewPage={(args) => {
+            return args.target ? setPage(parseFloat(args.target.text)) : null;
+          }}
+          currentPage={page}
+          numAdjacent={3}
+          numPages={numPages}
+        />
         <Table className="mt-3" responsive>
           <thead>
             <tr className="bg-light">
diff --git a/src/components/query/ApertifResults.js b/src/components/query/ApertifResults.js
index b360f12e6653e6da0080e96407dcd16fbfc4f24f..40d1519372eaf0bf4d0c8e5d877a01f17ea64384 100644
--- a/src/components/query/ApertifResults.js
+++ b/src/components/query/ApertifResults.js
@@ -5,14 +5,26 @@ import LoadingSpinner from "../LoadingSpinner";
 import Paginate from "../Paginate";
 
 export default function ApertifResults({ catalog }) {
-  const { queryMap } = useContext(QueryContext);
+  const { queryMap, page, setPage } = useContext(QueryContext);
   if (!queryMap) return null;
   if (queryMap.get(catalog).status === "fetched") {
+    if (!("results" in queryMap.get(catalog).results))
+      return <Alert variant="warning">{queryMap.get(catalog).results}</Alert>;
     if (queryMap.get(catalog).results.results.length === 0)
       return <Alert variant="warning">No matching results found!</Alert>;
+
+    const numPages = queryMap.get(catalog).results.pages;
     console.log("Query results:", queryMap.get(catalog).results.results);
     return (
       <>
+        <Paginate
+          getNewPage={(args) => {
+            return args.target ? setPage(parseFloat(args.target.text)) : null;
+          }}
+          currentPage={page}
+          numAdjacent={3}
+          numPages={numPages}
+        />
         <Table className="mt-3" responsive>
           <thead>
             <tr className="bg-light">
@@ -71,7 +83,6 @@ export default function ApertifResults({ catalog }) {
             })}
           </tbody>
         </Table>
-        {/* <Paginate /> */}
       </>
     );
   } else {
diff --git a/src/components/query/LOFARResults.js b/src/components/query/LOFARResults.js
new file mode 100644
index 0000000000000000000000000000000000000000..f6a7af2a5233f981095fa1e9c6b9ccb4f339f061
--- /dev/null
+++ b/src/components/query/LOFARResults.js
@@ -0,0 +1,98 @@
+import React, { useContext } from "react";
+import { Table, Alert } from "react-bootstrap";
+import { QueryContext } from "../../contexts/QueryContext";
+import LoadingSpinner from "../LoadingSpinner";
+import Paginate from "../Paginate";
+
+export default function LOFARResults({ catalog }) {
+  const { queryMap, page, setPage } = useContext(QueryContext);
+  if (!queryMap) return null;
+  if (queryMap.get(catalog).status === "fetched") {
+    if (!("results" in queryMap.get(catalog).results))
+      return <Alert variant="warning">{queryMap.get(catalog).results}</Alert>;
+    if (queryMap.get(catalog).results.results.length === 0)
+      return <Alert variant="warning">No matching results found!</Alert>;
+
+    const numPages = queryMap.get(catalog).results.pages;
+    console.log("Query results:", queryMap.get(catalog).results.results);
+    return (
+      <>
+        {/* <Paginate
+          getNewPage={(args) => {
+            return args.target ? setPage(parseFloat(args.target.text)) : null;
+          }}
+          currentPage={page}
+          numAdjacent={3}
+          numPages={numPages}
+        /> */}
+        <Table className="mt-3" responsive>
+          <thead>
+            <tr className="bg-light">
+              {/* <th>
+              <InputGroup>
+                <InputGroup.Checkbox />
+              </InputGroup>
+            </th> */}
+              <th>Project</th>
+              <th>SAS ID</th>
+              <th>Target Name</th>
+              <th>RA</th>
+              <th>Dec</th>
+              <th>Release Date</th>
+              <th>Start Time</th>
+              <th>Duration</th>
+              <th>Pipeline</th>
+              <th>Antenna Set</th>
+              <th>Instrument Filter</th>
+            </tr>
+          </thead>
+          <tbody>
+            {queryMap.get(catalog).results.results.map((result) => {
+              return (
+                <tr key={result.PID}>
+                  {/* <th>
+                  <InputGroup>
+                    <InputGroup.Checkbox />
+                  </InputGroup>
+                </th> */}
+                  <td>{result.project}</td>
+                  <td>{result.sas_id}</td>
+                  <td>{result.target}</td>
+                  <td>{Number(result.ra).toFixed(1)}</td>
+                  <td>{Number(result.dec).toFixed(1)}</td>
+                  <td>{result.releaseDate}</td>
+                  <td>{result.startTime}</td>
+                  <td>{result.duration}</td>
+                  <td>{result.pipeline}</td>
+                  <td>{result.antennaSet}</td>
+                  <td>{result.instrumentFilter}</td>
+                  {/* <td>
+                    <a
+                      href={result.url}
+                      target="_blank"
+                      rel="noopener noreferrer"
+                    >
+                      View data
+                    </a>
+                    {result.dataProductSubType === "continuumMF" ? (
+                      <a
+                        href={result.thumbnail}
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="ml-3"
+                      >
+                        Thumbnail
+                      </a>
+                    ) : null}
+                  </td> */}
+                </tr>
+              );
+            })}
+          </tbody>
+        </Table>
+      </>
+    );
+  } else {
+    return <LoadingSpinner />;
+  }
+}
diff --git a/src/components/query/QueryADEX.js b/src/components/query/QueryADEX.js
new file mode 100644
index 0000000000000000000000000000000000000000..f282ec4d7d0ce0024ece1a857ff7ceedf83d8a39
--- /dev/null
+++ b/src/components/query/QueryADEX.js
@@ -0,0 +1,152 @@
+import React, { useContext, useEffect } from "react";
+import { useParams, useHistory } from "react-router-dom";
+import axios from "axios";
+import { Container } from "react-bootstrap";
+import Form from "react-jsonschema-form";
+import { GlobalContext } from "../../contexts/GlobalContext";
+import { QueryContext } from "../../contexts/QueryContext";
+import QueryResults from "./QueryResults";
+import parseQueryForm from "../../utils/form/parseQueryForm";
+
+export default function QueryCatalogs() {
+  // queryMap is a map of dictionaries, where each dictionary consists of
+  // {"catalog": "catalogname",
+  //  "catalogquery": "querystring",
+  //  "status": "fetching|fechted",
+  //  "results": null}
+  const { queryMap, formData, setFormData, page } = useContext(QueryContext);
+  const { config, api_host, setConfigName, defaultConf } = useContext(
+    GlobalContext
+  );
+  const { uri } = useParams();
+  const history = useHistory();
+  console.log("uri:", uri);
+  console.log("default conf:", defaultConf);
+
+  // set ConfigName for archive
+  useEffect(() => {
+    switch (uri) {
+      case "adex":
+        setConfigName("adex");
+        break;
+      case "apertif":
+        setConfigName("apertif");
+        break;
+      case "zooniverse":
+        setConfigName("zooniverse");
+        break;
+      case "astron_vo":
+        setConfigName("astron_vo");
+        break;
+      case "lofar":
+        setConfigName("lofar");
+        break;
+    }
+    return () => {
+      console.log("cleaned up");
+      queryMap.clear();
+      setFormData();
+      setConfigName(uri);
+    };
+  }, [uri]);
+
+  useEffect(() => {
+    console.log(config.query_schema);
+    if (!formData) return;
+    const gui = config.query_schema.name;
+    const queries = parseQueryForm(gui, formData, page);
+
+    // Ideally query for each catalog is sent to ESAP API Gateway, and query results is returned
+    // This is under development in the backend at the moment
+    queryMap.clear();
+    queries.forEach((query) => {
+      queryMap.set(query.catalog, {
+        catalog: query.catalog,
+        esapquery: query.esapquery,
+        status: "fetching",
+        results: null,
+      });
+      const url = api_host + "query/query/?" + query.esapquery;
+      axios
+        .get(url)
+        .then((queryResponse) => {
+          queryMap.set(query.catalog, {
+            catalog: query.catalog,
+            esapquery: query.esapquery,
+            status: "fetched",
+            results: queryResponse.data,
+          });
+        })
+        .catch(() => {
+          queryMap.set(query.catalog, {
+            catalog: query.catalog,
+            esapquery: query.esapquery,
+            status: "error",
+            results: null,
+          });
+        });
+    });
+  }, [formData, page]);
+
+  function formTemplate({ TitleField, properties, title, description }) {
+    return (
+      <div>
+        <TitleField title={title} />
+        <div className="row">
+          {properties.map((prop) => (
+            <div
+              className="col-lg-2 col-md-4 col-sm-6 col-xs-12"
+              key={prop.content.key}
+            >
+              {prop.content}
+            </div>
+          ))}
+        </div>
+        {description}
+      </div>
+    );
+  }
+
+  console.log("queryMap", Array.from(queryMap.values()));
+
+  const uiSchemaProp = config.ui_schema ? { uiSchema: config.ui_schema } : {};
+  return (
+    <Container fluid>
+      <Form
+        schema={config.query_schema}
+        ObjectFieldTemplate={formTemplate}
+        formData={formData}
+        onBlur={(field, value) => {
+          if (field == "root_catalog") {
+            console.log("Change query catalog to : ", value);
+            if (value == "adex") {
+              history.push("/query");
+            } else {
+              history.push("/archives/" + value + "/query");
+            }
+          }
+        }}
+        onSubmit={({ formData }) => setFormData(formData)}
+        {...uiSchemaProp}
+      ></Form>
+      {Array.from(queryMap.keys()).map((catalog) => {
+        console.log("catalog:", catalog);
+        const details = queryMap.get(catalog);
+        console.log("Details:", details);
+        console.log("Results:", details.results);
+        let catalogName =
+          config.query_schema.properties.catalog.enumNames[
+            config.query_schema.properties.catalog.enum.findIndex(
+              (name) => name === catalog
+            )
+          ];
+        return (
+          <div key={catalog} className="mt-3">
+            <h4>Query results for {catalogName}</h4>
+            <QueryResults catalog={catalog} />
+          </div>
+        );
+      })}
+    </Container>
+  );
+}
diff --git a/src/components/query/QueryCatalogs.js b/src/components/query/QueryCatalogs.js
index 913d2aabf0450eb7cbfba1350a6b2bd375782360..44463f0997b1eecc2b92d2cd26017f81924482d7 100644
--- a/src/components/query/QueryCatalogs.js
+++ b/src/components/query/QueryCatalogs.js
@@ -1,5 +1,5 @@
 import React, { useContext, useEffect } from "react";
-import { useParams } from "react-router-dom";
+import { useParams, useHistory } from "react-router-dom";
 import axios from "axios";
 import { Container } from "react-bootstrap";
 import Form from "react-jsonschema-form";
@@ -15,9 +15,13 @@ export default function QueryCatalogs() {
   //  "status": "fetching|fechted",
   //  "results": null}
   const { queryMap, formData, setFormData, page } = useContext(QueryContext);
-  const { config, api_host, setConfigName } = useContext(GlobalContext);
+  const { config, api_host, setConfigName, defaultConf } = useContext(
+    GlobalContext
+  );
   const { uri } = useParams();
-  console.log(uri);
+  const history = useHistory();
+  console.log("uri:", uri);
+  console.log("default conf:", defaultConf);
 
   // set ConfigName for archive
   useEffect(() => {
@@ -37,12 +41,12 @@ export default function QueryCatalogs() {
       case "lofar":
         setConfigName("lofar");
         break;
-      default:
-        setConfigName("esap_ivoa");
     }
     return () => {
       console.log("cleaned up");
-      setConfigName("esap_ivoa");
+      queryMap.clear();
+      setFormData();
+      setConfigName(defaultConf);
     };
   }, [uri]);
 
diff --git a/src/components/query/QueryIVOARegistry.js b/src/components/query/QueryIVOARegistry.js
index cf1101a5d9266a9e42c8ac3a5eb7ca5e00351250..2101a32bd39775a8db821b4e08b727f6a98580de 100644
--- a/src/components/query/QueryIVOARegistry.js
+++ b/src/components/query/QueryIVOARegistry.js
@@ -17,11 +17,16 @@ export default function QueryIVOARegistry() {
   //  "catalogquery": "querystring",
   //  "status": "fetching|fechted",
   //  "results": null}
-  const { queryMap, formData, setFormData } = useContext(QueryContext);
-  const { config, api_host, setConfigName } = useContext(GlobalContext);
-  const { selectedRegistry, queryStep, setQueryStep } = useContext(IVOAContext);
+  const { queryMap, formData, setFormData, page } = useContext(QueryContext);
+  const { config, api_host, setConfigName, defaultConf } = useContext(
+    GlobalContext
+  );
+  const { selectedRegistry, queryStep, setQueryStep, regPage } = useContext(
+    IVOAContext
+  );
   const { uri } = useParams();
   console.log("uri:", uri);
+  console.log("default conf: ", defaultConf);
 
   // set ConfigName for archive
   useEffect(() => {
@@ -46,7 +51,7 @@ export default function QueryIVOARegistry() {
     }
     return () => {
       console.log("Set configuration back to default!");
-      setConfigName("esap_ivoa");
+      setConfigName(defaultConf);
     };
   }, [uri]);
 
@@ -59,16 +64,17 @@ export default function QueryIVOARegistry() {
 
     if (queryStep === "run-query") {
       selectedRegistry.forEach((access_url) => {
-        queries = [...queries, ...parseVOServiceForm(formData, access_url)];
+        queries = [
+          ...queries,
+          ...parseVOServiceForm(formData, access_url, page),
+        ];
       });
     } else {
-      queries = parseQueryForm(gui, formData);
+      queries = parseQueryForm(gui, formData, regPage);
     }
 
     console.log("queries:", queries);
 
-    // Ideally query for each catalog is sent to ESAP API Gateway, and query results is returned
-    // This is under development in the backend at the moment
     queryMap.clear();
     queries.forEach((query) => {
       queryMap.set(query.catalog, {
@@ -100,7 +106,7 @@ export default function QueryIVOARegistry() {
           });
         });
     });
-  }, [formData]);
+  }, [formData, page, regPage]);
 
   function formTemplate({ TitleField, properties, title, description }) {
     return (
@@ -132,6 +138,7 @@ export default function QueryIVOARegistry() {
       query: { "ui:widget": "textarea" },
       keyword: { "ui:widget": "hidden" },
       tap_schema: { "ui:widget": "hidden" },
+      waveband: { "ui:widget": "hidden" },
     };
     console.log("new ui schema:", uiSchemaProp);
     return (
diff --git a/src/components/query/QueryResults.js b/src/components/query/QueryResults.js
index edc9542aed74a5a35a07649a4e78e932fe3c9c94..9350c83c30aedc7977b4ebdbb74c8587a15b1016 100644
--- a/src/components/query/QueryResults.js
+++ b/src/components/query/QueryResults.js
@@ -2,7 +2,8 @@ import React from "react";
 import ApertifResults from "./ApertifResults";
 import ASTRONVOResults from "./ASTRONVOResults";
 import ZooniverseResults from "./ZooniverseResults";
-import VORegistryResults from "./VORegistryResults";
+import VORegListResults from "./VORegListResults";
+import LOFARResults from "./LOFARResults";
 
 export default function QueryResults({ catalog }) {
   switch (catalog) {
@@ -15,7 +16,9 @@ export default function QueryResults({ catalog }) {
     case "zooniverse_workflows":
       return <ZooniverseResults catalog={catalog} />;
     case "vo_reg":
-      return <VORegistryResults catalog={catalog} />;
+      return <VORegListResults catalog={catalog} />;
+    case "lofar":
+      return <LOFARResults catalog={catalog} />;
     default:
       return null;
   }
diff --git a/src/components/query/VORegistryResults.js b/src/components/query/VORegListResults.js
similarity index 89%
rename from src/components/query/VORegistryResults.js
rename to src/components/query/VORegListResults.js
index d8481c93430700d4c8ef622cc70a238703f9fa6c..ad5f3c3849f71ebb5873291dbfe4b479d8446588 100644
--- a/src/components/query/VORegistryResults.js
+++ b/src/components/query/VORegListResults.js
@@ -5,7 +5,7 @@ import LoadingSpinner from "../LoadingSpinner";
 import Paginate from "../Paginate";
 import { IVOAContext } from "../../contexts/IVOAContext";
 
-export default function VORegistryResults({ catalog }) {
+export default function VORegListResults({ catalog }) {
   const { queryMap } = useContext(QueryContext);
   const {
     selectedRegistry,
@@ -13,6 +13,8 @@ export default function VORegistryResults({ catalog }) {
     removeRegistry,
     registryList,
     setRegistryList,
+    regPage,
+    setRegPage,
   } = useContext(IVOAContext);
   // const [checkAll, setCheckAll] = useState("");
 
@@ -35,8 +37,20 @@ export default function VORegistryResults({ catalog }) {
     setRegistryList(queryMap.get(catalog).results.results);
     console.log("Registry List:", registryList);
 
+    const numPages = queryMap.get(catalog).results.pages;
+
     return (
       <>
+        <Paginate
+          getNewPage={(args) => {
+            return args.target
+              ? setRegPage(parseFloat(args.target.text))
+              : null;
+          }}
+          currentPage={regPage}
+          numAdjacent={3}
+          numPages={numPages}
+        />
         <Table className="mt-3" responsive>
           <thead>
             <tr className="bg-light">
@@ -96,7 +110,6 @@ export default function VORegistryResults({ catalog }) {
             })}
           </tbody>
         </Table>
-        {/* <Paginate /> */}
       </>
     );
   } else {
diff --git a/src/components/query/VOServiceResults.js b/src/components/query/VOServiceResults.js
index 0f9ee8c79bc649c1c5e2b91202a8dcea1c09145d..5617ff91dc7a2720e4fcce1f6c0720459fd46233 100644
--- a/src/components/query/VOServiceResults.js
+++ b/src/components/query/VOServiceResults.js
@@ -1,18 +1,36 @@
 import React, { useContext } from "react";
 import { Alert, Table } from "react-bootstrap";
 import { QueryContext } from "../../contexts/QueryContext";
+import LoadingSpinner from "../LoadingSpinner";
+import Paginate from "../Paginate";
 
 export default function VORegistryResults({ catalog }) {
-  const { queryMap } = useContext(QueryContext);
+  const { queryMap, page, setPage } = useContext(QueryContext);
 
   if (!queryMap.get(catalog)) return null;
   console.log("VO service queryMap:", queryMap.get(catalog));
+
   if (queryMap.get(catalog).status === "fetched") {
+    // if (queryMap.get(catalog).results[0].includes("ERROR"))
+    //   return (
+    //     <Alert variant="warning">{queryMap.get(catalog).results[0]}</Alert>
+    //   );
     if (queryMap.get(catalog).results.results.length === 0)
       return <Alert variant="warning">No matching results found!</Alert>;
+
+    const numPages = queryMap.get(catalog).results.pages;
+
     return (
       <div>
         <h1>Results from {catalog}</h1>
+        <Paginate
+          getNewPage={(args) => {
+            return args.target ? setPage(parseFloat(args.target.text)) : null;
+          }}
+          currentPage={page}
+          numAdjacent={3}
+          numPages={numPages}
+        />
         <Table className="mt-3" responsive>
           <thead>
             <tr className="bg-light">
@@ -35,6 +53,8 @@ export default function VORegistryResults({ catalog }) {
         </Table>
       </div>
     );
+  } else {
+    return <LoadingSpinner />;
   }
   return null;
 }
diff --git a/src/contexts/GlobalContext.js b/src/contexts/GlobalContext.js
index d8c42dcfbba472643df6364b482f3c14dfd3a148..b2471b44e9ca3fb85734436be94ea713300cfbdf 100644
--- a/src/contexts/GlobalContext.js
+++ b/src/contexts/GlobalContext.js
@@ -5,14 +5,16 @@ import getCookie from "../utils/getCookie";
 export const GlobalContext = createContext();
 
 export function GlobalContextProvider({ children }) {
+  const defaultConf = "esap_ivoa";
   console.log("ASTRON ESAP version ", Date());
   const api_host =
     process.env.NODE_ENV === "development"
-      ? "http://sdc.astron.nl:5555/esap-api/"
+      ? "http://localhost:15671/esap-api/"
       : "/esap-api/";
-
+  // "http://localhost:15671/esap-api/"
+  // "http://sdc.astron.nl:5557/esap-api/"
   const [config, setConfig] = useState();
-  const [configName, setConfigName] = useState("esap_ivoa");
+  const [configName, setConfigName] = useState(defaultConf);
 
   useEffect(() => {
     let configNameString = "";
@@ -63,6 +65,7 @@ export function GlobalContextProvider({ children }) {
         handleLogin,
         handleLogout,
         setConfigName,
+        defaultConf,
       }}
     >
       {children}
diff --git a/src/contexts/IVOAContext.js b/src/contexts/IVOAContext.js
index a5363958e05f9505b8046e3577721360e5c4b50d..6989ccdc0b4971d037bbc82f93e770a504cc8d19 100644
--- a/src/contexts/IVOAContext.js
+++ b/src/contexts/IVOAContext.js
@@ -7,6 +7,8 @@ export function IVOAContextProvider({ children }) {
   const [registryList, setRegistryList] = useState([]);
   const [selectedRegistry, setSelectedRegistry] = useState([]);
   const [queryStep, setQueryStep] = useState("get-services");
+  const [regPage, setRegPage] = useState(1);
+
   /* 
     IVOA query steps:
     1. get-services
@@ -40,6 +42,8 @@ export function IVOAContextProvider({ children }) {
         selectedRegistry,
         addRegistry: handleAddRegistry,
         removeRegistry: handleRemoveRegistry,
+        regPage,
+        setRegPage,
         registryList,
         setRegistryList,
         queryStep,
diff --git a/src/contexts/QueryContext.js b/src/contexts/QueryContext.js
index e0ad5419511ddddacc8a575a820f7ae199e5a56e..9e19d21b718af67d828509b03a48a6e673af3b1d 100644
--- a/src/contexts/QueryContext.js
+++ b/src/contexts/QueryContext.js
@@ -7,6 +7,7 @@ export function QueryContextProvider({ children }) {
   const queryMap = useMap();
   const [formData, setFormData] = useState();
   const [page, setPage] = useState(1);
+
   return (
     <QueryContext.Provider
       value={{
diff --git a/src/routes/Routes.js b/src/routes/Routes.js
index cc4098e741edcc92f1ea27b75432113034c25f56..c6bd803b3784c1e6d2d8474bb886754b9e1fd343 100644
--- a/src/routes/Routes.js
+++ b/src/routes/Routes.js
@@ -26,13 +26,18 @@ export default function Routes() {
         <Route exact path="/archives">
           <Archives />
         </Route>
-        <Route exact path="/query">
+        <Route exact path="/vo-query">
           <QueryContextProvider>
             <IVOAContextProvider>
               <QueryIVOARegistry />
             </IVOAContextProvider>
           </QueryContextProvider>
         </Route>
+        <Route exact path="/query">
+          <QueryContextProvider>
+            <QueryCatalogs />
+          </QueryContextProvider>
+        </Route>
         <Route exact path="/rucio">
           <Rucio />
         </Route>
diff --git a/src/utils/form/parseADEXForm.js b/src/utils/form/parseADEXForm.js
index 351fabef237b4d6f60208855092efa1e64e4060b..75f134d0e1ae7407460128178484854c52e4ae1d 100644
--- a/src/utils/form/parseADEXForm.js
+++ b/src/utils/form/parseADEXForm.js
@@ -1,5 +1,5 @@
-export default function ParseADEXForm(formData) {
-  let catalogs = ["apertif", "astron_vo"];
+export default function ParseADEXForm(formData, page) {
+  let catalogs = ["apertif", "astron_vo", "lofar"];
   let queries = [];
   // queries is an array of dictionaries, where each dictionary consists of
   // {"catalog": "catalogname",
@@ -20,10 +20,14 @@ export default function ParseADEXForm(formData) {
   //  "status": "null|fetching|fetched",
   //  "results": null}
   let catalog = formInput.find(([key]) => key === "catalog")[1];
-  if (catalog === "all") {
+  if (catalog === "adex") {
     console.log("Catalogs:", catalogs);
     catalogs.map((catalog) => {
-      let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
+      let esapquery =
+        query +
+        `${`${query}` ? "&" : ""}archive_uri=` +
+        catalog +
+        "&page_size=20";
 
       queries.push({
         catalog: catalog,
@@ -32,7 +36,11 @@ export default function ParseADEXForm(formData) {
       return null;
     });
   } else {
-    let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
+    let esapquery =
+      query +
+      `${`${query}` ? "&" : ""}archive_uri=` +
+      catalog +
+      `&page_size=30&page=${page}`;
 
     queries.push({
       catalog: catalog,
diff --git a/src/utils/form/parseASTRONVOForm.js b/src/utils/form/parseASTRONVOForm.js
index 9162c828a9635cabe750e5dbbcccfd933dc8ea4c..a98868e37007451b814479164372d451c8509b74 100644
--- a/src/utils/form/parseASTRONVOForm.js
+++ b/src/utils/form/parseASTRONVOForm.js
@@ -1,4 +1,4 @@
-export default function ParseASTRONVOForm(formData) {
+export default function ParseASTRONVOForm(formData, page) {
   let queries = [];
   // queries is an array of dictionaries, where each dictionary consists of
   // {"catalog": "catalogname",
@@ -19,7 +19,9 @@ export default function ParseASTRONVOForm(formData) {
   //  "status": "null|fetching|fetched",
   //  "results": null}
   let catalog = formInput.find(([key]) => key === "catalog")[1];
-  let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
+  let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog; //+ `&page=${page}`
+  // testing api with page=1, failing at the backend at the moment
+  page == 1 ? console.log("Page number is 1") : (esapquery += `&page=${page}`);
   queries.push({
     catalog: catalog,
     esapquery: esapquery,
diff --git a/src/utils/form/parseApertifForm.js b/src/utils/form/parseApertifForm.js
index 4a764050acb24deea951cb6778e8e023e62364c6..6aab904362942e15d814bdf12d9ca3f12d7b244e 100644
--- a/src/utils/form/parseApertifForm.js
+++ b/src/utils/form/parseApertifForm.js
@@ -1,4 +1,4 @@
-export default function ParseApertifForm(formData) {
+export default function ParseApertifForm(formData, page) {
   let queries = [];
   // queries is an array of dictionaries, where each dictionary consists of
   // {"catalog": "catalogname",
@@ -19,7 +19,8 @@ export default function ParseApertifForm(formData) {
   //  "status": "null|fetching|fetched",
   //  "results": null}
   let catalog = formInput.find(([key]) => key === "catalog")[1];
-  let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
+  let esapquery =
+    query + `${`${query}` ? "&" : ""}archive_uri=` + catalog + `&page=${page}`;
   queries.push({
     catalog: catalog,
     esapquery: esapquery,
diff --git a/src/utils/form/parseIVOAForm.js b/src/utils/form/parseIVOAForm.js
index e518ff0ccaf91f1b5730b7f98bdc8fe9df92bef7..2b3fadcf898d051b1ed7b733e549fd25e049fe1b 100644
--- a/src/utils/form/parseIVOAForm.js
+++ b/src/utils/form/parseIVOAForm.js
@@ -1,4 +1,4 @@
-export default function ParseIVOAForm(formData) {
+export default function ParseIVOAForm(formData, page) {
   let queries = [];
   // queries is an array of dictionaries, where each dictionary consists of
   // {"catalog": "catalogname",
@@ -25,7 +25,11 @@ export default function ParseIVOAForm(formData) {
   let service_type = formInput.find(([key]) => key === "service_type")[1];
 
   let esapquery =
-    "get-services/?" + query + `${`${query}` ? "&" : ""}dataset_uri=` + catalog;
+    "get-services/?" +
+    query +
+    `${`${query}` ? "&" : ""}dataset_uri=` +
+    catalog +
+    `&page=${page}`;
 
   queries.push({
     catalog: catalog,
diff --git a/src/utils/form/parseLOFARForm.js b/src/utils/form/parseLOFARForm.js
index badc2b8512cc5c64457384b6e23c3b435f4eb1d8..8f8ff91cf9c6cd1e297449c00b2e41702ed20a51 100644
--- a/src/utils/form/parseLOFARForm.js
+++ b/src/utils/form/parseLOFARForm.js
@@ -1,4 +1,4 @@
-export default function ParseLOFARForm(formData) {
+export default function ParseLOFARForm(formData, page) {
   let queries = [];
   // queries is an array of dictionaries, where each dictionary consists of
   // {"catalog": "catalogname",
@@ -19,7 +19,8 @@ export default function ParseLOFARForm(formData) {
   //  "status": "null|fetching|fetched",
   //  "results": null}
   let catalog = formInput.find(([key]) => key === "catalog")[1];
-  let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
+  let esapquery =
+    query + `${`${query}` ? "&" : ""}archive_uri=` + catalog + `&page=${page}`;
   queries.push({
     catalog: catalog,
     esapquery: esapquery,
diff --git a/src/utils/form/parseQueryForm.js b/src/utils/form/parseQueryForm.js
index ecf4e15093d67ab8c6142f82e434ee406d4128d9..08c3162b9737e8e0a72772702312f88c60d0951b 100644
--- a/src/utils/form/parseQueryForm.js
+++ b/src/utils/form/parseQueryForm.js
@@ -8,17 +8,17 @@ import parseASTRONVOForm from "./parseASTRONVOForm";
 export default function parseQueryForm(gui, formData, page) {
   switch (gui) {
     case "adex":
-      return parseADEXForm(formData);
+      return parseADEXForm(formData, page);
     case "zooniverse":
       return parseZooniverseForm(formData, page);
     case "lofar":
-      return parseLOFARForm(formData);
+      return parseLOFARForm(formData, page);
     case "apertif":
-      return parseApertifForm(formData);
+      return parseApertifForm(formData, page);
     case "astron_vo":
-      return parseASTRONVOForm(formData);
+      return parseASTRONVOForm(formData, page);
     case "ivoa":
-      return parseIVOAForm(formData);
+      return parseIVOAForm(formData, page);
     default:
       return null;
   }
diff --git a/src/utils/form/parseVOServiceForm.js b/src/utils/form/parseVOServiceForm.js
index c42aec9a71378c01d5b44ba9d9e675ff0b09abf9..9b308fc6dc12d528ba23fe406ceff6ae0ee92122 100644
--- a/src/utils/form/parseVOServiceForm.js
+++ b/src/utils/form/parseVOServiceForm.js
@@ -1,4 +1,4 @@
-export default function ParseVOServiceForm(formData, access_url) {
+export default function ParseVOServiceForm(formData, access_url, page) {
   let queries = [];
   // queries is an array of dictionaries, where each dictionary consists of
   // {"catalog": "catalogname",
@@ -29,7 +29,11 @@ export default function ParseVOServiceForm(formData, access_url) {
   let service_type = formInput.find(([key]) => key === "service_type")[1];
 
   let esapquery =
-    "query/?" + query + `${`${query}` ? "&" : ""}dataset_uri=` + catalog;
+    "query/?" +
+    query +
+    `${`${query}` ? "&" : ""}dataset_uri=` +
+    catalog +
+    `&page=${page}`;
 
   queries.push({
     catalog: access_url,