diff --git a/src/load-graph.cpp b/src/load-graph.cpp
index 79700d4..36470b6 100644
--- a/src/load-graph.cpp
+++ b/src/load-graph.cpp
@@ -126,7 +126,11 @@ void draw_background(LoadGraph *g) {
 			cairo_show_text (cr, caption.c_str());
 		} else {
 			// operation orders matters so it's 0 if i == num_bars
-			caption = g_strdup_printf("%d %%", 100 - i * (100 / num_bars));
+			guint max = 100;
+			if (g->type == LOAD_GRAPH_CPU) {
+				max = 100 * g->n;
+			}
+			caption = g_strdup_printf("%d %%", max - i * (max / num_bars));
 			cairo_text_extents (cr, caption, &extents);
 			cairo_move_to (cr, g->indent - extents.width + 20, y);
 			cairo_show_text (cr, caption);
@@ -209,7 +213,8 @@ load_graph_expose (GtkWidget *widget,
 	GtkAllocation allocation;
 	GdkWindow *window;
 
-	guint i, j;
+	guint i;
+	gint j;
 	gdouble sample_width, x_offset;
 
 	if (g->background == NULL) {
@@ -245,8 +250,13 @@ load_graph_expose (GtkWidget *widget,
 			 g->draw_width - g->rmargin - g->indent - 1, g->real_draw_height + FRAME_WIDTH - 1);
 	cairo_clip(cr);
 
-	for (j = 0; j < g->n; ++j) {
-		cairo_move_to (cr, x_offset, (1.0f - g->data[0][j]) * g->real_draw_height);
+	bool drawStacked = g->type == LOAD_GRAPH_CPU;
+	for (j = g->n-1; j >= 0; j--) {
+		if (drawStacked) {
+			cairo_move_to (cr, x_offset, g->real_draw_height);
+		} else {
+			cairo_move_to (cr, x_offset, (1.0f - g->data[0][j]) * g->real_draw_height);
+		}
 		gdk_cairo_set_source_color (cr, &(g->colors [j]));
 
 		for (i = 1; i < LoadGraph::NUM_POINTS; ++i) {
@@ -260,7 +270,12 @@ load_graph_expose (GtkWidget *widget,
 				       x_offset - (i * g->graph_delx),
 				       (1.0f - g->data[i][j]) * g->real_draw_height + 3.5f);
 		}
-		cairo_stroke (cr);
+		if (drawStacked) {
+			cairo_rel_line_to (cr, x_offset - ((LoadGraph::NUM_POINTS + 1.0f) * g->graph_delx), g->real_draw_height);
+			cairo_fill(cr);
+		} else {
+			cairo_stroke(cr);
+		}
 
 	}
 
@@ -308,7 +323,11 @@ get_load (LoadGraph *g)
 		used  = NOW[i][CPU_USED]  - LAST[i][CPU_USED];
 
 		load = used / MAX(total, 1.0f);
-		g->data[0][i] = load;
+
+		g->data[0][i] = load / g->n;
+		if (i > 0) {
+			g->data[0][i] += g->data[0][i-1];
+		}
 
 		/* Update label */
 		text = g_strdup_printf("%.1f%%", load * 100.0f);
