diff --git a/http/client.go b/http/client.go
index 09da43b4c355731b9a7ec9b58bda7472993234c3..401d62119f5ed89f51b01d2ae2dc071703c7984f 100644
--- a/http/client.go
+++ b/http/client.go
@@ -7,21 +7,36 @@ package http
 import (
 	"bytes"
 	"crypto/tls"
+	"crypto/x509"
 	"encoding/json"
 	"fmt"
 	"io"
+	"net"
 	"net/http"
 	"net/url"
 	"strings"
 	"time"
 
+	"github.com/miniflux/miniflux/errors"
 	"github.com/miniflux/miniflux/logger"
 	"github.com/miniflux/miniflux/timer"
 	"github.com/miniflux/miniflux/version"
 )
 
-const requestTimeout = 300
-const maxBodySize = 1024 * 1024 * 15
+const (
+	// 20 seconds max.
+	requestTimeout = 20
+
+	// 15MB max.
+	maxBodySize = 1024 * 1024 * 15
+)
+
+var (
+	errInvalidCertificate        = "Invalid SSL certificate (original error: %q)"
+	errTemporaryNetworkOperation = "This website is temporarily unreachable (original error: %q)"
+	errPermanentNetworkOperation = "This website is permanently unreachable (original error: %q)"
+	errRequestTimeout            = "Website unreachable, the request timed out after %d seconds"
+)
 
 // Client is a HTTP Client :)
 type Client struct {
@@ -77,6 +92,26 @@ func (c *Client) executeRequest(request *http.Request) (*Response, error) {
 	client := c.buildClient()
 	resp, err := client.Do(request)
 	if err != nil {
+		if uerr, ok := err.(*url.Error); ok {
+			switch uerr.Err.(type) {
+			case x509.CertificateInvalidError, x509.HostnameError:
+				err = errors.NewLocalizedError(errInvalidCertificate, uerr.Err)
+			case *net.OpError:
+				if uerr.Err.(*net.OpError).Temporary() {
+					err = errors.NewLocalizedError(errTemporaryNetworkOperation, uerr.Err)
+				} else {
+					err = errors.NewLocalizedError(errPermanentNetworkOperation, uerr.Err)
+				}
+			case net.Error:
+				nerr := uerr.Err.(net.Error)
+				if nerr.Timeout() {
+					err = errors.NewLocalizedError(errRequestTimeout, requestTimeout)
+				} else if nerr.Temporary() {
+					err = errors.NewLocalizedError(errTemporaryNetworkOperation, nerr)
+				}
+			}
+		}
+
 		return nil, err
 	}
 
diff --git a/locale/translations.go b/locale/translations.go
index 9f43be75950335f28ed9484936ab0aa06de4b110..7bf2039a12e83bd7099c0fa47764c9eb96e6c807 100644
--- a/locale/translations.go
+++ b/locale/translations.go
@@ -1,5 +1,5 @@
 // Code generated by go generate; DO NOT EDIT.
-// 2018-02-08 08:24:29.272801 +0100 CET m=+0.026701596
+// 2018-02-08 18:11:55.663532104 -0800 PST m=+0.009491930
 
 package locale
 
@@ -441,7 +441,11 @@ var translations = map[string]string{
     "Miniflux API": "API de Miniflux",
     "API Endpoint": "Point de terminaison de l'API",
     "Your account password": "Le mot de passe de votre compte",
-    "This web page is empty": "Cette page web est vide"
+    "This web page is empty": "Cette page web est vide",
+    "Invalid SSL certificate (original error: %q)": "Certificat SSL invalide (erreur originale : %q)",
+    "This website is temporarily unreachable (original error: %q)": "Ce site web est temporairement injoignable (erreur originale : %q)",
+    "This website is permanently unreachable (original error: %q)": "Ce site web n'est pas joignable de façon permanente (erreur originale : %q)",
+    "Website unreachable, the request timed out after %d seconds": "Site web injoignable, la requête à échouée après %d secondes"
 }
 `,
 }
@@ -449,5 +453,5 @@ var translations = map[string]string{
 var translationsChecksums = map[string]string{
 	"de_DE": "6528d76d5c78b45db4a137a092953155e81d47a64e91aa2411829e5d946e0e28",
 	"en_US": "6fe95384260941e8a5a3c695a655a932e0a8a6a572c1e45cb2b1ae8baa01b897",
-	"fr_FR": "e1f5604630f7dfffe81718f3647d6d3689ec3c4d9a2c78ed7641704e2b913b74",
+	"fr_FR": "ae61f82ac14bc2c6c6a3c2d38cf1ad8309ac2eef19b0726b2969ac155ccddc14",
 }
diff --git a/locale/translations/fr_FR.json b/locale/translations/fr_FR.json
index 48e12bbdbe925f4dbaf5adc6dc2ef5f20ac91710..ca2ec06498f45cca503f7e2c99bc2c451349b1ab 100644
--- a/locale/translations/fr_FR.json
+++ b/locale/translations/fr_FR.json
@@ -210,5 +210,9 @@
     "Miniflux API": "API de Miniflux",
     "API Endpoint": "Point de terminaison de l'API",
     "Your account password": "Le mot de passe de votre compte",
-    "This web page is empty": "Cette page web est vide"
+    "This web page is empty": "Cette page web est vide",
+    "Invalid SSL certificate (original error: %q)": "Certificat SSL invalide (erreur originale : %q)",
+    "This website is temporarily unreachable (original error: %q)": "Ce site web est temporairement injoignable (erreur originale : %q)",
+    "This website is permanently unreachable (original error: %q)": "Ce site web n'est pas joignable de façon permanente (erreur originale : %q)",
+    "Website unreachable, the request timed out after %d seconds": "Site web injoignable, la requête à échouée après %d secondes"
 }
diff --git a/reader/feed/handler.go b/reader/feed/handler.go
index cc7125643c21c5d8bca71c9cb088356b3c947646..d6ac84eddd495182c084a6c66ffd01013faa5a98 100644
--- a/reader/feed/handler.go
+++ b/reader/feed/handler.go
@@ -44,6 +44,9 @@ func (h *Handler) CreateFeed(userID, categoryID int64, url string, crawler bool)
 	client := http.NewClient(url)
 	response, err := client.Get()
 	if err != nil {
+		if _, ok := err.(errors.LocalizedError); ok {
+			return nil, err
+		}
 		return nil, errors.NewLocalizedError(errRequestFailed, err)
 	}
 
@@ -120,7 +123,13 @@ func (h *Handler) RefreshFeed(userID, feedID int64) error {
 	client := http.NewClientWithCacheHeaders(originalFeed.FeedURL, originalFeed.EtagHeader, originalFeed.LastModifiedHeader)
 	response, err := client.Get()
 	if err != nil {
-		customErr := errors.NewLocalizedError(errRequestFailed, err)
+		var customErr errors.LocalizedError
+		if lerr, ok := err.(errors.LocalizedError); ok {
+			customErr = lerr
+		} else {
+			customErr = errors.NewLocalizedError(errRequestFailed, err)
+		}
+
 		originalFeed.ParsingErrorCount++
 		originalFeed.ParsingErrorMsg = customErr.Error()
 		h.store.UpdateFeed(originalFeed)
diff --git a/reader/subscription/finder.go b/reader/subscription/finder.go
index 8e361b7eb73be20c47d12912fdfdd7f9d9282a2f..4e2879a111b44f2365309546a9d815e1e91fb402 100644
--- a/reader/subscription/finder.go
+++ b/reader/subscription/finder.go
@@ -33,6 +33,9 @@ func FindSubscriptions(websiteURL string) (Subscriptions, error) {
 	client := http.NewClient(websiteURL)
 	response, err := client.Get()
 	if err != nil {
+		if _, ok := err.(errors.LocalizedError); ok {
+			return nil, err
+		}
 		return nil, errors.NewLocalizedError(errConnectionFailure, err)
 	}