diff --git a/c++17.patch.0 b/c++17.patch.0
new file mode 100644
index 0000000..c416dc7
--- /dev/null
+++ b/c++17.patch.0
@@ -0,0 +1,412 @@
+--- a/src/libcmis/allowable-actions.cxx
++++ b/src/libcmis/allowable-actions.cxx
+@@ -62,7 +62,7 @@
+         }
+     }
+ 
+-    ObjectAction::Type ObjectAction::parseType( string type ) throw ( Exception )
++    ObjectAction::Type ObjectAction::parseType( string type )
+     {
+         Type value = DeleteObject;
+         if ( type == "canDeleteObject" )
+--- a/src/libcmis/allowable-actions.hxx
++++ b/src/libcmis/allowable-actions.hxx
+@@ -92,7 +92,7 @@
+             /** Parses the permission name into one of the enum values or throws
+                 an exception for invalid input strings.
+               */
+-            static Type parseType( std::string type ) throw ( Exception );
++            static Type parseType( std::string type );
+ 
+     };
+ 
+--- a/src/libcmis/document.hxx
++++ b/src/libcmis/document.hxx
+@@ -56,7 +56,7 @@
+ 
+                 @return the parents folder if any.
+               */
+-            virtual std::vector< boost::shared_ptr< Folder > > getParents( ) throw ( Exception ) = 0;
++            virtual std::vector< boost::shared_ptr< Folder > > getParents( ) = 0;
+             
+             /** Get the content stream without using a temporary file.
+ 
+@@ -74,7 +74,7 @@
+                     guaranteed.
+               */
+             virtual boost::shared_ptr< std::istream > getContentStream( std::string streamId = std::string( ) ) 
+-                        throw ( Exception ) = 0;
++                        = 0;
+ 
+             /** Set or replace the content stream of the document.
+ 
+@@ -88,7 +88,7 @@
+                                 capability.
+               */
+             virtual void setContentStream( boost::shared_ptr< std::ostream > os, std::string contentType,
+-                                           std::string filename, bool overwrite = true ) throw ( Exception ) = 0;
++                                           std::string filename, bool overwrite = true ) = 0;
+ 
+             /** Get the content mime type.
+               */
+@@ -107,12 +107,12 @@
+ 
+                 \return the Private Working Copy document
+               */
+-            virtual boost::shared_ptr< Document > checkOut( ) throw ( Exception ) = 0;
++            virtual boost::shared_ptr< Document > checkOut( ) = 0;
+ 
+             /** Cancels the checkout if the document is a private working copy, or
+                 throws an exception.
+               */
+-            virtual void cancelCheckout( ) throw ( Exception ) = 0;
++            virtual void cancelCheckout( ) = 0;
+ 
+             /** Check in the private working copy and create a new version or throw
+                 an exception.
+@@ -131,9 +131,9 @@
+             virtual boost::shared_ptr< Document > checkIn( bool isMajor, std::string comment,
+                                   const std::map< std::string, PropertyPtr >& properties,
+                                   boost::shared_ptr< std::ostream > stream,
+-                                  std::string contentType, std::string fileName ) throw ( Exception ) = 0;
++                                  std::string contentType, std::string fileName ) = 0;
+ 
+-            virtual std::vector< boost::shared_ptr< Document > > getAllVersions( ) throw ( Exception ) = 0;
++            virtual std::vector< boost::shared_ptr< Document > > getAllVersions( ) = 0;
+ 
+             // virtual methods form Object
+             virtual std::vector< std::string > getPaths( );
+--- a/src/libcmis/folder.cxx
++++ b/src/libcmis/folder.cxx
+@@ -40,7 +40,7 @@
+         return paths;
+     }
+     
+-    libcmis::FolderPtr Folder::getFolderParent( ) throw ( libcmis::Exception )
++    libcmis::FolderPtr Folder::getFolderParent( )
+     {
+         if ( getAllowableActions( ).get() && !getAllowableActions()->isAllowed( libcmis::ObjectAction::GetFolderParent ) )
+             throw libcmis::Exception( string( "GetFolderParent not allowed on node " ) + getId() );
+--- a/src/libcmis/folder.hxx
++++ b/src/libcmis/folder.hxx
+@@ -59,20 +59,20 @@
+ 
+             virtual std::vector< std::string > getPaths( );
+ 
+-            virtual ::boost::shared_ptr< Folder > getFolderParent( ) throw ( Exception );
+-            virtual std::vector< ObjectPtr > getChildren( ) throw ( Exception ) = 0;
++            virtual ::boost::shared_ptr< Folder > getFolderParent( );
++            virtual std::vector< ObjectPtr > getChildren( ) = 0;
+             virtual std::string getParentId( );
+             virtual std::string getPath( );
+ 
+             virtual bool isRootFolder( );
+ 
+             virtual ::boost::shared_ptr< Folder > createFolder( const std::map< std::string, PropertyPtr >& properties )
+-                throw ( libcmis::Exception ) = 0;
++                = 0;
+             virtual ::boost::shared_ptr< Document > createDocument( const std::map< std::string, PropertyPtr >& properties,
+-                                    boost::shared_ptr< std::ostream > os, std::string contentType, std::string fileName ) throw ( Exception ) = 0;
++                                    boost::shared_ptr< std::ostream > os, std::string contentType, std::string fileName ) = 0;
+ 
+             virtual std::vector< std::string > removeTree( bool allVersion = true, UnfileObjects::Type unfile = UnfileObjects::Delete,
+-                                    bool continueOnError = false ) throw ( Exception ) = 0;
++                                    bool continueOnError = false ) = 0;
+         
+             virtual std::string toString( );
+     };
+--- a/src/libcmis/object.cxx
++++ b/src/libcmis/object.cxx
+@@ -226,7 +226,6 @@
+     }
+ 
+     ObjectPtr Object::addSecondaryType( string id, PropertyPtrMap properties )
+-        throw ( Exception )
+     {
+         // First make sure the cmis:secondaryObjectTypeIds property can be defined
+         map< string, PropertyTypePtr >& propertyTypes = getTypeDescription( )->
+@@ -253,7 +252,7 @@
+         return updateProperties( newProperties );
+     }
+ 
+-    ObjectPtr Object::removeSecondaryType( string id ) throw ( Exception )
++    ObjectPtr Object::removeSecondaryType( string id )
+     {
+         // First make sure the cmis:secondaryObjectTypeIds property can be defined
+         map< string, PropertyTypePtr >& propertyTypes = getTypeDescription( )->
+@@ -297,12 +296,12 @@
+         return m_typeDescription;
+     }
+ 
+-    vector< RenditionPtr> Object::getRenditions( string /*filter*/ ) throw ( Exception )
++    vector< RenditionPtr> Object::getRenditions( string /*filter*/ )
+     {
+         return m_renditions;
+     }
+ 
+-    string Object::getThumbnailUrl( ) throw ( Exception )
++    string Object::getThumbnailUrl( )
+     {
+         string url;
+         vector< RenditionPtr > renditions = getRenditions( );
+--- a/src/libcmis/object.hxx
++++ b/src/libcmis/object.hxx
+@@ -129,8 +129,7 @@
+               */
+             virtual boost::shared_ptr< Object > addSecondaryType(
+                                                         std::string id,
+-                                                        PropertyPtrMap properties )
+-                throw ( Exception );
++                                                        PropertyPtrMap properties );
+ 
+             /** Convenience function removing a secondary type from the object.
+ 
+@@ -154,8 +153,7 @@
+                     to throw a constraint exception if it doesn't allow the
+                     operation.
+               */
+-            virtual boost::shared_ptr< Object > removeSecondaryType( std::string id )
+-                throw ( Exception );
++            virtual boost::shared_ptr< Object > removeSecondaryType( std::string id );
+ 
+             /** Gives access to the properties of the object.
+ 
+@@ -179,8 +177,7 @@
+                 \attention
+                     The streamId of the rendition is used in getContentStream( )
+               */
+-            virtual std::vector< RenditionPtr> getRenditions( std::string filter = std::string( ) )
+-                throw ( Exception );
++            virtual std::vector< RenditionPtr> getRenditions( std::string filter = std::string( ) );
+             virtual AllowableActionsPtr getAllowableActions( ) { return m_allowableActions; }
+ 
+             /** Update the object properties and return the updated object.
+@@ -191,21 +188,21 @@
+                     are still two different instances to ease memory handling.
+               */
+             virtual boost::shared_ptr< Object > updateProperties(
+-                        const PropertyPtrMap& properties ) throw ( Exception ) = 0;
++                        const PropertyPtrMap& properties ) = 0;
+ 
+             virtual ObjectTypePtr getTypeDescription( );
+ 
+             /** Reload the data from the server.
+               */
+-            virtual void refresh( ) throw ( Exception ) = 0;
++            virtual void refresh( ) = 0;
+             virtual time_t getRefreshTimestamp( ) { return m_refreshTimestamp; }
+ 
+-            virtual void remove( bool allVersions = true ) throw ( Exception ) = 0;
++            virtual void remove( bool allVersions = true ) = 0;
+ 
+-            virtual void move( boost::shared_ptr< Folder > source, boost::shared_ptr< Folder > destination ) throw ( Exception ) = 0;
++            virtual void move( boost::shared_ptr< Folder > source, boost::shared_ptr< Folder > destination ) = 0;
+ 
+ 
+-            virtual std::string getThumbnailUrl( ) throw ( Exception );
++            virtual std::string getThumbnailUrl( );
+ 
+             /** Dump the object as a string for debugging or display purpose.
+               */
+--- a/src/libcmis/object-type.cxx
++++ b/src/libcmis/object-type.cxx
+@@ -293,22 +293,22 @@
+         }
+     }
+ 
+-    void ObjectType::refresh( ) throw ( Exception )
++    void ObjectType::refresh( )
+     {
+         throw Exception( "ObjectType::refresh() shouldn't be called" );
+     }
+ 
+-    ObjectTypePtr  ObjectType::getParentType( ) throw ( Exception )
++    ObjectTypePtr  ObjectType::getParentType( )
+     {
+         throw Exception( "ObjectType::getParentType() shouldn't be called" );
+     }
+ 
+-    ObjectTypePtr  ObjectType::getBaseType( ) throw ( Exception )
++    ObjectTypePtr  ObjectType::getBaseType( )
+     {
+         throw Exception( "ObjectType::getBaseType() shouldn't be called" );
+     }
+ 
+-    vector< ObjectTypePtr > ObjectType::getChildren( ) throw ( Exception )
++    vector< ObjectTypePtr > ObjectType::getChildren( )
+     {
+         throw Exception( "ObjectType::getChildren() shouldn't be called" );
+     }
+--- a/src/libcmis/object-type.hxx
++++ b/src/libcmis/object-type.hxx
+@@ -94,7 +94,7 @@
+                     This method needs to be implemented in subclasses or it will
+                     do nothing
+              */
+-            virtual void refresh( ) throw ( Exception );
++            virtual void refresh( );
+             virtual time_t getRefreshTimestamp( ) const;
+ 
+             std::string getId( ) const;
+@@ -104,9 +104,9 @@
+             std::string getQueryName( ) const;
+             std::string getDescription( ) const;
+ 
+-            virtual boost::shared_ptr< ObjectType >  getParentType( ) throw ( Exception );
+-            virtual boost::shared_ptr< ObjectType >  getBaseType( ) throw ( Exception );
+-            virtual std::vector< boost::shared_ptr< ObjectType > > getChildren( ) throw ( Exception );
++            virtual boost::shared_ptr< ObjectType >  getParentType( );
++            virtual boost::shared_ptr< ObjectType >  getBaseType( );
++            virtual std::vector< boost::shared_ptr< ObjectType > > getChildren( );
+ 
+             /** Get the parent type id without extracting the complete parent type from
+                 the repository. This is mainly provided for performance reasons.
+--- a/src/libcmis/session-factory.cxx
++++ b/src/libcmis/session-factory.cxx
+@@ -57,7 +57,7 @@
+ 
+     Session* SessionFactory::createSession( string bindingUrl, string username,
+             string password, string repository, bool noSslCheck,
+-            libcmis::OAuth2DataPtr oauth2, bool verbose ) throw ( Exception )
++            libcmis::OAuth2DataPtr oauth2, bool verbose )
+     {
+         Session* session = NULL;
+ 
+@@ -138,7 +138,7 @@
+     }
+ 
+     vector< RepositoryPtr > SessionFactory::getRepositories( string bindingUrl,
+-            string username, string password, bool verbose ) throw ( Exception )
++            string username, string password, bool verbose )
+     {
+         vector< RepositoryPtr > repos;
+ 
+--- a/src/libcmis/session-factory.hxx
++++ b/src/libcmis/session-factory.hxx
+@@ -128,7 +128,7 @@
+                     std::string password = std::string( ),
+                     std::string repositoryId = std::string( ),
+                     bool noSslCheck = false,
+-                    OAuth2DataPtr oauth2 = OAuth2DataPtr(), bool verbose = false ) throw ( Exception );
++                    OAuth2DataPtr oauth2 = OAuth2DataPtr(), bool verbose = false );
+ 
+             /**
+                 Gets the informations of the repositories on the server.
+@@ -142,7 +142,7 @@
+             static std::vector< RepositoryPtr > getRepositories( std::string bindingUrl,
+                     std::string username = std::string( ),
+                     std::string password = std::string( ),
+-                    bool verbose = false ) throw ( Exception );
++                    bool verbose = false );
+     };
+ }
+ 
+--- a/src/libcmis/session.hxx
++++ b/src/libcmis/session.hxx
+@@ -47,7 +47,7 @@
+ 
+             /** Get the current repository.
+               */
+-            virtual RepositoryPtr getRepository( ) throw ( Exception ) = 0;
++            virtual RepositoryPtr getRepository( ) = 0;
+ 
+             virtual std::vector< RepositoryPtr > getRepositories( ) = 0;
+ 
+@@ -61,27 +61,27 @@
+ 
+             /** Get the Root folder of the repository
+               */
+-            virtual FolderPtr getRootFolder() throw ( Exception )= 0;
++            virtual FolderPtr getRootFolder() = 0;
+             
+             /** Get a CMIS object from its ID.
+               */
+-            virtual ObjectPtr getObject( std::string id ) throw ( Exception ) = 0;
++            virtual ObjectPtr getObject( std::string id ) = 0;
+ 
+             /** Get a CMIS object from one of its path.
+               */
+-            virtual ObjectPtr getObjectByPath( std::string path ) throw ( Exception ) = 0;
++            virtual ObjectPtr getObjectByPath( std::string path ) = 0;
+ 
+             /** Get a CMIS folder from its ID.
+               */
+-            virtual libcmis::FolderPtr getFolder( std::string id ) throw ( Exception ) = 0;
++            virtual libcmis::FolderPtr getFolder( std::string id ) = 0;
+ 
+             /** Get a CMIS object type from its ID.
+               */
+-            virtual ObjectTypePtr getType( std::string id ) throw ( Exception ) = 0;
++            virtual ObjectTypePtr getType( std::string id ) = 0;
+ 
+             /** Get all the CMIS base object types known by the server.
+               */
+-            virtual std::vector< ObjectTypePtr > getBaseTypes( ) throw ( Exception ) = 0;
++            virtual std::vector< ObjectTypePtr > getBaseTypes( ) = 0;
+ 
+             /** Enable or disable the SSL certificate verification.
+ 
+--- a/src/libcmis/xml-utils.cxx
++++ b/src/libcmis/xml-utils.cxx
+@@ -361,7 +361,6 @@
+     string getXmlNodeAttributeValue( xmlNodePtr node,
+                                      const char* attributeName,
+                                      const char* defaultValue )
+-        throw ( Exception )
+     {
+         xmlChar* xmlStr = xmlGetProp( node, BAD_CAST( attributeName ) );
+         if ( xmlStr == NULL )
+@@ -450,7 +449,7 @@
+         return str;
+     }
+ 
+-    bool parseBool( string boolStr ) throw ( Exception )
++    bool parseBool( string boolStr )
+     {
+         bool value = false;
+         if ( boolStr == "true" || boolStr == "1" )
+@@ -462,7 +461,7 @@
+         return value;
+     }
+ 
+-    long parseInteger( string intStr ) throw ( Exception )
++    long parseInteger( string intStr )
+     {
+         char* end;
+         errno = 0;
+@@ -481,7 +480,7 @@
+         return value;
+     }
+ 
+-    double parseDouble( string doubleStr ) throw ( Exception )
++    double parseDouble( string doubleStr )
+     {
+         char* end;
+         errno = 0;
+--- a/src/libcmis/xml-utils.hxx
++++ b/src/libcmis/xml-utils.hxx
+@@ -132,8 +132,7 @@
+       */
+     std::string getXmlNodeAttributeValue( xmlNodePtr node,
+                                           const char* attributeName,
+-                                          const char* defaultValue = NULL )
+-        throw ( Exception );
++                                          const char* defaultValue = NULL );
+ 
+     /** Parse a xsd:dateTime string and return the corresponding UTC posix time.
+      */
+@@ -142,11 +141,11 @@
+     /// Write a UTC time object to an xsd:dateTime string
+     std::string writeDateTime( boost::posix_time::ptime time );
+ 
+-    bool parseBool( std::string str ) throw ( Exception );
++    bool parseBool( std::string str );
+ 
+-    long parseInteger( std::string str ) throw ( Exception );
++    long parseInteger( std::string str );
+ 
+-    double parseDouble( std::string str ) throw ( Exception );
++    double parseDouble( std::string str );
+ 
+     /** Trim spaces on the left and right of a string.
+      */
diff --git a/libcmis.spec b/libcmis.spec
index 1b7ff11..5258111 100644
--- a/libcmis.spec
+++ b/libcmis.spec
@@ -2,7 +2,7 @@
 
 Name: libcmis
 Version: 0.5.1
-Release: 13%{?dist}
+Release: 14%{?dist}
 Summary: A C/C++ client library for CM interfaces
 
 License: GPLv2+ or LGPLv2+ or MPLv1.1
@@ -28,6 +28,7 @@ Patch6: 0001-rhbz-1410197-limit-the-number-of-redirections.patch
 Patch7: 0001-do-not-try-to-use-on-an-empty-string.patch
 Patch8: 0002-return-early-if-the-time-part-is-empty.patch
 Patch9: 0001-Properly-encode-OAuth2-credentials.patch
+Patch10: c++17.patch.0
 
 %description
 LibCMIS is a C/C++ client library for working with CM (content management)
@@ -97,6 +98,9 @@ make %{?_smp_mflags} check
 %{_mandir}/man1/cmis-client.1*
 
 %changelog
+* Mon Dec 10 2018 Caolán McNamara <caolanm@redhat.com> - 0.5.1-14
+- allow building with c++17
+
 * Wed Sep 12 2018 Stephan Bergmann <sbergman@redhat.com> - 0.5.1-13
 - fix Google Drive login