diff --git a/rsvg-css.c b/rsvg-css.c
index 3ffbaa2..0a726de 100644
--- a/rsvg-css.c
+++ b/rsvg-css.c
@@ -204,6 +204,7 @@ _rsvg_css_parse_length (const char *str)
     return out;
 }
 
+/* Recursive evaluation of all parent elements regarding absolute font size */
 double
 _rsvg_css_normalize_font_size (RsvgState * state, RsvgDrawingCtx * ctx)
 {
@@ -263,6 +264,27 @@ _rsvg_css_normalize_length (const RsvgLength * in, RsvgDrawingCtx * ctx, char di
     return 0;
 }
 
+/* Recursive evaluation of all parent elements regarding basline-shift */
+double
+_rsvg_css_baseline_shift (RsvgState * state, RsvgDrawingCtx * ctx)
+{
+    RsvgState *parent;
+    double shift = 0.;
+    
+    parent = rsvg_state_parent (state);
+    if (parent != NULL) {
+        if(state->has_baseline_shift == TRUE) {
+            double parent_font_size;
+            parent_font_size = _rsvg_css_normalize_font_size (parent, ctx); // font size from here
+            shift = parent_font_size * state->baseline_shift;
+	}
+        shift += _rsvg_css_baseline_shift(parent, ctx); // baseline-shift for parent element
+    }
+    
+    return shift;
+}
+
+
 double
 _rsvg_css_hand_normalize_length (const RsvgLength * in, gdouble pixels_per_inch,
                                  gdouble width_or_height, gdouble font_size)
diff --git a/rsvg-private.h b/rsvg-private.h
index 651e2f6..9bd8869 100644
--- a/rsvg-private.h
+++ b/rsvg-private.h
@@ -391,6 +391,8 @@ double _rsvg_css_hand_normalize_length  (const RsvgLength * in, gdouble pixels_p
                                          gdouble width_or_height, gdouble font_size);
 double _rsvg_css_normalize_font_size    (RsvgState * state, RsvgDrawingCtx * ctx);
 G_GNUC_INTERNAL
+double _rsvg_css_baseline_shift (RsvgState * state, RsvgDrawingCtx * ctx);
+G_GNUC_INTERNAL
 RsvgLength _rsvg_css_parse_length (const char *str);
 G_GNUC_INTERNAL
 void _rsvg_push_view_box    (RsvgDrawingCtx * ctx, double w, double h);
diff --git a/rsvg-styles.c b/rsvg-styles.c
index 1247fa4..1f58c8c 100644
--- a/rsvg-styles.c
+++ b/rsvg-styles.c
@@ -119,6 +119,7 @@ rsvg_state_init (RsvgState * state)
     state->mask = NULL;
     state->opacity = 0xff;
     state->adobe_blend = 0;
+    state->baseline_shift = 0.;
     state->fill = rsvg_paint_server_parse (NULL, NULL, "#000", 0);
     state->fill_opacity = 0xff;
     state->stroke_opacity = 0xff;
@@ -154,6 +155,7 @@ rsvg_state_init (RsvgState * state)
     state->middleMarker = NULL;
     state->endMarker = NULL;
 
+    state->has_baseline_shift = FALSE;
     state->has_current_color = FALSE;
     state->has_flood_color = FALSE;
     state->has_flood_opacity = FALSE;
@@ -248,6 +250,8 @@ rsvg_state_inherit_run (RsvgState * dst, const RsvgState * src,
 {
     gint i;
 
+    if (function (dst->has_baseline_shift, src->has_baseline_shift))
+        dst->baseline_shift = src->baseline_shift;
     if (function (dst->has_current_color, src->has_current_color))
         dst->current_color = src->current_color;
     if (function (dst->has_flood_color, src->has_flood_color))
@@ -519,7 +523,21 @@ rsvg_parse_style_pair (RsvgHandle * ctx,
             state->adobe_blend = 0;
     } else if (g_str_equal (name, "mask"))
         state->mask = rsvg_mask_parse (ctx->priv->defs, value);
-    else if (g_str_equal (name, "clip-path")) {
+    else if (g_str_equal (name, "baseline-shift")) {
+        if (g_str_equal (value, "sub")) {
+           state->baseline_shift = -0.2; // Compare with inkscape SP_CSS_BASELINE_SHIFT_(SUB/SUPER/BASELINE)
+           state->has_baseline_shift = TRUE;
+	} else if (g_str_equal (value, "super")) {
+           state->has_baseline_shift = TRUE;
+           state->baseline_shift = 0.4;
+	} else if (g_str_equal (value, "baseline")) {
+           state->has_baseline_shift = TRUE;
+           state->baseline_shift = 0.;
+	} else {
+          g_warning("value \'%s\' for attribute \'basline-shift\' not supported\n", value);
+	}
+	
+    } else if (g_str_equal (name, "clip-path")) {
         state->clip_path_ref = rsvg_clip_path_parse (ctx->priv->defs, value);
     } else if (g_str_equal (name, "overflow")) {
         if (!g_str_equal (value, "inherit")) {
@@ -864,6 +882,7 @@ void
 rsvg_parse_style_pairs (RsvgHandle * ctx, RsvgState * state, RsvgPropertyBag * atts)
 {
     rsvg_lookup_parse_style_pair (ctx, state, "a:adobe-blending-mode", atts);
+    rsvg_lookup_parse_style_pair (ctx, state, "baseline-shift", atts);
     rsvg_lookup_parse_style_pair (ctx, state, "clip-path", atts);
     rsvg_lookup_parse_style_pair (ctx, state, "clip-rule", atts);
     rsvg_lookup_parse_style_pair (ctx, state, "color", atts);
diff --git a/rsvg-styles.h b/rsvg-styles.h
index e5ae5d2..ebf4ae1 100644
--- a/rsvg-styles.h
+++ b/rsvg-styles.h
@@ -85,6 +85,8 @@ struct _RsvgState {
     guint8 adobe_blend;         /* 0..11 */
     guint8 opacity;             /* 0..255 */
 
+    double baseline_shift;
+    gboolean has_baseline_shift;
     RsvgPaintServer *fill;
     gboolean has_fill_server;
     guint8 fill_opacity;        /* 0..255 */
diff --git a/rsvg-text.c b/rsvg-text.c
index 9bd2fe3..e520641 100644
--- a/rsvg-text.c
+++ b/rsvg-text.c
@@ -163,6 +163,7 @@ static void
                             gdouble * x, gdouble * y, gboolean * lastwasspace,
                             gboolean usetextonly);
 
+/* This function is responsible of selecting render for a text element including its children and giving it the drawing context */
 static void
 _rsvg_node_text_type_children (RsvgNode * self, RsvgDrawingCtx * ctx,
                                gdouble * x, gdouble * y, gboolean * lastwasspace,
@@ -567,7 +568,8 @@ rsvg_text_render_text (RsvgDrawingCtx * ctx, const char *text, gdouble * x, gdou
     PangoLayout *layout;
     PangoLayoutIter *iter;
     RsvgState *state;
-    gint w, h, offsetX, offsetY;
+    gint w, h;
+    double offsetX, offsetY, offset;
 
     state = rsvg_current_state (ctx);
 
@@ -579,12 +581,14 @@ rsvg_text_render_text (RsvgDrawingCtx * ctx, const char *text, gdouble * x, gdou
     layout = rsvg_text_create_layout (ctx, state, text, context);
     pango_layout_get_size (layout, &w, &h);
     iter = pango_layout_get_iter (layout);
+    offset = pango_layout_iter_get_baseline (iter) / (double)PANGO_SCALE;
+    offset += _rsvg_css_baseline_shift (state, ctx);
     if (PANGO_GRAVITY_IS_VERTICAL (state->text_gravity)) {
-        offsetX = -pango_layout_iter_get_baseline (iter) / (double)PANGO_SCALE;
+        offsetX = -offset;
         offsetY = 0;
     } else {
         offsetX = 0;
-        offsetY = pango_layout_iter_get_baseline (iter) / (double)PANGO_SCALE;
+        offsetY = offset;
     }
     pango_layout_iter_free (iter);
     ctx->render->render_pango_layout (ctx, layout, *x - offsetX, *y - offsetY);
