diff --git a/src/cmislib/model.py b/src/cmislib/model.py
index 51b1dc5..6a6d3a4 100644
--- a/src/cmislib/model.py
+++ b/src/cmislib/model.py
@@ -353,7 +353,7 @@
         This method will re-fetch the repository's XML data from the CMIS
         repository.
         """
-        self.xmlDoc = self._cmisClient.get(self._cmisClient.repositoryUrl)
+        self.xmlDoc = self._cmisClient.get(self._cmisClient.repositoryUrl.encode('utf-8'))
         self._initData()
 
     def _initData(self):
@@ -688,7 +688,7 @@
         if typeId:
             targetType = self.getTypeDefinition(typeId)
             childrenUrl = targetType.getLink(DOWN_REL, ATOM_XML_FEED_TYPE_P)
-            typesXmlDoc = self._cmisClient.get(childrenUrl)
+            typesXmlDoc = self._cmisClient.get(childrenUrl.encode('utf-8'))
             entryElements = typesXmlDoc.getElementsByTagNameNS(ATOM_NS, 'entry')
             types = []
             for entryElement in entryElements:
@@ -759,7 +759,7 @@
         if not descendUrl:
             raise NotSupportedException("Could not determine the type descendants URL")
 
-        typesXmlDoc = self._cmisClient.get(descendUrl, **kwargs)
+        typesXmlDoc = self._cmisClient.get(descendUrl.encode('utf-8'), **kwargs)
         entryElements = typesXmlDoc.getElementsByTagNameNS(ATOM_NS, 'entry')
         types = []
         for entryElement in entryElements:
@@ -956,7 +956,7 @@
         byObjectPathUrl = multiple_replace(params, template)
 
         # do a GET against the URL
-        result = self._cmisClient.get(byObjectPathUrl, **addOptions)
+        result = self._cmisClient.get(byObjectPathUrl.encode('utf-8'), **addOptions)
         if type(result) == HTTPError:
             raise CmisException(result.code)
 
@@ -1021,7 +1021,7 @@
 
         # do the POST
         #print 'posting:%s' % xmlDoc.toxml(encoding='utf-8')
-        result = self._cmisClient.post(queryUrl,
+        result = self._cmisClient.post(queryUrl.encode('utf-8'),
                                        xmlDoc.toxml(encoding='utf-8'),
                                        CMIS_QUERY_TYPE)
         if type(result) == HTTPError:
@@ -1082,7 +1082,7 @@
             raise NotSupportedException(messages.NO_CHANGE_LOG_SUPPORT)
 
         changesUrl = self.getLink(CHANGE_LOG_REL)
-        result = self._cmisClient.get(changesUrl, **kwargs)
+        result = self._cmisClient.get(changesUrl.encode('utf-8'), **kwargs)
         if type(result) == HTTPError:
             raise CmisException(result.code)
 
@@ -1278,7 +1278,7 @@
         elif collectionType == TYPES_COLL:
             return self.getTypeDefinitions()
 
-        result = self._cmisClient.get(self.getCollectionLink(collectionType), **kwargs)
+        result = self._cmisClient.get(self.getCollectionLink(collectionType).encode('utf-8'), **kwargs)
         if (type(result) == HTTPError):
             raise CmisException(result.code)
 
@@ -1391,7 +1391,7 @@
         '''
         link = self._getLink(rel)
         if link:
-            result = self._cmisClient.get(link)
+            result = self._cmisClient.get(link.encode('utf-8'))
             if (type(result) == HTTPError):
                 raise CmisException(result.code)
 
@@ -1652,7 +1652,7 @@
         # fill in the template
         byObjectIdUrl = multiple_replace(params, template)
 
-        self.xmlDoc = self._cmisClient.get(byObjectIdUrl, **addOptions)
+        self.xmlDoc = self._cmisClient.get(byObjectIdUrl.encode('utf-8'), **addOptions)
         self._initData()
 
         # if a returnVersion arg was passed in, it is possible we got back
@@ -1708,7 +1708,7 @@
             raise NotSupportedException('Root folder does not support getObjectParents')
 
         # invoke the URL
-        result = self._cmisClient.get(parentUrl)
+        result = self._cmisClient.get(parentUrl.encode('utf-8'))
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -1861,7 +1861,7 @@
         xmlEntryDoc = self._getEntryXmlDoc(properties)
 
         # do a PUT of the entry
-        updatedXmlDoc = self._cmisClient.put(selfUrl,
+        updatedXmlDoc = self._cmisClient.put(selfUrl.encode('utf-8'),
                                              xmlEntryDoc.toxml(encoding='utf-8'),
                                              ATOM_XML_TYPE)
 
@@ -1906,7 +1906,7 @@
         """
 
         url = self._getSelfLink()
-        result = self._cmisClient.delete(url, **kwargs)
+        result = self._cmisClient.delete(url.encode('utf-8'), **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -1950,7 +1950,7 @@
         url = self._getLink(RELATIONSHIPS_REL)
         assert url != None, 'Could not determine relationships URL'
 
-        result = self._cmisClient.post(url,
+        result = self._cmisClient.post(url.encode('utf-8'),
                                        xmlDoc.toxml(encoding='utf-8'),
                                        ATOM_XML_TYPE)
 
@@ -1990,7 +1990,7 @@
         url = self._getLink(RELATIONSHIPS_REL)
         assert url != None, 'Could not determine relationships URL'
 
-        result = self._cmisClient.get(url, **kwargs)
+        result = self._cmisClient.get(url.encode('utf-8'), **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -2044,7 +2044,7 @@
             # if the ACL capability is discover or manage, this must be
             # supported
             aclUrl = self._getLink(ACL_REL)
-            result = self._cmisClient.get(aclUrl)
+            result = self._cmisClient.get(aclUrl.encode('utf-8'))
             if type(result) == HTTPError:
                 raise CmisException(result.code)
             return ACL(xmlDoc=result)
@@ -2075,7 +2075,7 @@
                 raise CmisException('The ACL to apply must be an instance of the ACL class.')
             aclUrl = self._getLink(ACL_REL)
             assert aclUrl, "Could not determine the object's ACL URL."
-            result = self._cmisClient.put(aclUrl, acl.getXmlDoc().toxml(encoding='utf-8'), CMIS_ACL_TYPE)
+            result = self._cmisClient.put(aclUrl.encode('utf-8'), acl.getXmlDoc().toxml(encoding='utf-8'), CMIS_ACL_TYPE)
             if type(result) == HTTPError:
                 raise CmisException(result.code)
             return ACL(xmlDoc=result)
@@ -2325,7 +2325,7 @@
         entryXmlDoc = self._getEntryXmlDoc(properties)
 
         # post it to to the checkedout collection URL
-        result = self._cmisClient.post(checkoutUrl,
+        result = self._cmisClient.post(checkoutUrl.encode('utf-8'),
                                        entryXmlDoc.toxml(encoding='utf-8'),
                                        ATOM_XML_ENTRY_TYPE)
 
@@ -2449,7 +2449,7 @@
         # Get the self link
         # Do a PUT of the empty ATOM to the self link
         url = self._getSelfLink()
-        result = self._cmisClient.put(url, entryXmlDoc.toxml(encoding='utf-8'), ATOM_XML_TYPE, **kwargs)
+        result = self._cmisClient.put(url.encode('utf-8'), entryXmlDoc.toxml(encoding='utf-8'), ATOM_XML_TYPE, **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -2522,7 +2522,7 @@
         versionsUrl = self._getLink(VERSION_HISTORY_REL)
 
         # invoke the URL
-        result = self._cmisClient.get(versionsUrl, **kwargs)
+        result = self._cmisClient.get(versionsUrl.encode('utf-8'), **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -2562,7 +2562,7 @@
             srcUrl = contentElements[0].attributes['src'].value
 
             # the cmis client class parses non-error responses
-            result = Rest().get(srcUrl,
+            result = Rest().get(srcUrl.encode('utf-8'),
                                 username=self._cmisClient.username,
                                 password=self._cmisClient.password,
                                 **self._cmisClient.extArgs)
@@ -2606,7 +2606,7 @@
             mimetype = 'application/binary'
 
         # put the content file
-        result = self._cmisClient.put(srcUrl, contentFile.read(), mimetype)
+        result = self._cmisClient.put(srcUrl.encode('utf-8'), contentFile.read(), mimetype)
         if type(result) == HTTPError:
             raise CmisException(result.code)
 
@@ -2636,7 +2636,7 @@
         assert(srcUrl), 'Unable to determine content stream URL.'
 
         # delete the content stream
-        result = self._cmisClient.delete(srcUrl)
+        result = self._cmisClient.delete(srcUrl.encode('utf-8'))
         if type(result) == HTTPError:
             raise CmisException(result.code)
 
@@ -2710,7 +2710,7 @@
         entryXml = self._getEntryXmlDoc(properties)
 
         # post the Atom entry
-        result = self._cmisClient.post(postUrl,
+        result = self._cmisClient.post(postUrl.encode('utf-8'),
                                        entryXml.toxml(encoding='utf-8'),
                                        ATOM_XML_ENTRY_TYPE)
         if type(result) == HTTPError:
@@ -2779,9 +2779,9 @@
         # build the Atom entry
         xmlDoc = self._getEntryXmlDoc(properties, contentFile,
                                       contentType, contentEncoding)
-
+        
         # post the Atom entry
-        result = self._cmisClient.post(postUrl, xmlDoc.toxml(encoding='utf-8'), ATOM_XML_ENTRY_TYPE)
+        result = self._cmisClient.post(postUrl.encode('utf-8'), xmlDoc.toxml(encoding='utf-8'), ATOM_XML_ENTRY_TYPE)
         if type(result) == HTTPError:
             raise CmisException(result.code)
 
@@ -2818,7 +2818,7 @@
         # get the appropriate 'down' link
         childrenUrl = self.getChildrenLink()
         # invoke the URL
-        result = self._cmisClient.get(childrenUrl, **kwargs)
+        result = self._cmisClient.get(childrenUrl.encode('utf-8'), **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -2904,7 +2904,7 @@
         descendantsUrl = self.getDescendantsLink()
 
         # invoke the URL
-        result = self._cmisClient.get(descendantsUrl, **kwargs)
+        result = self._cmisClient.get(descendantsUrl.encode('utf-8'), **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -2943,7 +2943,7 @@
         # Get the descendants link and do a GET against it
         url = self._getLink(FOLDER_TREE_REL)
         assert url != None, 'Unable to determine folder tree link'
-        result = self._cmisClient.get(url, **kwargs)
+        result = self._cmisClient.get(url.encode('utf-8'), **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -2963,7 +2963,7 @@
         # get the appropriate 'up' link
         parentUrl = self._getLink(UP_REL)
         # invoke the URL
-        result = self._cmisClient.get(parentUrl)
+        result = self._cmisClient.get(parentUrl.encode('utf-8'))
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -2996,7 +2996,7 @@
 
         # Get the descendants link and do a DELETE against it
         url = self._getLink(DOWN_REL, CMIS_TREE_TYPE_P)
-        result = self._cmisClient.delete(url, **kwargs)
+        result = self._cmisClient.delete(url.encode('utf-8'), **kwargs)
 
         if type(result) == HTTPError:
             raise CmisException(result.code)
@@ -3279,7 +3279,7 @@
         template = templates['typebyid']['template']
         params = {'{id}': self._typeId}
         byTypeIdUrl = multiple_replace(params, template)
-        result = self._cmisClient.get(byTypeIdUrl, **kwargs)
+        result = self._cmisClient.get(byTypeIdUrl.encode('utf-8'), **kwargs)
         if type(result) == HTTPError:
             raise CmisException(result.code)
 
@@ -3702,7 +3702,7 @@
         if (len(aclEls) == 1):
             return ACL(self._cmisClient, self._repository, aclEls[0])
         elif aclUrl:
-            result = self._cmisClient.get(aclUrl)
+            result = self._cmisClient.get(aclUrl.encode('utf-8'))
             if type(result) == HTTPError:
                 raise CmisException(result.code)
             return ACL(xmlDoc=result)
