diff --git a/pom.xml b/pom.xml
index 7c109e397..26eaa9fc2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -183,6 +183,14 @@
jar
+
+
+ com.sk89q.lib
+ jlibnoise
+ 1.0.0
+ true
+
+
org.mockito
diff --git a/src/main/java/com/sk89q/worldedit/math/noise/JLibNoiseGenerator.java b/src/main/java/com/sk89q/worldedit/math/noise/JLibNoiseGenerator.java
new file mode 100644
index 000000000..dbf7720fd
--- /dev/null
+++ b/src/main/java/com/sk89q/worldedit/math/noise/JLibNoiseGenerator.java
@@ -0,0 +1,62 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program 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.
+ *
+ * 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 Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.math.noise;
+
+import com.sk89q.worldedit.Vector;
+import com.sk89q.worldedit.Vector2D;
+import net.royawesome.jlibnoise.module.Module;
+
+import java.util.Random;
+
+abstract class JLibNoiseGenerator implements NoiseGenerator {
+
+ private static final Random RANDOM = new Random();
+ private final V module;
+
+ JLibNoiseGenerator() {
+ module = createModule();
+ setSeed(RANDOM.nextInt());
+ }
+
+ protected abstract V createModule();
+
+ protected V getModule() {
+ return module;
+ }
+
+ public abstract void setSeed(int seed);
+
+ public abstract int getSeed();
+
+ @Override
+ public float noise(Vector2D position) {
+ return forceRange(module.GetValue(position.getX(), 0, position.getZ()));
+ }
+
+ @Override
+ public float noise(Vector position) {
+ return forceRange(module.GetValue(position.getX(), position.getY(), position.getZ()));
+ }
+
+ private float forceRange(double value) {
+ return (float) Math.max(0, Math.min(1, value / 2.0 + 0.5));
+ }
+
+}
diff --git a/src/main/java/com/sk89q/worldedit/math/noise/PerlinNoise.java b/src/main/java/com/sk89q/worldedit/math/noise/PerlinNoise.java
new file mode 100644
index 000000000..ced3c0e67
--- /dev/null
+++ b/src/main/java/com/sk89q/worldedit/math/noise/PerlinNoise.java
@@ -0,0 +1,76 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program 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.
+ *
+ * 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 Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.math.noise;
+
+import net.royawesome.jlibnoise.module.source.Perlin;
+
+/**
+ * Generates Perlin noise.
+ */
+public class PerlinNoise extends JLibNoiseGenerator {
+
+ @Override
+ protected Perlin createModule() {
+ return new Perlin();
+ }
+
+ public double getFrequency() {
+ return getModule().getFrequency();
+ }
+
+ public void setFrequency(double frequency) {
+ getModule().setFrequency(frequency);
+ }
+
+ public double getLacunarity() {
+ return getModule().getLacunarity();
+ }
+
+ public void setLacunarity(double lacunarity) {
+ getModule().setLacunarity(lacunarity);
+ }
+
+ public int getOctaveCount() {
+ return getModule().getOctaveCount();
+ }
+
+ public void setOctaveCount(int octaveCount) {
+ getModule().setOctaveCount(octaveCount);
+ }
+
+ public void setPersistence(double persistence) {
+ getModule().setPersistence(persistence);
+ }
+
+ public double getPersistence() {
+ return getModule().getPersistence();
+ }
+
+ @Override
+ public void setSeed(int seed) {
+ getModule().setSeed(seed);
+ }
+
+ @Override
+ public int getSeed() {
+ return getModule().getSeed();
+ }
+
+}
diff --git a/src/main/java/com/sk89q/worldedit/math/noise/RidgedMultiFractalNoise.java b/src/main/java/com/sk89q/worldedit/math/noise/RidgedMultiFractalNoise.java
new file mode 100644
index 000000000..0ebd0de57
--- /dev/null
+++ b/src/main/java/com/sk89q/worldedit/math/noise/RidgedMultiFractalNoise.java
@@ -0,0 +1,68 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program 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.
+ *
+ * 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 Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.math.noise;
+
+import net.royawesome.jlibnoise.module.source.RidgedMulti;
+
+/**
+ * Generates ridged multi-fractal noise.
+ */
+public class RidgedMultiFractalNoise extends JLibNoiseGenerator {
+
+ @Override
+ protected RidgedMulti createModule() {
+ return new RidgedMulti();
+ }
+
+ public double getFrequency() {
+ return getModule().getFrequency();
+ }
+
+ public void setFrequency(double frequency) {
+ getModule().setFrequency(frequency);
+ }
+
+ public double getLacunarity() {
+ return getModule().getLacunarity();
+ }
+
+ public void setLacunarity(double lacunarity) {
+ getModule().setLacunarity(lacunarity);
+ }
+
+ public int getOctaveCount() {
+ return getModule().getOctaveCount();
+ }
+
+ public void setOctaveCount(int octaveCount) {
+ getModule().setOctaveCount(octaveCount);
+ }
+
+ @Override
+ public void setSeed(int seed) {
+ getModule().setSeed(seed);
+ }
+
+ @Override
+ public int getSeed() {
+ return getModule().getSeed();
+ }
+
+}
diff --git a/src/main/java/com/sk89q/worldedit/math/noise/VoronoiNoise.java b/src/main/java/com/sk89q/worldedit/math/noise/VoronoiNoise.java
new file mode 100644
index 000000000..af1b5260e
--- /dev/null
+++ b/src/main/java/com/sk89q/worldedit/math/noise/VoronoiNoise.java
@@ -0,0 +1,52 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program 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.
+ *
+ * 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 Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.math.noise;
+
+import net.royawesome.jlibnoise.module.source.Voronoi;
+
+/**
+ * Generates Voronoi noise.
+ */
+public class VoronoiNoise extends JLibNoiseGenerator {
+
+ @Override
+ protected Voronoi createModule() {
+ return new Voronoi();
+ }
+
+ public double getFrequency() {
+ return getModule().getFrequency();
+ }
+
+ public void setFrequency(double frequency) {
+ getModule().setFrequency(frequency);
+ }
+
+ @Override
+ public void setSeed(int seed) {
+ getModule().setSeed(seed);
+ }
+
+ @Override
+ public int getSeed() {
+ return getModule().getSeed();
+ }
+
+}