diff --git a/.gitignore b/.gitignore
index a44e0f5e09d5e800601f266a85244d3d3b530711..72c9e73f1f170fe9163385cc9b354d8fe3f641f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,5 +25,9 @@ ubuntu-bionic-18.04-cloudimg-console.log
 /docs/build/
 /docs/source/apidoc/
 
+# Notes
+/data/
+/notes/
+
 # Experimental
 /applications/connectors/
diff --git a/datasources/connectors/hypercat.py b/datasources/connectors/hypercat.py
index ba37216c9a8001220340995e9c916bd9a03b2e88..8616c0ff014bc703eed8eef38f2be75095f7dc95 100644
--- a/datasources/connectors/hypercat.py
+++ b/datasources/connectors/hypercat.py
@@ -86,12 +86,38 @@ class HyperCat(DataConnectorContainsDatasets, DataConnectorHasMetadata, BaseData
         return matches[0]
 
     def _get_response(self, query_params: typing.Optional[typing.Mapping[str, str]] = None):
-        r = requests.get(self.location, params=query_params)
+        # r = requests.get(self.location, params=query_params)
+        r = self._get_auth_request(self.location,
+                                   query_params=query_params)
         return r.json()
 
+    def _get_auth_request(self, url, **kwargs):
+        return requests.get(url,
+                            auth=requests.auth.HTTPBasicAuth(self.api_key, ''),
+                            **kwargs)
+
     def __enter__(self):
         self._response = self._get_response()
         return self
 
     def __exit__(self, exc_type, exc_val, exc_tb):
         pass
+
+
+class HyperCatCisco(HyperCat):
+    def __init__(self, location: str,
+                 api_key: typing.Optional[str] = None,
+                 entity_url: str = None):
+        super().__init__(location, api_key=api_key)
+
+        self.entity_url = entity_url
+
+    def get_entities(self):
+        r = self._get_auth_request(self.entity_url)
+        return r.json()
+
+    def _get_auth_request(self, url, **kwargs):
+        return requests.get(url,
+                            # Doesn't accept HttpBasicAuth
+                            headers={'Authorization': self.api_key},
+                            **kwargs)
diff --git a/datasources/tests/test_connectors.py b/datasources/tests/test_connectors.py
index 94538279495cb40b4afe98c1267c02ee42046b9b..b3e09fb8f042368587b2e84d225cd7aa14a2f562 100644
--- a/datasources/tests/test_connectors.py
+++ b/datasources/tests/test_connectors.py
@@ -136,3 +136,75 @@ class ConnectorHyperCatTest(TestCase):
 
         self.assertIsInstance(result, str)
         self.assertGreaterEqual(len(result), 1)
+
+
+class ConnectorHyperCatCiscoTest(TestCase):
+    url = 'https://api.cityverve.org.uk/v1/cat'
+    entity_url = 'https://api.cityverve.org.uk/v1/entity'
+
+    dataset = 'weather-observations-wind'
+
+    def setUp(self):
+        from decouple import config
+
+        BaseDataConnector.load_plugins('datasources/connectors')
+        self.plugin = BaseDataConnector.get_plugin('HyperCatCisco')
+
+        self.api_key = config('HYPERCAT_CISCO_API_KEY')
+
+    def test_get_plugin(self):
+        self.assertIsNotNone(self.plugin)
+
+    def test_plugin_init(self):
+        connection = self.plugin(self.url)
+        self.assertEqual(connection.location, self.url)
+
+    def test_plugin_get_entities(self):
+        connection = self.plugin(self.url,
+                                 api_key=self.api_key,
+                                 entity_url=self.entity_url)
+        result = connection.get_entities()
+
+        self.assertGreaterEqual(len(result), 1)
+
+        for entity in result:
+            self.assertIn('id', entity)
+            self.assertIn('uri', entity)
+
+    def test_plugin_get_catalogue_metadata(self):
+        connection = self.plugin(self.url)
+        result = connection.get_metadata()
+
+        self.assertIn('application/vnd.hypercat.catalogue+json',
+                      result['urn:X-hypercat:rels:isContentType'])
+
+        self.assertIn('CityVerve',
+                      result['urn:X-hypercat:rels:hasDescription:en'][0])
+
+        self.assertEqual('https://developer.cityverve.org.uk',
+                         result['urn:X-hypercat:rels:hasHomepage'])
+
+    def test_plugin_get_dataset_metadata(self):
+        connection = self.plugin(self.url)
+        result = connection.get_metadata(dataset=self.dataset)
+
+        for property in [
+            'urn:X-bt:rels:feedTitle',
+            'urn:X-hypercat:rels:hasDescription:en',
+            'urn:X-bt:rels:feedTag',
+            'urn:X-bt:rels:hasSensorStream',
+            'urn:X-hypercat:rels:isContentType',
+        ]:
+            self.assertIn(property, result)
+
+        self.assertIn('Met Office',
+                      result['urn:X-bt:rels:feedTitle'][0])
+
+        self.assertIn('Met Office',
+                      result['urn:X-hypercat:rels:hasDescription:en'][0])
+
+        self.assertEqual(len(result['urn:X-bt:rels:feedTag']), 1)
+        self.assertEqual(result['urn:X-bt:rels:feedTag'][0], 'weather')
+
+        self.assertGreaterEqual(len(result['urn:X-bt:rels:hasSensorStream']), 1)
+