Index: src/nm-openvpn-service.h
===================================================================
--- src/nm-openvpn-service.h	(revision 3715)
+++ src/nm-openvpn-service.h	(working copy)
@@ -45,7 +45,8 @@
 #define NM_OPENVPN_CONTYPE_X509 0
 #define NM_OPENVPN_CONTYPE_SHAREDKEY 1
 #define NM_OPENVPN_CONTYPE_PASSWORD 2
-#define NM_OPENVPN_CONTYPE_X509USERPASS 3
+#define NM_OPENVPN_CONTYPE_PKCS12 3
+#define NM_OPENVPN_CONTYPE_X509USERPASS 4
 
 #define NM_OPENVPN_KEY_CA "ca"
 #define NM_OPENVPN_KEY_CERT "cert"
@@ -55,6 +56,7 @@
 #define NM_OPENVPN_KEY_TAP_DEV "dev"
 #define NM_OPENVPN_KEY_KEY "key"
 #define NM_OPENVPN_KEY_LOCAL_IP "local-ip"
+#define NM_OPENVPN_KEY_PKCS12 "pkcs12"
 #define NM_OPENVPN_KEY_PROTO_TCP "proto"
 #define NM_OPENVPN_KEY_PORT "port"
 #define NM_OPENVPN_KEY_REMOTE "remote"
Index: src/nm-openvpn-service.c
===================================================================
--- src/nm-openvpn-service.c	(revision 3715)
+++ src/nm-openvpn-service.c	(working copy)
@@ -91,6 +91,7 @@
 	{ NM_OPENVPN_KEY_TAP_DEV,         G_TYPE_BOOLEAN },
 	{ NM_OPENVPN_KEY_KEY,             G_TYPE_STRING },
 	{ NM_OPENVPN_KEY_LOCAL_IP,        G_TYPE_STRING },
+	{ NM_OPENVPN_KEY_PKCS12,          G_TYPE_STRING },
 	{ NM_OPENVPN_KEY_PORT,            G_TYPE_INT },
 	{ NM_OPENVPN_KEY_PROTO_TCP,       G_TYPE_BOOLEAN },
 	{ NM_OPENVPN_KEY_REMOTE,          G_TYPE_STRING },
@@ -494,6 +495,17 @@
 		}
 		break;
 
+	case NM_OPENVPN_CONTYPE_PKCS12:
+		g_ptr_array_add (openvpn_argv, (gpointer) "--client");
+
+		tmp = g_hash_table_lookup (properties, NM_OPENVPN_KEY_PKCS12);
+		if (tmp) {
+			g_ptr_array_add (openvpn_argv, (gpointer) "--pkcs12");
+			g_ptr_array_add (openvpn_argv, (gpointer) g_value_get_string ((GValue *) tmp));
+		}
+
+		break;
+
 	case NM_OPENVPN_CONTYPE_SHAREDKEY:
 		tmp = g_hash_table_lookup (properties, NM_OPENVPN_KEY_SHARED_KEY);
 		if (tmp) {
@@ -583,8 +595,10 @@
 	   PASSWORD: Will require username and password
 	   X509USERPASS: Will require username and password and maybe certificate password
 	   X509: May require certificate password
+	   PKCS12: May require certificate password
 	*/
 	if (connection_type == NM_OPENVPN_CONTYPE_PASSWORD ||
+	    connection_type == NM_OPENVPN_CONTYPE_PKCS12 ||
 	    connection_type == NM_OPENVPN_CONTYPE_X509USERPASS ||
 	    connection_type == NM_OPENVPN_CONTYPE_X509) {
 
@@ -693,6 +707,11 @@
 		if (!g_hash_table_lookup (s_vpn_props->data, NM_OPENVPN_KEY_CERTPASS))
 			need_secrets = TRUE;
 		break;
+	case NM_OPENVPN_CONTYPE_PKCS12:
+		/* May require certificate password */
+		if (!g_hash_table_lookup (s_vpn_props->data, NM_OPENVPN_KEY_CERTPASS))
+			need_secrets = TRUE;
+		break;
 	default:
 		break;
 	}
Index: properties/nm-openvpn.c
===================================================================
--- properties/nm-openvpn.c	(revision 3715)
+++ properties/nm-openvpn.c	(working copy)
@@ -618,6 +618,22 @@
 			is_valid = TRUE;
 		}
 
+	} else if ( connection_type == NM_OPENVPN_CONTYPE_PKCS12 ) {
+		const char *cert;
+
+		cert        = gtk_entry_get_text (impl->w_cert);
+
+		/* initial sanity checking */
+		if ( cert && strlen (cert) > 0 &&
+		    ((!use_routes) || (use_routes && strlen (routes_entry) > 0)) &&
+		    /* validate ca/cert/key files */
+		    g_file_test( cert, G_FILE_TEST_IS_REGULAR)) {
+
+			is_valid = TRUE;
+		}
+
+	}
+
 	} else {
 		// default to NM_OPENVPN_CONTYPE_X509
 		const char *ca;
@@ -857,6 +873,13 @@
 		g_string_append_printf (buf, _("Username:  %s"), username);
 		break;
 
+	case NM_OPENVPN_CONTYPE_PKCS12:
+		g_string_append (buf, _("Connection Type: PKCS12 Certificate"));
+
+		g_string_append (buf, "\n\t");
+		g_string_append_printf (buf, _("Cert:  %s"), cert);
+		break;
+
 	case NM_OPENVPN_CONTYPE_X509USERPASS:
 		ca = gtk_entry_get_text (impl->w_x509userpass_ca);
 
@@ -1006,6 +1029,15 @@
 				} else {
 					file_is_good = FALSE;
 				}
+            } else if (strcmp (connection_type, "pkcs12") == 0) {
+				if ( (cert != NULL ) &&
+					(strlen(cert) > 0) ) {
+
+					gtk_entry_set_text (impl->w_cert, cert);
+					connection_type_sel = NM_OPENVPN_CONTYPE_PKCS12;
+				} else {
+					file_is_good = FALSE;
+				}
 			} else if (strcmp (connection_type, "shared-key") == 0) {
 				if ( (shared_key != NULL ) &&
 					(local_ip != NULL ) &&
@@ -1220,6 +1252,7 @@
 	case NM_OPENVPN_CONTYPE_X509:
 	case NM_OPENVPN_CONTYPE_SHAREDKEY:
 	case NM_OPENVPN_CONTYPE_PASSWORD:
+    case NM_OPENVPN_CONTYPE_PKCS12:
 	case NM_OPENVPN_CONTYPE_X509USERPASS:
 		{
 			gtk_notebook_set_current_page( impl->w_settings_notebook, sel );
@@ -1411,6 +1444,9 @@
 		case NM_OPENVPN_CONTYPE_PASSWORD:
 			connection_type = "password";
 			break;
+		case NM_OPENVPN_CONTYPE_PKCS12:
+			connection_type = "pkcs12";
+			break;
 		case NM_OPENVPN_CONTYPE_X509USERPASS:
 			connection_type = "x509userpass";
 			break;
Index: auth-dialog/main.c
===================================================================
--- auth-dialog/main.c	(revision 3715)
+++ auth-dialog/main.c	(working copy)
@@ -307,6 +307,7 @@
 		case NM_OPENVPN_CONTYPE_X509USERPASS:
 			info->need_password = TRUE;
 			/* Fall through */
+		case NM_OPENVPN_CONTYPE_PKCS12:
 		case NM_OPENVPN_CONTYPE_X509:
 			success = TRUE;
 
