diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index 3f64758..14373cb 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -284,6 +284,13 @@
                 .show();
     }
 
+    private void addError(LayoutInflater inflater, LinearLayout parent, int error) {
+        TextView textView = (TextView) inflater.inflate(R.layout.ssl_warning,
+                parent, false);
+        textView.setText(error);
+        parent.addView(textView);
+    }
+
     /**
      * Displays the SSL error certificate dialog.
      * @param view The target web-view.
@@ -306,23 +313,26 @@
         final LinearLayout placeholder =
                 (LinearLayout)certificateView.findViewById(com.android.internal.R.id.placeholder);
 
-        LinearLayout ll = (LinearLayout)factory.inflate(R.layout.ssl_warning, placeholder);
-        TextView textView = (TextView)ll.findViewById(R.id.warning);
-
         if (error.hasError(SslError.SSL_UNTRUSTED)) {
-            textView.setText(R.string.ssl_untrusted);
-        } else if (error.hasError(SslError.SSL_IDMISMATCH)) {
-            textView.setText(R.string.ssl_mismatch);
-        } else if (error.hasError(SslError.SSL_EXPIRED)) {
-            textView.setText(R.string.ssl_expired);
-        } else if (error.hasError(SslError.SSL_NOTYETVALID)) {
-            textView.setText(R.string.ssl_not_yet_valid);
-        } else if (error.hasError(SslError.SSL_DATE_INVALID)) {
-            textView.setText(R.string.ssl_date_invalid);
-        } else if (error.hasError(SslError.SSL_INVALID)) {
-            textView.setText(R.string.ssl_invalid);
-        } else {
-            textView.setText(R.string.ssl_unknown);
+            addError(factory, placeholder, R.string.ssl_untrusted);
+        }
+        if (error.hasError(SslError.SSL_IDMISMATCH)) {
+            addError(factory, placeholder, R.string.ssl_mismatch);
+        }
+        if (error.hasError(SslError.SSL_EXPIRED) || true) {
+            addError(factory, placeholder, R.string.ssl_expired);
+        }
+        if (error.hasError(SslError.SSL_NOTYETVALID)) {
+            addError(factory, placeholder, R.string.ssl_not_yet_valid);
+        }
+        if (error.hasError(SslError.SSL_DATE_INVALID) || true) {
+            addError(factory, placeholder, R.string.ssl_date_invalid);
+        }
+        if (error.hasError(SslError.SSL_INVALID)) {
+            addError(factory, placeholder, R.string.ssl_invalid);
+        }
+        if (placeholder.getChildCount() == 0) {
+            addError(factory, placeholder, R.string.ssl_unknown);
         }
 
         mSSLCertificateOnErrorHandler = handler;
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index d6106a5..c519c91 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -744,75 +744,45 @@
                 return;
             }
             if (mSettings.showSecurityWarnings()) {
-                final LayoutInflater factory =
-                    LayoutInflater.from(mContext);
-                final View warningsView =
-                    factory.inflate(R.layout.ssl_warnings, null);
-                final LinearLayout placeholder =
-                    (LinearLayout)warningsView.findViewById(R.id.placeholder);
-
-                if (error.hasError(SslError.SSL_UNTRUSTED)) {
-                    LinearLayout ll = (LinearLayout)factory
-                        .inflate(R.layout.ssl_warning, null);
-                    ((TextView)ll.findViewById(R.id.warning))
-                        .setText(R.string.ssl_untrusted);
-                    placeholder.addView(ll);
-                }
-
-                if (error.hasError(SslError.SSL_IDMISMATCH)) {
-                    LinearLayout ll = (LinearLayout)factory
-                        .inflate(R.layout.ssl_warning, null);
-                    ((TextView)ll.findViewById(R.id.warning))
-                        .setText(R.string.ssl_mismatch);
-                    placeholder.addView(ll);
-                }
-
-                if (error.hasError(SslError.SSL_EXPIRED)) {
-                    LinearLayout ll = (LinearLayout)factory
-                        .inflate(R.layout.ssl_warning, null);
-                    ((TextView)ll.findViewById(R.id.warning))
-                        .setText(R.string.ssl_expired);
-                    placeholder.addView(ll);
-                }
-
-                if (error.hasError(SslError.SSL_NOTYETVALID)) {
-                    LinearLayout ll = (LinearLayout)factory
-                        .inflate(R.layout.ssl_warning, null);
-                    ((TextView)ll.findViewById(R.id.warning))
-                        .setText(R.string.ssl_not_yet_valid);
-                    placeholder.addView(ll);
-                }
-
-                new AlertDialog.Builder(mContext).setTitle(
-                        R.string.security_warning).setIcon(
-                        android.R.drawable.ic_dialog_alert).setView(
-                        warningsView).setPositiveButton(R.string.ssl_continue,
+                new AlertDialog.Builder(mContext)
+                    .setTitle(R.string.security_warning)
+                    .setMessage(R.string.ssl_warnings_header)
+                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setPositiveButton(R.string.ssl_continue,
                         new DialogInterface.OnClickListener() {
+                            @Override
                             public void onClick(DialogInterface dialog,
                                     int whichButton) {
                                 handler.proceed();
                             }
-                        }).setNeutralButton(R.string.view_certificate,
+                        })
+                    .setNeutralButton(R.string.view_certificate,
                         new DialogInterface.OnClickListener() {
+                            @Override
                             public void onClick(DialogInterface dialog,
                                     int whichButton) {
-                                mWebViewController.showSslCertificateOnError(view,
-                                        handler, error);
+                                mWebViewController.showSslCertificateOnError(
+                                        view, handler, error);
                             }
-                        }).setNegativeButton(R.string.ssl_go_back,
+                        })
+                    .setNegativeButton(R.string.ssl_go_back,
                         new DialogInterface.OnClickListener() {
+                            @Override
                             public void onClick(DialogInterface dialog,
                                     int whichButton) {
                                 dialog.cancel();
                             }
-                        }).setOnCancelListener(
+                        })
+                    .setOnCancelListener(
                         new DialogInterface.OnCancelListener() {
+                            @Override
                             public void onCancel(DialogInterface dialog) {
                                 handler.cancel();
                                 setLockIconType(LockIcon.LOCK_ICON_UNSECURE);
                                 mWebViewController.onUserCanceledSsl(Tab.this);
                             }
-                        }).show();
+                        })
+                    .show();
             } else {
                 handler.proceed();
             }
