diff --git a/src/main/java/net/imglib2/img/basictypeaccess/volatiles/VolatileByteAccess.java b/src/main/java/net/imglib2/img/basictypeaccess/volatiles/VolatileByteAccess.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a79fbdbacf988b24b78e516df36cb766b38e4d9
--- /dev/null
+++ b/src/main/java/net/imglib2/img/basictypeaccess/volatiles/VolatileByteAccess.java
@@ -0,0 +1,11 @@
+package net.imglib2.img.basictypeaccess.volatiles;
+
+import net.imglib2.img.basictypeaccess.ByteAccess;
+
+
+/**
+ * @author Stephan Saalfeld <saalfelds@janelia.hhmi.org>
+ * @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
+ */
+public interface VolatileByteAccess extends ByteAccess, VolatileAccess
+{}
diff --git a/src/main/java/net/imglib2/img/basictypeaccess/volatiles/array/VolatileByteArray.java b/src/main/java/net/imglib2/img/basictypeaccess/volatiles/array/VolatileByteArray.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebec4451d9280c2109e5cf2b5059492a51019381
--- /dev/null
+++ b/src/main/java/net/imglib2/img/basictypeaccess/volatiles/array/VolatileByteArray.java
@@ -0,0 +1,52 @@
+package net.imglib2.img.basictypeaccess.volatiles.array;
+
+import net.imglib2.img.basictypeaccess.volatiles.VolatileByteAccess;
+
+/**
+ * A {@link ByteArray} with an {@link #isValid()} flag.
+ *
+ * @author Stephan Saalfeld <saalfelds@janelia.hhmi.org>
+ * @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
+ */
+public class VolatileByteArray extends AbstractVolatileArray< VolatileByteArray > implements VolatileByteAccess
+{
+ private static final long serialVersionUID = -2609245209721069962L;
+
+ protected byte[] data;
+
+ public VolatileByteArray( final int numEntities, final boolean isValid )
+ {
+ super( isValid );
+ this.data = new byte[ numEntities ];
+ }
+
+ public VolatileByteArray( final byte[] data, final boolean isValid )
+ {
+ super( isValid );
+ this.data = data;
+ }
+
+ @Override
+ public byte getValue( final int index )
+ {
+ return data[ index ];
+ }
+
+ @Override
+ public void setValue( final int index, final byte value )
+ {
+ data[ index ] = value;
+ }
+
+ @Override
+ public VolatileByteArray createArray( final int numEntities )
+ {
+ return new VolatileByteArray( numEntities, true );
+ }
+
+ @Override
+ public byte[] getCurrentStorageArray()
+ {
+ return data;
+ }
+}
diff --git a/src/main/java/net/imglib2/img/basictypeaccess/volatiles/array/VolatileShortArray.java b/src/main/java/net/imglib2/img/basictypeaccess/volatiles/array/VolatileShortArray.java
index 869d891bde599252ddf00a5acf99fbcc19cf62ec..5f754222ccaa54945d258dc8ac429011519c7d21 100644
--- a/src/main/java/net/imglib2/img/basictypeaccess/volatiles/array/VolatileShortArray.java
+++ b/src/main/java/net/imglib2/img/basictypeaccess/volatiles/array/VolatileShortArray.java
@@ -10,6 +10,8 @@ import net.imglib2.img.basictypeaccess.volatiles.VolatileShortAccess;
*/
public class VolatileShortArray extends AbstractVolatileArray< VolatileShortArray > implements VolatileShortAccess
{
+ private static final long serialVersionUID = -8460450507170281183L;
+
protected short data[];
public VolatileShortArray( final int numEntities, final boolean isValid )
diff --git a/src/main/java/net/imglib2/type/volatiles/VolatileUnsignedByteType.java b/src/main/java/net/imglib2/type/volatiles/VolatileUnsignedByteType.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2a5a43abc76d68e0a50a23c98da81945738e23d
--- /dev/null
+++ b/src/main/java/net/imglib2/type/volatiles/VolatileUnsignedByteType.java
@@ -0,0 +1,106 @@
+package net.imglib2.type.volatiles;
+
+import net.imglib2.Volatile;
+import net.imglib2.img.NativeImg;
+import net.imglib2.img.NativeImgFactory;
+import net.imglib2.img.basictypeaccess.ByteAccess;
+import net.imglib2.img.basictypeaccess.volatiles.VolatileByteAccess;
+import net.imglib2.img.basictypeaccess.volatiles.array.VolatileByteArray;
+import net.imglib2.type.numeric.integer.UnsignedByteType;
+
+/**
+ * A {@link Volatile} variant of {@link UnsignedByteType}. It uses an
+ * underlying {@link UnsignedByteType} that maps into a
+ * {@link VolatileByteAccess}.
+ *
+ * @author Stephan Saalfeld <saalfelds@janelia.hhmi.org>
+ * @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
+ */
+public class VolatileUnsignedByteType extends AbstractVolatileNativeRealType< UnsignedByteType, VolatileUnsignedByteType >
+{
+ final protected NativeImg< ?, ? extends VolatileByteAccess > img;
+
+ private static class WrappedUnsignedByteType extends UnsignedByteType
+ {
+ public WrappedUnsignedByteType( final NativeImg<?, ? extends ByteAccess> img )
+ {
+ super( img );
+ }
+
+ public WrappedUnsignedByteType( final ByteAccess access )
+ {
+ super( access );
+ }
+
+ public void setAccess( final ByteAccess access )
+ {
+ dataAccess = access;
+ }
+ }
+
+ // this is the constructor if you want it to read from an array
+ public VolatileUnsignedByteType( final NativeImg< ?, ? extends VolatileByteAccess > img )
+ {
+ super( new WrappedUnsignedByteType( img ), false );
+ this.img = img;
+ }
+
+ // this is the constructor if you want to specify the dataAccess
+ public VolatileUnsignedByteType( final VolatileByteAccess access )
+ {
+ super( new WrappedUnsignedByteType( access ), access.isValid() );
+ this.img = null;
+ }
+
+ // this is the constructor if you want it to be a variable
+ public VolatileUnsignedByteType( final int value )
+ {
+ this( new VolatileByteArray( 1, true ) );
+ set( value );
+ }
+
+ // this is the constructor if you want it to be a variable
+ public VolatileUnsignedByteType()
+ {
+ this( 0 );
+ }
+
+ public void set( final int value )
+ {
+ get().set( value );
+ }
+
+ @Override
+ public void updateContainer( final Object c )
+ {
+ final VolatileByteAccess a = img.update( c );
+ ( ( WrappedUnsignedByteType )t ).setAccess( a );
+ setValid( a.isValid() );
+ }
+
+ @Override
+ public NativeImg< VolatileUnsignedByteType, ? extends VolatileByteAccess > createSuitableNativeImg( final NativeImgFactory< VolatileUnsignedByteType > storageFactory, final long[] dim )
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public VolatileUnsignedByteType duplicateTypeOnSameNativeImg()
+ {
+ return new VolatileUnsignedByteType( img );
+ }
+
+ @Override
+ public VolatileUnsignedByteType createVariable()
+ {
+ return new VolatileUnsignedByteType();
+ }
+
+ @Override
+ public VolatileUnsignedByteType copy()
+ {
+ final VolatileUnsignedByteType v = createVariable();
+ v.set( this );
+ return v;
+ }
+}