diff --git a/engine/src/terrain/com/jme3/terrain/heightmap/RawArrayHeightMap.java b/engine/src/terrain/com/jme3/terrain/heightmap/RawArrayHeightMap.java
new file mode 100644
index 000000000..f3c412eff
--- /dev/null
+++ b/engine/src/terrain/com/jme3/terrain/heightmap/RawArrayHeightMap.java
@@ -0,0 +1,125 @@
+package com.jme3.terrain.heightmap;
+import java.io.IOException;
+import com.jme3.export.InputCapsule;
+import com.jme3.export.JmeExporter;
+import com.jme3.export.JmeImporter;
+import com.jme3.export.OutputCapsule;
+import com.jme3.export.Savable;
+import com.jme3.math.FastMath;
+
+/**
+ * RawArrayHeightMap
creates a height map directly from a float
+ * Array.
+ *
+ * @author OzoneGrif
+ * @version $Id$
+ */
+public class RawArrayHeightMap extends AbstractHeightMap implements Savable
+{
+ /**
+ * Empty constructor, used by the Savable
implementation.
+ * Do not use manually.
+ */
+ public RawArrayHeightMap()
+ {
+ }
+
+ /**
+ * Creates an empty heightMap
+ *
+ * @param size
+ */
+ public RawArrayHeightMap( int size )
+ {
+ this.size = size;
+ heightData = new float[ size * size ];
+ }
+
+ /**
+ * Creates a heightMap from a pre-existing float Array
+ */
+ public RawArrayHeightMap( float[] buffer ) throws Exception
+ {
+ size = (int) FastMath.sqr( buffer.length );
+ if ( (size * size) == buffer.length )
+ heightData = buffer;
+ else
+ throw new Exception( "buffer size must be 2^n" );
+ }
+
+ /**
+ * Not needed for RawArrayHeightMap
, will return false if not
+ * initialized
+ */
+ @Override
+ public boolean load()
+ {
+ return ((size > 0) && (heightData != null));
+ }
+
+ /**
+ * Checks if both heightMaps are strictly identical
+ */
+ @Override
+ public boolean equals( Object o )
+ {
+ if ( o instanceof AbstractHeightMap )
+ {
+ RawArrayHeightMap rhm = (RawArrayHeightMap) o;
+ if ( (size == rhm.size) && (heightScale == rhm.heightScale) && (filter == rhm.filter) )
+ {
+ for ( int i = 0 ; i < heightData.length ; i++ )
+ if ( heightData[ i ] != rhm.heightData[ i ] )
+ return false;
+ return true;
+ } else
+ return false;
+ } else
+ return false;
+ }
+
+ /**
+ * Returns an unique hashCode strictly linked to this heightMap's data
+ */
+ @Override
+ public int hashCode()
+ {
+ int hashCode = (size ^ Float.floatToIntBits( heightScale ) ^ Float.floatToIntBits( filter ));
+ for ( float element : heightData )
+ hashCode ^= Float.floatToIntBits( element );
+ return hashCode;
+ }
+
+ /**
+ * Save the heightMap for a BinaryExporter
+ *
+ * @param out
+ * @throws IOException
+ */
+ @Override
+ public void write( JmeExporter ex ) throws IOException
+ {
+ OutputCapsule oc = ex.getCapsule( this );
+ oc.write( size, "size", 0 );
+ oc.write( heightScale, "heightScale", 1.0f );
+ oc.write( filter, "filter", 0.5f );
+ oc.write( heightData, "heightData", null );
+ }
+
+ /**
+ * Load the heightMap for a BinaryImporter
+ *
+ * @param in
+ * @throws IOException
+ * @throws ClassNotFoundException
+ */
+ @Override
+ public void read( JmeImporter im ) throws IOException
+ {
+ InputCapsule ic = im.getCapsule( this );
+ ic.readInt( "size", 0 );
+ ic.readFloat( "heightScale", 1.0f );
+ ic.readFloat( "filter", 0.5f );
+ ic.readFloatArray( "heightData", null );
+ }
+}
\ No newline at end of file