Index: menus-skeleton.h
===================================================================
--- menus-skeleton.h	(revision 17142)
+++ menus-skeleton.h	(working copy)
@@ -160,10 +160,12 @@
 "       <separator/>\n"
 "       <submenu name=\"" N_("Cli_p") "\">\n"
 "           <verb verb-id=\"ObjectSetClipPath\" />\n"
+"           <verb verb-id=\"ObjectEditClipPath\" />\n"
 "           <verb verb-id=\"ObjectUnSetClipPath\" />\n"
 "       </submenu>\n"
 "       <submenu name=\"" N_("Mas_k") "\">\n"
 "           <verb verb-id=\"ObjectSetMask\" />\n"
+"           <verb verb-id=\"ObjectEditMask\" />\n"
 "           <verb verb-id=\"ObjectUnSetMask\" />\n"
 "       </submenu>\n"
 "       <submenu name=\"" N_("Patter_n") "\">\n"
Index: nodepath.cpp
===================================================================
--- nodepath.cpp	(revision 17142)
+++ nodepath.cpp	(working copy)
@@ -199,6 +199,8 @@
     np->local_change = 0;
     np->show_handles = show_handles;
     np->helper_path = NULL;
+    np->helperpath_rgba = 0xff0000ff;
+    np->helperpath_width = 1.0;
     np->curve = sp_curve_copy(curve);
     np->show_helperpath = false;
     np->straight_path = false;
@@ -4539,6 +4541,26 @@
 
 void sp_nodepath_show_helperpath(Inkscape::NodePath::Path *np, bool show) {
     np->show_helperpath = show;
+
+    if (show) {
+        SPCurve *helper_curve = sp_curve_copy(np->curve);
+        sp_curve_transform(helper_curve, np->i2d );
+        if (!np->helper_path) {
+            np->helper_path = sp_canvas_bpath_new(sp_desktop_controls(np->desktop), helper_curve);
+            sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(np->helper_path), np->helperpath_rgba, np->helperpath_width, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
+            sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(np->helper_path), 0, SP_WIND_RULE_NONZERO);
+            sp_canvas_item_show(np->helper_path);
+        } else {
+            sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(np->helper_path), helper_curve);
+        }
+        sp_curve_unref(helper_curve);
+    } else {
+        if (np->helper_path) {
+            GtkObject *temp = np->helper_path;
+            np->helper_path = NULL;
+            gtk_object_destroy(temp);
+        }
+    }
 }
 
 /* this function does not work yet */
Index: nodepath.h
===================================================================
--- nodepath.h	(revision 17142)
+++ nodepath.h	(working copy)
@@ -307,6 +307,7 @@
 NR::Maybe<NR::Coord> sp_node_selected_common_coord (Inkscape::NodePath::Path *nodepath, NR::Dim2 axis);
 
 void sp_nodepath_show_handles(Inkscape::NodePath::Path *nodepath, bool show);
+void sp_nodepath_show_helperpath(Inkscape::NodePath::Path *nodepath, bool show);
 
 void sp_nodepath_selected_nodes_rotate (Inkscape::NodePath::Path * nodepath, gdouble angle, int which, bool screen);
 
Index: selection-chemistry.cpp
===================================================================
--- selection-chemistry.cpp	(revision 17142)
+++ selection-chemistry.cpp	(working copy)
@@ -80,6 +80,12 @@
 #include "uri-references.h"
 #include "live_effects/lpeobject.h"
 
+// For clippath editing
+#include "tools-switch.h"
+#include "shape-editor.h"
+#include "node-context.h"
+#include "nodepath.h"
+
 using NR::X;
 using NR::Y;
 
@@ -2081,6 +2087,47 @@
     }
 }
 
+void sp_selection_edit_clip_or_mask(SPDesktop * dt, bool clip)
+{
+    if (!dt) return;
+
+    Inkscape::Selection *selection = sp_desktop_selection(dt);
+    if ( selection && !selection->isEmpty() ) {
+        SPItem *item = selection->singleItem();
+        if ( item ) {
+            SPObject *obj = NULL;
+            if (clip)
+                obj = item->clip_ref ? SP_OBJECT(item->clip_ref->getObject()) : NULL;
+            else
+                obj = item->mask_ref ? SP_OBJECT(item->mask_ref->getObject()) : NULL;
+
+            if (obj) {
+                // obj is a group object, the children are the actual clippers
+                for ( SPObject *child = obj->children ; child ; child = child->next ) {
+                    if ( SP_IS_ITEM(child) ) {
+                        // If not already in nodecontext, goto it!
+                        if (!tools_isactive(dt, TOOLS_NODES)) {
+                            tools_switch_current(TOOLS_NODES);
+                        }
+
+                        ShapeEditor * shape_editor = SP_NODE_CONTEXT( dt->event_context )->shape_editor;
+                        shape_editor->set_item(SP_ITEM(child));
+                        Inkscape::NodePath::Path *np = shape_editor->get_nodepath();
+                        np->helperpath_rgba = clip ? 0x0000ffff : 0x800080ff;
+                        np->helperpath_width = 1.0;
+                        sp_nodepath_show_helperpath(np, true);
+                        break; // break out of for loop after 1st encountered item
+                    }
+                }
+            } else if (clip) {
+                dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("The selection has no applied clip path."));
+            } else {
+                dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("The selection has no applied mask."));
+            }
+        }
+    }
+}
+
 namespace {
 
 template <typename D>
Index: selection-chemistry.h
===================================================================
--- selection-chemistry.h	(revision 17142)
+++ selection-chemistry.h	(working copy)
@@ -91,6 +91,8 @@
 
 void sp_selection_next_patheffect_param(SPDesktop * dt);
 
+void sp_selection_edit_clip_or_mask(SPDesktop * dt, bool clip);
+
 void scroll_to_show_item(SPDesktop *desktop, SPItem *item);
 
 void sp_undo (SPDesktop *desktop, SPDocument *doc);
Index: verbs.cpp
===================================================================
--- verbs.cpp	(revision 17142)
+++ verbs.cpp	(working copy)
@@ -961,6 +961,7 @@
         case SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER:
             sp_selection_next_patheffect_param(dt);
             break;
+
         default:
             break;
     }
@@ -1329,12 +1330,18 @@
         case SP_VERB_OBJECT_SET_MASK:
             sp_selection_set_mask(false, false);
             break;
+        case SP_VERB_OBJECT_EDIT_MASK:
+            sp_selection_edit_clip_or_mask(dt, false);
+            break;
         case SP_VERB_OBJECT_UNSET_MASK:
             sp_selection_unset_mask(false);
             break;
         case SP_VERB_OBJECT_SET_CLIPPATH:
             sp_selection_set_mask(true, false);
             break;
+        case SP_VERB_OBJECT_EDIT_CLIPPATH:
+            sp_selection_edit_clip_or_mask(dt, true);
+            break;
         case SP_VERB_OBJECT_UNSET_CLIPPATH:
             sp_selection_unset_mask(true);
             break;
@@ -2357,10 +2364,14 @@
                    "object_flip_ver"),
     new ObjectVerb(SP_VERB_OBJECT_SET_MASK, "ObjectSetMask", N_("_Set"),
                  N_("Apply mask to selection (using the topmost object as mask)"), NULL),
+    new ObjectVerb(SP_VERB_OBJECT_EDIT_MASK, "ObjectEditMask", N_("_Edit"),
+                 N_("Edit mask"), NULL),
     new ObjectVerb(SP_VERB_OBJECT_UNSET_MASK, "ObjectUnSetMask", N_("_Release"),
                  N_("Remove mask from selection"), NULL),
     new ObjectVerb(SP_VERB_OBJECT_SET_CLIPPATH, "ObjectSetClipPath", N_("_Set"),
                  N_("Apply clipping path to selection (using the topmost object as clipping path)"), NULL),
+    new ObjectVerb(SP_VERB_OBJECT_EDIT_CLIPPATH, "ObjectEditClipPath", N_("_Edit"),
+                 N_("Edit clipping path"), NULL),
     new ObjectVerb(SP_VERB_OBJECT_UNSET_CLIPPATH, "ObjectUnSetClipPath", N_("_Release"),
                  N_("Remove clipping path from selection"), NULL),
 
Index: verbs.h
===================================================================
--- verbs.h	(revision 17142)
+++ verbs.h	(working copy)
@@ -134,8 +134,10 @@
     SP_VERB_OBJECT_FLIP_HORIZONTAL,
     SP_VERB_OBJECT_FLIP_VERTICAL,
     SP_VERB_OBJECT_SET_MASK,
+    SP_VERB_OBJECT_EDIT_MASK,
     SP_VERB_OBJECT_UNSET_MASK,
     SP_VERB_OBJECT_SET_CLIPPATH,
+    SP_VERB_OBJECT_EDIT_CLIPPATH,
     SP_VERB_OBJECT_UNSET_CLIPPATH,
     /* Tools */
     SP_VERB_CONTEXT_SELECT,
