diff --git a/moondb.py b/moondb.py
index b9b3c941c60a9c49e84afafb6f602db69e77648d..ec904f2e173f8fb118a4bc52793d2018f0379946 100755
--- a/moondb.py
+++ b/moondb.py
@@ -1,60 +1,221 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 
-# Alessandro Frigeri 2019 
+# (c) 2019 Alessandro Frigeri, Istituto Nazionale di Astrofisica
 # 
 # MoonDB Python module
 # https://realpython.com/api-integration-in-python/
 
 import requests
 import json 
+import urllib.parse
+from collections import namedtuple
 
-def _url(path):
-   return "http://api.moondb.org" + path
+class Mission:
+   def __init__(self,name):
+      self.name = name
+   def __str__(self):
+      return self.name
 
-def get_specimen():
-   pass
+class Landmark:
+   def __init__(self,name):
+      self.name = name
 
-def get_specimentype():
-   pass
+class Specimen:
+   def __init__(self):
+       self.specimenCode = ""
+       self.specimenName = ""
+       self.parentSpecimen = ""
+       self.childSpecimens = ""
+       self.specimenType = ""
+       self.samplingTechnique = ""
+       self.mission = ""
+       self.landmark = ""
+       self.lunarStation = ""
+       self.returnContainer = ""
+       self.weight = ""
+       self.pristinity = ""
+       self.pristinityDate = ""
+       self.description = ""
+   def say_hello(self):
+      print('Hello Moon!')
+   def __str__(self):
+      return self.specimenName
+   def __repr__(self):
+      return self.specimenName
 
-def get_mission():
-   pass
+class SpecimenType:
+   def __init__(self,name):
+      self.name = name
+   def __str__(self):
+      return self.name
+   def __repr__(self):
+      return self.name
+
+class SamplingTechnique:
+   def __init__(self,name):
+      self.name = name
+   def __str__(self):
+      return self.name
+   def __repr__(self):
+      return self.name
+
+class AnalyzedMaterial:
+   def __init__(self,name):
+      self.name = name
+   def __str__(self):
+      return self.name
+   def __repr__(self):
+      return self.name
+
+class Analyte:
+   def __init__(self,name):
+      self.name = name
+   def __str__(self):
+      return self.name
+   def __repr__(self):
+      return self.name
+
+class AnalysisMethod:
+   def __init__(self,code,name):
+      self.name = name
+      self.code = code
+   def __str__(self):
+      return self.name
+   def __repr__(self):
+      return self.name
+
+
+
+class AnalyisMethod:
+   def __init__(self,name):
+      self.name = name
+
+
+
+def _url(path):
+   print(urllib.parse.quote(path))
+   return "http://api.moondb.org" + urllib.parse.quote(path)
 
 def _check_resp(resp):
    if resp.status_code != 200:
       #raise ApiError('Cannot fetch all objects: {}'.format(resp.status_code))
       pass
 
+def _get_resp(path):
+   resp = requests.get(_url( path ))
+   _check_resp(resp)
+   r = resp.json()
+   # To be checked with Peng
+   if 'results' in r:
+      return r['results']
+   if 'result' in r:
+      return r['result']
+
+def get_specimen(sc=None,mn=None,ln=None,sty=None,ste=None):
+   '''
+   Get specimen by:
+   - specimen code - sc
+   - mission name - mn
+   - landmark name - ln
+   - speciment type - sty
+   - sampling technique - ste
+   '''
+   sp_list = []
+   if sc:
+      for s in sc: 
+         spec = _get_resp('/specimen/'+s) 
+         sp_list.extend(spec)
+   if mn:
+      for n in mn:
+         spec = _get_resp('/specimenlist/mission/'+n) 
+         sp_list.extend(spec)
+
+   if ln:
+      for n in ln:
+         spec = _get_resp('/specimenlist/mission/'+n) 
+         sp_list.extend(spec)
+
+   if sty:
+      for st in sty:
+         spec = _get_resp('/specimenlist/mission/'+st) 
+         sp_list.extend(spec)
+
+   if ste:
+      for st in ste:
+         spec = _get_resp('/specimenlist/mission/'+st) 
+         sp_list.extend(spec)
+
+   from collections import namedtuple
+   
+   sp_obj_list = []
+
+   for s in sp_list:
+      s_obj = namedtuple("Specimen", s.keys())(*s.values())
+      sp_obj_list.append(s_obj)
+
+   return sp_obj_list
+
+
+
+
+
+
 def _json_object_hook(d): 
    return namedtuple('X', d.keys())(*d.values())
 
 def json2obj(data): 
    return json.loads(data, object_hook=_json_object_hook)
 
-def get_analytes():
-   analytes = []
-   resp = requests.get(_url('/cv/analytes/'))
-   _check_resp(resp)
-   for m_item in resp.json()['result']:
-      analytes.append( Analyte(m_item['name'] ))
-   return analytes
+
 
 def get_missions():
    missions = []
    resp = requests.get(_url('/authorities/missions/'))
    _check_resp(resp)
-   print resp.json()['result']
-   for m_item in resp.json()['result']:
+   for m_item in resp.json()['results']:
       missions.append( Mission(m_item['name'] ))
-      print(m_item)
-      #this_m = json.load( "{'name': 'Apollo 11'}" )
    return missions
 
-def get_missions2():
-   resp = requests.get(_url('/authorities/missions/'))
-   #m2 = json.loads(resp)
-   print(resp)
-   return resp.json()['result']   
+## Controlled Vocabularies
+
+def get_specimentypes():
+   st_list = []
+   st = _get_resp('/cv/specimentypes') 
+   for s in st:
+      stobj = SpecimenType(s['name'])
+      st_list.append(stobj)
+   return st_list
+
+def get_samplingtechniques():
+   st_list = []
+   st = _get_resp('/cv/samplingtechniques') 
+   for s in st:
+      stobj = SamplingTechnique(s['name'])
+      st_list.append(stobj)
+   return st_list
+
+def get_analyzedmaterials():
+   st_list = []
+   st = _get_resp('/cv/analyzedmaterials') 
+   for s in st:
+      stobj = AnalyzedMaterial(s['name'])
+      st_list.append(stobj)
+   return st_list
+
+def get_analytes():
+   analytes = []
+   an = _get_resp('/cv/analyzedmaterials') 
+   for a in an:
+      analytes.append( Analyte(m_item['name'] ))
+   return analytes
+
+def get_analysismethods():
+   am_list = []
+   am = _get_resp('/cv/analysismethods') 
+   for a in am:
+      aobj = AnalysisMethod(s['name'])
+      am_list.append(aobj)
+   return am_list
 
 def get_landmark():
    pass
@@ -73,11 +234,9 @@ class Filter:
       self.analyte = []
       self.analysisMethod = []
    def _toJSON(self):
-      #indent=4
       return json.dumps(self, default=lambda o: o.__dict__,sort_keys=True,separators=(",", ":"))
+
    def get_results(self):
-      #print self._toJSON()
-      #print _url('/data/'+self._toJSON() )
       resp = requests.get(_url('/data/'+self._toJSON() ))
       res_list = []
       
@@ -85,51 +244,41 @@ class Filter:
          rd = dict(r)
          res_list.append(rd) 
       return res_list
-      
-class Mission:
-   def __init__(self,name):
-      self.name = name
-
-class Specimen:
-   def __init__(self):
-       self.specimenCode = ""
-       self.specimenName = ""
-       self.parentSpecimen = ""
-       self.childSpecimens = ""
-       self.specimenType = ""
-       #self.samplingTechnique":null,"mission":"Apollo 12","landmark":null,"lunarStation":null,"returnContainer":null,"weight":null,"pristinity":null,"pristinityDate":null,"description":null}
-    
-
-class AnalysisMethos:
-   def __init__(self,code,name):
-      self.name = name
-      self.code = code
-
-class Analyte:
-   def __init__(self,name):
-      self.name = name
-
 
 
 if __name__ == "__main__":
    m = get_missions()
-   print m
    f = Filter()
    f.specimenType = ["SOIL"]
    f.analyte = ["H2O","Ti"]
    f.mission = ["Apollo 11"]
-   print 80*"#"
+   print(80*"#")
    #print f.toJSON()
    results = f.get_results()
    for r in results:
-       print r
-       print "********"
        this_res = r['dataResults'][0]
-       print this_res
        var = this_res['variable']
        val = this_res['value']
        unit = this_res['unit']
-       print var,": ",val,unit
+       print(var,": ",val,unit)
+
+   s = get_specimen(mn=['Apollo 12','Apollo 11'])
+   print(len(s))
+   s1 = s[0]
+
+   m = get_missions()
+   ml = []
+   for mn in m:
+      ml.append(mn.name)
+   s = get_specimen(mn=ml)
+   print(len(s))
+   s1 = s[0]
+   #s1.say_hello()
+   #print(type(s1))
+   #for sp in s:
+   #   print(sp['specimenName'])
+   #sp_types = get_specimentypes()
+   #print(sp_types)
 
 
 
diff --git a/notebooks/print.prt b/notebooks/print.prt
deleted file mode 100644
index 6f44f72c055a2bb9008d844d57d152a7de298571..0000000000000000000000000000000000000000
--- a/notebooks/print.prt
+++ /dev/null
@@ -1,60 +0,0 @@
-Object = cam2map
-  IsisVersion       = "3.6.2  | 2-28-2019"
-  ProgramVersion    = 2016-06-29
-  ProgramPath       = /Users/alf/miniconda2/envs/isis3/bin
-  ExecutionDateTime = 2019-04-17T15:14:19
-  HostName          = Unknown
-  UserName          = alf
-  Description       = "Convert camera image to a map projection"
-
-  Group = UserParameters
-    MAP           = $base/templates/maps/sinusoidal.map
-    MATCHMAP      = false
-    PIXRES        = CAMERA
-    DEFAULTRANGE  = MINIMIZE
-    LONSEAM       = AUTO
-    INTERP        = CUBICCONVOLUTION
-    WARPALGORITHM = AUTOMATIC
-  End_Group
-
-  Group = Error
-    Program = cam2map
-    Class   = "USER ERROR"
-    Code    = 2
-    Message = "Parameter [FROM] must be entered"
-    File    = IsisAml.cpp
-    Line    = 2867
-  End_Group
-End_Object
-
-
-Object = cam2map
-  IsisVersion       = "3.6.2  | 2-28-2019"
-  ProgramVersion    = 2016-06-29
-  ProgramPath       = /Users/alf/miniconda2/envs/isis3/bin
-  ExecutionDateTime = 2019-04-17T15:17:02
-  HostName          = Unknown
-  UserName          = alf
-  Description       = "Convert camera image to a map projection"
-
-  Group = UserParameters
-    MAP           = $base/templates/maps/sinusoidal.map
-    MATCHMAP      = false
-    PIXRES        = CAMERA
-    DEFAULTRANGE  = MINIMIZE
-    LONSEAM       = AUTO
-    INTERP        = CUBICCONVOLUTION
-    WARPALGORITHM = AUTOMATIC
-  End_Group
-
-  Group = Error
-    Program = cam2map
-    Class   = "USER ERROR"
-    Code    = 2
-    Message = "Parameter [FROM] must be entered"
-    File    = IsisAml.cpp
-    Line    = 2867
-  End_Group
-End_Object
-
-