Index: /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/ElevationProfileBase.java
===================================================================
--- /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/ElevationProfileBase.java	(revision 23763)
+++ /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/ElevationProfileBase.java	(revision 23764)
@@ -63,6 +63,4 @@
 	private int gain;
 	private int lastEle;
-	private WayPoint lastWayPoint;
-
 	private static boolean ignoreZeroHeight = true;
 
@@ -495,11 +493,4 @@
 			lastEle = ele;			
 		}
-		
-		/*
-		if (lastWayPoint != null) {
-			double d = wp.getCoor().greatCircleDistance(lastWayPoint.getCoor());
-			dist += d;
-		}*/
-		lastWayPoint = wp;
 	}
 }
Index: /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/ElevationWayPointKind.java
===================================================================
--- /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/ElevationWayPointKind.java	(revision 23763)
+++ /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/ElevationWayPointKind.java	(revision 23764)
@@ -28,5 +28,6 @@
 	ElevationGain,		// Elevation gain
 	ElevationLoss,		// Elevation loss	
-	ElevationLevel,		// Elevation level (e. g. crossed 300m)
+	ElevationLevelGain,		// Elevation level gain (e. g. crossed 300m from lower elevation)
+	ElevationLevelLoss,		// Elevation level (e. g. crossed 300m from higher elevation)
 	FullHour			// Full Hour	
 }
Index: /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/DefaultElevationProfileRenderer.java
===================================================================
--- /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/DefaultElevationProfileRenderer.java	(revision 23763)
+++ /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/DefaultElevationProfileRenderer.java	(revision 23764)
@@ -54,5 +54,5 @@
 	private static final int REGULAR_WPT_RADIUS = BASIC_WPT_RADIUS * 4;
 	private static final int BIG_WPT_RADIUS = BASIC_WPT_RADIUS * 10;
-	
+
 	// predefined colors
 	private static final Color HIGH_COLOR = ElevationColors.EPMidBlue;
@@ -65,5 +65,5 @@
 	// private static final double RAD_270 = Math.PI * 1.5;
 	private static final double RAD_90 = Math.PI * 0.5;
-	
+
 	private List<Rectangle> forbiddenRects = new ArrayList<Rectangle>();
 
@@ -91,5 +91,6 @@
 		switch (kind) {
 		case Plain:
-		case ElevationLevel:
+		case ElevationLevelLoss:
+		case ElevationLevelGain:
 			if (z > profile.getAverageHeight()) {
 				return HIGH_COLOR;
@@ -109,5 +110,5 @@
 		case MinElevation:
 			return LOW_COLOR;
-		
+
 		case StartPoint:
 			return START_COLOR;
@@ -179,27 +180,40 @@
 
 		Point pnt = mv.getPoint(wpt.getEastNorth());
-
+		int ele = ((int) Math.rint(WayPointHelper.getElevation(wpt) / 100.0)) * 100;
+		
 		int rad = REGULAR_WPT_RADIUS;
 		g.setColor(c);
-		//g.drawOval(pnt.x - rad, pnt.y - rad, r2, r2);
+		// g.drawOval(pnt.x - rad, pnt.y - rad, r2, r2);
 		drawSphere(g, Color.WHITE, c, pnt.x, pnt.y, rad);
+
+		if (kind == ElevationWayPointKind.FullHour) {
+			int hour = WayPointHelper.getHourOfWayPoint(wpt);
+			drawLabel(String.format("%02d:00", hour), pnt.x, pnt.y
+					+ g.getFontMetrics().getHeight(), g);
+		}
+
+		if (kind == ElevationWayPointKind.ElevationLevelGain) {
+			drawLabelWithTriangle(String.format("%dm", ele), pnt.x, pnt.y
+					+ g.getFontMetrics().getHeight(), g, c, 8, 
+					getColorForWaypoint(profile, wpt, ElevationWayPointKind.ElevationGain),
+					TriangleDir.Up);
+		}
 		
-		if (kind == ElevationWayPointKind.FullHour) {
-			int hour = WayPointHelper.getHourOfWayPoint(wpt);			
-			drawLabel(String.format("%02d:00", hour), pnt.x, pnt.y + g.getFontMetrics().getHeight(), g);
-		}
-		
-		if (kind == ElevationWayPointKind.ElevationLevel) {
-			int ele = ((int)Math.rint(WayPointHelper.getElevation(wpt) / 100.0)) * 100;						
-			drawLabel(String.format("%dm", ele), pnt.x, pnt.y + g.getFontMetrics().getHeight(), g, c);
-		}
-		
+		if (kind == ElevationWayPointKind.ElevationLevelLoss) {
+			drawLabelWithTriangle(String.format("%dm", ele), pnt.x, pnt.y
+					+ g.getFontMetrics().getHeight(), g, c, 8, 
+					getColorForWaypoint(profile, wpt, ElevationWayPointKind.ElevationLoss),
+					TriangleDir.Down);
+		}
+
 		if (kind == ElevationWayPointKind.Highlighted) {
 			int eleH = (int) WayPointHelper.getElevation(wpt);
-			int hour = WayPointHelper.getHourOfWayPoint(wpt);			
+			int hour = WayPointHelper.getHourOfWayPoint(wpt);
 			int min = WayPointHelper.getMinuteOfWayPoint(wpt);
 			drawSphere(g, Color.WHITE, c, pnt.x, pnt.y, BIG_WPT_RADIUS);
-			drawLabel(String.format("%02d:%02d", hour, min), pnt.x, pnt.y - g.getFontMetrics().getHeight() - 5, g);
-			drawLabel(String.format("%dm", eleH), pnt.x, pnt.y + g.getFontMetrics().getHeight() + 5, g);
+			drawLabel(String.format("%02d:%02d", hour, min), pnt.x, pnt.y
+					- g.getFontMetrics().getHeight() - 5, g);
+			drawLabel(String.format("%dm", eleH), pnt.x, pnt.y
+					+ g.getFontMetrics().getHeight() + 5, g);
 		}
 	}
@@ -245,12 +259,13 @@
 		}
 
-		paintRegularTriangle(g, c, td, pnt.x, pnt.y,
+		drawRegularTriangle(g, c, td, pnt.x, pnt.y,
 				DefaultElevationProfileRenderer.TRIANGLE_BASESIZE);
 
-		drawLabel(String.format("%dm", eleH), pnt.x, pnt.y + g.getFontMetrics().getHeight(), g, c);
-	}
-
-	/**
-	 * Draw a regular triangle.
+		drawLabel(String.format("%dm", eleH), pnt.x, pnt.y
+				+ g.getFontMetrics().getHeight(), g, c);
+	}
+
+	/**
+	 * Draws a regular triangle.
 	 * 
 	 * @param g
@@ -267,5 +282,5 @@
 	 *            The side length in pixel of the triangle.
 	 */
-	private void paintRegularTriangle(Graphics g, Color c, TriangleDir dir,
+	private void drawRegularTriangle(Graphics g, Color c, TriangleDir dir,
 			int x, int y, int baseLength) {
 		if (baseLength < 2)
@@ -387,58 +402,131 @@
 	/**
 	 * Draws a label.
-	 * @param s The text to draw.
-	 * @param x The x coordinate of the label.
-	 * @param y The y coordinate of the label.
-	 * @param g The graphics context.
+	 * 
+	 * @param s
+	 *            The text to draw.
+	 * @param x
+	 *            The x coordinate of the label.
+	 * @param y
+	 *            The y coordinate of the label.
+	 * @param g
+	 *            The graphics context.
 	 */
 	private void drawLabel(String s, int x, int y, Graphics g) {
-		drawLabel(s, x, y, g, Color.BLACK);
-	}
+		drawLabel(s, x, y, g, Color.GRAY);
+	}
+
 	/**
 	 * Draws a label.
-	 * @param s The text to draw.
-	 * @param x The x coordinate of the label.
-	 * @param y The y coordinate of the label.
-	 * @param g The graphics context.
-	 * @param secondGradColor The second color of the gradient.
-	 */
-	private void drawLabel(String s, int x, int y, Graphics g, Color secondGradColor) {
+	 * 
+	 * @param s
+	 *            The text to draw.
+	 * @param x
+	 *            The x coordinate of the label.
+	 * @param y
+	 *            The y coordinate of the label.
+	 * @param g
+	 *            The graphics context.
+	 * @param secondGradColor
+	 *            The second color of the gradient.
+	 */
+	private void drawLabel(String s, int x, int y, Graphics g,
+			Color secondGradColor) {
 		Graphics2D g2d = (Graphics2D) g;
 
 		int width = g.getFontMetrics(g.getFont()).stringWidth(s) + 10;
+		int height = g.getFont().getSize() + g.getFontMetrics().getLeading()
+				+ 5;
+
+		Rectangle r = new Rectangle(x - (width / 2), y - (height / 2), width,
+				height);
+
+		if (isForbiddenArea(r)) {
+			return; // no space left, skip this label
+		}
+
+		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+				RenderingHints.VALUE_ANTIALIAS_ON);
+		GradientPaint gradient = new GradientPaint(x, y, Color.WHITE, x, y
+				+ (height / 2), secondGradColor, false);
+		g2d.setPaint(gradient);
+
+		g2d.fillRoundRect(r.x, r.y, r.width, r.height, ROUND_RECT_RADIUS,
+				ROUND_RECT_RADIUS);
+
+		g2d.setColor(Color.BLACK);
+
+		g2d.drawRoundRect(r.x, r.y, r.width, r.height, ROUND_RECT_RADIUS,
+				ROUND_RECT_RADIUS);
+		g2d.drawString(s, x - (width / 2) + 5, y + (height / 2) - 3);
+
+		forbiddenRects.add(r);
+	}
+
+	/**
+	 * Draws a label with an additional triangle on the left side.
+	 * 
+	 * @param s
+	 *            The text to draw.
+	 * @param x
+	 *            The x coordinate of the label.
+	 * @param y
+	 *            The y coordinate of the label.
+	 * @param g
+	 *            The graphics context.
+	 * @param secondGradColor
+	 *            The second color of the gradient.
+	 * @param baseLength
+	 *            The base length of the triangle in pixels.
+	 * @param triangleColor
+	 *            The color of the triangle.
+	 * @param triangleDir
+	 *            The direction of the triangle.
+	 */
+	private void drawLabelWithTriangle(String s, int x, int y, Graphics g,
+			Color secondGradColor, int baseLength, Color triangleColor,
+			TriangleDir triangleDir) {
+		Graphics2D g2d = (Graphics2D) g;
+
+		int width = g.getFontMetrics(g.getFont()).stringWidth(s) + 10 + baseLength + 5;
 		int height = g.getFont().getSize() + g.getFontMetrics().getLeading() + 5;
 
 		Rectangle r = new Rectangle(x - (width / 2), y - (height / 2), width, height);
-		
-		if (isForbiddenArea(r)) { 
+
+		if (isForbiddenArea(r)) {
 			return; // no space left, skip this label
 		}
-		
+
 		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-				RenderingHints.VALUE_ANTIALIAS_ON);		
+				RenderingHints.VALUE_ANTIALIAS_ON);
 		GradientPaint gradient = new GradientPaint(x, y, Color.WHITE, x, y
-				+ (height/2), secondGradColor, false);
-		g2d.setPaint(gradient);		
-
-		
-		g2d.fillRoundRect(r.x, r.y, r.width, r.height, ROUND_RECT_RADIUS, ROUND_RECT_RADIUS);
-		
+				+ (height / 2), secondGradColor, false);
+		g2d.setPaint(gradient);
+
+		g2d.fillRoundRect(r.x, r.y, r.width, r.height, ROUND_RECT_RADIUS,
+				ROUND_RECT_RADIUS);
+
 		g2d.setColor(Color.BLACK);
-		
-		g2d.drawRoundRect(r.x, r.y, r.width, r.height, ROUND_RECT_RADIUS, ROUND_RECT_RADIUS);		
-		g2d.drawString(s, x - (width / 2) + 5, y + (height / 2) - 3);
-		
+
+		g2d.drawRoundRect(r.x, r.y, r.width, r.height, ROUND_RECT_RADIUS,
+				ROUND_RECT_RADIUS);
+		g2d.drawString(s, x - (width / 2) + 8 + baseLength, y + (height / 2) - 3);
+		drawRegularTriangle(g2d, triangleColor, triangleDir, r.x + baseLength,
+				r.y + baseLength, baseLength);
+
 		forbiddenRects.add(r);
 	}
-	
+
 	/**
 	 * Checks, if the rectangle has been 'reserved' by a previous draw action.
-	 * @param r The area to check for.
+	 * 
+	 * @param r
+	 *            The area to check for.
 	 * @return true; if area is already occupied by another rectangle.
 	 */
 	private boolean isForbiddenArea(Rectangle r) {
-		
+
 		for (Rectangle rTest : forbiddenRects) {
-			if (r.intersects(rTest)) return true;
+			if (r.intersects(rTest))
+				return true;
 		}
 		return false;
@@ -452,5 +540,5 @@
 	@Override
 	public void finishRendering() {
-		// nothing to do currently		
+		// nothing to do currently
 	}
 }
Index: /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfileLayer.java
===================================================================
--- /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfileLayer.java	(revision 23763)
+++ /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfileLayer.java	(revision 23764)
@@ -170,9 +170,16 @@
 					int ele1 = (int)(ele / 100.0);
 					int ele2 = (int)(lastEle / 100.0);
-					if (ele1 != ele2) { // hour changed?
-						renderer.renderWayPoint(g, profile, mv, wpt,
-								ElevationWayPointKind.ElevationLevel);
-					} else { // check for elevation gain
-						if (ele > lastEle) {
+					
+					// Check, if we passed an elevation level
+					if (ele1 != ele2 && Math.abs(ele1 - ele2) == 1) { 
+						if (ele1 > ele2) { // we went down?
+							renderer.renderWayPoint(g, profile, mv, wpt,
+								ElevationWayPointKind.ElevationLevelGain);
+						} else {
+							renderer.renderWayPoint(g, profile, mv, wpt,
+									ElevationWayPointKind.ElevationLevelLoss);
+						}
+					} else { // check for elevation gain or loss
+						if (ele > lastEle) { // we went down?
 							renderer.renderWayPoint(g, profile, mv, wpt,
 									ElevationWayPointKind.ElevationGain);
Index: /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfilePanel.java
===================================================================
--- /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfilePanel.java	(revision 23763)
+++ /applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfilePanel.java	(revision 23764)
@@ -5,5 +5,4 @@
 import java.awt.Color;
 import java.awt.Dimension;
-import java.awt.Event;
 import java.awt.Font;
 import java.awt.FontMetrics;
@@ -13,5 +12,4 @@
 import java.awt.event.ComponentListener;
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.text.Format;
