diff --git a/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/oned/NeuronString.java b/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/oned/NeuronString.java
index dcef125..f223c91 100644
--- a/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/oned/NeuronString.java
+++ b/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/oned/NeuronString.java
@@ -144,6 +144,15 @@
     }
 
     /**
+     * Indicates whether the line of neurons is wrapped.
+     *
+     * @return {@code true} if the last neuron is linked to the first neuron.
+     */
+    public boolean isWrapped() {
+        return wrap;
+    }
+
+    /**
      * Retrieves the features set from the neuron at location
      * {@code i} in the map.
      *
diff --git a/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2D.java b/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2D.java
index 4a6b185..92439ee 100644
--- a/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2D.java
+++ b/commons-math-neuralnet/src/main/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2D.java
@@ -285,6 +285,36 @@
     }
 
     /**
+     * Indicates whether the map is wrapped along the first dimension.
+     *
+     * @return {@code true} if the last neuron of a row is linked to
+     * the first neuron of that row.
+     */
+    public boolean isWrappedRow() {
+        return wrapRows;
+    }
+
+    /**
+     * Indicates whether the map is wrapped along the second dimension.
+     *
+     * @return {@code true} if the last neuron of a column is linked to
+     * the first neuron of that column.
+     */
+    public boolean isWrappedColumn() {
+        return wrapColumns;
+    }
+
+    /**
+     * Indicates the {@link SquareNeighbourhood type of connectivity}
+     * between neurons.
+     *
+     * @return the neighbourhood type.
+     */
+    public SquareNeighbourhood getSquareNeighbourhood() {
+        return neighbourhood;
+    }
+
+    /**
      * Retrieves the neuron at location {@code (i, j)} in the map.
      * The neuron at position {@code (0, 0)} is located at the upper-left
      * corner of the map.
diff --git a/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/oned/NeuronStringTest.java b/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/oned/NeuronStringTest.java
index e6aeec0..7069b04 100644
--- a/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/oned/NeuronStringTest.java
+++ b/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/oned/NeuronStringTest.java
@@ -47,8 +47,10 @@
     @Test
     public void testSegmentNetwork() {
         final FeatureInitializer[] initArray = {init};
-        final Network net = new NeuronString(4, false, initArray).getNetwork();
+        final NeuronString line = new NeuronString(4, false, initArray);
+        Assert.assertFalse(line.isWrapped());
 
+        final Network net = line.getNetwork();
         Collection<Neuron> neighbours;
 
         // Neuron 0.
@@ -92,8 +94,10 @@
     @Test
     public void testCircleNetwork() {
         final FeatureInitializer[] initArray = {init};
-        final Network net = new NeuronString(4, true, initArray).getNetwork();
+        final NeuronString line = new NeuronString(4, true, initArray);
+        Assert.assertTrue(line.isWrapped());
 
+        final Network net = line.getNetwork();
         Collection<Neuron> neighbours;
 
         // Neuron 0.
diff --git a/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2DTest.java b/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2DTest.java
index 78833d5..a5e721d 100644
--- a/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2DTest.java
+++ b/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/twod/NeuronSquareMesh2DTest.java
@@ -75,6 +75,23 @@
         Assert.assertEquals(3, net.getFeaturesSize());
     }
 
+    @Test
+    public void testAccessors() {
+        final FeatureInitializer[] initArray = {init};
+        NeuronSquareMesh2D map;
+
+        for (SquareNeighbourhood type : SquareNeighbourhood.values()) {
+            map = new NeuronSquareMesh2D(4, false, 2, true, type, initArray);
+            Assert.assertFalse(map.isWrappedRow());
+            Assert.assertTrue(map.isWrappedColumn());
+            Assert.assertEquals(type, map.getSquareNeighbourhood());
+
+            map = new NeuronSquareMesh2D(3, true, 4, false, type, initArray);
+            Assert.assertTrue(map.isWrappedRow());
+            Assert.assertFalse(map.isWrappedColumn());
+            Assert.assertEquals(type, map.getSquareNeighbourhood());
+        }
+    }
 
     /*
      * Test assumes that the network is
