diff --git a/include/denemo/denemo_objects.h b/include/denemo/denemo_objects.h
index 0643ab3..f58780f 100644
--- a/include/denemo/denemo_objects.h
+++ b/include/denemo/denemo_objects.h
@@ -128,6 +128,7 @@ typedef struct chord
   gboolean is_tied;
   gboolean is_stemup;
   gboolean is_reversealigned;
+  gint stem_directive;/**< if not 0 then start of auto stemming/stems up/stems down */
   gboolean slur_begin_p; /**< Is this note a beginning of a slur? */
   gboolean slur_end_p; /**< Is this note an end of a slur? */
   gboolean crescendo_begin_p;
diff --git a/src/callbacks.h b/src/callbacks.h
index 3b71e9c..aced21b 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -380,6 +380,13 @@ stem_down (gui);
 displayhelper (gui);
   score_status(gui, TRUE);
 }
+/*StemAuto stem_auto*/
+static void stem_auto_cb (GtkAction *action, gpointer param) {
+  DenemoGUI *gui = Denemo.gui;
+stem_auto (gui);
+displayhelper (gui);
+  score_status(gui, TRUE);
+}
 /*AddDot add_dot_key*/
 static void add_dot_key_cb (GtkAction *action, gpointer param) {
   DenemoGUI *gui = Denemo.gui;
diff --git a/src/contexts.c b/src/contexts.c
index 5a2a735..95ef645 100644
--- a/src/contexts.c
+++ b/src/contexts.c
@@ -139,11 +139,26 @@ find_leftmost_staffcontext (DenemoStaff * curstaffstruct, DenemoScore * si)
     {
       curstaffstruct->leftmost_timesig = &curstaffstruct->timesig;
     }
+
+#if 0
+
+!!!!!!!!!!!!!!!!!! if STEMDIRECTIVE find a CHORD with non zero stemdirective...
   if ((obj = find_measure_context (leftmeasure, STEMDIRECTIVE)))
     curstaffstruct->leftmost_stem_directive =
       ((stemdirective *) obj->object)->type;
   else
     curstaffstruct->leftmost_stem_directive = DENEMO_STEMBOTH;
+!!!!!!!!!!!!!!!!!!!
+#else
+
+
+
+  curstaffstruct->leftmost_stem_directive = DENEMO_STEMBOTH;
+  if ((obj = find_measure_context (leftmeasure, CHORD))
+      && ((chord*) obj->object)->stem_directive)
+    curstaffstruct->leftmost_stem_directive =
+      ((chord*) obj->object)->stem_directive;
+#endif
 }
 
 /**
diff --git a/src/draw.c b/src/draw.c
index c2b93dc..7f2a109 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -217,6 +217,8 @@ draw_object (objnode * curobj, gint x, gint y,
     {
     case CHORD:
       { chord *thechord = ((chord *) mudelaitem->object);
+	if(thechord->stem_directive)
+	  itp->stem_directive = thechord->stem_directive;
        if (thechord->is_figure && thechord->figure)
       //if (thechord->is_figure)
 	//draw_figure (gui->pixmap, itp->gc,
diff --git a/src/entries.h b/src/entries.h
index 71a9aca..e10ca51 100644
--- a/src/entries.h
+++ b/src/entries.h
@@ -59,8 +59,9 @@
 {"RemoveNoteFromChord", NULL, N_("Remove note"), NULL,N_("Remove a note from the current chord"),G_CALLBACK (remove_tone_key_cb)},
 {"Sharpen", NULL, N_("Sharpen"), NULL,N_("No Tooltip yet"),G_CALLBACK (sharpen_key_cb)},
 {"Flatten", NULL, N_("Flatten"), NULL,N_("No Tooltip yet"),G_CALLBACK (flatten_key_cb)},
-{"StemUp", NULL, N_("StemUp"), NULL,N_("Alters a StemNeutral object to stem up."),G_CALLBACK (stem_up_cb)},
-{"StemDown", NULL, N_("StemDown"), NULL,N_("Alters a StemNeutral object to stem down."),G_CALLBACK (stem_down_cb)},
+{"StemUp", NULL, N_("StemUp"), NULL,N_("Starts up stemming display from this chord."),G_CALLBACK (stem_up_cb)},
+{"StemDown", NULL, N_("StemDown"), NULL,N_("Starts down stemming display from this chord."),G_CALLBACK (stem_down_cb)},
+{"StemAuto", NULL, N_("StemAuto"), NULL,N_("Starts auto stemming display from this chord."),G_CALLBACK (stem_auto_cb)},
 {"AddDot", NULL, N_("Add Dot"), NULL,N_("No Tooltip yet"),G_CALLBACK (add_dot_key_cb)},
 {"RemoveDot", NULL, N_("Remove Dot"), NULL,N_("No Tooltip yet"),G_CALLBACK (remove_dot_key_cb)},
 {"InsertTiedNote", NULL, N_("Tied note"), NULL,N_("Inserts a duplicate of the current note, tied"),G_CALLBACK (tie_notes_key_cb)},
diff --git a/src/generate_source.c b/src/generate_source.c
index b37786b..4545d5a 100644
--- a/src/generate_source.c
+++ b/src/generate_source.c
@@ -137,9 +137,9 @@ struct name_and_function denemo_commands[] = {
 
   {CMD_CATEGORY_NOTE_ENTRY, NULL, "No Tooltip yet",	N_("Sharpen"), "sharpen_key", "Sharpen", N_("Sharpen Note")},
   {CMD_CATEGORY_NOTE_ENTRY, NULL, "No Tooltip yet",	N_("Flatten"), "flatten_key", "Flatten", N_("Flatten Note")},
-  {CMD_CATEGORY_NOTE_ENTRY, NULL, "Alters a StemNeutral object to stem up.",	N_("StemUp"), "stem_up", "StemUp", N_("Stem Up")},
-  {CMD_CATEGORY_NOTE_ENTRY, NULL, "Alters a StemNeutral object to stem down.",	N_("StemDown"), "stem_down", "StemDown", N_("Stem Down")},
-
+  {CMD_CATEGORY_NOTE_ENTRY, NULL, "Starts up stemming display from this chord.",	N_("StemUp"), "stem_up", "StemUp", N_("Stem Up")},
+  {CMD_CATEGORY_NOTE_ENTRY, NULL, "Starts down stemming display from this chord.",	N_("StemDown"), "stem_down", "StemDown", N_("Stem Down")},
+  {CMD_CATEGORY_NOTE_ENTRY, NULL, "Starts auto stemming display from this chord.",	N_("StemAuto"), "stem_auto", "StemAuto", N_("Stem Auto")},
   {CMD_CATEGORY_NOTE_ENTRY, NULL, "No Tooltip yet",	N_("AddDot"), "add_dot_key", N_("Add Dot")},
   {CMD_CATEGORY_NOTE_ENTRY, NULL, "No Tooltip yet",	N_("RemoveDot"), "remove_dot_key", N_("Remove Dot")},
 
diff --git a/src/keyresponses.c b/src/keyresponses.c
index 4c1e669..e9145a7 100644
--- a/src/keyresponses.c
+++ b/src/keyresponses.c
@@ -692,11 +692,7 @@ sharpen_key (DenemoGUI * gui)
   else
     incrementenshift (gui, 1);
 }
-void
-stem_up (DenemoGUI * gui)
-{
-  sharpen_key(gui);
-}
+
 void
 flatten_key (DenemoGUI * gui)
 {
@@ -708,10 +704,31 @@ flatten_key (DenemoGUI * gui)
   else
     incrementenshift (gui, -1);
 }
+
+void
+stem_up (DenemoGUI * gui)
+{
+  DenemoObject *curmudelaobj = (DenemoObject *)
+    (gui->si->currentobject ? gui->si->currentobject->data : NULL);
+
+  if (curmudelaobj && curmudelaobj->type == CHORD)
+    ((chord*)curmudelaobj->object)->stem_directive=DENEMO_STEMUP;
+}
 void
 stem_down (DenemoGUI * gui)
 {
-  flatten_key(gui);
+  DenemoObject *curmudelaobj = (DenemoObject *)
+    (gui->si->currentobject ? gui->si->currentobject->data : NULL);
+  if (curmudelaobj && curmudelaobj->type == CHORD)
+    ((chord*)curmudelaobj->object)->stem_directive=DENEMO_STEMDOWN;
+}
+void
+stem_auto (DenemoGUI * gui)
+{
+  DenemoObject *curmudelaobj = (DenemoObject *)
+    (gui->si->currentobject ? gui->si->currentobject->data : NULL);
+  if (curmudelaobj && curmudelaobj->type == CHORD)
+    ((chord*)curmudelaobj->object)->stem_directive=DENEMO_STEMBOTH;
 }
 /* insert a duplicate note and tie to it */
 void
diff --git a/src/keyresponses.h b/src/keyresponses.h
index a18b3d4..c6a249d 100644
--- a/src/keyresponses.h
+++ b/src/keyresponses.h
@@ -88,6 +88,7 @@ void deletepreviousobject(DenemoGUI *gui);
 void sharpen_key (DenemoGUI *gui);
 void stem_up (DenemoGUI *gui);
 void stem_down (DenemoGUI *gui);
+void stem_auto (DenemoGUI *gui);
 void flatten_key (DenemoGUI *gui);
 void tie_notes_key (DenemoGUI *gui);
 void add_dot_key (DenemoGUI *gui);
diff --git a/src/register_commands.h b/src/register_commands.h
index 524480b..1031f37 100644
--- a/src/register_commands.h
+++ b/src/register_commands.h
@@ -58,8 +58,9 @@ register_command(Denemo.map, gtk_action_group_get_action(action_group, "AddNoteT
 register_command(Denemo.map, gtk_action_group_get_action(action_group, "RemoveNoteFromChord"), "RemoveNoteFromChord", "Remove note", "Remove a note from the current chord", remove_tone_key);
 register_command(Denemo.map, gtk_action_group_get_action(action_group, "Sharpen"), "Sharpen", "Sharpen", "No Tooltip yet", sharpen_key);
 register_command(Denemo.map, gtk_action_group_get_action(action_group, "Flatten"), "Flatten", "Flatten", "No Tooltip yet", flatten_key);
-register_command(Denemo.map, gtk_action_group_get_action(action_group, "StemUp"), "StemUp", "StemUp", "Alters a StemNeutral object to stem up.", stem_up);
-register_command(Denemo.map, gtk_action_group_get_action(action_group, "StemDown"), "StemDown", "StemDown", "Alters a StemNeutral object to stem down.", stem_down);
+register_command(Denemo.map, gtk_action_group_get_action(action_group, "StemUp"), "StemUp", "StemUp", "Starts up stemming display from this chord.", stem_up);
+register_command(Denemo.map, gtk_action_group_get_action(action_group, "StemDown"), "StemDown", "StemDown", "Starts down stemming display from this chord.", stem_down);
+register_command(Denemo.map, gtk_action_group_get_action(action_group, "StemAuto"), "StemAuto", "StemAuto", "Starts auto stemming display from this chord.", stem_auto);
 register_command(Denemo.map, gtk_action_group_get_action(action_group, "AddDot"), "AddDot", "Add Dot", "No Tooltip yet", add_dot_key);
 register_command(Denemo.map, gtk_action_group_get_action(action_group, "RemoveDot"), "RemoveDot", "Remove Dot", "No Tooltip yet", remove_dot_key);
 register_command(Denemo.map, gtk_action_group_get_action(action_group, "InsertTiedNote"), "InsertTiedNote", "Tied note", "Inserts a duplicate of the current note, tied", tie_notes_key);
diff --git a/src/scheme.h b/src/scheme.h
index ce32466..e5b1639 100644
--- a/src/scheme.h
+++ b/src/scheme.h
@@ -247,6 +247,10 @@ g_object_set_data(G_OBJECT(action_of_name(Denemo.map, "StemUp")), "scm", (gpoint
 SCM scheme_StemDown(SCM optional);
 install_scm_function ("d-StemDown", scheme_StemDown);
 g_object_set_data(G_OBJECT(action_of_name(Denemo.map, "StemDown")), "scm", (gpointer)1);
+/*StemAuto stem_auto*/
+SCM scheme_StemAuto(SCM optional);
+install_scm_function ("d-StemAuto", scheme_StemAuto);
+g_object_set_data(G_OBJECT(action_of_name(Denemo.map, "StemAuto")), "scm", (gpointer)1);
 /*AddDot add_dot_key*/
 SCM scheme_AddDot(SCM optional);
 install_scm_function ("d-AddDot", scheme_AddDot);
diff --git a/src/scheme_cb.h b/src/scheme_cb.h
index 8f3140c..9145ed0 100644
--- a/src/scheme_cb.h
+++ b/src/scheme_cb.h
@@ -1052,6 +1052,23 @@ stem_down_cb (NULL, &param);
          if(param.status && query) return scm_makfrom0str (gstr->str);         if(gstr) g_string_free(gstr, TRUE);
 return SCM_BOOL(param.status);
 }
+SCM scheme_StemAuto (SCM optional) {
+gboolean query=FALSE;
+DenemoScriptParam param;
+GString *gstr=NULL;
+int length;
+   char *str=NULL;
+if(SCM_STRINGP(optional)){
+str = scm_to_locale_stringn(optional, &length);
+gstr = g_string_new_len(str, length);
+if(!strncmp("query",str,5)) query = TRUE;          }
+         param.string = gstr;
+         param.status = FALSE;
+         
+stem_auto_cb (NULL, &param);
+         if(param.status && query) return scm_makfrom0str (gstr->str);         if(gstr) g_string_free(gstr, TRUE);
+return SCM_BOOL(param.status);
+}
 SCM scheme_AddDot (SCM optional) {
 gboolean query=FALSE;
 DenemoScriptParam param;
