Index: src/misc/floatcoord.h
===================================================================
--- src/misc/floatcoord.h (revision 104:ed1fa52a4f6d)
+++ src/misc/floatcoord.h (revision 185:33ee25e05181)
@@ -9,5 +9,6 @@
 
 /**
- * A real valued coordinate class, which contains an optional ID.
+ * A real valued coordinate class. Can also be seen as a short,
+ * fixed-size vector.
  */
 template<int DIM>
@@ -27,6 +28,4 @@
 
     boost::array<double, DIM> c;
-    // fixme: get rid of this
-    int id;
 };
 
@@ -40,8 +39,7 @@
     explicit
     inline
-    FloatCoord(const double& x = 0, const int _id = 0) 
+    FloatCoord(const double& x = 0) 
     {
         c[0] = x;
-        id = _id;
     }
 
@@ -61,4 +59,33 @@
 template<>
 class FloatCoord<2> : public FloatCoordBase<2>
+{
+public:
+
+    explicit
+    inline
+    FloatCoord(
+        const double& x = 0, 
+        const double& y = 0) 
+    {
+        c[0] = x;
+        c[1] = y;
+    }
+
+    inline
+    double length() const
+    {
+        return sqrt(c[0] * c[0] + 
+                    c[1] * c[1]);
+    }
+
+    inline
+    double sum() const
+    {
+        return c[0] + c[1];
+    }
+};
+
+template<>
+class FloatCoord<3> : public FloatCoordBase<3>
 {
 public:
@@ -69,42 +96,9 @@
         const double& x = 0, 
         const double& y = 0, 
-        const int _id = 0) 
-    {
-        c[0] = x;
-        c[1] = y;
-        id = _id;
-    }
-
-    inline
-    double length() const
-    {
-        return sqrt(c[0] * c[0] + 
-                    c[1] * c[1]);
-    }
-
-    inline
-    double sum() const
-    {
-        return c[0] + c[1];
-    }
-};
-
-template<>
-class FloatCoord<3> : public FloatCoordBase<3>
-{
-public:
-
-    explicit
-    inline
-    FloatCoord(
-        const double& x = 0, 
-        const double& y = 0, 
-        const double& z = 0,
-        const int _id = 0) 
+        const double& z = 0)
     {
         c[0] = x;
         c[1] = y;
         c[2] = z;
-        id = _id;
     }
 
Index: src/misc/meshlessadapter.h
===================================================================
--- src/misc/meshlessadapter.h (revision 33:727aed332c25)
+++ src/misc/meshlessadapter.h (revision 185:33ee25e05181)
@@ -24,7 +24,7 @@
     static const int MAX_SIZE = 300000;
 
-    typedef std::list<FloatCoord<DIM> > CoordList;
+    typedef std::list<std::pair<FloatCoord<DIM>, int> > CoordList;
     typedef Grid<CoordList, TOPOLOGY> CoordListGrid;
-    typedef SuperVector<FloatCoord<DIM> > CoordVec;
+    typedef SuperVector<std::pair<FloatCoord<DIM>, int> > CoordVec;
     typedef SuperVector<SuperVector<int> > Graph;
 
@@ -58,8 +58,8 @@
     }
 
-    inline void insert(CoordListGrid *grid, const FloatCoord<DIM>& pos) const
+    inline void insert(CoordListGrid *grid, const FloatCoord<DIM>& pos, const int& id) const
     {
         Coord<2> c = posToCoord(pos);
-        (*grid)[c].push_back(pos);
+        (*grid)[c].push_back(std::make_pair(pos, id));
     }
 
@@ -96,6 +96,6 @@
         CoordBoxSequence<DIM> s = box.sequence();
         while (s.hasNext()) {
-            const std::list<FloatCoord<DIM> >& list = positions[s.next()];
-            for (typename std::list<FloatCoord<DIM> >::const_iterator iter = list.begin();
+            const CoordList& list = positions[s.next()];
+            for (typename CoordList::const_iterator iter = list.begin();
                  iter != list.end();
                  ++iter) {
@@ -189,5 +189,5 @@
             for (SuperVector<int>::const_iterator n = graph[i].begin(); 
                  n != graph[i].end(); ++n) 
-                if (manhattanDistance(positions[i], positions[*n]) > 1)
+                if (manhattanDistance(positions[i].first, positions[*n].first) > 1)
                     return false;
 
@@ -267,5 +267,5 @@
 
     bool searchList(
-        const std::list<FloatCoord<DIM> >& list,
+        const CoordList& list,
         const FloatCoord<DIM>& pos,
         std::set<int> *coords = 0) const
@@ -273,11 +273,11 @@
         bool found = false;
 
-        for (typename std::list<FloatCoord<DIM> >::const_iterator iter = list.begin();
+        for (typename CoordList::const_iterator iter = list.begin();
              iter != list.end();
              ++iter) {
-            if (distance2(pos, *iter) < radius2) {
+            if (distance2(pos, iter->first) < radius2) {
                 found = true;
                 if (coords)
-                    coords->insert(iter->id);
+                    coords->insert(iter->second);
             }
         }
Index: src/misc/test/unit/meshlessadaptertest.h
===================================================================
--- src/misc/test/unit/meshlessadaptertest.h (revision 27:3e219b6a1c2f)
+++ src/misc/test/unit/meshlessadaptertest.h (revision 185:33ee25e05181)
@@ -65,5 +65,5 @@
 
         for (int i = 0; i < 6; ++i) 
-            adapter.insert(&grid, FloatCoord<2>(i + 0.5, 0.5, i));
+            adapter.insert(&grid, FloatCoord<2>(i + 0.5, 0.5), i);
 
         std::set<int> coords;
@@ -124,5 +124,5 @@
         MyAdapter::Graph graph;
         for (int i = 0; i < width; ++i) {
-            positions.push_back(FloatCoord<2>(i * 0.5, 0.5, i));
+            positions.push_back(std::make_pair(FloatCoord<2>(i * 0.5, 0.5), i));
             SuperVector<int> neighbors;
             neighbors << ((i + width - 1) % width)
Index: src/testbed/testbed.cpp
===================================================================
--- src/testbed/testbed.cpp (revision 184:f66d2627150f)
+++ src/testbed/testbed.cpp (revision 185:33ee25e05181)
@@ -151,4 +151,5 @@
             coefficients, 
             source,
+            index +
             coord.x() +
             coord.y() * DIM_X + 
@@ -198,5 +199,17 @@
     operator[](FixedCoord<X, Y, Z> /*unused*/) const
     {
-        return FixedNeighborhood<DIM_X, DIM_Y, DIM_Z, X + Y * DIM_X + Z * DIM_X * DIM_Y>(coefficients, source);
+        return FixedNeighborhood<DIM_X, DIM_Y, DIM_Z, INDEX + X + Y * DIM_X + Z * DIM_X * DIM_Y>(coefficients, source);
+    }
+
+    Neighborhood<DIM_X, DIM_Y, DIM_Z>
+    operator[](Coord<3> coord) const
+    {
+        return Neighborhood<DIM_X, DIM_Y, DIM_Z>(
+            coefficients, 
+            source,
+            INDEX +
+            coord.x() +
+            coord.y() * DIM_X + 
+            coord.z() * DIM_X * DIM_Y);
     }
 
