diff --git a/go.mod b/go.mod
index 6c4320a..db01c84 100644
--- a/go.mod
+++ b/go.mod
@@ -3,12 +3,12 @@ module github.com/mdiluz/rove
 go 1.14
 
 require (
-	github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/golang/protobuf v1.4.2
 	github.com/google/uuid v1.1.1
 	github.com/grpc-ecosystem/grpc-gateway v1.14.6
 	github.com/kr/pretty v0.1.0 // indirect
+	github.com/ojrac/opensimplex-go v1.0.1
 	github.com/robfig/cron v1.2.0
 	github.com/stretchr/testify v1.6.0
 	golang.org/x/net v0.0.0-20200602114024-627f9648deb9
diff --git a/go.sum b/go.sum
index e579bf8..a2bd9a2 100644
--- a/go.sum
+++ b/go.sum
@@ -4,8 +4,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28 h1:iQUvYFmTKLXaDf3N0YfsJG5vgVtA1La82fHFDkpX5y4=
-github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28/go.mod h1:z9Rl7EM4BZY0Ikp2fEN1I5mKSOJ26HQpk0O2TBdN2HE=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU=
@@ -52,6 +50,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/ojrac/opensimplex-go v1.0.1 h1:XslvpLP6XqQSATUtsOnGBYtFPw7FQ6h6y0ihjVeOLHo=
+github.com/ojrac/opensimplex-go v1.0.1/go.mod h1:MoSgj04tZpH8U0RefZabnHV2AbLgv/2mo3hLJtWqSEs=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go
index 144ce93..0526488 100644
--- a/pkg/atlas/atlas.go
+++ b/pkg/atlas/atlas.go
@@ -4,10 +4,10 @@ import (
 	"log"
 	"math/rand"
 
-	"github.com/aquilax/go-perlin"
 	"github.com/mdiluz/rove/pkg/maths"
 	"github.com/mdiluz/rove/pkg/objects"
 	"github.com/mdiluz/rove/pkg/vector"
+	"github.com/ojrac/opensimplex-go"
 )
 
 // Tile describes the type of terrain
@@ -52,10 +52,14 @@ type Atlas struct {
 	// ChunkSize is the x/y dimensions of each square chunk
 	ChunkSize int `json:"chunksize"`
 
-	// perlin is the current perlin noise generator
-	perlin *perlin.Perlin
+	// noise is an OpenSimplex noise generator
+	noise opensimplex.Noise
 }
 
+const (
+	noiseSeed = 1024
+)
+
 // NewAtlas creates a new empty atlas
 func NewAtlas(chunkSize int) Atlas {
 	// Start up with one chunk
@@ -64,7 +68,7 @@ func NewAtlas(chunkSize int) Atlas {
 		Chunks:     make([]Chunk, 1),
 		LowerBound: vector.Vector{X: 0, Y: 0},
 		UpperBound: vector.Vector{X: chunkSize, Y: chunkSize},
-		perlin:     perlin.NewPerlin(2, 2, 3, 100),
+		noise:      opensimplex.New(noiseSeed),
 	}
 	// Initialise the first chunk
 	a.populate(0)
@@ -115,12 +119,12 @@ func (a *Atlas) populate(chunk int) {
 		for j := 0; j < a.ChunkSize; j++ {
 
 			// Get the perlin noise value for this location
-			pl := a.perlin.Noise2D(float64(origin.X+i)/15, float64(origin.Y+j)/15)
+			pl := a.noise.Eval2(float64(origin.X+i)/6, float64(origin.Y+j)/6)
 
 			// Choose a tile based on the perlin noise value
 			var tile Tile
 			switch {
-			case pl > 0.2:
+			case pl > 0.5:
 				tile = TileGravel
 			case pl > 0.05:
 				tile = TileSand
@@ -238,7 +242,7 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int {
 		LowerBound: lower,
 		UpperBound: upper,
 		Chunks:     make([]Chunk, size.X*size.Y),
-		perlin:     a.perlin,
+		noise:      a.noise,
 	}
 
 	// Log that we're resizing