diff --git a/camel/camel-sasl-gssapi.c b/camel/camel-sasl-gssapi.c
index 68d2dd9..e543ba0 100644
--- a/camel/camel-sasl-gssapi.c
+++ b/camel/camel-sasl-gssapi.c
@@ -79,6 +79,12 @@ extern gss_OID gss_nt_service_name;
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_SASL_GSSAPI, CamelSaslGssapiPrivate))
 
+static const char spnego_OID[] = "\x2b\x06\x01\x05\x05\x02";
+static const gss_OID_desc gss_mech_spnego = {
+	6,
+	&spnego_OID
+};
+
 #ifndef GSS_C_OID_KRBV5_DES
 #define GSS_C_OID_KRBV5_DES GSS_C_NO_OID
 #endif
@@ -97,6 +103,16 @@ static CamelServiceAuthType sasl_gssapi_auth_type = {
 	FALSE
 };
 
+static CamelServiceAuthType sasl_gss_spnego_auth_type = {
+	N_("SPNEGO"),
+
+	N_("This option will connect to the server using "
+	   "SPNEGO authentication."),
+
+	"GSS-SPNEGO",
+	FALSE
+};
+
 enum {
 	GSSAPI_STATE_INIT,
 	GSSAPI_STATE_CONTINUE_NEEDED,
@@ -114,11 +130,13 @@ struct _CamelSaslGssapiPrivate {
 	gint state;
 	gss_ctx_id_t ctx;
 	gss_name_t target;
+	gss_OID mech;
 };
 
 #endif /* HAVE_KRB5 */
 
 G_DEFINE_TYPE (CamelSaslGssapi, camel_sasl_gssapi, CAMEL_TYPE_SASL)
+G_DEFINE_TYPE (CamelSaslGssSpnego, camel_sasl_gss_spnego, CAMEL_TYPE_SASL_GSSAPI)
 
 #ifdef HAVE_KRB5
 
@@ -349,7 +367,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 		major = gss_init_sec_context (
 			&minor, GSS_C_NO_CREDENTIAL,
 			&priv->ctx, priv->target,
-			GSS_C_OID_KRBV5_DES,
+			priv->mech,
 			GSS_C_MUTUAL_FLAG |
 			GSS_C_REPLAY_FLAG |
 			GSS_C_SEQUENCE_FLAG,
@@ -489,5 +507,27 @@ camel_sasl_gssapi_init (CamelSaslGssapi *sasl)
 	sasl->priv->state = GSSAPI_STATE_INIT;
 	sasl->priv->ctx = GSS_C_NO_CONTEXT;
 	sasl->priv->target = GSS_C_NO_NAME;
+	sasl->priv->mech = GSS_C_OID_KRBV5_DES;
+#endif /* HAVE_KRB5 */
+}
+
+static void
+camel_sasl_gss_spnego_class_init (CamelSaslGssSpnegoClass *class)
+{
+#ifdef HAVE_KRB5
+	CamelSaslClass *sasl_class;
+
+	sasl_class = CAMEL_SASL_CLASS (class);
+	sasl_class->auth_type = &sasl_gss_spnego_auth_type;
+#endif /* HAVE_KRB5 */
+}
+
+static void
+camel_sasl_gss_spnego_init (CamelSaslGssSpnego *sasl)
+{
+#ifdef HAVE_KRB5
+	CamelSaslGssapiPrivate *priv = CAMEL_SASL_GSSAPI_GET_PRIVATE (sasl);
+
+	priv->mech = (gss_OID)&gss_mech_spnego;
 #endif /* HAVE_KRB5 */
 }
diff --git a/camel/camel-sasl-gssapi.h b/camel/camel-sasl-gssapi.h
index 6885ebb..f53155e 100644
--- a/camel/camel-sasl-gssapi.h
+++ b/camel/camel-sasl-gssapi.h
@@ -49,6 +49,25 @@
 	(G_TYPE_INSTANCE_GET_CLASS \
 	((obj), CAMEL_TYPE_SASL_GSSAPI, CamelSaslGssapiClass))
 
+/* Standard GObject macros */
+#define CAMEL_TYPE_SASL_GSS_SPNEGO \
+	(camel_sasl_gss_spnego_get_type ())
+#define CAMEL_SASL_GSS_SPNEGO(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), CAMEL_TYPE_SASL_GSS_SPNEGO, CamelSaslGssSpnego))
+#define CAMEL_SASL_GSS_SPNEGO_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), CAMEL_TYPE_SASL_GSS_SPNEGO, CamelSaslGssSpnegoClass))
+#define CAMEL_IS_SASL_GSS_SPNEGO(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), CAMEL_TYPE_SASL_GSS_SPNEGO))
+#define CAMEL_IS_SASL_GSS_SPNEGO_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), CAMEL_TYPE_SASL_GSS_SPNEGO))
+#define CAMEL_SASL_GSS_SPNEGO_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), CAMEL_TYPE_SASL_GSS_SPNEGO, CamelSaslGssSpnegoClass))
+
 G_BEGIN_DECLS
 
 typedef struct _CamelSaslGssapi CamelSaslGssapi;
@@ -64,7 +83,19 @@ struct _CamelSaslGssapiClass {
 	CamelSaslClass parent_class;
 };
 
+typedef struct _CamelSaslGssSpnego CamelSaslGssSpnego;
+typedef struct _CamelSaslGssSpnegoClass CamelSaslGssSpnegoClass;
+
+struct _CamelSaslGssSpnego {
+	CamelSaslGssapi parent;
+};
+
+struct _CamelSaslGssSpnegoClass {
+	CamelSaslGssapiClass parent_class;
+};
+
 GType camel_sasl_gssapi_get_type (void);
+GType camel_sasl_gss_spnego_get_type (void);
 
 G_END_DECLS
 
