diff --git a/ippisite/ippidb/tests.py b/ippisite/ippidb/tests.py
index 99a7153907df1dda3466970230b8e84b23a926bb..95dffa7b60aa971324fa30bb6bc1725fb082a875 100644
--- a/ippisite/ippidb/tests.py
+++ b/ippisite/ippidb/tests.py
@@ -404,3 +404,42 @@ class TestGetPDBUniProtMapping(TestCase):
 
     def test_entry_not_found(self):
         self.assertRaises(ws.EntryNotFoundError, ws.get_pdb_uniprot_mapping, 'Xu85')
+
+
+class TestConvertIUPACToSMILESAndMore(TestCase):
+    """
+    Test converting a IUPAC to smiles and inchi with opsin web service
+    """
+
+    def test_valid(self):
+        pairs = [
+            (
+                '2,4,6-trinitrotoluene',
+                {
+                    "inchi": "InChI=1/C7H5N3O6/c1-4-6(9(13)14)2-5(8(11)12)3-7(4)10(15)16/h2-3H,1H3",
+                    "stdinchi": "InChI=1S/C7H5N3O6/c1-4-6(9(13)14)2-5(8(11)12)3-7(4)10(15)16/h2-3H,1H3",
+                    "stdinchikey": "SPSSULHKWOKEEL-UHFFFAOYSA-N",
+                    "smiles": "[N+](=O)([O-])C1=C(C)C(=CC(=C1)[N+](=O)[O-])[N+](=O)[O-]",
+                }
+            ),
+            (
+                '3-{1-oxo-6-[4-(piperidin-4-yl)butanamido]-2,3-dihydro-1H-isoindol-2-yl}propanoic acid',
+                {
+                    "inchi": "InChI=1/C20H27N3O4/c24-18(3-1-2-14-6-9-21-10-7-14)22-16-5-4-15-13-23(11-8-19(25)26)20(27)17(15)12-16/h4-5,12,14,21H,1-3,6-11,13H2,(H,22,24)(H,25,26)/f/h22,25H",
+                    "stdinchi": "InChI=1S/C20H27N3O4/c24-18(3-1-2-14-6-9-21-10-7-14)22-16-5-4-15-13-23(11-8-19(25)26)20(27)17(15)12-16/h4-5,12,14,21H,1-3,6-11,13H2,(H,22,24)(H,25,26)",
+                    "stdinchikey": "HWRXVANHVCXVHA-UHFFFAOYSA-N",
+                    "smiles": "O=C1N(CC2=CC=C(C=C12)NC(CCCC1CCNCC1)=O)CCC(=O)O"
+                }
+
+            )
+        ]
+        for iupac, dict_expected in pairs:
+            dict_returned = ws.convert_iupac_to_smiles_and_inchi(iupac)
+            self.assertEqual(dict_expected, dict_returned)
+            self.assertEqual(dict_expected["smiles"], ws.convert_iupac_to_smiles(iupac))
+
+
+    def test_invalide_entry(self):
+        self.assertRaises(ws.EntryNotFoundError, ws.convert_iupac_to_smiles_and_inchi, '3-{1-oxo-6-[4-(piperid')
+        self.assertRaises(ws.EntryNotFoundError, ws.convert_iupac_to_smiles_and_inchi, None)
+
diff --git a/ippisite/ippidb/ws.py b/ippisite/ippidb/ws.py
index f982fa6e6a149c598644936d0cf2324b579c1810..8448e7c2c72d54a25aa48a916bc8b406a236c5c3 100644
--- a/ippisite/ippidb/ws.py
+++ b/ippisite/ippidb/ws.py
@@ -4,6 +4,7 @@ iPPI-DB web-service client utility functions
 
 import json
 import xml.etree.ElementTree as ET
+from urllib import parse as urllib_parse
 
 import requests
 from bioservices.eutils import EUtils
@@ -363,3 +364,20 @@ def pdb_entry_exists(pdb_id):
         return False
     else:
         return True
+
+
+def convert_iupac_to_smiles(iupac):
+    return convert_iupac_to_smiles_and_inchi(iupac)["smiles"]
+
+
+def convert_iupac_to_smiles_and_inchi(iupac):
+    if iupac is None:
+        raise EntryNotFoundError(iupac, 422)
+    resp = requests.get(
+        'https://opsin.ch.cam.ac.uk/opsin/{}'.format(urllib_parse.quote(iupac, safe='')))
+    if resp.status_code != 200:
+        raise EntryNotFoundError(iupac, resp.status_code)
+    ret = resp.json()
+    ret.pop("cml")
+    ret.pop("message")
+    return ret