diff --git a/Changelog b/Changelog
index b078036..ee52938 100644
--- a/Changelog
+++ b/Changelog
@@ -38,7 +38,7 @@ GKrellM Changelog
 	* Patch from Gerard Neil: Skip autofs mounts in free disk space polling
 	* Patch from Gerard Neil: Handle cifs as remote filesystem to use longer
 	  nfs-timeout polling interval
-	* Patch from Alexandre Rostovtsev: Explicitely link against gmodule-2.0
+	* Patch from Alexandre Rostovtsev: Explicitly link against gmodule-2.0
 	* Add support for GPU-Z sensor information on Windows
 	* Increase minimum required GLib version to 2.32, some parts of gkrellm
 	  use newer GLib API
@@ -151,7 +151,7 @@ GKrellM Changelog
 	        Use unicode function calls.
 	        Use getaddrinfo() on win32.
 	        Support CoreTemp application for getting cpu temperatures.
-	        Redo sensor-handling to support multipe sensor backends.
+	        Redo sensor-handling to support multiple sensor backends.
 	        Make Proc monitor work and properly count # of logged in users.
 	        Mem monitor displays cache bytes.
 	        System name shows some new windows versions.
diff --git a/README b/README
index 84df8ac..b8f59d4 100644
--- a/README
+++ b/README
@@ -549,7 +549,7 @@ The reasons for this choice are a) efficiency (though it might be possible
 to open/close /dev/sysmon each time a reading is needed without major
 performance issue) and b) as of october 2001, there's a bug in the
 envsys(4) driver which sometimes causes deadlocks when processes try to
-access simultaneoulsy /dev/sysmon  (see NetBSD PR#14368). A (quick and
+access simultaneously /dev/sysmon  (see NetBSD PR#14368). A (quick and
 dirty) workaround for this is to monopolize the driver :)
 
 
diff --git a/Themes.html b/Themes.html
index 9975120..e411ec3 100644
--- a/Themes.html
+++ b/Themes.html
@@ -719,7 +719,7 @@ krell parameters, frame rendering, etc  are made in the gkrellmrc file.
 Setting these values may have a variable effect on different monitors
 because the programmer may use the values to differing degrees.  For
 example, margins may affect a label or some text decal but not affect
-other text decals because the programmer explicitely centers the decal.
+other text decals because the programmer explicitly centers the decal.
 <p>
 The possible gkrellmrc lines are listed here.
 <p>
diff --git a/gkrellmd.1 b/gkrellmd.1
index 073a665..032e775 100644
--- a/gkrellmd.1
+++ b/gkrellmd.1
@@ -192,7 +192,7 @@ arguments may be given.  If no hosts are specified on the command
 line or in a gkrellmd.conf file, then all
 hosts are allowed to connect.  The
 .I hostname
-argument may be a text name or a IPv4 or IPv6
+argument may be a text name or an IPv4 or IPv6
 dotted notation.  For IPv4, the simple subnet pattern x.y.z.* may be used.
 Also, if
 .I hostname
diff --git a/server/mail.c b/server/mail.c
index 83a8a7b..d7929f9 100644
--- a/server/mail.c
+++ b/server/mail.c
@@ -324,7 +324,7 @@ check_maildir(Mailbox *mbox)
   |  But, new mail arriving (writing mailbox) sets st_mtime while reading
   |  the mailbox (mail program reading) sets st_atime.  So the test
   |  st_atime > st_mtime is testing if mbox has been read since last new mail.
-  |  Mail readers may restore st_mtime after writting status.
+  |  Mail readers may restore st_mtime after writing status.
   |  And Netscape mail does status with X-Mozilla-Status: xxxS
   |    where S is bitwise or of status flags:
   |    1: read  2: replied  4: marked  8: deleted
diff --git a/server/main.c b/server/main.c
index 8851e13..1c1f22e 100644
--- a/server/main.c
+++ b/server/main.c
@@ -1124,18 +1124,28 @@ detach_from_terminal(void)
 #endif /* !defined(WIN32) */
 
 
-static void
+static int
 drop_privileges(void)
 	{
 #if !defined(WIN32)
+	int r;
 	if (drop_privs.gid > (uid_t)0)
 		{
-		(void) setgroups((size_t)0, (gid_t*)0);
-		(void) setgid(drop_privs.gid);
+		r = setgroups((size_t)0, (gid_t*)0);
+		if (r != 0)
+			return r;
+		r = setgid(drop_privs.gid);
+		if (r != 0)
+			return r;
 		}
 	if (drop_privs.uid > (uid_t)0)
-		(void) setuid(drop_privs.uid);
+		{
+		r = setuid(drop_privs.uid);
+		if (r != 0)
+			return r;
+		}
 #endif
+	return 0;
 	}
 
 
@@ -1201,7 +1211,12 @@ gkrellmd_run(gint argc, gchar **argv)
 
 	make_pidfile();
 	gkrellm_sys_main_init();
-	drop_privileges();
+	if (drop_privileges() != 0)
+		{
+		g_warning("Failed to drop privileges: %s\n", strerror(errno));
+		gkrellm_sys_main_cleanup();
+		return 1;
+		}
 
 	_GK.start_time = time(0);
 	if (_GK.update_HZ < 1 || _GK.update_HZ > 10)
diff --git a/server/monitor.c b/server/monitor.c
index 3e3eec9..1a7fa45 100644
--- a/server/monitor.c
+++ b/server/monitor.c
@@ -2018,7 +2018,7 @@ init_sensors_monitor(void)
 /* ======================================================= */
 static time_t	base_uptime,
 				up_seconds;
-static gulong	up_minutes = -1;
+static glong	up_minutes = -1;
 
 void
 gkrellm_uptime_set_base_uptime(time_t base)
@@ -2029,16 +2029,16 @@ gkrellm_uptime_set_base_uptime(time_t base)
 static void
 update_uptime(GkrellmdMonitor *mon, gboolean first_update)
 	{
-	gint	prev_up;
+	glong	prev_up;
 
 	if (GK.ten_second_tick || up_minutes < 0 || first_update)
 		{
 		prev_up = up_minutes;
 		up_seconds = gkrellm_sys_uptime_read_uptime();
 		if (up_seconds > 0)
-			up_minutes = (gint) (up_seconds / 60);
+			up_minutes = (glong) (up_seconds / 60);
 		else
-			up_minutes = (gint)(time(0) - _GK.start_time + base_uptime) / 60;
+			up_minutes = (glong)(time(0) - _GK.start_time + base_uptime) / 60;
 		if (up_minutes != prev_up)
 			gkrellmd_need_serve(mon);
 		}
@@ -2050,7 +2050,7 @@ serve_uptime_data(GkrellmdMonitor *mon, gboolean first_serve)
 	gchar	buf[128];
 
 	gkrellmd_set_serve_name(mon, "uptime");
-	snprintf(buf, sizeof(buf), "%lu\n", (gulong) up_minutes);
+	snprintf(buf, sizeof(buf), "%ld\n", (glong) (up_minutes >= 0 ? up_minutes : 0));
 	gkrellmd_serve_data(mon, buf);
 	}
 
diff --git a/shared/log.c b/shared/log.c
index 44a429c..6d47993 100644
--- a/shared/log.c
+++ b/shared/log.c
@@ -92,7 +92,7 @@ gkrellm_log_file_cleanup()
 	}
 
 static void
-gkrellm_log_file_log(GLogLevelFlags log_level, const gchar *message)
+gkrellm_log_file_log(G_GNUC_UNUSED GLogLevelFlags log_level, const gchar *message)
 	{
 	time_t raw_time;
 	char *local_time_str;
@@ -160,11 +160,11 @@ gkrellm_log_to_terminal(GLogLevelFlags log_level, const gchar *message)
 
 //! Handler that receives all the log-messages first
 static void
-gkrellm_log_handler(const gchar *log_domain, GLogLevelFlags log_level,
-	const gchar *message, gpointer user_data)
+gkrellm_log_handler(G_GNUC_UNUSED const gchar *log_domain, GLogLevelFlags log_level,
+	const gchar *message, G_GNUC_UNUSED gpointer user_data)
 	{
 	gchar *localized_message;
-	gint i;
+	guint i;
 	GkrellmLogFacility *f;
 
 	localized_message = g_locale_from_utf8(message, -1, NULL, NULL, NULL);
@@ -206,7 +206,7 @@ gkrellm_log_init()
 void
 gkrellm_log_cleanup()
 	{
-	gint i;
+	guint i;
 	GkrellmLogFacility *f;
 
 	if (!s_log_facility_ptr_array)
@@ -231,7 +231,7 @@ gkrellm_log_register(
 	GkrellmLogCleanupFunc cleanup)
 	{
 	GkrellmLogFacility *f;
-	gint i;
+	guint i;
 
 	if (!s_log_facility_ptr_array)
 		return FALSE; // gkrellm_log_init() not called yet
@@ -260,7 +260,7 @@ gkrellm_log_register(
 gboolean
 gkrellm_log_unregister(GkrellmLogFunc log)
 	{
-	gint i;
+	guint i;
 	GkrellmLogFacility *f;
 
 	if (!s_log_facility_ptr_array)
diff --git a/src/battery.c b/src/battery.c
index bacd3cd..40d4198 100644
--- a/src/battery.c
+++ b/src/battery.c
@@ -382,7 +382,7 @@ estimate_battery_time_left(Battery *bat)
 			/* charging, use exponential: eta =~ 2.5 * time-constant (~=92%) */
 			eta = -2.5 * dt/60 / (log(1 - (gdouble)dp/(gdouble)(p+dp)));
 		else
-			eta = abs((gdouble)p / rate);	/* use linear */
+			eta = fabs((gdouble)p / rate);	/* use linear */
 
 #ifdef BAT_ESTIMATE_DEBUG
 		fprintf(stderr, "eta = %.2f\t", eta);
diff --git a/src/client.c b/src/client.c
index e644eba..8f9d5f8 100644
--- a/src/client.c
+++ b/src/client.c
@@ -1787,6 +1787,11 @@ read_server_setup(gint fd)
 void
 gkrellm_client_mode_disconnect(void)
 	{
+	if (client_input_id != 0)
+		{
+		gdk_input_remove(client_input_id);
+		client_input_id = 0;
+		}
 	if (client_fd >= 0)
 		{
 		gkrellm_debug(DEBUG_CLIENT, "gkrellm_client_mode_disconnect(); " \
@@ -1795,8 +1800,6 @@ gkrellm_client_mode_disconnect(void)
 		}
 	client_fd = -1;
 	server_alive = FALSE;
-	gdk_input_remove(client_input_id);
-	client_input_id = 0;
 	}
 
 static void
diff --git a/src/fs.c b/src/fs.c
index 626bc74..5db65b1 100644
--- a/src/fs.c
+++ b/src/fs.c
@@ -460,7 +460,7 @@ fs_draw_decal_text(FSmon *fs, gint value)
 	GkrellmDecal		*d;
 	GkrellmTextstyle	ts_save;
 	gchar				buf[128];
-	gint				x_off, w;
+	gint				x_off, w = 0;
 
 	if (value == 0)
 		{
@@ -810,7 +810,7 @@ fs_update(void)
 				if (fs->blocks > 2147483648LL)
 					fs->krell_factor = 1024 * 1024;
 				else if (fs->blocks > 2097152LL)
-					fs->krell_factor = 1024 * 1024;
+					fs->krell_factor = 1024;
 				else
 					fs->krell_factor = 1;
 				}
diff --git a/src/gkrellm-sysdeps.h b/src/gkrellm-sysdeps.h
index 9a0f8fc..07295fb 100644
--- a/src/gkrellm-sysdeps.h
+++ b/src/gkrellm-sysdeps.h
@@ -139,7 +139,7 @@ void	gkrellm_proc_assign_users(gint n_users);
 |      the device numbers to an identifying name.  It may also set an order
 |      value for the name to control the stacking order of the disk chart.
 |  If gkrellm_disk_assign_data_by_name() is used, then an order may be
-|      optionally specifed with gkrellm_sys_disk_order_from_name().
+|      optionally specified with gkrellm_sys_disk_order_from_name().
 |      (the default order of -1 simply appends disk charts as data for them
 |      is reported).  After this function is called for a disk, the function
 |      gkrellm_disk_subdisk_assign_data_by_name() may be called for subdisk
diff --git a/src/gui.c b/src/gui.c
index 406f2e9..68a43e6 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -1569,7 +1569,7 @@ gkrellm_save_theme_config(void)
 	gchar	*path;
 
 	/* Assume gkrellm -t is for testing and don't save theme config changes.
-	|  Similary for _GK.demo.
+	|  Similarly for _GK.demo.
 	*/
 	if (!theme_modified || _GK.command_line_theme || _GK.demo || _GK.no_config)
 		return;
diff --git a/src/krell.c b/src/krell.c
index 697c4a0..07a1a1d 100644
--- a/src/krell.c
+++ b/src/krell.c
@@ -663,7 +663,7 @@ reset_text_layer_pixmap_decal_region(GkrellmPanel *p, GkrellmDecal *d)
   |  a decal's extents.  So when scrolling, a slow Pango redraw at each scroll
   |  step can be avoided if the text string has not changed.
   |  There are a couple of limitations because it's impossible to generate a
-  |  stencil bitmask of Pango rendered text (Pango doesn't allow writting to
+  |  stencil bitmask of Pango rendered text (Pango doesn't allow writing to
   |  depth 1 and it looks at the background pixmap colors as it renders):
   |    1) A scroll text decal is not transparent and will hide any objects
   |       underneath it, so when this condition is detected, scroll drawing
diff --git a/src/mail.c b/src/mail.c
index a47cf01..51e53a6 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -814,12 +814,36 @@ tcp_shutdown(ConnInfo *conn, Mailbox *mbox, gchar *message, gboolean warn)
 static gboolean
 ssl_negotiate(ConnInfo *conn, Mailbox *mbox)
 	{
-	const SSL_METHOD	*ssl_method;
+	const SSL_METHOD	*ssl_method = NULL;
+	gchar	buf[128];
 
+#if defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+	ssl_method = TLS_client_method();
+	if (_GK.debug_level & DEBUG_MAIL)
+		{
+		format_remote_mbox_name(mbox, buf, sizeof(buf));
+		g_debug("ssl_negotiate( %s ): will use TLS client method\n", buf);
+		}
+#else
 	if (mbox->account->use_ssl == SSL_TRANSPORT)
+		{
 		ssl_method = SSLv23_client_method();
+		if (_GK.debug_level & DEBUG_MAIL)
+			{
+			format_remote_mbox_name(mbox, buf, sizeof(buf));
+			g_debug("ssl_negotiate( %s ): will use SSLv23 client method\n", buf);
+			}
+		}
 	else
+		{
 		ssl_method = TLSv1_client_method();
+		if (_GK.debug_level & DEBUG_MAIL)
+			{
+			format_remote_mbox_name(mbox, buf, sizeof(buf));
+			g_debug("ssl_negotiate( %s ): will use TLSv1 client method\n", buf);
+			}
+		}
+#endif
 	if (ssl_method == NULL)
 		return tcp_shutdown(conn, mbox,
 				    N_("Cannot initialize SSL method."),
@@ -1251,7 +1275,11 @@ check_imap(Mailbox *mbox)
 #ifdef HAVE_SSL
 	if (account->use_ssl == SSL_STARTTLS)
 		{
-		gkrellm_debug(DEBUG_MAIL, "check_imap: Issuing STARTTLS\n");
+		if (_GK.debug_level & DEBUG_MAIL)
+			{
+			format_remote_mbox_name(mbox, buf, sizeof(buf));
+			g_debug("check_imap( %s ): issuing STARTTLS\n", buf);
+			}
 		snprintf(line, sizeof(line), "a%03d STARTTLS\r\n", ++seq);
 		server_command(&conn, mbox, line);
 		snprintf(line, sizeof(line), "a%03d OK", seq);
@@ -1261,7 +1289,11 @@ check_imap(Mailbox *mbox)
 					    TRUE);
 		if (!ssl_negotiate(&conn, mbox))
 			return FALSE;
-		gkrellm_debug(DEBUG_MAIL, "check_imap: STARTTLS successful\n");
+		if (_GK.debug_level & DEBUG_MAIL)
+			{
+			format_remote_mbox_name(mbox, buf, sizeof(buf));
+			g_debug("check_imap( %s ): STARTTLS successful\n", buf);
+			}
 		}
 #endif
 
@@ -1560,7 +1592,7 @@ check_maildir(Mailbox *mbox)
   |  But, new mail arriving (writing mailbox) sets st_mtime while reading
   |  the mailbox (mail program reading) sets st_atime.  So the test
   |  st_atime > st_mtime is testing if mbox has been read since last new mail.
-  |  Mail readers may restore st_mtime after writting status.
+  |  Mail readers may restore st_mtime after writing status.
   |  And Netscape mail does status with X-Mozilla-Status: xxxS
   |    where S is bitwise or of status flags:
   |    1: read  2: replied  4: marked  8: deleted
diff --git a/src/mem.c b/src/mem.c
index 2f85935..c130aa4 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -299,7 +299,7 @@ draw_decal_label(MeminfoMeter *mm, gint draw_to_screen)
 	GkrellmDecal		*d;
 	GkrellmTextstyle	ts_save;
 	gchar				buf[128];
-	gint				x_off, w;
+	gint				x_off, w = 0;
 
 	d = mm->decal_label;
 	if (! mm->label_is_data)
diff --git a/src/proc.c b/src/proc.c
index a813066..80887b6 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -347,7 +347,7 @@ setup_proc_scaling(void)
 
 	res = gkrellm_get_chartconfig_grid_resolution(cp->config);
 
-	/* Since grid_resolution is set for load, set krell_full_scale explicitely
+	/* Since grid_resolution is set for load, set krell_full_scale explicitly
 	|  to get what I want, which is 10 forks full scale.
 	|  When res or number of grids is changed, scale all fork data to keep a
 	|  fixed 50 forks/sec max on the chart.
diff --git a/src/sensors.c b/src/sensors.c
index 9482874..80a43e7 100644
--- a/src/sensors.c
+++ b/src/sensors.c
@@ -1669,7 +1669,7 @@ gkrellm_init_sensor_monitor(void)
   |  to composite CPU on a SMP machine.
   |
   |  2.1.15 scales sensor factor/offset values by SENSOR_FLOAT_FACTOR to avoid
-  |  writting decimal points in the config.  This is not backwards compatible
+  |  writing decimal points in the config.  This is not backwards compatible
   |  with the pre 2.1.15 sensor_config format hence the config file name
   |  change to sensor-config.  But sensor_config is forward compatible
   |  since the float factor defaults to 1.0.
diff --git a/src/sysdeps/linux.c b/src/sysdeps/linux.c
index c82dfaf..921cf63 100644
--- a/src/sysdeps/linux.c
+++ b/src/sysdeps/linux.c
@@ -556,6 +556,8 @@ gkrellm_sys_disk_order_from_name(const gchar *name)
 		}
 	if (i >= table_size)
 		i = -1;
+	if (i > 9) /* > hda */
+		i += (i - 10) * 16 + suffix - dm->suffix_base;
 	return i;
 	}
 
@@ -1523,7 +1525,7 @@ gkrellm_sys_fs_get_mounts_list(void)
 	while (fgets(buf, sizeof(buf), f))
 		{
 		dev[0] = dir[0] = type[0] = '\0';
-		sscanf(buf, "%512s %512s %127s", dev, dir, type);
+		sscanf(buf, "%511s %511s %127s", dev, dir, type);
 		fix_fstab_name(dev);
 		fix_fstab_name(dir);
 		fix_fstab_name(type);
@@ -3155,6 +3157,7 @@ sensors_nvidia_smi_read(gboolean setup)
 				    || !strcmp(id, ":")
 				   )
 					continue;
+				stmp = str;
 				if ((str = g_strstr_len(str, -1, "Temperature")) != NULL)
 					{
 					str += 11;
@@ -3183,6 +3186,10 @@ sensors_nvidia_smi_read(gboolean setup)
 					else if ((smi = nvidia_smi_lookup(id)) != NULL)
 						smi->temp = temp;
 					}
+				else
+					{
+					str = stmp;
+					}
 				}
 			}
 	if (output)
@@ -4029,7 +4036,7 @@ gkrellm_sys_sensors_init(void)
 
 	sensors_nvidia_smi_read(TRUE);
 
-	/* nvidia-settings GPU core & ambient temperatues
+	/* nvidia-settings GPU core & ambient temperatures
 	*/
 	cnt = sensors_nvidia_settings_ngpus();
 	ngpus_added = 0;
diff --git a/src/utils.c b/src/utils.c
index f6162e9..0190ed8 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -276,13 +276,17 @@ gkrellm_format_size_abbrev(gchar *buf, size_t buflen, gfloat size,
 	{
 	gfloat	abs_size;
 	gint	i;
+	int		ret;
 
 	abs_size = (size < 0.0) ? -size : size;
 
 	for (i = 0; i < tbl_size - 1; ++i)
 		if (abs_size < tbl[i].limit)
 			break;
-	return snprintf(buf, buflen, tbl[i].format, size / tbl[i].divisor);
+	ret = snprintf(buf, buflen, tbl[i].format, size / tbl[i].divisor);
+	if (ret < 0 || ret >= buflen)
+		return 0;
+	return ret;
 	}
 
 
@@ -366,7 +370,8 @@ gkrellm_text_extents(PangoFontDescription *font_desc, gchar *text,
 	else
 		{
 		utf8 = g_locale_to_utf8(text, -1, NULL, NULL, NULL);
-		pango_layout_set_text(layout, utf8, len);
+		if (utf8)
+			pango_layout_set_text(layout, utf8, len);
 		g_free(utf8);
 		}
 	iter = pango_layout_get_iter(layout);
@@ -456,7 +461,8 @@ gkrellm_gdk_draw_text(GdkDrawable *drawable, PangoFontDescription *font_desc,
 
 	layout = gtk_widget_create_pango_layout(gkrellm_get_top_window(), NULL);
 	pango_layout_set_font_description(layout, font_desc);
-	pango_layout_set_text(layout, string, len);
+	if (g_utf8_validate(string, -1, NULL))
+		pango_layout_set_text(layout, string, len);
 	gdk_draw_layout(drawable, gc, x, y, layout);
 	g_object_unref(layout);
 	}