diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c
index 400944d..095cc11 100644
--- a/app/actions/layers-commands.c
+++ b/app/actions/layers-commands.c
@@ -45,6 +45,10 @@
 #include "core/gimptoolinfo.h"
 #include "core/gimpundostack.h"
 #include "core/gimpprogress.h"
+#ifdef ENABLE_LAYERND
+#include <glib/gprintf.h>
+#include "core/gimpgrouplayernd.h"
+#endif
 
 #include "text/gimptext.h"
 #include "text/gimptext-vectors.h"
@@ -1030,6 +1034,17 @@ layers_edit_layer_response (GtkWidget          *widget,
     {
       GimpLayer   *layer = dialog->layer;
       const gchar *new_name;
+      #ifdef ENABLE_LAYERND
+      const gchar *new_ndscalex;
+      const gchar *new_ndscaley;
+      const gchar *new_ndbrightness;
+      const gchar *new_ndcontrast;
+      gint64      d_new_ndscalex;
+      gint64      d_new_ndscaley;
+      gint64      d_new_ndbrightness;
+      gint64      d_new_ndcontrast;
+      GimpGroupLayer *group;
+      #endif
 
       new_name = gtk_entry_get_text (GTK_ENTRY (dialog->name_entry));
 
@@ -1060,6 +1075,27 @@ layers_edit_layer_response (GtkWidget          *widget,
                         gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->rename_toggle)),
                         NULL);
         }
+        
+        #ifdef ENABLE_LAYERND
+        if ( GIMP_IS_GROUP_LAYER(layer) ) {
+          new_ndscalex = gtk_entry_get_text (GTK_ENTRY (dialog->xscale_entry));
+          new_ndscaley = gtk_entry_get_text (GTK_ENTRY (dialog->yscale_entry));
+          new_ndbrightness = gtk_entry_get_text (GTK_ENTRY (dialog->brightness_entry));
+          new_ndcontrast = gtk_entry_get_text (GTK_ENTRY (dialog->contrast_entry));
+          d_new_ndscalex = g_ascii_strtoll(new_ndscalex, NULL, 10);
+          d_new_ndscaley = g_ascii_strtoll(new_ndscaley, NULL, 10);
+          d_new_ndbrightness = g_ascii_strtoll(new_ndbrightness, NULL, 10);
+          d_new_ndcontrast = g_ascii_strtoll(new_ndcontrast, NULL, 10);
+          // scale the group itself, not the children
+          gimp_group_layernd_set_scale(layer, (gint) d_new_ndscalex, (gint) d_new_ndscaley);
+          // set brightness/contrast
+          gimp_group_layernd_set_brightness_contrast(layer, (gint) d_new_ndbrightness, (gint) d_new_ndcontrast);
+          // must force update to the gimp group
+          group = GIMP_GROUP_LAYER(layer);
+          gimp_group_layernd_update(group);
+          gimp_image_flush (dialog->image);
+        }
+        #endif
     }
 
   gtk_widget_destroy (dialog->dialog);
diff --git a/app/core/gimpgrouplayer.c b/app/core/gimpgrouplayer.c
index e979fb2..b89d578 100644
--- a/app/core/gimpgrouplayer.c
+++ b/app/core/gimpgrouplayer.c
@@ -39,6 +39,10 @@
 #include "gimpprojectable.h"
 #include "gimpprojection.h"
 
+#ifdef ENABLE_LAYERND
+#include "gimpgrouplayernd.h"
+#endif
+
 #include "gimp-intl.h"
 
 
@@ -945,6 +949,10 @@ gimp_group_layer_update_size (GimpGroupLayer *group)
   gint      height     = 1;
   gboolean  first      = TRUE;
   GList    *list;
+  
+  #ifdef ENABLE_LAYERND
+  gimp_group_layernd_reset (group);
+  #endif
 
   for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children));
        list;
@@ -1026,6 +1034,9 @@ gimp_group_layer_update_size (GimpGroupLayer *group)
                        "y", (gdouble) -y,
                        NULL);
     }
+    #ifdef ENABLE_LAYERND
+    gimp_group_layernd_update(group);
+    #endif
 }
 
 static void
diff --git a/app/core/gimpgrouplayernd.c b/app/core/gimpgrouplayernd.c
index e69de29..4266af2 100644
--- a/app/core/gimpgrouplayernd.c
+++ b/app/core/gimpgrouplayernd.c
@@ -0,0 +1,195 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * GimpGroupLayer
+ * Copyright (C) 2009  Joseph Miller <josephcmiller2@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <gegl.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpmath/gimpmath.h"
+
+#include "core-types.h"
+
+#include "base/tile-manager.h"
+#include "base/pixel-region.h"
+
+#include "paint-funcs/scale-region.h"
+
+#include "gimpgrouplayer.h"
+#include "gimpgrouplayernd.h"
+#include "gimpimage.h"
+#include "gimpimage-undo-push.h"
+#include "gimpdrawablestack.h"
+#include "gimppickable.h"
+#include "gimpprojectable.h"
+#include "gimpprojection.h"
+#include "gimpprogress.h"
+
+#include "gimpdrawable-brightness-contrast.h"
+
+#include "gimp-intl.h"
+
+static void
+gimp_group_layernd_update_brightness_contrast (GimpGroupLayer *group)
+{
+    GimpLayer     *layer;
+    GimpItem      *item;
+    GimpDrawable  *drawable;
+    
+    layer = GIMP_LAYER (group);
+    item = GIMP_ITEM(layer);
+    drawable = GIMP_DRAWABLE (item);
+    
+    gimp_drawable_brightness_contrast(drawable, NULL, layer->ndbrightness, layer->ndcontrast);
+}
+
+static void
+gimp_group_layernd_update_scale(GimpGroupLayer *group) {
+    GimpLayer     *layer;
+    GimpItem      *item;
+    GimpDrawable  *drawable;
+    TileManager   *new_tiles;
+    PixelRegion    srcPR, destPR;
+    gint           off_x, off_y;
+    
+    layer = GIMP_LAYER (group);
+    item = GIMP_ITEM(layer);
+    
+    gimp_item_get_offset(item, &off_x, &off_y);
+        
+    // FIXME - what do I do about the GimpProgress?
+    
+    drawable = GIMP_DRAWABLE (item);
+
+    new_tiles = tile_manager_new (layer->ndscalex, layer->ndscaley, drawable->bytes);
+    
+    pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable),
+                       0, 0,
+                       gimp_item_get_width  (item),
+                       gimp_item_get_height (item),
+                       FALSE);
+    pixel_region_init (&destPR, new_tiles,
+                       0, 0,
+                       layer->ndscalex, layer->ndscaley,
+                       TRUE);
+                       
+    scale_region (&srcPR, &destPR,
+                  gimp_drawable_is_indexed (drawable) ?
+                  GIMP_INTERPOLATION_NONE : GIMP_INTERPOLATION_CUBIC,
+                  NULL,
+                  NULL);
+                  
+    gimp_drawable_set_tiles_full (drawable, gimp_item_is_attached (item), NULL,
+                                  new_tiles, gimp_drawable_type (drawable),
+                                  off_x, off_y);
+    tile_manager_unref (new_tiles);
+    
+}
+
+/* public functions */
+
+void
+gimp_group_layernd_reset (GimpGroupLayer *group)
+{
+    GimpLayer   *layer;
+    GimpItem    *item;
+    gint         width;
+    gint         height;
+    GimpDrawable  *drawable;
+    TileManager   *new_tiles;
+    PixelRegion    srcPR, destPR;
+    gint           off_x, off_y;
+    
+    layer = GIMP_LAYER (group);
+    item = GIMP_ITEM(layer);
+    drawable = GIMP_DRAWABLE (item);
+
+    gimp_item_get_offset(item, &off_x, &off_y);
+    width = gimp_item_get_width(item);
+    height = gimp_item_get_height(item);
+        
+    // FIXME - what do I do about the GimpProgress?
+    
+    new_tiles = tile_manager_new (width, height, drawable->bytes);
+    
+    pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable),
+                       0, 0,
+                       gimp_item_get_width  (item),
+                       gimp_item_get_height (item),
+                       FALSE);
+    pixel_region_init (&destPR, new_tiles,
+                       0, 0,
+                       gimp_item_get_width  (item),
+                       gimp_item_get_height (item),
+                       TRUE);
+                       
+    scale_region (&srcPR, &destPR,
+                  gimp_drawable_is_indexed (drawable) ?
+                  GIMP_INTERPOLATION_NONE : GIMP_INTERPOLATION_CUBIC,
+                  NULL,
+                  NULL);
+                  
+    gimp_drawable_set_tiles_full (drawable, gimp_item_is_attached (item), NULL,
+                                  new_tiles, gimp_drawable_type (drawable),
+                                  off_x, off_y);
+    tile_manager_unref (new_tiles);
+    
+}
+
+void
+gimp_group_layernd_update (GimpGroupLayer *group)
+{
+  GimpLayer *layer;
+  
+  layer = GIMP_LAYER (group);
+  
+  if ( layer->ndmode & GIMP_GROUP_LAYERND_MODE_SCALE ) {
+      gimp_group_layernd_update_scale(group);
+  }
+  if ( layer->ndmode & GIMP_GROUP_LAYERND_MODE_BRIGHTCONTRAST ) {
+      gimp_group_layernd_update_brightness_contrast(group);
+  }
+}
+
+void
+gimp_group_layernd_set_scale (GimpLayer *layer, gint scalex, gint scaley)
+{
+  if ( scalex && scaley ) {
+      layer->ndmode |= GIMP_GROUP_LAYERND_MODE_SCALE;
+      layer->ndscalex = scalex;
+      layer->ndscaley = scaley;
+  } else {
+      layer->ndmode &= (~GIMP_GROUP_LAYERND_MODE_SCALE);
+  }
+}
+
+void
+gimp_group_layernd_set_brightness_contrast (GimpLayer *layer, gint brightness, gint contrast)
+{
+  if ( brightness || contrast ) {
+      layer->ndmode |= GIMP_GROUP_LAYERND_MODE_BRIGHTCONTRAST;
+      layer->ndbrightness = brightness;
+      layer->ndcontrast = contrast;
+  } else {
+      layer->ndmode &= (~GIMP_GROUP_LAYERND_MODE_BRIGHTCONTRAST);
+  }
+}
diff --git a/app/core/gimpgrouplayernd.h b/app/core/gimpgrouplayernd.h
index e69de29..ece692e 100644
--- a/app/core/gimpgrouplayernd.h
+++ b/app/core/gimpgrouplayernd.h
@@ -0,0 +1,33 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * GimpGroupLayer
+ * Copyright (C) 2009  Joseph Miller <josephcmiller2@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_GROUP_LAYERND_H__
+#define __GIMP_GROUP_LAYERND_H__
+
+#define GIMP_GROUP_LAYERND_MODE_NONE            0
+#define GIMP_GROUP_LAYERND_MODE_SCALE           1
+#define GIMP_GROUP_LAYERND_MODE_BRIGHTCONTRAST  2
+
+void        gimp_group_layernd_set_scale (GimpLayer *layer, gint scalex, gint scaley);
+void        gimp_group_layernd_set_brightness_contrast (GimpLayer *layer, gint brightness, gint contrast);
+void        gimp_group_layernd_update (GimpGroupLayer *group);
+void        gimp_group_layernd_reset (GimpGroupLayer *group);   // prepares for GimpGroupLayer update by resizing to original size.
+
+#endif
\ No newline at end of file
diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c
index d0584aa..5bdfefa 100644
--- a/app/core/gimplayer.c
+++ b/app/core/gimplayer.c
@@ -321,6 +321,14 @@ gimp_layer_init (GimpLayer *layer)
   layer->fs.boundary_known = FALSE;
   layer->fs.segs           = NULL;
   layer->fs.num_segs       = 0;
+  
+  #ifdef ENABLE_LAYERND
+  layer->ndmode = 0;
+  layer->ndscalex = 0;
+  layer->ndscaley = 0;
+  layer->ndbrightness = 0;
+  layer->ndcontrast = 0;
+  #endif
 }
 
 static void
diff --git a/app/core/gimplayer.h b/app/core/gimplayer.h
index c45d245..054f4d5 100644
--- a/app/core/gimplayer.h
+++ b/app/core/gimplayer.h
@@ -52,6 +52,14 @@ struct _GimpLayer
     BoundSeg     *segs;               /*  boundary of floating sel       */
     gint          num_segs;           /*  number of segs in boundary     */
   } fs;
+
+  #ifdef ENABLE_LAYERND
+  gint            ndmode;
+  gint            ndscalex;
+  gint            ndscaley;
+  gint            ndbrightness;
+  gint            ndcontrast;
+  #endif
 };
 
 struct _GimpLayerClass
diff --git a/app/dialogs/layer-options-dialog.c b/app/dialogs/layer-options-dialog.c
index 2e0ba8d..af7a3f1 100644
--- a/app/dialogs/layer-options-dialog.c
+++ b/app/dialogs/layer-options-dialog.c
@@ -29,6 +29,12 @@
 #include "core/gimpimage.h"
 #include "core/gimplayer.h"
 
+#ifdef ENABLE_LAYERND
+#include "core/gimpgrouplayer.h"
+#include "core/gimpgrouplayernd.h"
+#include "base/boundary.h"
+#endif
+
 #include "text/gimptext.h"
 #include "text/gimptextlayer.h"
 
@@ -70,6 +76,11 @@ layer_options_dialog_new (GimpImage    *image,
   GtkWidget          *spinbutton;
   GtkWidget          *frame;
   GtkWidget          *button;
+  #ifdef ENABLE_LAYERND
+  BoundSeg           *layer_boundary;
+  gint                layer_numsegs;
+  gchar              *str;
+  #endif
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (layer == NULL || GIMP_IS_LAYER (layer), NULL);
@@ -113,12 +124,20 @@ layer_options_dialog_new (GimpImage    *image,
                      vbox);
   gtk_widget_show (vbox);
 
+  #ifdef ENABLE_LAYERND
+  if ( GIMP_IS_GROUP_LAYER(layer) ) {
+    table = gtk_table_new (layer ? 5 : 3, 2, FALSE);
+  } else {
+  #endif
   table = gtk_table_new (layer ? 1 : 3, 2, FALSE);
+  #ifdef ENABLE_LAYERND
+  }
+  #endif
   gtk_table_set_col_spacing (GTK_TABLE (table), 0, 6);
   gtk_table_set_row_spacing (GTK_TABLE (table), 0, 6);
   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
   gtk_widget_show (table);
-
+  
   /*  The name label and entry  */
   options->name_entry = gtk_entry_new ();
   gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
@@ -128,6 +147,63 @@ layer_options_dialog_new (GimpImage    *image,
   gtk_entry_set_activates_default (GTK_ENTRY (options->name_entry), TRUE);
   gtk_entry_set_text (GTK_ENTRY (options->name_entry), layer_name);
 
+  #ifdef ENABLE_LAYERND
+  if ( GIMP_IS_GROUP_LAYER(layer) )
+    {
+      if ( !(layer->ndmode & GIMP_GROUP_LAYERND_MODE_SCALE) ) {
+        layer_boundary = gimp_layer_boundary(layer, &layer_numsegs);
+        options->xscale = (layer_boundary[1].x2 - layer_boundary[1].x1);
+        options->yscale = (layer_boundary[0].y2 - layer_boundary[0].y1);
+      } else {
+        layer_boundary = NULL;
+        options->xscale = layer->ndscalex;
+        options->yscale = layer->ndscaley;
+      }
+      if ( layer->ndmode & GIMP_GROUP_LAYERND_MODE_BRIGHTCONTRAST ) {
+          options->brightness = layer->ndbrightness;
+          options->contrast = layer->ndcontrast;
+      } else {
+          options->brightness = 0;
+          options->contrast = 0;
+      }
+
+      options->xscale_entry = gtk_entry_new ();
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
+                                _("X Scale:"), 0.0, 0.5,
+                                options->xscale_entry, 1, FALSE);
+      str = g_strdup_printf("%d", options->xscale);
+      gtk_entry_set_text (GTK_ENTRY (options->xscale_entry), str);
+      g_free(str);
+
+      options->yscale_entry = gtk_entry_new ();
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
+                                _("Y Scale:"), 0.0, 0.5,
+                                options->yscale_entry, 1, FALSE);
+      str = g_strdup_printf("%d", options->yscale);
+      gtk_entry_set_text (GTK_ENTRY (options->yscale_entry), str);
+      g_free(str);
+      
+      options->brightness_entry = gtk_entry_new ();
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
+                                 _("Brightness"), 0.0, 0.5,
+                                 options->brightness_entry, 1, FALSE);
+      str = g_strdup_printf("%d", options->brightness);
+      gtk_entry_set_text (GTK_ENTRY (options->brightness_entry), str);
+      g_free(str);
+      
+      options->contrast_entry = gtk_entry_new ();
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, 4,
+                                 _("Contrast"), 0.0, 0.5,
+                                 options->contrast_entry, 1, FALSE);
+      str = g_strdup_printf("%d", options->contrast);
+      gtk_entry_set_text (GTK_ENTRY (options->contrast_entry), str);
+      g_free(str);
+
+      if ( layer_boundary ) g_free(layer_boundary);
+  
+    }
+  #endif
+
   if (! layer)
     {
       gdouble xres;
diff --git a/app/dialogs/layer-options-dialog.h b/app/dialogs/layer-options-dialog.h
index f841bf2..fb20372 100644
--- a/app/dialogs/layer-options-dialog.h
+++ b/app/dialogs/layer-options-dialog.h
@@ -35,6 +35,17 @@ struct _LayerOptionsDialog
   GimpImage    *image;
   GimpContext  *context;
   GimpLayer    *layer;
+  #ifdef ENABLE_LAYERND
+  GtkWidget    *xscale_entry;
+  GtkWidget    *yscale_entry;
+  GtkWidget    *brightness_entry;
+  GtkWidget    *contrast_entry;
+  
+  gint          xscale;
+  gint          yscale;
+  gint          brightness;
+  gint          contrast;
+  #endif
 };
 
 
