diff --git a/operations/common/edge-neon.c b/operations/common/edge-neon.c
new file mode 100644
index 0000000..50a19bd
--- /dev/null
+++ b/operations/common/edge-neon.c
@@ -0,0 +1,143 @@
+/* This file is an image processing operation for GEGL
+ *
+ * GEGL is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * GEGL 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 1995 Spencer Kimball and Peter Mattis
+ * Copyright 2013 Samuel Pitoiset <samuel.pitoiset@gmail.com>
+ */
+
+#include "config.h"
+#include <glib/gi18n-lib.h>
+
+#ifdef GEGL_CHANT_PROPERTIES
+
+gegl_chant_double (radius, _("Radius"), 0.0, 50.0, 10.0,
+                   _("Radius"))
+
+gegl_chant_double (amount, _("Amount"), 0.0, 1.0, 0.5,
+                   _("Amount"))
+
+#else
+
+#define GEGL_CHANT_TYPE_AREA_FILTER
+#define GEGL_CHANT_C_FILE       "edge-neon.c"
+
+#include "gegl-chant.h"
+#include <math.h>
+
+static void
+edge_neon (GeglBuffer          *src,
+           const GeglRectangle *src_rect,
+           GeglBuffer          *dst,
+           const GeglRectangle *dst_rect);
+
+typedef struct {
+  gdouble      radius;
+  gdouble      amount;
+  gdouble      prev_radius;
+  gdouble      prev_amount;
+} Ramps;
+
+static void
+prepare (GeglOperation *operation)
+{
+  GeglChantO *o = GEGL_CHANT_PROPERTIES (operation);
+
+  gegl_operation_set_format (operation, "input",
+                             babl_format ("RGBA float"));
+  gegl_operation_set_format (operation, "output",
+                             babl_format ("RGBA float"));
+  if (o->chant_data)
+    {
+      Ramps* ramps = (Ramps*) o->chant_data;
+
+      if (ramps->prev_radius != o->radius ||
+          ramps->prev_amount != o->amount)
+        {
+          g_slice_free (Ramps, o->chant_data);
+          o->chant_data = NULL;
+        }
+    }
+}
+
+static gboolean
+process (GeglOperation       *operation,
+         GeglBuffer          *input,
+         GeglBuffer          *output,
+         const GeglRectangle *result,
+         gint                 level)
+{
+  GeglRectangle compute;
+
+  compute = gegl_operation_get_required_for_output(operation, "input", result);
+  edge_neon(input, &compute, output, result);
+
+  return  TRUE;
+}
+
+static void
+edge_neon (GeglBuffer          *src,
+           const GeglRectangle *src_rect,
+           GeglBuffer          *dst,
+           const GeglRectangle *dst_rect)
+{
+    gfloat *src_buf;
+
+    src_buf = g_new0(gfloat, src_rect->width * src_rect->height * 4);
+
+    gegl_buffer_get(src, src_rect, 1.0, babl_format ("RGBA float"),
+                    src_buf, GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+
+    // TODO: Port the algorithm from The GIMP.
+
+    g_free(src_buf);
+}
+
+static void
+finalize (GObject *object)
+{
+  GeglChantO *o = GEGL_CHANT_PROPERTIES (object);
+
+  if (o->chant_data)
+    {
+      g_slice_free (Ramps, o->chant_data);
+      o->chant_data = NULL;
+    }
+
+  G_OBJECT_CLASS (gegl_chant_parent_class)->finalize (object);
+}
+
+static void
+gegl_chant_class_init (GeglChantClass *klass)
+{
+  GObjectClass             *object_class;
+  GeglOperationClass       *operation_class;
+  GeglOperationFilterClass *filter_class;
+
+  object_class    = G_OBJECT_CLASS (klass);
+  operation_class = GEGL_OPERATION_CLASS (klass);
+  filter_class    = GEGL_OPERATION_FILTER_CLASS (klass);
+
+  operation_class->prepare = prepare;
+  filter_class->process    = process;
+  object_class->finalize   = finalize;
+
+  gegl_operation_class_set_keys (operation_class,
+                                 "name"       , "gegl:edge-neon",
+                                 "categories" , "edge-detect",
+                                 "description", _("Simulate the glowing boundary of a neon light"),
+                                 NULL);
+}
+
+#endif
diff --git a/tests/compositions/Makefile.am b/tests/compositions/Makefile.am
index e3cc80d..9976da5 100644
--- a/tests/compositions/Makefile.am
+++ b/tests/compositions/Makefile.am
@@ -34,6 +34,7 @@ TESTS = \
   run-clones.xml.sh                    \
   run-composite-transform.xml.sh       \
   run-edge-laplace-broken.xml.sh       \
+  run-edge-neon.xml.sh                 \
   run-edge-sobel.xml.sh                \
   run-fattal02.xml.sh                  \
   run-gamma.xml.sh                     \
diff --git a/tests/compositions/edge-neon.xml b/tests/compositions/edge-neon.xml
new file mode 100644
index 0000000..a6a450b
--- /dev/null
+++ b/tests/compositions/edge-neon.xml
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<gegl>
+  <node operation='gegl:edge-neon'>
+    <params>
+    </params>
+  </node>
+  <node operation='gegl:load'>
+    <params>
+      <param name='path'>data/duck.png</param>
+    </params>
+  </node>
+</gegl>
