[gimp-gap/gap-2-8] nmove path merge down features, fixes for #699207 (automake version check), #732837 (typos)



commit abfdb3c4cc746bf7dd84fdc925385f3d0befa502
Author: Wolfgang Hofer <wolfgangh svn gnome org>
Date:   Sat Aug 29 12:57:51 2015 +0200

    nmove path merge down features, fixes for  #699207 (automake version check), #732837 (typos)

 ChangeLog                                          |   74 +++++
 autogen.sh                                         |  109 +++++--
 docs/reference/txt/STORYBOARD_FILE_DOC.txt         |    6 +-
 .../txt/plug-in-gap-onionskin-configuration.txt    |    2 +-
 gap/gap_apcl_lib.h                                 |    6 +-
 gap/gap_blend_fill_main.c                          |    6 +-
 gap/gap_colormask_dialog.c                         |    2 +-
 gap/gap_decode_mplayer.c                           |    8 +-
 gap/gap_detail_align_exec.c                        |    4 +-
 gap/gap_detail_tracking_main.c                     |    2 +-
 gap/gap_fg_matting_dialog.c                        |    2 +-
 gap/gap_filter_foreach.c                           |    2 +-
 gap/gap_image.c                                    |   79 ++++-
 gap/gap_image.h                                    |    1 +
 gap/gap_layer_copy.c                               |   84 +++++-
 gap/gap_layer_copy.h                               |    2 +
 gap/gap_lib.c                                      |    4 +-
 gap/gap_main.c                                     |    4 +-
 gap/gap_morph_dialog.c                             |    2 +-
 gap/gap_morph_tween_dialog.c                       |    8 +-
 gap/gap_mov_dialog.c                               |  308 ++++++++++++++++++-
 gap/gap_mov_dialog.h                               |   26 ++-
 gap/gap_mov_exec.c                                 |  337 +++++++++++++++++++-
 gap/gap_mov_xml_par.c                              |  122 +++++++
 gap/gap_mpege.c                                    |    4 +-
 gap/gap_onion_dialog.c                             |    2 +-
 gap/gap_onion_main.c                               |    2 +-
 gap/gap_range_ops.c                                |    4 +-
 gap/gap_split.c                                    |    4 +-
 gap/gap_story_att_trans_dlg.c                      |    2 +-
 gap/gap_story_dialog.c                             |    2 +-
 gap/gap_story_file.c                               |    4 +-
 gap/gap_story_properties.c                         |    2 +-
 gap/gap_story_render_processor.c                   |    2 +-
 gap/gap_video_index_creator.c                      |    6 +-
 gap/gap_water_pattern.c                            |    2 +-
 gap/gap_wr_resynth.c                               |    8 +-
 vid_common/gap_cme_main.c                          |    2 +-
 vid_enc_avi/gap_enc_avi_gui.c                      |    4 +-
 vid_enc_avi/gap_enc_avi_main.c                     |    4 +-
 vid_enc_ffmpeg/gap_enc_ffmpeg_gui.c                |   12 +-
 vid_enc_rawframes/gap_enc_rawframes_main.c         |    2 +-
 42 files changed, 1147 insertions(+), 121 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index f69a8e9..910722f 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,77 @@
+2015-08-29 Wolfgang Hofer <hof gimp org>
+
+- use generic checks for required automake aclocal version
+  as suggested in #699207
+
+
+  * autogen.sh
+
+2015-08-24 Wolfgang Hofer <hof gimp org>
+
+- MovePath new Merge features for merging the layer(s) 
+   created by MovePath down to an existing layer or into its layermask.
+ 
+ * gap/gap_mov_main.c  
+ * gap/gap_mov_dialog.c [.h]
+ * gap/gap_mov_exec.c
+ * gap/gap_mov_xml_par.c
+ * gap/gap_layer_copy.c [.h]
+ * gap/gap_image.c [.h]
+ 
+
+
+- Fixed typos reported at #732837 by Anders Jonsson
+
+ * gap/gap_blend_fill_main.c
+ * gap/gap_colormask_dialog.c
+ * gap/gap_decode_mplayer.c
+ * gap/gap_detail_align_exec.c
+ * gap/gap_detail_tracking_main.c
+ * gap/gap_fg_matting_dialog.c
+ * gap/gap_filter_foreach.c 
+ * gap/gap_image.c
+ * gap/gap_lib.c
+ * gap/gap_main.c
+ * gap/gap_morph_dialog.c
+ * gap/gap_morph_tween_dialog.c
+ * gap/gap_mov_dialog.c
+ * gap/gap_mpege.c
+ * gap/gap_onion_dialog.c
+ * gap/gap_onion_main.c
+ * gap/gap_range_ops.c
+ * gap/gap_split.c
+ * gap/gap_story_att_trans_dlg.c
+ * gap/gap_story_dialog.c
+ * gap/gap_story_file.c
+ * gap/gap_story_properties.c
+ * gap/gap_story_render_processor.c
+ * gap/gap_video_index_creator.c
+ * gap/gap_water_pattern.c
+ * gap/gap_wr_resynth.c
+ 
+ * vid_common/gap_cme_main.c
+ * vid_enc_avi/gap_enc_avi_gui.c
+ * vid_enc_avi/gap_enc_avi_main.c
+ * vid_enc_ffmpeg/gap_enc_ffmpeg_gui.c
+ * vid_enc_rawframes/gap_enc_rawframes_main.c
+ 
+ * docs/reference/txt/STORYBOARD_FILE_DOC.txt
+ * docs/reference/txt/plug-in-gap-onionskin-configuration.txt
+ 
+
+- Applied patch provided  at #753294 by Anders Jonsson
+  that shall fix build problems when building without SDL based audio client
+  (build for the old wavplay client failed on unkown typ PCL_Errfunc, must use APCL_ErrFunc)
+
+ * gap/gap_apcl_lib.h
+
+
+
+
+
+
+
+
 2015-05-14 Wolfgang Hofer <hof gimp org>
 
 added options for ffmpeg windows crosscompiliation 
diff --git a/autogen.sh b/autogen.sh
index 340b704..f89a8ba 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -64,6 +64,77 @@ check_version ()
     fi
 }
 
+# Usage:
+#     compare_versions MIN_VERSION ACTUAL_VERSION
+# returns true if ACTUAL_VERSION >= MIN_VERSION
+compare_versions() {
+    ch_min_version=$1
+    ch_actual_version=$2
+    ch_status=0
+    IFS="${IFS=         }"; ch_save_IFS="$IFS"; IFS="."
+    set $ch_actual_version
+    for ch_min in $ch_min_version; do
+        ch_cur=`echo $1 | sed 's/[^0-9].*$//'`; shift # remove letter suffixes
+        if [ -z "$ch_min" ]; then break; fi
+        if [ -z "$ch_cur" ]; then ch_status=1; break; fi
+        if [ $ch_cur -gt $ch_min ]; then break; fi
+        if [ $ch_cur -lt $ch_min ]; then ch_status=1; break; fi
+    done
+    IFS="$ch_save_IFS"
+    return $ch_status
+}
+
+# Usage:
+#     version_check PACKAGE VARIABLE CHECKPROGS MIN_VERSION SOURCE
+# checks to see if the package is available
+version_check() {
+    vc_package=$1
+    vc_variable=$2
+    vc_checkprogs=$3
+    vc_min_version=$4
+    vc_source=$5
+    vc_status=1
+    local ${vc_variable}_VERSION
+
+    vc_checkprog=`eval echo "\\$$vc_variable"`
+    if [ -n "$vc_checkprog" ]; then
+       echo "using $vc_checkprog for $vc_package"
+       return 0
+    fi
+
+    echo "checking for $vc_package >= $vc_min_version..."
+    for vc_checkprog in $vc_checkprogs; do
+       echo $ECHO_N "  testing $vc_checkprog... " $ECHO_C
+       if $vc_checkprog --version < /dev/null > /dev/null 2>&1; then
+           vc_actual_version=`$vc_checkprog --version | head -n 1 | \
+                               sed 's/^.*[     ]\([0-9.]*[a-z]*\).*$/\1/'`
+           if compare_versions $vc_min_version $vc_actual_version; then
+               echo "found $vc_actual_version"
+               # set variables
+               eval "$vc_variable=$vc_checkprog; \
+                       ${vc_variable}_VERSION=$vc_actual_version"
+               vc_status=0
+               break
+           else
+               echo "too old (found version $vc_actual_version)"
+           fi
+       else
+           echo "not found."
+       fi
+    done
+    if [ "$vc_status" != 0 ]; then
+       echo "***Error***: You must have $vc_package >= $vc_min_version installed"
+       echo "  to build $PKG_NAME.  Download the appropriate package for"
+       echo "  from your distribution or get the source tarball at"
+        echo "    $vc_source"
+       echo
+       ## exit $vc_status
+        DIE=1
+    fi
+    return $vc_status
+}
+
+
 echo
 echo "I am testing that you have the required versions of autoconf,"
 echo "automake and glib-gettextize and intltoolize."
@@ -87,36 +158,16 @@ else
 fi
 
 
+
 echo -n "checking for automake >= $AUTOMAKE_REQUIRED_VERSION ... "
-if (automake-1.13 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.13
-   ACLOCAL=aclocal-1.13
-elif (automake-1.12 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.12
-   ACLOCAL=aclocal-1.12
-elif (automake-1.11 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.11
-   ACLOCAL=aclocal-1.11
-elif (automake-1.10 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.10
-   ACLOCAL=aclocal-1.10
-elif (automake-1.9 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.9
-   ACLOCAL=aclocal-1.9
-elif (automake-1.8 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.8
-   ACLOCAL=aclocal-1.8
-elif (automake-1.7 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.7
-   ACLOCAL=aclocal-1.7
-else
-    echo
-    echo "  You must have automake 1.7 or newer installed to compile $PROJECT."
-    echo "  Download the appropriate package for your distribution,"
-    echo "  or get the source tarball at ftp://ftp.gnu.org/pub/gnu/automake/";
-    echo
-    DIE=1
-fi
+
+version_check automake AUTOMAKE automake $AUTOMAKE_REQUIRED_VERSION \
+    "http://ftp.gnu.org/pub/gnu/automake/automake-$AUTOMAKE_REQUIRED_VERSION.tar.xz";
+
+# aclocal required version must be the same as automake required version
+version_check aclocal ACLOCAL aclocal $AUTOMAKE_REQUIRED_VERSION \
+    "http://ftp.gnu.org/pub/gnu/automake/automake-$AUTOMAKE_REQUIRED_VERSION.tar.xz";
+
 
 if test x$AUTOMAKE != x; then
     VER=`$AUTOMAKE --version \
diff --git a/docs/reference/txt/STORYBOARD_FILE_DOC.txt b/docs/reference/txt/STORYBOARD_FILE_DOC.txt
index 2f97d75..ee3bb30 100644
--- a/docs/reference/txt/STORYBOARD_FILE_DOC.txt
+++ b/docs/reference/txt/STORYBOARD_FILE_DOC.txt
@@ -697,7 +697,7 @@ VID_MOVE_X and VID_MOVE_Y
 VID_FIT_SIZE
   Define how to match input framesize with the target size.
   The target size is typically the size of the resulting video (VID_MASTER_SIZE).
-  except in scenarios where a movepath transistion is active.
+  except in scenarios where a movepath transition is active.
   In this special case the input frame is processed as moving object
   of this transition and the target size refers to the scaled size 
   (preScaleWidth, preScaleHeight) of the recorded moving object.
@@ -710,7 +710,7 @@ VID_FIT_SIZE
   - Zooming may cause additional Scaling. The VID_FIT_SIZE record
     describes the normal Size (where zoom is set to 1.0)
 
-  - In case the input Frame is processed by a movepath transistion
+  - In case the input Frame is processed by a movepath transition
     the target size depends on the size of the moving object and the framesize
     in the xml_paramfile and on the VID_MASTER_SIZE.
     (see VID_MOVE_PATH below)
@@ -1022,7 +1022,7 @@ VID_MOVE_PATH
   (5) nframes           ... duration of the effect
                             in number of frames (integer)
                             In case nframes is greater than total_frames
-                            the transistions of the end
+                            the transitions of the end
                             The duration Value 0 disables move transitions.
   (6) accel             ... an integer value specifiying acceleration characteristic
                             DEFAULT: 0  ** other values are currently ignored 
diff --git a/docs/reference/txt/plug-in-gap-onionskin-configuration.txt 
b/docs/reference/txt/plug-in-gap-onionskin-configuration.txt
index 957fd8b..ad9c278 100644
--- a/docs/reference/txt/plug-in-gap-onionskin-configuration.txt
+++ b/docs/reference/txt/plug-in-gap-onionskin-configuration.txt
@@ -198,7 +198,7 @@ Onionskin Functions:
        (see above)
   
   Toggle Visibility:
-       Turn visibilty on (or off) for all onionlayers.
+       Turn visibility on (or off) for all onionlayers.
 
   Delete Onion Layers:
        Remove all onionlayers from the current frame.
diff --git a/gap/gap_apcl_lib.h b/gap/gap_apcl_lib.h
index 0222d09..fd0c720 100644
--- a/gap/gap_apcl_lib.h
+++ b/gap/gap_apcl_lib.h
@@ -99,9 +99,9 @@ static int apcl_have_memory_playback(void) { return (1); }
 
 /* static dummy implementations for (newer) features that are NOT supported by wavplay */
 static  int apcl_have_memory_playback(void) { return (0); }
-static  int apcl_bits(int flags, PCL_ErrFunc erf,int bits) { return (1); }
-static  int apcl_memory_buffer(char *buffer, long buffer_len, PCL_ErrFunc erf)  { return (1); }
-static  int apcl_channels(int flags, PCL_ErrFunc erf, int channels) { return (1); }
+static  int apcl_bits(int flags, APCL_ErrFunc erf,int bits) { return (1); }
+static  int apcl_memory_buffer(char *buffer, long buffer_len, APCL_ErrFunc erf)  { return (1); }
+static  int apcl_channels(int flags, APCL_ErrFunc erf, int channels) { return (1); }
 
 /* apcl_volume: volume must be a value between 0.0 and 1.0 */
 extern int   apcl_volume(double volume, int flags,APCL_ErrFunc erf);
diff --git a/gap/gap_blend_fill_main.c b/gap/gap_blend_fill_main.c
index 2ee0d58..d7c7ee7 100644
--- a/gap/gap_blend_fill_main.c
+++ b/gap/gap_blend_fill_main.c
@@ -219,8 +219,8 @@ static void query (void)
                           "Fill selected area by blending surrounding colors to cover it. "
                           "The fill area can be represented by the current selection  "
                           "or by an alternative selction (provided as parameter altSelection) "
-                          "If the image, that is refered by the altSelection drawable_id has a selection "
-                          "then the refered selection is used to identify the fill area. "
+                          "If the image, that is referred by the altSelection drawable_id has a selection "
+                          "then the referred selection is used to identify the fill area. "
                           "otherwise a grayscale copy of the altSelection drawable_id will be used "
                           "to identify the area that shall be filled. "
                           "altSelection value -1 indicates that the current selection of the input image 
shall be used. "
@@ -1485,7 +1485,7 @@ p_check_exec_condition_and_set_ok_sesitivity(GuiStuff *guiStuffPtr)
       else
       {
         gtk_label_set_text(GTK_LABEL(guiStuffPtr->msg_label)
-                        , _("SVG file does not exist (use Save Pats button to create)."));
+                        , _("SVG file does not exist (use Save Paths button to create)."));
       }
     }
     else
diff --git a/gap/gap_colormask_dialog.c b/gap/gap_colormask_dialog.c
index 8a942d3..044bf07 100644
--- a/gap/gap_colormask_dialog.c
+++ b/gap/gap_colormask_dialog.c
@@ -812,7 +812,7 @@ p_create_debug_options(GapColormaskValues *cmaskvals, GtkWidget *preview)
 
   /* colorSensitivity  */
   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, row++,
-                              _("DiffSensitvity:"), SCALE_WIDTH, 6,
+                              _("DiffSensitivity:"), SCALE_WIDTH, 6,
                               cmaskvals->colorSensitivity, 1.0, 2.0, 0.01, 0.1, 4,
                               TRUE, 0, 0,
                               NULL, NULL);
diff --git a/gap/gap_decode_mplayer.c b/gap/gap_decode_mplayer.c
index 463d147..76794c9 100644
--- a/gap/gap_decode_mplayer.c
+++ b/gap/gap_decode_mplayer.c
@@ -541,7 +541,7 @@ p_mplayer_dialog   (GapMPlayerParams *gpp)
   ii++; ii_jpg_optimize = ii;
   gap_arr_arg_init(&argv[ii], GAP_ARR_WGT_INT);
   argv[ii].label_txt = _("Jpeg Optimize:");
-  argv[ii].help_txt  = _("optimization factor"
+  argv[ii].help_txt  = _("Optimization factor "
                         "(is ignored when other formats are used)");
   argv[ii].constraint = TRUE;
   argv[ii].int_min    = 0;
@@ -552,7 +552,7 @@ p_mplayer_dialog   (GapMPlayerParams *gpp)
   ii++; ii_jpg_smooth = ii;
   gap_arr_arg_init(&argv[ii], GAP_ARR_WGT_INT);
   argv[ii].label_txt = _("Jpeg Smooth:");
-  argv[ii].help_txt  = _("Smooth factor"
+  argv[ii].help_txt  = _("Smooth factor "
                         "(is ignored when other formats are used)");
   argv[ii].constraint = TRUE;
   argv[ii].int_min    = 0;
@@ -563,14 +563,14 @@ p_mplayer_dialog   (GapMPlayerParams *gpp)
   ii++; ii_jpg_progressive = ii;
   gap_arr_arg_init(&argv[ii], GAP_ARR_WGT_TOGGLE);
   argv[ii].label_txt = _("Jpeg Progressive:");
-  argv[ii].help_txt  = _("Enable progressive jpeg encoding"
+  argv[ii].help_txt  = _("Enable progressive jpeg encoding "
                         "(is ignored when other formats are used)");
   argv[ii].int_ret   = gpp->jpg_progressive;
 
   ii++; ii_jpg_baseline = ii;
   gap_arr_arg_init(&argv[ii], GAP_ARR_WGT_TOGGLE);
   argv[ii].label_txt = _("Jpeg Baseline:");
-  argv[ii].help_txt  = _("Enable baseline jpeg encoding"
+  argv[ii].help_txt  = _("Enable baseline jpeg encoding "
                         "(is ignored when other formats are used)");
   argv[ii].int_ret   = gpp->jpg_baseline;
 
diff --git a/gap/gap_detail_align_exec.c b/gap/gap_detail_align_exec.c
index 4cf6a8b..a74abb3 100644
--- a/gap/gap_detail_align_exec.c
+++ b/gap/gap_detail_align_exec.c
@@ -1276,7 +1276,7 @@ gap_detail_exact_align_via_4point_path(gint32 image_id, gint32 activeDrawableId
   {
     if (advals.pointOrder == POINT_ORDER_MODE_31_42)
     {
-      g_message(_("This filter requires a current path with 4 points,"
+      g_message(_("This filter requires a current path with 4 points, "
                 "where point 1 and 2 mark reference positions "
                 "and point 3 and 4 mark positions in the target layer."
                 "It transforms the target layer in a way that "
@@ -1287,7 +1287,7 @@ gap_detail_exact_align_via_4point_path(gint32 image_id, gint32 activeDrawableId
     }
     else
     {
-      g_message(_("This filter requires a current path with 4 points,"
+      g_message(_("This filter requires a current path with 4 points, "
                 "where point 1 and 3 mark reference positions "
                 "and point 2 and 4 mark positions in the target layer."
                 "It transforms the target layer in a way that "
diff --git a/gap/gap_detail_tracking_main.c b/gap/gap_detail_tracking_main.c
index 8411a28..7cb264c 100644
--- a/gap/gap_detail_tracking_main.c
+++ b/gap/gap_detail_tracking_main.c
@@ -266,7 +266,7 @@ static void query (void)
 
   /* the  installation of the xml based aligner plugin */
   gimp_install_procedure (GAP_DETAIL_TRACKING_XML_ALIGNER_PLUG_IN_NAME,
-                          "Exact Align Layer via transformation according to current phase of detail 
tracking (recorded in XML file) .",
+                          "Exact Align Layer via transformation according to current phase of detail 
tracking (recorded in XML file).",
                           "This filter tranforms the specified layer. "
                           "It uses the relevant controlpoint (that matches the framePhase parameter) in the 
recorded XML file as input.  "
                           "and calculates offsts, scaling and rotation to transform the layer in a way that 
the points p1x p1y p2x p2y "
diff --git a/gap/gap_fg_matting_dialog.c b/gap/gap_fg_matting_dialog.c
index e58a060..841be56 100644
--- a/gap/gap_fg_matting_dialog.c
+++ b/gap/gap_fg_matting_dialog.c
@@ -445,7 +445,7 @@ do_dialog (FgExtractDialogGuiStuff *guiStuffPtr, GapFgExtractValues *cuvals)
                          " provides a rough user selection "
                          " where WHITE pixels in the tri map defines FOREGROUND (i.e. opaque result) "
                          " BLACK pixels define BACKGROUND (i.e. transparent result)"
-                         " GRAY pixels (value 1 upto 240) are marked as Undefined "
+                         " GRAY pixels (value 1 up to 240) are marked as Undefined "
                          " (i.e. opacity to be processed by this filter.) )")
                        , NULL);
 
diff --git a/gap/gap_filter_foreach.c b/gap/gap_filter_foreach.c
index 6a07968..8b7c942 100644
--- a/gap/gap_filter_foreach.c
+++ b/gap/gap_filter_foreach.c
@@ -232,7 +232,7 @@ p_visibilty_restore(gint32 image_id, gint nlayers, int *visible_tab, char *plugi
   }
   else
   {
-    g_message(_("Error: Plugin %s has changed the number of layers from %d to %d\ncould not restore Layer 
visibilty.\n"),
+    g_message(_("Error: Plugin %s has changed the number of layers from %d to %d\ncould not restore Layer 
visibility.\n"),
             plugin_name, (int)nlayers, (int)l_nlayers2);
   }
 
diff --git a/gap/gap_image.c b/gap/gap_image.c
index 2e05da4..5a0b448 100644
--- a/gap/gap_image.c
+++ b/gap/gap_image.c
@@ -332,10 +332,10 @@ gap_image_merge_to_specified_layer(gint32 ref_layer_id, GimpMergeType mergemode)
  * -------------------------------------------------------
  * create a selection in the specified image_id.
  * The selection is a scaled copy of the selection in another image,
- * refered by ref_drawable_id, or a Grayscale copy of the specified ref_drawable_id
- * (in case the refered image has no selection or the flag force_from_drawable is TRUE)
+ * referred by ref_drawable_id, or a Grayscale copy of the specified ref_drawable_id
+ * (in case the referred image has no selection or the flag force_from_drawable is TRUE)
  *
- *  - operates on a duplicate of the image refered by ref_drawable_id.
+ *  - operates on a duplicate of the image referred by ref_drawable_id.
  *  - this duplicate is scaled to same size as specified image_id
  *
  * return TRUE in case the selection was successfully created .
@@ -360,7 +360,7 @@ gap_image_set_selection_from_selection_or_drawable(gint32 image_id, gint32 ref_d
 
   if (ref_image_id < 0)
   {
-    printf("ref_drawable_id does not refere to a valid image layer_id:%d\n", (int)ref_drawable_id);
+    printf("ref_drawable_id does not refer to a valid image layer_id:%d\n", (int)ref_drawable_id);
     return (FALSE);
   }
 
@@ -369,7 +369,7 @@ gap_image_set_selection_from_selection_or_drawable(gint32 image_id, gint32 ref_d
   dup_image_id = gimp_image_duplicate(ref_image_id);
   if (dup_image_id < 0)
   {
-    printf("duplicating of image failed, refered souce image_id:%d\n", (int)ref_image_id);
+    printf("duplicating of image failed, referred souce image_id:%d\n", (int)ref_image_id);
     return (FALSE);
   }
   /* clear undo stack */
@@ -391,7 +391,7 @@ gap_image_set_selection_from_selection_or_drawable(gint32 image_id, gint32 ref_d
   has_selection  = gimp_selection_bounds(ref_image_id, &non_empty, &x1, &y1, &x2, &y2);
   if ((has_selection) && (non_empty) && (force_from_drawable != TRUE))
   {
-    /* use scaled copy of the already exisating selection in the refered image */
+    /* use scaled copy of the already exisating selection in the referred image */
     work_drawable_id = gimp_image_get_selection(dup_image_id);
   }
   else
@@ -988,7 +988,7 @@ gap_image_find_or_create_group_layer(gint32 image_id
           if(gap_debug)
           {
             printf("ERROR: gap_image_find_or_create_group_layer the path\n  %s\n"
-                   "  refers to an already exsiting item that is NOT a GROUP\n"
+                   "  refers to an already existing item that is NOT a GROUP\n"
                    , group_name_path_string
                    );
           }
@@ -1285,7 +1285,7 @@ gap_image_get_parentpositions_as_int_stringlist(gint32 drawable_id)
  *    otherwise return the list of layers of the nested group
  *    where  parentpositions specifies a list of integer stackpositions
  *    from toplevel to the deepest nested group delimited by "/"
- *    note that all specified parentpositions MUST refere to group layers.
+ *    note that all specified parentpositions MUST refer to group layers.
  * return NULL in case no matching layerstack was found in the image.
  */
 gint32 *
@@ -1390,3 +1390,66 @@ gap_image_get_layers_at_parentpositions(gint32 image_id, gint *nlayers, const ch
 
 
 } /* end gap_image_get_layers_at_parentpositions */
+
+
+/* -----------------------------
+ * gap_image_get_the_layer_below
+ * -----------------------------
+ * returns the id of the layer below the specified layerId
+ *
+ * returns -1 in case there is no layer below the specified layerId
+ *            Note that -1 is alse returned 
+ *            a) in case the specified layerId is not a valid layer (or not attached to an image)
+ *            b) in case the specified layerId is on bottom of a layergroup
+ *            c) in case the specified layerId is on bottom of the toplevel layerstack
+ */
+gint32
+gap_image_get_the_layer_below(gint32 layerId)
+{
+  gint32        lowerLayerId;
+  gint32        l_parent_id;
+  gint          l_nlayers;
+  gint32       *l_layers_list;
+  gint          l_ii;
+
+  lowerLayerId = -1;
+  l_parent_id = 0;
+  if (layerId >= 0)
+  {
+    l_parent_id = gimp_item_get_parent(layerId);
+  }
+  
+  if (l_parent_id > 0)
+  {
+    l_layers_list = gimp_item_get_children(l_parent_id, &l_nlayers);
+  }
+  else
+  {
+    /* use toplevel layers list of the image */
+    l_layers_list = gimp_image_get_layers(gimp_item_get_image(layerId), &l_nlayers);
+  }
+
+
+  if (l_layers_list == NULL)
+  {
+    return (-1);
+  }
+
+  for(l_ii = 0; l_ii < l_nlayers; l_ii++)
+  {
+    if (l_layers_list[l_ii] == layerId)
+    {
+      gint l_pos_below = l_ii + 1;
+      if (l_pos_below < l_nlayers)
+      {
+        lowerLayerId = l_layers_list[l_pos_below];
+        break;
+      }
+    }
+  }
+  g_free(l_layers_list);
+  
+  
+  return (lowerLayerId);
+  
+}  /* end gap_image_get_the_layer_below */
diff --git a/gap/gap_image.h b/gap/gap_image.h
index 4512863..548de2c 100644
--- a/gap/gap_image.h
+++ b/gap/gap_image.h
@@ -99,6 +99,7 @@ gint32  gap_image_merge_group_layer(gint32 image_id,
 char *   gap_image_get_parentpositions_as_int_stringlist(gint32 drawable_id);
 gint32 * gap_image_get_layers_at_parentpositions(gint32 image_id, gint *nlayers, const char 
*parentpositions);
 
+gint32   gap_image_get_the_layer_below(gint32 layerId);
 
 #endif
 
diff --git a/gap/gap_layer_copy.c b/gap/gap_layer_copy.c
index f1c866e..c9ca53a 100644
--- a/gap/gap_layer_copy.c
+++ b/gap/gap_layer_copy.c
@@ -684,7 +684,7 @@ gap_layer_flip(gint32 layer_id, gint32 flip_request)
 /* -----------------------------
  * gap_layer_copy_paste_drawable
  * -----------------------------
- * copy specified dst_drawable into src_drawable using
+ * copy specified src_drawable into dst_drawable using
  * gimp copy paste procedures.
  * The selection in the specified image will be removed
  * (and therefore is ignored for copying)
@@ -700,12 +700,15 @@ gap_layer_copy_paste_drawable(gint32 image_id, gint32 dst_drawable_id, gint32 sr
   {
     gimp_selection_none(image_id);
   }
-        gimp_edit_copy(src_drawable_id);
-  l_fsel_layer_id = gimp_edit_paste(dst_drawable_id, FALSE);
-  gimp_floating_sel_anchor(l_fsel_layer_id);
+  if (TRUE == gimp_edit_copy(src_drawable_id))
+  {
+    l_fsel_layer_id = gimp_edit_paste(dst_drawable_id, FALSE);
+    gimp_floating_sel_anchor(l_fsel_layer_id);
+  }
 }  /* end gap_layer_copy_paste_drawable */
 
 
+
 /* ---------------------------------
  * gap_layer_get_stackposition
  * ---------------------------------
@@ -954,3 +957,76 @@ gap_layer_find_by_name(gint32 image_id, const char *name)
   return (l_layer_id);
 
 }  /* end gap_layer_find_by_name */
+
+/* --------------------------------------
+ * gap_layer_new_same_size_and_offsets
+ * --------------------------------------
+ * creates a new layer with name "worklayer" above the specified origLayer with same size
+ * as the specified imageId (when imageSize == true) or same size as
+ * the origLayerId (when imageSize == false)
+ * and attached to the specified image_id at same offsets.
+ *
+ * In case the origLayer is a valid layer in the same image, the newly created layer
+ * is placed in the same layergroup one stackposition above.
+ *
+ * otherwise the position will be above the active layer.
+ *
+ * Note that the created layer is not yet initialized.
+ *   initialize can be done with:
+ *   gimp_drawable_fill(workLayerId, GIMP_TRANSPARENT_FILL);
+ *
+ */
+gint32
+gap_layer_new_same_size_and_offsets(gint32 image_id, gint32 origLayerId, gboolean imageSize)
+{
+ gint32 l_new_layer_id;
+ gint32 l_parent_id;
+ gint32 l_position;
+ gint src_offset_x;
+ gint src_offset_y;
+ 
+ gint l_width;
+ gint l_height;
+ 
+ l_parent_id = 0;
+ l_position = -1;  /* -1 specifies position avove the active layer,  where 0 is on top (in the foreground) */
+ 
+ if (origLayerId >= 0)
+ {
+   if (image_id == gimp_item_get_image(origLayerId))
+   {
+     l_position = gimp_image_get_item_position (image_id, origLayerId);
+     l_parent_id = gimp_item_get_parent(origLayerId);
+     if (l_parent_id < 0)
+     {
+       l_parent_id = 0;
+     }
+   }
+   l_width = gimp_drawable_width(origLayerId);
+   l_height = gimp_drawable_height(origLayerId);
+
+   gimp_drawable_offsets(origLayerId, &src_offset_x, &src_offset_y );
+
+ }
+ else
+ {
+   l_width = gimp_image_width(image_id);
+   l_height = gimp_image_height(image_id);
+   src_offset_x = 0;
+   src_offset_y = 0;
+ }
+ 
+ l_new_layer_id = gimp_layer_new(image_id, "worklayer",
+                                 l_width,
+                                 l_height,
+                                 ((gint)(gimp_image_base_type(image_id)) * 2),
+                                 100.0,     /* Opacity full opaque */
+                                 0);        /* NORMAL */
+  gimp_image_insert_layer(image_id, l_new_layer_id, l_parent_id, l_position);
+  gimp_layer_set_offsets(l_new_layer_id, src_offset_x, src_offset_y);
+  
+
+  gimp_item_set_visible(l_new_layer_id, TRUE);
+  return (l_new_layer_id);
+          
+}  /* end gap_layer_new_same_size_and_offsets */
diff --git a/gap/gap_layer_copy.h b/gap/gap_layer_copy.h
index 5cd4cdc..4862d8c 100644
--- a/gap/gap_layer_copy.h
+++ b/gap/gap_layer_copy.h
@@ -95,4 +95,6 @@ gint32  gap_layer_create_layer_from_alpha(gint32 src_layer_id, gint32 image_id
 
 gint32  gap_layer_find_by_name(gint32 image_id, const char *name);
 
+gint32  gap_layer_new_same_size_and_offsets(gint32 image_id, gint32 origLayerId, gboolean imageSize);
+
 #endif
diff --git a/gap/gap_lib.c b/gap/gap_lib.c
index be4ec3a..3a3ebbf 100644
--- a/gap/gap_lib.c
+++ b/gap/gap_lib.c
@@ -2166,8 +2166,8 @@ gap_lib_save_non_xcf_dialog(char *key_gimprc, char *lower_extension)
   argv[0].label_txt = g_strdup_printf(_("You are using another file format than xcf.\n"
                         "This dialog configures how to handle exchanges of\n"
                         "the current frame image (for frames with extension %s)\n"
-                        "Note that automatical save on frame change just works with XCF\n"
-                        "but automatical overwrite (via export) to other formats\n"
+                        "Note that automatic save on frame change just works with XCF\n"
+                        "but automatic overwrite (via export) to other formats\n"
                         "typically results in loss of layers and other information.")
                         , lower_extension);
 
diff --git a/gap/gap_main.c b/gap/gap_main.c
index e2e10cc..eb954ef 100644
--- a/gap/gap_main.c
+++ b/gap/gap_main.c
@@ -663,8 +663,8 @@ query ()
 
   gimp_install_procedure(PLUGIN_NAME_GAP_DENSITY,
                          "This plugin changes the number of frames (density) on disk to match a"
-                         " new target framerate that is densty_factor times higher"
-                         " than the origianl framerate."
+                         " new target framerate that is density_factor times higher"
+                         " than the original framerate."
                          " (or 1/density_factor lower if density_grow is FALSE)"
                          " changing of density results in duplicating (or deleting)"
                          " of frames on disk",
diff --git a/gap/gap_morph_dialog.c b/gap/gap_morph_dialog.c
index 2cd71b0..3035581 100644
--- a/gap/gap_morph_dialog.c
+++ b/gap/gap_morph_dialog.c
@@ -3952,7 +3952,7 @@ gap_morph_create_dialog(GapMorphGUIParams *mgup)
   gtk_widget_set_size_request (spinbutton, 80, -1);
   gimp_help_set_help_data (spinbutton, _("Locate Shaperadius in pixels."
                                          " Defines shape size as area around workpoint to be compared "
-                                         " when loacting corresponding coordinate"
+                                         " when locating corresponding coordinate"
                                          "(Not relevant for rendering)")
                                          , NULL);
   g_signal_connect (G_OBJECT (adj), "value_changed"
diff --git a/gap/gap_morph_tween_dialog.c b/gap/gap_morph_tween_dialog.c
index 4c8c8ba..53f28b7 100644
--- a/gap/gap_morph_tween_dialog.c
+++ b/gap/gap_morph_tween_dialog.c
@@ -731,7 +731,7 @@ gap_morph_generate_frame_tween_workpoints_dialog(GapAnimInfo *ainfo_ptr, GapMorp
                               _("Num Workpoints:"), SCALE_WIDTH, 7,
                               mgpp->numWorkpoints, 1, 5000, 1.0, 10.0, 0,
                               TRUE, 0, 0,
-                              _("Number of workpoints to be generated par processed frame"),
+                              _("Number of workpoints to be generated per processed frame"),
                               NULL);
   g_signal_connect (adj, "value-changed",
                     G_CALLBACK (gimp_int_adjustment_update),
@@ -788,7 +788,7 @@ gap_morph_generate_frame_tween_workpoints_dialog(GapAnimInfo *ainfo_ptr, GapMorp
                               mgpp->gravity_intensity, 0.0, 5.0, 0.1, 0.1, 1,
                               TRUE, 0, 0,
                               _("INTENSITY attribute value to be written to the generated workpoint file. "
-                                "value 0 turns off intensity desceding deformation, "
+                                "value 0 turns off intensity descending deformation, "
                                 "morph processing will use linear deform action inside the deform radius"),
                               NULL);
   g_signal_connect (adj, "value-changed",
@@ -1299,7 +1299,7 @@ gap_morph_frame_tweens_dialog(GapAnimInfo *ainfo_ptr, GapMorphGlobalParams *mgpp
       gtk_entry_set_text(GTK_ENTRY(entry), &mgpp->tween_subdir[0]);
     }
     gtk_table_attach(GTK_TABLE(table), entry, 1, 2, row, row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 4, 0);
-    gimp_help_set_help_data(entry, _("Name of a (Sub)directoy to save copies of processed frames "
+    gimp_help_set_help_data(entry, _("Name of a (Sub)directory to save copies of processed frames "
                                      "and generated tweens. "
                                      "Note that tweens are created via simple fade operations "
                                      "when no workpointfile for the processed frame is available. "
@@ -1335,7 +1335,7 @@ gap_morph_frame_tweens_dialog(GapAnimInfo *ainfo_ptr, GapMorphGlobalParams *mgpp
   /* the master progress bar */
 
   /* master progress */
-  label = gtk_label_new (_("Create Tweenfame(s):"));
+  label = gtk_label_new (_("Create Tweenframe(s):"));
   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
   gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row + 1,
                     GTK_FILL, GTK_FILL, 4, 0);
diff --git a/gap/gap_mov_dialog.c b/gap/gap_mov_dialog.c
index b72964d..b988995 100644
--- a/gap/gap_mov_dialog.c
+++ b/gap/gap_mov_dialog.c
@@ -26,6 +26,7 @@
  */
 
 /* revision history:
+ * gimp    2.8.14;  2015/08/24  hof: support merge down postprocessing
  * gimp    2.8.10;  2014/05/07  hof: support unlimited number of controlpoints.
  * gimp    2.1.0b;  2004/11/04  hof: replaced deprecated option_menu by combo box
  * gimp    2.1.0b;  2004/08/14  hof: feature: point navigation + SHIFT ==> mov_follow_keyframe
@@ -340,6 +341,11 @@ typedef struct
   GtkWidget            *dstGroupPathEntry;
   GtkWidget            *dstGroupDelimiterEntry;
 
+  GtkWidget     *objmerge_mode_combo;
+  GtkWidget     *tweenmerge_mode_combo;
+  GtkWidget     *tracemerge_mode_combo;
+  GtkWidget     *merge_target_combo;
+
 } t_mov_gui_stuff;
 
 
@@ -384,6 +390,7 @@ static void        mov_path_prevw_create ( GimpDrawable *drawable,
 static void        mov_refresh_src_layer_menu(t_mov_gui_stuff *mgp);
 static GtkWidget * mov_src_sel_create (t_mov_gui_stuff *mgp);
 static GtkWidget * mov_advanced_tab_create(t_mov_gui_stuff *mgp);
+static GtkWidget * mov_merge_tab_create(t_mov_gui_stuff *mgp);
 static GtkWidget * mov_edit_button_box_create (t_mov_gui_stuff *mgp);
 static GtkWidget * mov_path_framerange_box_create(t_mov_gui_stuff *mgp,
                                                   gboolean vertical_layout
@@ -454,6 +461,10 @@ static void mov_imglayer_menu_callback  (GtkWidget *, t_mov_gui_stuff *mgp);
 static void mov_paintmode_menu_callback (GtkWidget *, t_mov_gui_stuff *mgp);
 static void mov_handmode_menu_callback  (GtkWidget *, t_mov_gui_stuff *mgp);
 static void mov_stepmode_menu_callback  (GtkWidget *, t_mov_gui_stuff *mgp);
+static void mov_objmerge_mode_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp);
+static void mov_tweenmerge_mode_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp);
+static void mov_tracemerge_mode_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp);
+static void mov_merge_target_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp);
 static void mov_tweenlayer_sensitivity(t_mov_gui_stuff *mgp);
 static void mov_tracelayer_sensitivity(t_mov_gui_stuff *mgp);
 static void mov_gint_toggle_callback    (GtkWidget *, gpointer);
@@ -769,7 +780,10 @@ p_gap_mov_dlg_move_dialog(t_mov_gui_stuff *mgp
   mgp->handlemode_combo = NULL;
   mgp->src_selmode_combo = NULL;
   mgp->src_layer_combo = NULL;
-
+  mgp->objmerge_mode_combo = NULL;
+  mgp->tweenmerge_mode_combo = NULL;
+  mgp->tracemerge_mode_combo = NULL;
+  mgp->merge_target_combo = NULL;
 
   pvals = mov_ptr->val_ptr;
 
@@ -973,6 +987,7 @@ mov_dialog ( GimpDrawable *drawable, t_mov_gui_stuff *mgp,
   GtkWidget *label;
   GtkWidget *src_sel_frame;
   GtkWidget *advanced_frame;
+  GtkWidget *merge_frame;
   GtkWidget *framerange_table;
   gboolean  vertical_layout;
 
@@ -1118,6 +1133,17 @@ mov_dialog ( GimpDrawable *drawable, t_mov_gui_stuff *mgp,
                              , gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1)
                              , label
                              );
+
+  /* the merge frame */
+  merge_frame = mov_merge_tab_create(mgp);
+  gtk_container_add (GTK_CONTAINER (notebook), merge_frame);
+  label = gtk_label_new(_("Merge Settings"));
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook)
+                             , gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 2)
+                             , label
+                             );
+
+
   gtk_widget_show (notebook);
 
   /* the path preview frame (with all the controlpoint widgets) */
@@ -2510,7 +2536,7 @@ mov_psave_callback (GtkWidget *widget,
  *    may no longer exist at load time)
  *
  * Note that not render relvant widgets are not
- * included in the xml paramter file and are not refreshed here.
+ * included in the xml parameter file and are not refreshed here.
  */
 static void
 p_refresh_widgets_after_load(t_mov_gui_stuff *mgp)
@@ -2539,6 +2565,24 @@ p_refresh_widgets_after_load(t_mov_gui_stuff *mgp)
     gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (mgp->src_selmode_combo), pvals->src_selmode);
   }
 
+  if (mgp->objmerge_mode_combo != NULL)
+  {
+    gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (mgp->objmerge_mode_combo), 
pvals->mergeModeRenderedObject);
+  }
+  if (mgp->tweenmerge_mode_combo != NULL)
+  {
+    gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (mgp->tweenmerge_mode_combo), 
pvals->mergeModeRenderedTweenLayer);
+  }
+  if (mgp->tracemerge_mode_combo != NULL)
+  {
+    gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (mgp->tracemerge_mode_combo), 
pvals->mergeModeRenderedTraceLayer);
+  }
+  if (mgp->merge_target_combo != NULL)
+  {
+    gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (mgp->merge_target_combo), pvals->mergeTarget);
+  }
+
+
   if(mgp->step_speed_factor_adj != NULL)
   {
     gtk_adjustment_set_value(mgp->step_speed_factor_adj,  pvals->step_speed_factor);
@@ -2963,6 +3007,56 @@ mov_stepmode_menu_callback (GtkWidget *widget, t_mov_gui_stuff *mgp)
 
 
 static void
+mov_objmerge_mode_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp)
+{
+  gint value;
+
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &value);
+  pvals->mergeModeRenderedObject = value;
+  if(mgp == NULL) return;
+
+  mov_set_instant_apply_request(mgp);
+}
+
+
+static void
+mov_tweenmerge_mode_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp)
+{
+  gint value;
+
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &value);
+  pvals->mergeModeRenderedTweenLayer = value;
+  if(mgp == NULL) return;
+
+  mov_set_instant_apply_request(mgp);
+}
+
+static void
+mov_tracemerge_mode_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp)
+{
+  gint value;
+
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &value);
+  pvals->mergeModeRenderedTraceLayer = value;
+  if(mgp == NULL) return;
+
+  mov_set_instant_apply_request(mgp);
+}
+
+static void
+mov_merge_target_menu_callback (GtkWidget *widget,  t_mov_gui_stuff *mgp)
+{
+  gint value;
+
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &value);
+  pvals->mergeTarget = value;
+  if(mgp == NULL) return;
+
+  mov_set_instant_apply_request(mgp);
+}
+
+
+static void
 mov_tweenlayer_sensitivity(t_mov_gui_stuff *mgp)
 {
   gboolean l_sensitive;
@@ -4228,6 +4322,214 @@ mov_advanced_tab_create(t_mov_gui_stuff *mgp)
 }       /* end mov_advanced_tab_create */
 
 /* ============================================================================
+ * Create set of widgets for the merge postprocessing Move Path features
+ *   A frame that contains:
+ *   in the 1.st row
+ *   - 3x combo option menu: postrocessing merge options for movingObject, tween and trace layer
+ *   in the 2.nd row
+ *   - 1x combo option menu: postprocessing merge target selection.
+ * ============================================================================
+ */
+static GtkWidget *
+mov_merge_tab_create(t_mov_gui_stuff *mgp)
+{
+  GtkWidget      *table;
+  GtkWidget      *label;
+  GtkWidget      *combo;
+  guint          row;
+  guint          col;
+
+
+  /* the table (2 rows) */
+  table = gtk_table_new (2, 8, FALSE);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 2);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 4);
+
+
+  row = 0;
+  col = 0;
+
+  /* the merge option menu for the moving object */
+  combo = gimp_int_combo_box_new (_("Keep Rendered Object as Layer"),     GAP_MPP_MODE_KEEP,
+                                  _("Merge Down Rendered Object"),        GAP_MPP_MODE_MERGE_DOWN,
+                                  _("Delete Rendered Object"),            GAP_MPP_MODE_DELETE,
+                                  NULL);
+
+
+  {
+    gint initialValue;
+
+    initialValue = GAP_MPP_MODE_KEEP;
+    if(pvals)
+    {
+      switch(pvals->mergeModeRenderedObject)
+      {
+        case GAP_MPP_MODE_KEEP:
+        case GAP_MPP_MODE_MERGE_DOWN:
+        case GAP_MPP_MODE_DELETE:
+          initialValue = pvals->mergeModeRenderedObject;
+          break;
+      }
+    }
+
+    gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
+                              initialValue,
+                              G_CALLBACK (mov_objmerge_mode_menu_callback),
+                              mgp);
+  }
+
+  gtk_table_attach(GTK_TABLE(table), combo, col+0, col+1, row, row+1,
+                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
+  gimp_help_set_help_data(combo,
+                       _("Postprocessing mode for the rendered moving object layer")
+                       , NULL);
+  gtk_widget_show(combo);
+  mgp->objmerge_mode_combo = combo;
+
+
+
+  col++;
+  
+  /* the merge option menu for the tween layer */
+  combo = gimp_int_combo_box_new (_("Keep TweenLayer"),              GAP_MPP_MODE_KEEP,
+                                  _("Merge Down TweenLayer"),        GAP_MPP_MODE_MERGE_DOWN,
+                                  _("Delete TweenLayer"),            GAP_MPP_MODE_DELETE,
+                                  NULL);
+
+
+  {
+    gint initialValue;
+
+    initialValue = GAP_MPP_MODE_KEEP;
+    if(pvals)
+    {
+      switch(pvals->mergeModeRenderedTweenLayer)
+      {
+        case GAP_MPP_MODE_KEEP:
+        case GAP_MPP_MODE_MERGE_DOWN:
+        case GAP_MPP_MODE_DELETE:
+          initialValue = pvals->mergeModeRenderedTweenLayer;
+          break;
+      }
+    }
+
+    gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
+                              initialValue,
+                              G_CALLBACK (mov_tweenmerge_mode_menu_callback),
+                              mgp);
+  }
+
+  gtk_table_attach(GTK_TABLE(table), combo, col+0, col+1, row, row+1,
+                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
+  gimp_help_set_help_data(combo,
+                       _("Postprocessing mode for the tween layer (is ignored when not present)")
+                       , NULL);
+  gtk_widget_show(combo);
+  mgp->tweenmerge_mode_combo = combo;
+
+
+  col++;
+  
+  /* the merge option menu for the trace layer */
+  combo = gimp_int_combo_box_new (_("Keep TraceLayer"),          GAP_MPP_MODE_KEEP,
+                                  _("Merge Down TraceLayer"),    GAP_MPP_MODE_MERGE_DOWN,
+                                  _("Delete TraceLayer"),        GAP_MPP_MODE_DELETE,
+                                  NULL);
+
+
+  {
+    gint initialValue;
+
+    initialValue = GAP_MPP_MODE_KEEP;
+    if(pvals)
+    {
+      switch(pvals->mergeModeRenderedTraceLayer)
+      {
+        case GAP_MPP_MODE_KEEP:
+        case GAP_MPP_MODE_MERGE_DOWN:
+        case GAP_MPP_MODE_DELETE:
+          initialValue = pvals->mergeModeRenderedTraceLayer;
+          break;
+      }
+    }
+
+    gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
+                              initialValue,
+                              G_CALLBACK (mov_tracemerge_mode_menu_callback),
+                              mgp);
+  }
+
+  gtk_table_attach(GTK_TABLE(table), combo, col+0, col+1, row, row+1,
+                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
+  gimp_help_set_help_data(combo,
+                       _("Postprocessing mode for the trace layer (is ignored when not present)")
+                       , NULL);
+  gtk_widget_show(combo);
+  mgp->tracemerge_mode_combo = combo;
+
+
+  col = 0;
+  row = 1;
+
+  /* the merge target option menu widgets */
+
+  label = gtk_label_new( _("Merge Target:"));
+  gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+  gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 4, 0);
+  gtk_widget_show(label);
+
+  combo = gimp_int_combo_box_new (_("New Layer"),                               GAP_MPP_TARGET_NEW_LAYER,
+                                  _("Merge to Layer below"),                    GAP_MPP_TARGET_LOWER_LAYER,
+                                  _("Merge to new Black Mask at Layer below"),  
GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_BLACK,
+                                  _("Merge to new White Mask at Layer below"),  
GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_WHITE,
+                                  _("Merge to existing Mask at Layer below"),   
GAP_MPP_TARGET_LOWER_LAYERS_MASK_ADD,
+                                  NULL);
+
+
+  {
+    gint initialValue;
+
+    initialValue = GAP_MPP_TARGET_NEW_LAYER;
+    if(pvals)
+    {
+      switch(pvals->mergeTarget)
+      {
+        case GAP_MPP_TARGET_NEW_LAYER:
+        case GAP_MPP_TARGET_LOWER_LAYER:
+        case GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_BLACK:
+        case GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_WHITE:
+        case GAP_MPP_TARGET_LOWER_LAYERS_MASK_ADD:
+          initialValue = pvals->mergeTarget;
+          break;
+      }
+    }
+
+    gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
+                              initialValue,
+                              G_CALLBACK (mov_merge_target_menu_callback),
+                              mgp);
+  }
+
+  gtk_table_attach(GTK_TABLE(table), combo, col+1, col+2, row, row+1,
+                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
+  gimp_help_set_help_data(combo,
+                       _("merge target provides options "
+                          "how to postprocess layers rendered by MovePath.")
+                       , NULL);
+  gtk_widget_show(combo);
+  mgp->merge_target_combo = combo;
+
+
+
+  gtk_widget_show( table );
+
+  return table;
+}       /* end mov_merge_tab_create */
+
+
+
+/* ============================================================================
  * Create new EditCtrlPoint Frame
  * ============================================================================
  */
@@ -6986,7 +7288,7 @@ gap_mov_dlg_move_dialog_singleframe(GapMovSingleFrame *singleFramePtr)
   gap_arr_arg_init(&argv[l_ii], GAP_ARR_WGT_FILESEL);
   argv[l_ii].label_txt = _("MovePath xmlfile:");
   argv[l_ii].entry_width = 400;
-  argv[l_ii].help_txt  = _("Name of the file containing move path paramters and controlpoints in XML 
format");
+  argv[l_ii].help_txt  = _("Name of the file containing move path parameters and controlpoints in XML 
format");
   argv[l_ii].text_buf_len = sizeof(singleFramePtr->xml_paramfile);
   argv[l_ii].text_buf_ret = singleFramePtr->xml_paramfile;
 
diff --git a/gap/gap_mov_dialog.h b/gap/gap_mov_dialog.h
index f5ede9c..44426a7 100644
--- a/gap/gap_mov_dialog.h
+++ b/gap/gap_mov_dialog.h
@@ -27,6 +27,7 @@
 #define _GAP_MOV_DIALOG_H
 
 /* revision history:
+ * gimp    2.8.14;  2015/08/24  hof: support merge down postprocessing
  * gimp    2.8.10;  2014/05/07  hof: support unlimited number of controlpoints.
  * gimp    1.3.20d; 2003/10/14  hof: added bluebox stuff
  * gimp    1.3.20d; 2003/10/05  hof: added tweenindex (twix)
@@ -44,7 +45,7 @@
 
 #define GAP_MOV_KEEP_SRC_PAINTMODE 4444
 
-#define GAP_MOV_INT_VERSION 2
+#define GAP_MOV_INT_VERSION 3
 
 #define   GAP_MOVPATH_XML_FILENAME_MAX_LENGTH     1024
 #define   GAP_MOVEPATH_GIMPRC_LOG_RENDER_PARAMS "video-move-path-log-render-params"
@@ -93,6 +94,22 @@ typedef enum
   GAP_MOV_SEL_FRAME_SPECIFIC  = 2
 } GapMovSelMode;
 
+typedef enum
+{
+  GAP_MPP_MODE_KEEP        = 0,
+  GAP_MPP_MODE_MERGE_DOWN  = 1,
+  GAP_MPP_MODE_DELETE      = 2
+} GapMovMergePostProcessingMode;
+
+typedef enum
+{
+  GAP_MPP_TARGET_NEW_LAYER                        = 0,
+  GAP_MPP_TARGET_LOWER_LAYER                      = 1,
+  GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_BLACK  = 2,
+  GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_WHITE  = 3,
+  GAP_MPP_TARGET_LOWER_LAYERS_MASK_ADD            = 4
+} GapMovMergePostProcessingTargetMode;
+
 typedef struct {
         gint32  dst_frame_nr;        /* current destination frame_nr */
         gint32  src_layer_parent_id; /* 0 for toplevel layer that are not member of a layer group */
@@ -275,6 +292,13 @@ typedef struct {
 
         gchar  *dst_group_name_path_string;
         gchar  *dst_group_name_delimiter;
+        
+        /* for merge down postprocessing options */
+        GapMovMergePostProcessingMode  mergeModeRenderedObject;
+        GapMovMergePostProcessingMode  mergeModeRenderedTweenLayer;
+        GapMovMergePostProcessingMode  mergeModeRenderedTraceLayer;
+        GapMovMergePostProcessingTargetMode  mergeTarget;
+
 
 } GapMovValues;
 
diff --git a/gap/gap_mov_exec.c b/gap/gap_mov_exec.c
index ca57e68..9013dbc 100644
--- a/gap/gap_mov_exec.c
+++ b/gap/gap_mov_exec.c
@@ -78,7 +78,9 @@
 
 extern      int gap_debug; /* ==0  ... dont print debug infos */
 
-static void p_add_tween_and_trace(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *cur_ptr);
+static void p_add_tween_and_trace_and_postprocessing(gint32 dest_image_id, GapMovData *mov_ptr, 
GapMovCurrent *cur_ptr);
+static void p_mov_merge_postprocessor(gint32 dest_image_id, GapMovValues *val_ptr,
+              gint32 theMovingObjectLayer, gint32 theTweenLayerId, gint32 theTraceLayerId, gint32 
theLayerBelow);
 static gint p_mov_call_render(GapMovData *mov_ptr, GapMovCurrent *cur_ptr, gint apv_layerstack);
 static void p_mov_advance_src_layer(GapMovCurrent *cur_ptr, GapMovValues  *pvals);
 static long p_mov_advance_src_frame_no_fetch(GapMovCurrent *cur_ptr, GapMovValues  *pvals);
@@ -229,34 +231,49 @@ gap_mov_exec_set_iteration_relevant_src_layers(GapMovCurrent *cur_ptr, gint32 sr
 
 
 /* ============================================================================
- * p_add_tween_and_trace
+ * p_add_tween_and_trace_and_postprocessing
  * ============================================================================
+ *
+ * copy the trace_layer to the dest_image (if there is one)
+ *
  * if there are tween_layers add them to the dest_image
  * and remove them from the tween_image.
  *
- * copy the trace_layer to the dest_image (if there is one)
+ * call postprocessing to perform merge options on the dest_image_id
  */
 
 void
-p_add_tween_and_trace(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *cur_ptr)
+p_add_tween_and_trace_and_postprocessing(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *cur_ptr)
 {
   GimpMergeType l_mergemode;
-  gint32  l_new_layer_id;
   gint    l_src_offset_x, l_src_offset_y;
   gint32  l_layer_id;
+  gint32  l_parent_id;
+  gint32  theMovingObjectLayer;
+  gint32  theTweenLayerId;
+  gint32  theTraceLayerId;
+  gint32  theLayerBelow;
 
   l_mergemode = GIMP_EXPAND_AS_NECESSARY;
   if(mov_ptr->val_ptr->clip_to_img)
   {
     l_mergemode = GIMP_CLIP_TO_IMAGE;
   }
+  
+  l_parent_id = -1;
+  theMovingObjectLayer = cur_ptr->processedLayerId;
+  theTweenLayerId = -1;
+  theTraceLayerId = -1;
+  theLayerBelow = gap_image_get_the_layer_below(theMovingObjectLayer);
+
+  theMovingObjectLayer = cur_ptr->processedLayerId;
 
   /* add Trace_layer */
   if((mov_ptr->val_ptr->trace_image_id >= 0)
   && (mov_ptr->val_ptr->trace_layer_id >= 0))
   {
     /* copy the layer from the temp image to the anim preview multilayer image */
-    l_new_layer_id = gap_layer_copy_to_dest_image(dest_image_id,
+    theTraceLayerId = gap_layer_copy_to_dest_image(dest_image_id,
                                    mov_ptr->val_ptr->trace_layer_id,
                                    100.0,       /* opacity full */
                                    0,           /* NORMAL */
@@ -265,7 +282,14 @@ p_add_tween_and_trace(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *
                                    );
 
     /* add the layer to the destination image */
-    gimp_image_insert_layer (dest_image_id, l_new_layer_id, 0, mov_ptr->val_ptr->dst_layerstack +1);
+    l_parent_id = gap_image_find_or_create_group_layer(dest_image_id
+                           , mov_ptr->val_ptr->dst_group_name_path_string
+                           , mov_ptr->val_ptr->dst_group_name_delimiter
+                           , mov_ptr->val_ptr->dst_layerstack     /* stackposition for the group in case it 
is created at toplvel */
+                           , FALSE  /* enableCreate */
+                           );
+
+    gimp_image_insert_layer (dest_image_id, theTraceLayerId, l_parent_id, mov_ptr->val_ptr->dst_layerstack 
+1);
 
     /* keep the trace_layer for all further move path processing steps */
   }
@@ -287,7 +311,7 @@ p_add_tween_and_trace(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *
     l_layer_id = gap_image_merge_visible_layers(mov_ptr->val_ptr->tween_image_id, l_mergemode);
 
     /* copy the layer from the temp image to the anim preview multilayer image */
-    l_new_layer_id = gap_layer_copy_to_dest_image(dest_image_id,
+    theTweenLayerId = gap_layer_copy_to_dest_image(dest_image_id,
                                    l_layer_id,
                                    100.0,       /* opacity full */
                                    0,           /* NORMAL */
@@ -296,7 +320,16 @@ p_add_tween_and_trace(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *
                                    );
 
     /* add the layer to the destination image */
-    gimp_image_insert_layer (dest_image_id, l_new_layer_id, 0, mov_ptr->val_ptr->dst_layerstack +1);
+    if (l_parent_id < 0)
+    {
+      l_parent_id = gap_image_find_or_create_group_layer(dest_image_id
+                           , mov_ptr->val_ptr->dst_group_name_path_string
+                           , mov_ptr->val_ptr->dst_group_name_delimiter
+                           , mov_ptr->val_ptr->dst_layerstack     /* stackposition for the group in case it 
is created at toplvel */
+                           , FALSE  /* enableCreate */
+                           );
+    }
+    gimp_image_insert_layer (dest_image_id, theTweenLayerId, l_parent_id, mov_ptr->val_ptr->dst_layerstack 
+1);
 
     if((mov_ptr->val_ptr->trace_image_id >= 0)
     && (mov_ptr->val_ptr->trace_layer_id >= 0))
@@ -305,7 +338,7 @@ p_add_tween_and_trace(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *
        * in this case the tween_layer is set invisible
        *
        */
-       gimp_item_set_visible(l_new_layer_id, FALSE);
+       gimp_item_set_visible(theTweenLayerId, FALSE);
     }
 
     /* remove tween layers from the tween_image after usage */
@@ -315,8 +348,277 @@ p_add_tween_and_trace(gint32 dest_image_id, GapMovData *mov_ptr, GapMovCurrent *
     gimp_image_delete(mov_ptr->val_ptr->tween_image_id);
     mov_ptr->val_ptr->tween_image_id = l_new_tween_image_id;
   }
+  
+  
+  /* postprocessing for optional merge / delete layers rendered by this move path call */
+  p_mov_merge_postprocessor(dest_image_id, mov_ptr->val_ptr
+     , theMovingObjectLayer
+     , theTweenLayerId 
+     , theTraceLayerId
+     , theLayerBelow
+     );
+
+}  /* end p_add_tween_and_trace_and_postprocessing */
+
+
+/* --------------------------------------
+ * p_mov_merge_postprocessor
+ * --------------------------------------
+ * Handle Merging and removal of layers in the currently processed frame image.
+ * The (optional) merge affects layers that were created / rendered by MovePath render processing
+ * it the following Stackposition order.
+ *     MovingObjectLayer  renderedObjectLayerId  
+ *     Tweenlayer         tweenLayerId   (optionally present when tween layer feature is active)
+ *     Tracelayer         traceLayerId   (optionally present when trace layer feature is active)
+ *     a layer below      existingLayerBelowId (may not be present when inserting on bottom of layertack or 
group)
+ *
+ * Notes:
+ * - in case any merge action is required
+ *   a working layer is created at image size.
+ *   The work layer will be fully transparent (in case the merge taget is NOT a Lyermask)
+ *   or may be BLACK opaque, WHITE opaque and optionally copied from an already existing layer mask
+ *   (in case the merge target is a layermask)
+ *   The renderedObject, Tween and Trace layer(s) will be merged down to the newly created worklayer.
+ *   and the merged working layer is then either:
+ *   o) copied into the layermask (and removed)  ... for mergeTarget types GAP_MPP_TARGET_LOWER_LAYERS_MASK_*
+ *   o) mereged down to the existing Layer Below ... for mergeTarget type GAP_MPP_TARGET_LOWER_LAYER
+ *   o) kept as final render result              ... for mergeTarget type GAP_MPP_TARGET_NEW_LAYER
+ *
+ */
+static void
+p_mov_merge_postprocessor(gint32 dest_image_id, GapMovValues *val_ptr,
+  gint32 theMovingObjectLayer, gint32 theTweenLayerId, gint32 theTraceLayerId, gint32 theLayerBelow)
+{
+  gint32 renderedObjectLayerId = -1;
+  gint32 tweenLayerId = -1;
+  gint32 traceLayerId = -1;
+  gint32 existingLayerBelowId = -1;
+  gint32 workLayerId = -1;
+  gint   mergemode;
+  
+  
+  mergemode = GIMP_EXPAND_AS_NECESSARY;
+  
+  renderedObjectLayerId = theMovingObjectLayer;
+  tweenLayerId = theTweenLayerId;
+  traceLayerId = theTraceLayerId;
+  existingLayerBelowId = theLayerBelow;
+  
+  if ((val_ptr->mergeModeRenderedObject == GAP_MPP_MODE_MERGE_DOWN)
+  || (val_ptr->mergeModeRenderedTweenLayer == GAP_MPP_MODE_MERGE_DOWN)
+  || (val_ptr->mergeModeRenderedTraceLayer == GAP_MPP_MODE_MERGE_DOWN))
+  {
+    /* if any merge is to be done, create a worklayer
+     * below the rendered layers but above the 
+     * layer that already existed before the move path operation.
+     * The worklayer is fully transparent 
+     *   (in case of layer mask as merge target it is BLACK, WHITE or filled with 
+     *    already existing layermask content)
+     * It is the base for all merge down
+     * postprocessing in this procedure.
+     */
+    gboolean imageSize;
+    gint32   refLayer;
+    
+    imageSize = TRUE;
+    if (existingLayerBelowId >= 0)
+    {
+      /* worklayer position above the existing Layer */
+      workLayerId = gap_layer_new_same_size_and_offsets(dest_image_id, existingLayerBelowId, imageSize);
+    }
+    else
+    {
+      workLayerId = gap_layer_new_same_size_and_offsets(dest_image_id, renderedObjectLayerId, imageSize);
+      gimp_image_lower_item(dest_image_id, workLayerId);
+      if (tweenLayerId >= 0)
+      {
+        gimp_image_lower_item(dest_image_id, workLayerId);
+      }
+      if (traceLayerId >= 0)
+      {
+        gimp_image_lower_item(dest_image_id, workLayerId);
+      }
+      /* now layerstack shall look like this:
+       *   renderedObjectLayerId (foreground)
+       *   [ tweenLayerId ]      (optional) 
+       *   [ traceLayerId ]      (optional)
+       *   workLayerId
+       */
+    }
+    if (!gimp_drawable_has_alpha(workLayerId))
+    {
+      gimp_layer_add_alpha(workLayerId);
+    }
+    
+    if ((existingLayerBelowId >= 0) && (val_ptr->mergeTarget == GAP_MPP_TARGET_LOWER_LAYERS_MASK_ADD))
+    {
+      gint32 l_layermask_id;
+                  
+      
+      l_layermask_id = gimp_layer_get_mask(existingLayerBelowId);
+      if (l_layermask_id >= 0) 
+      {
+         /* fill workLayerId (BLACK fully TRANSPARENT) */
+         gap_layer_clear_to_color(workLayerId
+                                    ,0.0 /* red */
+                                    ,0.0 /* green */
+                                    ,0.0 /* blue */
+                                    ,0.0 /* alpha */
+                              );
+         /* the existingLayerBelowId already HAS a Layermask 
+          * Copy from this Layermask into the worklayer
+          */
+         gimp_image_select_item(dest_image_id, GIMP_CHANNEL_OP_REPLACE, existingLayerBelowId);
+        gap_layer_copy_paste_drawable(-1  /* image_id -1 indicates to keep existing selection */
+                                      , workLayerId  /* destination drawable */
+                                      , l_layermask_id     /* source drawable */
+                                      );
+      }
+      else
+      {
+         /* fill workLayerId (BLACK fully opaque) */
+         gap_layer_clear_to_color(workLayerId
+                                    ,0.0 /* red */
+                                    ,0.0 /* green */
+                                    ,0.0 /* blue */
+                                    ,1.0 /* alpha */
+                              );
+      }
+    }
+    else if ((existingLayerBelowId >= 0) && (val_ptr->mergeTarget == 
GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_BLACK))
+    {
+      /* fill workLayerId (BLACK fully opaque) */
+      gap_layer_clear_to_color(workLayerId
+                                    ,0.0 /* red */
+                                    ,0.0 /* green */
+                                    ,0.0 /* blue */
+                                    ,1.0 /* alpha */
+                              );
+    }
+    else if ((existingLayerBelowId >= 0) && (val_ptr->mergeTarget == 
GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_WHITE))
+    {
+      /* fill workLayerId (WHITE fully opaque) */
+      gap_layer_clear_to_color(workLayerId
+                                    ,1.0 /* red */
+                                    ,1.0 /* green */
+                                    ,1.0 /* blue */
+                                    ,1.0 /* alpha */
+                              );
+    }
+    else
+    {
+      /* fill workLayerId (BLACK fully TRANSPARENT) */
+      gap_layer_clear_to_color(workLayerId
+                                    ,0.0 /* red */
+                                    ,0.0 /* green */
+                                    ,0.0 /* blue */
+                                    ,0.0 /* alpha */
+                              );
+    }
+  }
+  
+  if (traceLayerId >= 0)
+  {
+    if (val_ptr->mergeModeRenderedTraceLayer == GAP_MPP_MODE_DELETE)
+    {
+       gimp_image_remove_layer(dest_image_id, traceLayerId);
+       traceLayerId = -1;
+    } else if (val_ptr->mergeModeRenderedTraceLayer == GAP_MPP_MODE_MERGE_DOWN) {
+       /* merge trace layer down to worklayer, merged result is the new worklayer */
+       gimp_item_set_visible(traceLayerId, TRUE); /* force visibility to ensure included in the merge down */
+       workLayerId = gimp_image_merge_down(dest_image_id, traceLayerId, mergemode);
+       traceLayerId = -1;
+    }
+    /* else Keep the trace layer */
+  }
+  
+  if (tweenLayerId >= 0)
+  {
+    if (val_ptr->mergeModeRenderedTweenLayer == GAP_MPP_MODE_DELETE)
+    {
+       gimp_image_remove_layer(dest_image_id, tweenLayerId);
+       tweenLayerId = -1;
+    } else if (val_ptr->mergeModeRenderedTweenLayer == GAP_MPP_MODE_MERGE_DOWN) {
+       if (traceLayerId >= 0)
+       {
+         /* lower the tweenLayerId below the still existing traceLayerId 
+          * (that shall be kept and protectect from merge down)
+          */
+         gimp_image_lower_item(dest_image_id, tweenLayerId);
+       }
+       /* merge tween layer down to worklayer, merged result is the new worklayer */
+       gimp_item_set_visible(tweenLayerId, TRUE); /* force visibility to ensure included in the merge down */
+       workLayerId = gimp_image_merge_down(dest_image_id, tweenLayerId, mergemode);
+       tweenLayerId = -1;
+    }
+    /* else Keep the tween layer */
+  }
+
+
+  if (renderedObjectLayerId >= 0)
+  {
+    if (val_ptr->mergeModeRenderedObject == GAP_MPP_MODE_DELETE)
+    {
+       gimp_image_remove_layer(dest_image_id, renderedObjectLayerId);
+       renderedObjectLayerId = -1;
+    } else if (val_ptr->mergeModeRenderedObject == GAP_MPP_MODE_MERGE_DOWN) {
+       if (tweenLayerId >= 0)
+       {
+         /* lower the renderedObjectLayerId below the still existing tweenLayerId 
+          * (that shall be kept and protectect from merge down)
+          */
+         gimp_image_lower_item(dest_image_id, renderedObjectLayerId);
+       }
+       if (traceLayerId >= 0)
+       {
+         /* lower the tweenLayerId below the still existing traceLayerId 
+          * (that shall be kept and protectect from merge down)
+          */
+         gimp_image_lower_item(dest_image_id, renderedObjectLayerId);
+       }
+       /* merge tween layer down to worklayer, merged result is the new worklayer */
+       gimp_item_set_visible(renderedObjectLayerId, TRUE); /* force visibility to ensure included in the 
merge down */
+       workLayerId = gimp_image_merge_down(dest_image_id, renderedObjectLayerId, mergemode);
+       renderedObjectLayerId = -1;
+    }
+    /* else Keep the rendered Object Layer  */
+  }
+  
+  if ((existingLayerBelowId >= 0) && (workLayerId >= 0))
+  {
+    if (val_ptr->mergeTarget == GAP_MPP_TARGET_LOWER_LAYER)
+    {
+       workLayerId = gimp_image_merge_down(dest_image_id, workLayerId, mergemode);
+       existingLayerBelowId = -1;
+    }
+    else if ((val_ptr->mergeTarget == GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_BLACK)
+         ||  (val_ptr->mergeTarget == GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_WHITE)
+         ||  (val_ptr->mergeTarget == GAP_MPP_TARGET_LOWER_LAYERS_MASK_ADD))
+    {
+      gint32 l_layermask_id;
+              
+      l_layermask_id = gimp_layer_get_mask(existingLayerBelowId);
+      if (l_layermask_id >= 0) 
+      {
+        gimp_layer_remove_mask (existingLayerBelowId, GIMP_MASK_DISCARD);
+      }
+      l_layermask_id = gimp_layer_create_mask(existingLayerBelowId, GIMP_ADD_BLACK_MASK);
+      gimp_layer_add_mask(existingLayerBelowId, l_layermask_id);
+
+      /* copy workLayerId into the layermask of existingLayerBelowId */
+      gimp_image_select_item(dest_image_id, GIMP_CHANNEL_OP_REPLACE, existingLayerBelowId);
+      gap_layer_copy_paste_drawable(-1  /* image_id -1 indicates to keep existing selection */
+                                    , l_layermask_id  /* destination drawable */
+                                    , workLayerId     /* source drawable */
+                                    );
+      gimp_image_remove_layer(dest_image_id, workLayerId);  /* remove workLayerId after copying */
+
+    }
+  }
+
+ 
+}  /* end p_mov_merge_postprocessor */
 
-}  /* end p_add_tween_and_trace */
 
 
 /* ============================================================================
@@ -471,7 +773,7 @@ p_mov_call_render(GapMovData *mov_ptr, GapMovCurrent *cur_ptr, gint apv_layersta
         /* check if we have tween_layer and/or trace_layer
          * and add them to the temp image
          */
-        p_add_tween_and_trace(l_tmp_image_id, mov_ptr, cur_ptr);
+        p_add_tween_and_trace_and_postprocessing(l_tmp_image_id, mov_ptr, cur_ptr);
 
         if(singleFramePtr == NULL)
         {
@@ -546,7 +848,7 @@ p_mov_call_render(GapMovData *mov_ptr, GapMovCurrent *cur_ptr, gint apv_layersta
         /* check if we have tween_layer and/or trace_layer
          * and add them to the temp image
          */
-        p_add_tween_and_trace(l_tmp_image_id, mov_ptr, cur_ptr);
+        p_add_tween_and_trace_and_postprocessing(l_tmp_image_id, mov_ptr, cur_ptr);
 
         /* flatten the rendered frame */
         l_layer_id = gimp_image_flatten(l_tmp_image_id);
@@ -4386,6 +4688,11 @@ GapMovValues *gap_mov_exec_new_GapMovValues()
   pvals->point_table_size = 0;
   pvals->point = NULL;
   gap_mov_exec_dim_point_table(pvals, GAP_MOV_POINT_INITIAL_SIZE);
+  
+  pvals->mergeModeRenderedObject = GAP_MPP_MODE_KEEP;
+  pvals->mergeModeRenderedTweenLayer = GAP_MPP_MODE_KEEP;
+  pvals->mergeModeRenderedTraceLayer = GAP_MPP_MODE_KEEP;
+  pvals->mergeTarget = GAP_MPP_TARGET_NEW_LAYER;
 
 
   return(pvals);
@@ -4484,6 +4791,10 @@ void gap_mov_exec_copy_xml_GapMovValues(GapMovValues *dstValues, GapMovValues *s
   dstValues->tracelayer_enable = srcValues->tracelayer_enable;
   dstValues->tween_steps = srcValues->tween_steps;
 
+  dstValues->mergeModeRenderedObject = srcValues->mergeModeRenderedObject;
+  dstValues->mergeModeRenderedTweenLayer = srcValues->mergeModeRenderedTweenLayer;
+  dstValues->mergeModeRenderedTraceLayer = srcValues->mergeModeRenderedTraceLayer;
+  dstValues->mergeTarget = srcValues->mergeTarget;
 
   dstValues->point_idx = srcValues->point_idx;
   dstValues->point_idx_max = srcValues->point_idx_max;
diff --git a/gap/gap_mov_xml_par.c b/gap/gap_mov_xml_par.c
index 47efb52..dedb627 100644
--- a/gap/gap_mov_xml_par.c
+++ b/gap/gap_mov_xml_par.c
@@ -148,6 +148,11 @@
 #define GAP_MOVPATH_XML_TOKEN_ACC_PERSPECTIVE        "acc_perspective"
 #define GAP_MOVPATH_XML_TOKEN_ACC_SEL_FEATHER_RADIUS "acc_sel_feather_radius"
 
+#define GAP_MOVPATH_XML_TOKEN_MERGE_OPTIONS                 "merge_options"
+#define GAP_MOVPATH_XML_TOKEN_MERGE_MODE_OBJECT             "merge_mode_object"
+#define GAP_MOVPATH_XML_TOKEN_MERGE_MODE_TWEEN_LAYER        "merge_mode_tween"
+#define GAP_MOVPATH_XML_TOKEN_MERGE_MODE_TRACE_LAYER        "merge_mode_trace"
+#define GAP_MOVPATH_XML_TOKEN_MERGE_TARGET                  "merge_target"
 
 
 
@@ -196,6 +201,11 @@ static void  p_xml_parse_element_moving_object(const gchar         *element_name
     const gchar        **attribute_values,
     GapMovXmlUserData   *userDataPtr,
     gint                 count);
+static void  p_xml_parse_element_merge_options(const gchar         *element_name,
+    const gchar        **attribute_names,
+    const gchar        **attribute_values,
+    GapMovXmlUserData   *userDataPtr,
+    gint                 count);
 static void  p_xml_parse_element_trace(const gchar         *element_name,
     const gchar        **attribute_names,
     const gchar        **attribute_values,
@@ -248,6 +258,7 @@ static  JmpTableElement    jmpTableElement[] = {
  ,{0, FALSE, GAP_MOVPATH_XML_TOKEN_BLUEBOX_PARAMETERS,      p_xml_parse_element_bluebox_parameters }
  ,{0, TRUE,  GAP_MOVPATH_XML_TOKEN_CONTROLPOINTS,           p_xml_parse_element_controlpoints }
  ,{0, TRUE,  GAP_MOVPATH_XML_TOKEN_CONTROLPOINT,            p_xml_parse_element_controlpoint }
+ ,{0, FALSE, GAP_MOVPATH_XML_TOKEN_MERGE_OPTIONS,           p_xml_parse_element_merge_options }
  ,{0, FALSE, NULL,                                          NULL }
 };
 
@@ -327,7 +338,23 @@ static const GEnumValue valuesGapBlueboxThresMode[] =
   { 0,                             NULL, NULL }
 };
 
+static const GEnumValue valuesGapMovMergePostProcessingMode[] =
+{
+  { GAP_MPP_MODE_KEEP,            "GAP_MPP_MODE_KEEP", NULL },
+  { GAP_MPP_MODE_MERGE_DOWN,      "GAP_MPP_MODE_MERGE_DOWN", NULL },
+  { GAP_MPP_MODE_DELETE,          "GAP_MPP_MODE_DELETE", NULL },
+  { 0,                             NULL, NULL }
+};
 
+static const GEnumValue valuesGapMovMergePostProcessingTargetMode[] =
+{
+  { GAP_MPP_TARGET_NEW_LAYER,                       "GAP_MPP_TARGET_NEW_LAYER", NULL },
+  { GAP_MPP_TARGET_LOWER_LAYER,                     "GAP_MPP_TARGET_LOWER_LAYER", NULL },
+  { GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_BLACK, "GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_BLACK", NULL },
+  { GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_WHITE, "GAP_MPP_TARGET_LOWER_LAYERS_MASK_REPLACE_WHITE", NULL },
+  { GAP_MPP_TARGET_LOWER_LAYERS_MASK_ADD,           "GAP_MPP_TARGET_LOWER_LAYERS_MASK_ADD", NULL },
+  { 0,                                              NULL, NULL }
+};
 
 /*
  * XML PARSER procedures
@@ -436,6 +463,43 @@ p_xml_parse_value_GapBlueboxThresMode(const gchar *attribute_value, GapBlueboxTh
 }  /* end p_xml_parse_value_GapBlueboxThresMode */
 
 
+/* -----------------------------------------------
+ * p_xml_parse_value_GapMovMergePostProcessingMode
+ * -----------------------------------------------
+ */
+static gboolean
+p_xml_parse_value_GapMovMergePostProcessingMode(const gchar *attribute_value, GapMovMergePostProcessingMode 
*valDestPtr)
+{
+  gboolean isOk;
+  gint     value;
+
+  isOk = gap_xml_parse_EnumValue_as_gint(attribute_value, &value, &valuesGapMovMergePostProcessingMode[0]);
+  if(isOk)
+  {
+    *valDestPtr = value;
+  }
+  return (isOk);
+
+}  /* end p_xml_parse_value_GapMovMergePostProcessingMode */
+
+/* -----------------------------------------------------
+ * p_xml_parse_value_GapMovMergePostProcessingTargetMode
+ * -----------------------------------------------------
+ */
+static gboolean
+p_xml_parse_value_GapMovMergePostProcessingTargetMode(const gchar *attribute_value, 
GapMovMergePostProcessingTargetMode *valDestPtr)
+{
+  gboolean isOk;
+  gint     value;
+
+  isOk = gap_xml_parse_EnumValue_as_gint(attribute_value, &value, 
&valuesGapMovMergePostProcessingTargetMode[0]);
+  if(isOk)
+  {
+    *valDestPtr = value;
+  }
+  return (isOk);
+
+}  /* end p_xml_parse_value_GapMovMergePostProcessingTargetMode */
 
 
 /* --------------------------------------
@@ -698,6 +762,49 @@ p_xml_parse_element_moving_object(const gchar         *element_name,
 
 
 /* --------------------------------------
+ * p_xml_parse_element_merge_options
+ * --------------------------------------
+ */
+static void
+p_xml_parse_element_merge_options(const gchar         *element_name,
+    const gchar        **attribute_names,
+    const gchar        **attribute_values,
+    GapMovXmlUserData   *userDataPtr,
+    gint                 count)
+{
+  const gchar **name_cursor = attribute_names;
+  const gchar **value_cursor = attribute_values;
+
+  if(count > 0)
+  {
+    userDataPtr->isParseOk = FALSE;
+  }
+
+  while ((*name_cursor) && (userDataPtr->isParseOk))
+  {
+    if (strcmp (*name_cursor, GAP_MOVPATH_XML_TOKEN_MERGE_MODE_OBJECT) == 0)
+    {
+      userDataPtr->isParseOk = p_xml_parse_value_GapMovMergePostProcessingMode(*value_cursor, 
&userDataPtr->pvals->mergeModeRenderedObject);
+    }
+    else if (strcmp (*name_cursor, GAP_MOVPATH_XML_TOKEN_MERGE_MODE_TWEEN_LAYER) == 0)
+    {
+      userDataPtr->isParseOk = p_xml_parse_value_GapMovMergePostProcessingMode(*value_cursor, 
&userDataPtr->pvals->mergeModeRenderedTweenLayer);
+    }
+    else if (strcmp (*name_cursor, GAP_MOVPATH_XML_TOKEN_MERGE_MODE_TRACE_LAYER) == 0)
+    {
+      userDataPtr->isParseOk = p_xml_parse_value_GapMovMergePostProcessingMode(*value_cursor, 
&userDataPtr->pvals->mergeModeRenderedTraceLayer);
+    }
+    else if (strcmp (*name_cursor, GAP_MOVPATH_XML_TOKEN_MERGE_TARGET) == 0)
+    {
+      userDataPtr->isParseOk = p_xml_parse_value_GapMovMergePostProcessingTargetMode(*value_cursor, 
&userDataPtr->pvals->mergeTarget);
+    }
+
+    name_cursor++;
+    value_cursor++;
+  }
+}   /* end  p_xml_parse_element_merge_options */
+
+/* --------------------------------------
  * p_xml_parse_element_bluebox_parameters
  * --------------------------------------
  */
@@ -1499,6 +1606,7 @@ gap_mov_xml_par_save(char *filename, GapMovValues *pvals)
       gap_xml_write_gint_as_gboolean_value(l_fp, GAP_MOVPATH_XML_TOKEN_SRC_FORCE_VISIBLE, 
pvals->src_force_visible);
       gap_xml_write_gint_as_gboolean_value(l_fp, GAP_MOVPATH_XML_TOKEN_CLIP_TO_IMG, pvals->clip_to_img);
       gap_xml_write_gint_as_gboolean_value(l_fp, GAP_MOVPATH_XML_TOKEN_SRC_APPLY_BLUEBOX, 
pvals->src_apply_bluebox);
+
       fprintf(l_fp, "\n");
 
       /* attributes for applying bluebox transparency processing */
@@ -1542,6 +1650,20 @@ gap_mov_xml_par_save(char *filename, GapMovValues *pvals)
 
     fprintf(l_fp, "\n");
 
+
+    fprintf(l_fp, "  <%s ", GAP_MOVPATH_XML_TOKEN_MERGE_OPTIONS);
+    /* write merge postprocessing options */
+    gap_xml_write_EnumValue(l_fp, GAP_MOVPATH_XML_TOKEN_MERGE_MODE_OBJECT, pvals->mergeModeRenderedObject, 
&valuesGapMovMergePostProcessingMode[0]);
+    gap_xml_write_EnumValue(l_fp, GAP_MOVPATH_XML_TOKEN_MERGE_MODE_TWEEN_LAYER, 
pvals->mergeModeRenderedTweenLayer, &valuesGapMovMergePostProcessingMode[0]);
+    gap_xml_write_EnumValue(l_fp, GAP_MOVPATH_XML_TOKEN_MERGE_MODE_TRACE_LAYER, 
pvals->mergeModeRenderedTraceLayer, &valuesGapMovMergePostProcessingMode[0]);
+    fprintf(l_fp, "\n    ");
+    gap_xml_write_EnumValue(l_fp, GAP_MOVPATH_XML_TOKEN_MERGE_TARGET, pvals->mergeTarget, 
&valuesGapMovMergePostProcessingTargetMode[0]);
+    fprintf(l_fp, "\n");
+    fprintf(l_fp, "    >\n");
+    fprintf(l_fp, "  </%s>\n", GAP_MOVPATH_XML_TOKEN_MERGE_OPTIONS);
+    fprintf(l_fp, "\n");
+
+
     /* controlpoints */
 
     fprintf(l_fp, "  <%s ", GAP_MOVPATH_XML_TOKEN_CONTROLPOINTS);
diff --git a/gap/gap_mpege.c b/gap/gap_mpege.c
index c261daf..c636551 100644
--- a/gap/gap_mpege.c
+++ b/gap/gap_mpege.c
@@ -432,7 +432,7 @@ int p_mpege_dialog(GapAnimInfo *ainfo_ptr, t_mpg_par *mp_ptr, GapMpegEncoderType
 
      gap_arr_arg_init(&argv[10], GAP_ARR_WGT_OPTIONMENU);
      argv[10].label_txt = _("P-Search:");
-     argv[10].help_txt  = _("Search algorithmus used for P-frames");
+     argv[10].help_txt  = _("Search algorithm used for P-frames");
      argv[10].radio_argc = 3;
      argv[10].radio_argv = psearch_args;
      argv[10].radio_ret  = 1;
@@ -441,7 +441,7 @@ int p_mpege_dialog(GapAnimInfo *ainfo_ptr, t_mpg_par *mp_ptr, GapMpegEncoderType
 
      gap_arr_arg_init(&argv[11], GAP_ARR_WGT_OPTIONMENU);
      argv[11].label_txt = _("B-Search:");
-     argv[11].help_txt  = _("Search algorithmus used for B-frames");
+     argv[11].help_txt  = _("Search algorithm used for B-frames");
      argv[11].radio_argc = 3;
      argv[11].radio_argv = bsearch_args;
      argv[11].radio_ret  = 1;
diff --git a/gap/gap_onion_dialog.c b/gap/gap_onion_dialog.c
index a224886..d959c6b 100644
--- a/gap/gap_onion_dialog.c
+++ b/gap/gap_onion_dialog.c
@@ -1173,7 +1173,7 @@ create_oni__dialog (GapOnionMainGlobalParams *gpp)
                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                     (GtkAttachOptions) (0), 0, 0);
   gimp_help_set_help_data(oni__spinbutton_opacity_delta
-                         , _("Descending opacity for 2.nd onionskin layer")
+                         , _("Descending opacity for 2nd onionskin layer")
                          , NULL);
 
   tab1_row++;
diff --git a/gap/gap_onion_main.c b/gap/gap_onion_main.c
index af6bae4..bcf3d45 100644
--- a/gap/gap_onion_main.c
+++ b/gap/gap_onion_main.c
@@ -137,7 +137,7 @@ query ()
   gimp_plugin_domain_register (GETTEXT_PACKAGE, LOCALEDIR);
 
   gimp_install_procedure(GAP_PLUGIN_NAME_ONION_CFG,
-                         "This plugin sets Configuration for Onion Layers in Videofames",
+                         "This plugin sets Configuration for Onion Layers in Videoframes",
                          "This plugin is the configuration GUI for Onion layers."
                          " Onion Layer(s) usually do show previous and/ or next frame(s)"
                          " of the video in the current frame, depending on ref_mode parameter"
diff --git a/gap/gap_range_ops.c b/gap/gap_range_ops.c
index c724ffa..2b15d0c 100644
--- a/gap/gap_range_ops.c
+++ b/gap/gap_range_ops.c
@@ -572,7 +572,7 @@ p_convert_dialog(GapAnimInfo *ainfo_ptr,
   gap_arr_arg_init(&argv[5], GAP_ARR_WGT_OPTIONMENU);
   argv[5].label_txt = _("Imagetype:");
   argv[5].help_txt  = _("Convert to another imagetype, or keep imagetype as it is. "
-                        "Most fileformats can't handle all types and may require a conversion."
+                        "Most fileformats can't handle all types and may require a conversion. "
                         "Example: GIF can not handle RGB and requires convert to indexed imagetype.");
   argv[5].radio_argc  = 4;
   argv[5].radio_argv = radio_args;
@@ -775,7 +775,7 @@ p_range_to_multilayer_dialog(GapAnimInfo *ainfo_ptr,
   gap_arr_arg_init(&argv[5], GAP_ARR_WGT_TOGGLE);
   argv[5].label_txt = _("Exclude BG-Layer:");
   argv[5].help_txt  = _("Exclude the background layer in all handled frames, "
-                        "regardless to the other settings of layer selection.");
+                        "regardless of the other settings of layer selection.");
   argv[5].int_ret   = 0;   /* 1: exclude BG Layer from all selections */
 
 
diff --git a/gap/gap_split.c b/gap/gap_split.c
index dc443ba..2670a70 100644
--- a/gap/gap_split.c
+++ b/gap/gap_split.c
@@ -477,14 +477,14 @@ p_split_dialog(GapAnimInfo *ainfo_ptr, split_vals_t *valPtr)
   gap_arr_arg_init(&argv[4], GAP_ARR_WGT_TOGGLE);
   argv[4].label_txt = _("Only Visible:");
   argv[4].help_txt  = _("ON: Handle only visible layers.\n"
-                        "OFF: handle all layers and force visibiblity");
+                        "OFF: handle all layers and force visibility");
   argv[4].int_ret   = valPtr->only_visible;
   argv[4].has_default = TRUE;
   argv[4].int_default = 0;
 
   gap_arr_arg_init(&argv[5], GAP_ARR_WGT_TOGGLE);
   argv[5].label_txt = _("Copy properties:");
-  argv[5].help_txt  = _("ON: Copy all image properties (channels, pathes, guides) to all frame images.\n"
+  argv[5].help_txt  = _("ON: Copy all image properties (channels, paths, guides) to all frame images.\n"
                         "OFF: copy only layers without image properties to frame images");
   argv[5].int_ret   = valPtr->copy_properties;
   argv[5].has_default = TRUE;
diff --git a/gap/gap_story_att_trans_dlg.c b/gap/gap_story_att_trans_dlg.c
index d405810..d30c8d4 100644
--- a/gap/gap_story_att_trans_dlg.c
+++ b/gap/gap_story_att_trans_dlg.c
@@ -3882,7 +3882,7 @@ gap_story_attw_properties_dialog (GapStbAttrWidget *attw)
       , 10.0       /* page increment   for the from/to values */
       , 0.0        /* page size        for the from/to values */
       , 0          /* digits for the from/to values */
-      , _("ON: Enable move path transistions using settings provided via a movepath parameter file")
+      , _("ON: Enable move path transitions using settings provided via a movepath parameter file")
       , &attw->stb_elem_refptr->att_arr_enable[att_type_idx]
       , _("frame number (phase) of the movement/transition along path for the first handled frame"
           " where 1 is the begin of the path using settings of the 1st controlpoint"
diff --git a/gap/gap_story_dialog.c b/gap/gap_story_dialog.c
index 74c6c8f..324641c 100644
--- a/gap/gap_story_dialog.c
+++ b/gap/gap_story_dialog.c
@@ -9513,7 +9513,7 @@ p_tabw_master_prop_dialog(GapStbTabWidgets *tabw, gboolean new_flag)
   gap_arr_arg_init(&argv[l_ii], GAP_ARR_WGT_OPT_ENTRY);
   argv[l_ii].label_txt = _("Decoder:");
   argv[l_ii].help_txt  = _("Select preferred video decoder library, "
-                       "or leave empty for automatic selection."
+                       "or leave empty for automatic selection. "
                        "The decoder setting is only relevant if "
                        "videoclips are used (but not for frames "
                        "that are imagefiles)");
diff --git a/gap/gap_story_file.c b/gap/gap_story_file.c
index c3d0067..ce8292c 100644
--- a/gap/gap_story_file.c
+++ b/gap/gap_story_file.c
@@ -2713,7 +2713,7 @@ p_scan_gint32(char *ptr, gint32 min, gint32 max, GapStoryBoard *stb)
 
       if(stb)
       {
-        l_errtxt = g_strdup_printf(_("illegal number: %s (valid range is %d upto %d)\n")
+        l_errtxt = g_strdup_printf(_("illegal number: %s (valid range is %d up to %d)\n")
                                   , ptr, (int)min, (int)max);
         p_set_stb_error(stb, l_errtxt);
         g_free(l_errtxt);
@@ -2752,7 +2752,7 @@ p_scan_gdouble(char *ptr, gdouble min, gdouble max, GapStoryBoard *stb)
 
       if(stb)
       {
-        l_errtxt = g_strdup_printf(_("illegal number: %s (valid range is %.3f upto %.3f)")
+        l_errtxt = g_strdup_printf(_("illegal number: %s (valid range is %.3f up to %.3f)")
                                   , ptr, (float)min, (float)max);
         p_set_stb_error(stb, l_errtxt);
         g_free(l_errtxt);
diff --git a/gap/gap_story_properties.c b/gap/gap_story_properties.c
index 17f262a..31e7f93 100644
--- a/gap/gap_story_properties.c
+++ b/gap/gap_story_properties.c
@@ -2498,7 +2498,7 @@ p_pw_colormask_file_filesel_button_cb ( GtkWidget *w
   }
   if(pw->stb_elem_refptr == NULL) { return; }
 
-  filesel = gtk_file_selection_new ( _("Set Colormark Parmeter Filename"));
+  filesel = gtk_file_selection_new ( _("Set Colormask Parameter Filename"));
   pw->pw_colormask_file_filesel = filesel;
 
   gtk_window_set_position (GTK_WINDOW (filesel), GTK_WIN_POS_MOUSE);
diff --git a/gap/gap_story_render_processor.c b/gap/gap_story_render_processor.c
index 820b173..858977f 100644
--- a/gap/gap_story_render_processor.c
+++ b/gap/gap_story_render_processor.c
@@ -3426,7 +3426,7 @@ p_framerange_list_from_storyboard(const char *storyboard_file
     *frame_count = 0;
     sterr->currline = "(eof)";
 
-    p_set_stb_error(sterr, _("No Frames or Images found ...."));
+    p_set_stb_error(sterr, _("No Frames or Images found ..."));
     /* note: this can occure if there are non empty sub sections
      *       but the MAIN section is empty.
      *       (in such a case nothing will be rendered).
diff --git a/gap/gap_video_index_creator.c b/gap/gap_video_index_creator.c
index b1bab0b..707a3ae 100644
--- a/gap/gap_video_index_creator.c
+++ b/gap/gap_video_index_creator.c
@@ -922,10 +922,10 @@ p_vindex_dialog(VindexValues *val_ptr)
   static char *radio_modes[VR_DECODERS_SIZE]  = {"libavformat", "libmpeg3" };
   static char *mode_args[MODE_SIZE]    = { "QUICK", "SMART", "FULLSCAN" };
   static char *mode_help[MODE_SIZE]    = { N_("Conditional video index creation, "
-                                              " based on a few quick timcode probereads.\n"
+                                              " based on a few quick timecode probereads.\n"
                                               "Skip index creation if native seek seems possible\n"
                                               "\nWARNING: positioning via native seek may not work exact in 
case critical "
-                                              "timecode steps were not detected in the quick test)")
+                                              "timecode steps were not detected in the quick test.")
                                          , N_("Conditional video index creation, "
                                               "based on probereads for the specified percentage of frames.\n"
                                               "Skip index creation if native seek seems possible "
@@ -991,7 +991,7 @@ p_vindex_dialog(VindexValues *val_ptr)
   ii++; gap_arr_arg_init(&argv[ii], GAP_ARR_WGT_FLT); ii_percentage_smart_mode = ii;
   argv[ii].constraint = TRUE;
   argv[ii].label_txt = _("Percentage:");
-  argv[ii].help_txt  = _("stop scan after percentage reached and no unplausible timecode was detected so far 
(only relevant in smart mode)");
+  argv[ii].help_txt  = _("stop scan after percentage reached and no implausible timecode was detected so far 
(only relevant in smart mode)");
   argv[ii].flt_min   =  1.0;
   argv[ii].flt_max   = (gint)100.0;
   argv[ii].flt_step  =  1.0;
diff --git a/gap/gap_water_pattern.c b/gap/gap_water_pattern.c
index b9eb0e8..77cc5b4 100644
--- a/gap/gap_water_pattern.c
+++ b/gap/gap_water_pattern.c
@@ -1213,7 +1213,7 @@ do_dialog (WaterPatternDialog *wcd, waterpattern_val_t *cuvals)
   checkbutton = gtk_check_button_new_with_label (" ");
   g_object_set_data (G_OBJECT (checkbutton), "wcd", wcd);
   wcd->patternCheckbutton = checkbutton;
-  gimp_help_set_help_data (checkbutton, _("ON: create waterpattern cloud layers according options. OFF: Use 
external pattern layers. "), NULL);
+  gimp_help_set_help_data (checkbutton, _("ON: create waterpattern cloud layers according to options. OFF: 
Use external pattern layers. "), NULL);
   gtk_widget_show (checkbutton);
   gtk_table_attach( GTK_TABLE(table1), checkbutton, 1, 2, row, row+1,
                     GTK_FILL, 0, 0, 0 );
diff --git a/gap/gap_wr_resynth.c b/gap/gap_wr_resynth.c
index 74670fc..000ecf4 100644
--- a/gap/gap_wr_resynth.c
+++ b/gap/gap_wr_resynth.c
@@ -161,16 +161,16 @@ query (void)
                           N_("Smart selection eraser."),
                           "Remove an object from an image by extending surrounding texture to cover it. "
                           "The object can be represented by the current selection  "
-                          "or by an alternative selction (provided as parameter alt_selection) "
-                          "If the image, that is refered by the alt_selction drawable_id has a selction "
-                          "then the refred selection is used to identify the object. "
+                          "or by an alternative selection (provided as parameter alt_selection) "
+                          "If the image, that is referred by the alt_selection drawable_id has a selection "
+                          "then the referred selection is used to identify the object. "
                           "otherwise a grayscale copy of the alt_selection drawable_id will be used "
                           "to identify the object that shall be replaced. "
                           "alt_selection value -1 indicates that the selection of the input image shall be 
used. "
                           "Requires resynthesizer plug-in. (available in the gimp plug-in registry) "
                           "The smart selection eraser wrapper provides ability to run in GIMP_GAP 
filtermacros "
                           "when processing video frames (typically for removing unwanted logos from video 
frames)."
-                          "(using the same seed value for all frames is recommanded) ",
+                          "(using the same seed value for all frames is recommended) ",
                           "Wolfgang Hofer",
                           "Wolfgang Hofer",
                           PLUG_IN_VERSION,
diff --git a/vid_common/gap_cme_main.c b/vid_common/gap_cme_main.c
index fad48b1..0aaddfb 100644
--- a/vid_common/gap_cme_main.c
+++ b/vid_common/gap_cme_main.c
@@ -153,7 +153,7 @@ query ()
                          " The videoformat is defined with vid_enc_plugin parameter. The specified plugin "
                          " is called with the parameters specified in the dialog. for noninteractive calls"
                          " default values will be used. (you may call the desired plugin directly if you"
-                         " want to specify non-interacive parameters"),
+                         " want to specify non-interactive parameters"),
                          "Wolfgang Hofer (hof gimp org)",
                          "Wolfgang Hofer",
                          GAP_VERSION_WITH_DATE,
diff --git a/vid_enc_avi/gap_enc_avi_gui.c b/vid_enc_avi/gap_enc_avi_gui.c
index 8dc703e..ddc0c71 100644
--- a/vid_enc_avi/gap_enc_avi_gui.c
+++ b/vid_enc_avi/gap_enc_avi_gui.c
@@ -918,9 +918,9 @@ p_create_shell_window (GapGveAviGlobalParams *gpp)
                    , G_CALLBACK (on_checkbutton_toggled)
                    , &epp->raw_bgr);
   gimp_help_set_help_data (checkbutton
-                   , _("Check if you want to encode frames in BGR (prefered) or RGB colormodel "
+                   , _("Check if you want to encode frames in BGR (preferred) or RGB colormodel "
                        "(most players like WinDvD, VLC-player want BGR colormodel for RAW data) "
-                       "other players want RGB colromodel for RAW avi data)")
+                       "other players want RGB colormodel for RAW avi data)")
                    , NULL);
 
 #ifdef ENABLE_LIBXVIDCORE
diff --git a/vid_enc_avi/gap_enc_avi_main.c b/vid_enc_avi/gap_enc_avi_main.c
index 817ede3..133c671 100644
--- a/vid_enc_avi/gap_enc_avi_main.c
+++ b/vid_enc_avi/gap_enc_avi_main.c
@@ -87,7 +87,7 @@ int global_nargs_avi_enc_par;
 
 static void query(void);
 static void  run (const gchar *name,          /* name of plugin */
-     gint nparams,               /* number of in-paramters */
+     gint nparams,               /* number of in-parameters */
      const GimpParam * param,    /* in-parameters */
      gint *nreturn_vals,         /* number of out-parameters */
      GimpParam ** return_vals);  /* out-parameters */
@@ -211,7 +211,7 @@ query ()
                          " .wav files can be mono (1) or stereo (2channels) audiodata must be 16bit 
uncompressed."
                          " IMPORTANT:  you should first call "
                          "\"" GAP_PLUGIN_NAME_AVI_PARAMS  "\""
-                         " to set encoder specific paramters, then set the use_rest parameter to 1 to use 
them."),
+                         " to set encoder specific parameters, then set the use_rest parameter to 1 to use 
them."),
                          "Wolfgang Hofer (hof gimp org)",
                          "Wolfgang Hofer",
                          GAP_VERSION_WITH_DATE,
diff --git a/vid_enc_ffmpeg/gap_enc_ffmpeg_gui.c b/vid_enc_ffmpeg/gap_enc_ffmpeg_gui.c
index 17aee19..5326e13 100644
--- a/vid_enc_ffmpeg/gap_enc_ffmpeg_gui.c
+++ b/vid_enc_ffmpeg/gap_enc_ffmpeg_gui.c
@@ -499,7 +499,7 @@ gap_enc_ffgui_set_default_codecs(GapGveFFMpegGlobalParams *gpp, gboolean set_cod
          if (gpp->evl.ntsc_height != gpp->evl.pal_height)
          {
            recomand_size = g_strdup_printf("   %s : %d x %d (PAL)  %d x %d (NTSC)"
-                                          ,_("Recommanded Framesize")
+                                          ,_("Recommended Framesize")
                                           ,(int)gpp->evl.pal_width
                                           ,(int)gpp->evl.pal_height
                                           ,(int)gpp->evl.ntsc_width
@@ -515,7 +515,7 @@ gap_enc_ffgui_set_default_codecs(GapGveFFMpegGlobalParams *gpp, gboolean set_cod
            recHeight = MAX(gpp->evl.ntsc_height, gpp->evl.pal_height);
            
            recomand_size = g_strdup_printf("   %s : %d x %d"
-                                          ,_("Recommanded Framesize")
+                                          ,_("Recommended Framesize")
                                           ,(int)recWidth
                                           ,(int)recHeight
                                           );
@@ -527,8 +527,8 @@ gap_enc_ffgui_set_default_codecs(GapGveFFMpegGlobalParams *gpp, gboolean set_cod
          recomand_size = g_strdup_printf(" ");
        }
        detailInfo = g_strdup_printf(_("Selected Fileformat : [%s] %s\n"
-                                  "Recommanded Video CODEC : %s\n"
-                                  "Recommanded Audio CODEC : %s\n"
+                                  "Recommended Video CODEC : %s\n"
+                                  "Recommended Audio CODEC : %s\n"
                                   "Extension(s): %s %s"
                                  )
                                , ofmt->name
@@ -2475,8 +2475,8 @@ p_create_expert_flags_frame (GapGveFFMpegGlobalParams *gpp)
                     (GtkAttachOptions) (GTK_FILL),
                     (GtkAttachOptions) (0), 0, 0);
   gimp_help_set_help_data (checkbutton
-                        , _("Bypass the FFMPEG Vidoencoder where inputframes can "
-                            "be copied 1:1 from an input MPEG videofile."
+                        , _("Bypass the FFMPEG Videoencoder where inputframes can "
+                            "be copied 1:1 from an input MPEG videofile. "
                             "This experimental feature provides lossless MPEG "
                             "video cut, but works only for the MPEG Fileformats.")
                         , NULL);
diff --git a/vid_enc_rawframes/gap_enc_rawframes_main.c b/vid_enc_rawframes/gap_enc_rawframes_main.c
index 6daf34f..51f3a47 100644
--- a/vid_enc_rawframes/gap_enc_rawframes_main.c
+++ b/vid_enc_rawframes/gap_enc_rawframes_main.c
@@ -189,7 +189,7 @@ query ()
                          " but the framenumber part is replaced by the current framenumber"
                          " (or added automatic if videofile has no number part)"
                          " audiodata is ignored."
-                         "WARNINGS: for proper operation, the handled frames shall refere to single"
+                         " WARNINGS: for proper operation, the handled frames shall refer to single"
                          " video file without any transitions. this allows fetching frames"
                          " as raw data chunks. The chunks are 1:1 written to disc as framefiles."
                          " The resulting raw data frames on disc may be unusable if the raw chunk data"


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]