Index: lemon/lemon_reader.h
===================================================================
--- lemon/lemon_reader.h	(revision 1875)
+++ lemon/lemon_reader.h	(revision 1901)
@@ -48,5 +48,5 @@
     template <typename T>
     bool operator<(T, T) {
-      throw DataFormatError("Id is not comparable");
+      throw DataFormatError("Label is not comparable");
     }
 
@@ -59,20 +59,20 @@
 
     template <typename Item>
-    class ItemIdReader {
+    class ItemLabelReader {
     public:
 
-      bool isIdReader() { return true; }
-
-      void readId(std::istream&, Item&) {}
+      bool isLabelReader() { return true; }
+
+      void readLabel(std::istream&, Item&) {}
       
-      template <class _ItemIdReader>
+      template <class _ItemLabelReader>
       struct Constraints {
 	void constraints() {
-	  bool b = reader.isIdReader();
+	  bool b = reader.isLabelReader();
 	  ignore_unused_variable_warning(b);
 	  Item item;
-	  reader.readId(is, item);
-	}
-	_ItemIdReader& reader;
+	  reader.readLabel(is, item);
+	}
+	_ItemLabelReader& reader;
 	std::istream& is;
       };
@@ -242,5 +242,5 @@
 	  inverse.insert(std::make_pair(value, item));
 	} else {
-	  throw DataFormatError("Multiple ID occurence");
+	  throw DataFormatError("Multiple label occurence");
 	}
       }
@@ -253,5 +253,5 @@
 	  return it->second;
 	} else {
-	  throw DataFormatError("Invalid ID error");
+	  throw DataFormatError("Invalid label error");
 	}
       }      
@@ -280,5 +280,5 @@
 	  inverse.insert(std::make_pair(value, item));
 	} else {
-	  throw DataFormatError("Multiple ID occurence error");
+	  throw DataFormatError("Multiple label occurence error");
 	}
       }
@@ -291,5 +291,5 @@
 	  return it->second;
 	} else {
-	  throw DataFormatError("Invalid ID error");
+	  throw DataFormatError("Invalid label error");
 	}
       }
@@ -371,31 +371,31 @@
 
     template <typename _Item>
-    class IdReaderBase {
+    class LabelReaderBase {
     public:
       typedef _Item Item;
-      virtual ~IdReaderBase() {}
+      virtual ~LabelReaderBase() {}
       virtual Item read(std::istream& is) const = 0;
-      virtual bool isIdReader() const = 0;
-    };
-
-    template <typename _Item, typename _BoxedIdReader>
-    class IdReader : public IdReaderBase<_Item> {
+      virtual bool isLabelReader() const = 0;
+    };
+
+    template <typename _Item, typename _BoxedLabelReader>
+    class LabelReader : public LabelReaderBase<_Item> {
     public:
       typedef _Item Item;
-      typedef _BoxedIdReader BoxedIdReader;
+      typedef _BoxedLabelReader BoxedLabelReader;
       
-      const BoxedIdReader& boxedIdReader;
-
-      IdReader(const BoxedIdReader& _boxedIdReader) 
-	: boxedIdReader(_boxedIdReader) {}
+      const BoxedLabelReader& boxedLabelReader;
+
+      LabelReader(const BoxedLabelReader& _boxedLabelReader) 
+	: boxedLabelReader(_boxedLabelReader) {}
 
       virtual Item read(std::istream& is) const {
 	Item item;
-	boxedIdReader.readId(is, item);
+	boxedLabelReader.readLabel(is, item);
 	return item;
       }
 
-      virtual bool isIdReader() const {
-	return boxedIdReader.isIdReader();
+      virtual bool isLabelReader() const {
+	return boxedLabelReader.isLabelReader();
       }
     };
@@ -728,6 +728,6 @@
   ///
   /// The lemon format can store multiple graph nodesets with several maps.
-  /// The nodeset section's header line is \c \@nodeset \c nodeset_id, but the
-  /// \c nodeset_id may be empty.
+  /// The nodeset section's header line is \c \@nodeset \c nodeset_name, but the
+  /// \c nodeset_name may be empty.
   ///
   /// The first line of the section contains the names of the maps separated
@@ -735,7 +735,7 @@
   /// contains the mapped values for each map.
   ///
-  /// If the nodeset contains an \c "id" named map then it will be regarded
+  /// If the nodeset contains an \c "label" named map then it will be regarded
   /// as id map. This map should contain only unique values and when the 
-  /// \c readId() member will read a value from the given stream it will
+  /// \c readLabel() member will read a value from the given stream it will
   /// give back that node which is mapped to this value.
   ///
@@ -756,10 +756,10 @@
     /// attach it into the given LemonReader. The nodeset reader will
     /// add the readed nodes to the given Graph. The reader will read
-    /// the section when the \c section_id and the \c _id are the same. 
+    /// the section when the \c section_name and the \c _name are the same. 
     NodeSetReader(LemonReader& _reader, 
 		  Graph& _graph, 
-		  const std::string& _id = std::string(),
+		  const std::string& _name = std::string(),
 		  const DefaultSkipper& _skipper = DefaultSkipper()) 
-      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {} 
+      : Parent(_reader), graph(_graph), name(_name), skipper(_skipper) {} 
 
 
@@ -856,9 +856,9 @@
     ///
     /// It gives back true when the header line starts with \c \@nodeset,
-    /// and the header line's id and the nodeset's id are the same.
+    /// and the header line's name and the nodeset's name are the same.
     virtual bool header(const std::string& line) {
       std::istringstream ls(line);
       std::string command;
-      std::string name;
+      std::string id;
       ls >> command >> name;
       return command == "@nodeset" && name == id;
@@ -873,5 +873,6 @@
 
       getline(is, line);
-      std::istringstream ls(line);	
+      std::istringstream ls(line);
+      std::string id;
       while (ls >> id) {
 	typename MapReaders::iterator it = readers.find(id);
@@ -882,5 +883,5 @@
 	  index.push_back(&skipper);
 	}
-	if (id == "id" && inverter.get() == 0) {
+	if (id == "label" || (id =="id" && inverter.get() == 0)) {
 	  inverter.reset(index.back()->getInverter());
 	  index.back() = inverter.get();
@@ -906,17 +907,17 @@
   public:
 
-    /// \brief Returns true if the nodeset can give back the node by its id.
-    ///
-    /// Returns true if the nodeset can give back the node by its id.
-    /// It is possible only if an "id" named map was read.
-    bool isIdReader() const {
+    /// \brief Returns true if the nodeset can give back the node by its label.
+    ///
+    /// Returns true if the nodeset can give back the node by its label.
+    /// It is possible only if an "label" named map was read.
+    bool isLabelReader() const {
       return inverter.get() != 0;
     }
 
-    /// \brief Gives back the node by its id.
+    /// \brief Gives back the node by its label.
     ///
     /// It reads an id from the stream and gives back which node belongs to
-    /// it. It is possible only if there was read an "id" named map.
-    void readId(std::istream& is, Node& node) const {
+    /// it. It is possible only if there was read an "label" named map.
+    void readLabel(std::istream& is, Node& node) const {
       node = inverter->read(is);
     } 
@@ -928,5 +929,5 @@
    
     Graph& graph;   
-    std::string id;
+    std::string name;
     _reader_bits::SkipReader<Node, DefaultSkipper> skipper;
 
@@ -938,6 +939,6 @@
   ///
   /// The lemon format can store multiple graph edgesets with several maps.
-  /// The edgeset section's header line is \c \@edgeset \c edgeset_id, but the
-  /// \c edgeset_id may be empty.
+  /// The edgeset section's header line is \c \@edgeset \c edgeset_name, but the
+  /// \c edgeset_name may be empty.
   ///
   /// The first line of the section contains the names of the maps separated
@@ -946,11 +947,11 @@
   /// values for each map.
   ///
-  /// If the edgeset contains an \c "id" named map then it will be regarded
+  /// If the edgeset contains an \c "label" named map then it will be regarded
   /// as id map. This map should contain only unique values and when the 
-  /// \c readId() member will read a value from the given stream it will
+  /// \c readLabel() member will read a value from the given stream it will
   /// give back that edge which is mapped to this value.
   ///
   /// The edgeset reader needs a node id reader to identify which nodes
-  /// have to be connected. If a NodeSetReader reads an "id" named map,
+  /// have to be connected. If a NodeSetReader reads an "label" named map,
   /// it will be able to resolve the nodes by ids.
   ///
@@ -973,16 +974,16 @@
     /// add the readed edges to the given Graph. It will use the given
     /// node id reader to read the source and target nodes of the edges.
-    /// The reader will read the section only if the \c _id and the 
-    /// \c edgset_id are the same. 
-    template <typename NodeIdReader>
+    /// The reader will read the section only if the \c _name and the 
+    /// \c edgset_name are the same. 
+    template <typename NodeLabelReader>
     EdgeSetReader(LemonReader& _reader, 
 		  Graph& _graph, 
-		  const NodeIdReader& _nodeIdReader, 
-		  const std::string& _id = std::string(),
+		  const NodeLabelReader& _nodeLabelReader, 
+		  const std::string& _name = std::string(),
 		  const DefaultSkipper& _skipper = DefaultSkipper()) 
-      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
-      checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
-      nodeIdReader.reset(new _reader_bits::
-			 IdReader<Node, NodeIdReader>(_nodeIdReader));
+      : Parent(_reader), graph(_graph), name(_name), skipper(_skipper) {
+      checkConcept<_reader_bits::ItemLabelReader<Node>, NodeLabelReader>();
+      nodeLabelReader.reset(new _reader_bits::
+			 LabelReader<Node, NodeLabelReader>(_nodeLabelReader));
     }
     /// \brief Destructor.
@@ -1078,9 +1079,9 @@
     ///
     /// It gives back true when the header line starts with \c \@edgeset,
-    /// and the header line's id and the edgeset's id are the same.
+    /// and the header line's name and the edgeset's name are the same.
     virtual bool header(const std::string& line) {
       std::istringstream ls(line);
       std::string command;
-      std::string name;
+      std::string id;
       ls >> command >> name;
       return command == "@edgeset" && name == id;
@@ -1091,6 +1092,6 @@
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      if (!nodeIdReader->isIdReader()) {
-	throw DataFormatError("Cannot find nodeset or ID map");
+      if (!nodeLabelReader->isLabelReader()) {
+	throw DataFormatError("Cannot find nodeset or label map");
       }
       std::vector<_reader_bits::MapReaderBase<Edge>* > index;
@@ -1099,4 +1100,5 @@
       getline(is, line);
       std::istringstream ls(line);	
+      std::string id;
       while (ls >> id) {
 	typename MapReaders::iterator it = readers.find(id);
@@ -1107,5 +1109,5 @@
 	  index.push_back(&skipper);
 	}
-	if (id == "id" && inverter.get() == 0) {
+	if (id == "label" || (id =="id" && inverter.get() == 0)) {
 	  inverter.reset(index.back()->getInverter());
 	  index.back() = inverter.get();
@@ -1122,6 +1124,6 @@
       while (getline(is, line)) {	
 	std::istringstream ls(line);
-	Node from = nodeIdReader->read(ls);
-	Node to = nodeIdReader->read(ls);
+	Node from = nodeLabelReader->read(ls);
+	Node to = nodeLabelReader->read(ls);
 	Edge edge = graph.addEdge(from, to);
 	for (int i = 0; i < (int)index.size(); ++i) {
@@ -1133,17 +1135,17 @@
   public:
 
-    /// \brief Returns true if the edgeset can give back the edge by its id.
-    ///
-    /// Returns true if the edgeset can give back the edge by its id.
-    /// It is possible only if an "id" named map was read.
-    bool isIdReader() const {
+    /// \brief Returns true if the edgeset can give back the edge by its label.
+    ///
+    /// Returns true if the edgeset can give back the edge by its label.
+    /// It is possible only if an "label" named map was read.
+    bool isLabelReader() const {
       return inverter.get() != 0;
     }
 
-    /// \brief Gives back the edge by its id.
+    /// \brief Gives back the edge by its label.
     ///
     /// It reads an id from the stream and gives back which edge belongs to
-    /// it. It is possible only if there was read an "id" named map.
-    void readId(std::istream& is, Edge& edge) const {
+    /// it. It is possible only if there was read an "label" named map.
+    void readLabel(std::istream& is, Edge& edge) const {
       edge = inverter->read(is);
     } 
@@ -1155,9 +1157,9 @@
    
     Graph& graph;   
-    std::string id;
+    std::string name;
     _reader_bits::SkipReader<Edge, DefaultSkipper> skipper;
 
     std::auto_ptr<_reader_bits::MapInverterBase<Edge> > inverter;
-    std::auto_ptr<_reader_bits::IdReaderBase<Node> > nodeIdReader;
+    std::auto_ptr<_reader_bits::LabelReaderBase<Node> > nodeLabelReader;
   };
 
@@ -1167,5 +1169,5 @@
   /// The lemon format can store multiple undirected edgesets with several 
   /// maps. The undirected edgeset section's header line is \c \@undiredgeset 
-  /// \c undiredgeset_id, but the \c undiredgeset_id may be empty.
+  /// \c undiredgeset_name, but the \c undiredgeset_name may be empty.
   ///
   /// The first line of the section contains the names of the maps separated
@@ -1179,11 +1181,11 @@
   /// difference.
   ///
-  /// If the edgeset contains an \c "id" named map then it will be regarded
+  /// If the edgeset contains an \c "label" named map then it will be regarded
   /// as id map. This map should contain only unique values and when the 
-  /// \c readId() member will read a value from the given stream it will
+  /// \c readLabel() member will read a value from the given stream it will
   /// give back that undiricted edge which is mapped to this value.
   ///
   /// The undirected edgeset reader needs a node id reader to identify which 
-  /// nodes have to be connected. If a NodeSetReader reads an "id" named map,
+  /// nodes have to be connected. If a NodeSetReader reads an "label" named map,
   /// it will be able to resolve the nodes by ids.
   ///
@@ -1208,15 +1210,15 @@
     /// will use the given node id reader to read the source and target 
     /// nodes of the edges. The reader will read the section only if the 
-    /// \c _id and the \c undiredgset_id are the same. 
-    template <typename NodeIdReader>
+    /// \c _name and the \c undiredgset_name are the same. 
+    template <typename NodeLabelReader>
     UndirEdgeSetReader(LemonReader& _reader, 
 		       Graph& _graph, 
-		       const NodeIdReader& _nodeIdReader, 
-		       const std::string& _id = std::string(),
+		       const NodeLabelReader& _nodeLabelReader, 
+		       const std::string& _name = std::string(),
 		       const DefaultSkipper& _skipper = DefaultSkipper()) 
-      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
-      checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
-      nodeIdReader.reset(new _reader_bits::
-			 IdReader<Node, NodeIdReader>(_nodeIdReader));
+      : Parent(_reader), graph(_graph), name(_name), skipper(_skipper) {
+      checkConcept<_reader_bits::ItemLabelReader<Node>, NodeLabelReader>();
+      nodeLabelReader.reset(new _reader_bits::
+			 LabelReader<Node, NodeLabelReader>(_nodeLabelReader));
     }
     /// \brief Destructor.
@@ -1373,9 +1375,9 @@
     ///
     /// It gives back true when the header line starts with \c \@undiredgeset,
-    /// and the header line's id and the edgeset's id are the same.
+    /// and the header line's name and the edgeset's name are the same.
     virtual bool header(const std::string& line) {
       std::istringstream ls(line);
       std::string command;
-      std::string name;
+      std::string id;
       ls >> command >> name;
       return command == "@undiredgeset" && name == id;
@@ -1386,6 +1388,6 @@
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      if (!nodeIdReader->isIdReader()) {
-	throw DataFormatError("Cannot find nodeset or ID map");
+      if (!nodeLabelReader->isLabelReader()) {
+	throw DataFormatError("Cannot find nodeset or label map");
       }
       std::vector<_reader_bits::MapReaderBase<UndirEdge>* > index;
@@ -1394,4 +1396,5 @@
       getline(is, line);
       std::istringstream ls(line);	
+      std::string id;
       while (ls >> id) {
 	typename MapReaders::iterator it = readers.find(id);
@@ -1402,5 +1405,5 @@
 	  index.push_back(&skipper);
 	}
-	if (id == "id" && inverter.get() == 0) {
+	if (id == "label" || (id =="id" && inverter.get() == 0)) {
 	  inverter.reset(index.back()->getInverter());
 	  index.back() = inverter.get();
@@ -1417,6 +1420,6 @@
       while (getline(is, line)) {	
 	std::istringstream ls(line);
-	Node from = nodeIdReader->read(ls);
-	Node to = nodeIdReader->read(ls);
+	Node from = nodeLabelReader->read(ls);
+	Node to = nodeLabelReader->read(ls);
 	UndirEdge edge = graph.addEdge(from, to);
 	for (int i = 0; i < (int)index.size(); ++i) {
@@ -1428,27 +1431,27 @@
   public:
 
-    /// \brief Returns true if the edgeset can give back the edge by its id.
+    /// \brief Returns true if the edgeset can give back the edge by its label.
     ///
     /// Returns true if the edgeset can give back the undirected edge by its 
-    /// id. It is possible only if an "id" named map was read.
-    bool isIdReader() const {
+    /// id. It is possible only if an "label" named map was read.
+    bool isLabelReader() const {
       return inverter.get() != 0;
     }
 
-    /// \brief Gives back the undirected edge by its id.
+    /// \brief Gives back the undirected edge by its label.
     ///
     /// It reads an id from the stream and gives back which undirected edge 
-    /// belongs to it. It is possible only if there was read an "id" named map.
-    void readId(std::istream& is, UndirEdge& undirEdge) const {
+    /// belongs to it. It is possible only if there was read an "label" named map.
+    void readLabel(std::istream& is, UndirEdge& undirEdge) const {
       undirEdge = inverter->read(is);
     } 
 
-    /// \brief Gives back the directed edge by its id.
+    /// \brief Gives back the directed edge by its label.
     ///
     /// It reads an id from the stream and gives back which directed edge 
     /// belongs to it. The directed edge id is the \c '+' or \c '-' character
     /// and the undirected edge id. It is possible only if there was read 
-    /// an "id" named map.
-    void readId(std::istream& is, Edge& edge) const {
+    /// an "label" named map.
+    void readLabel(std::istream& is, Edge& edge) const {
       char c;
       is >> c;
@@ -1471,9 +1474,9 @@
    
     Graph& graph;   
-    std::string id;
+    std::string name;
     _reader_bits::SkipReader<UndirEdge, DefaultSkipper> skipper;
 
     std::auto_ptr<_reader_bits::MapInverterBase<UndirEdge> > inverter;
-    std::auto_ptr<_reader_bits::IdReaderBase<Node> > nodeIdReader;
+    std::auto_ptr<_reader_bits::LabelReaderBase<Node> > nodeLabelReader;
   };
 
@@ -1481,6 +1484,6 @@
   /// \brief SectionReader for reading labeled nodes.
   ///
-  /// The nodes section's header line is \c \@nodes \c nodes_id, but the
-  /// \c nodes_id may be empty.
+  /// The nodes section's header line is \c \@nodes \c nodes_name, but the
+  /// \c nodes_name may be empty.
   ///
   /// Each line in the section contains the name of the node 
@@ -1500,12 +1503,12 @@
     /// attach it into the given LemonReader. It will use the given
     /// node id reader to give back the nodes. The reader will read the 
-    /// section only if the \c _id and the \c nodes_id are the same. 
-    template <typename _IdReader>
-    NodeReader(LemonReader& _reader, const _IdReader& _idReader, 
-	       const std::string& _id = std::string()) 
-      : Parent(_reader), id(_id) {
-      checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
-      nodeIdReader.reset(new _reader_bits::
-			 IdReader<Node, _IdReader>(_idReader));
+    /// section only if the \c _name and the \c nodes_name are the same. 
+    template <typename _LabelReader>
+    NodeReader(LemonReader& _reader, const _LabelReader& _labelReader, 
+	       const std::string& _name = std::string()) 
+      : Parent(_reader), name(_name) {
+      checkConcept<_reader_bits::ItemLabelReader<Node>, _LabelReader>();
+      nodeLabelReader.reset(new _reader_bits::
+			 LabelReader<Node, _LabelReader>(_labelReader));
     }
 
@@ -1539,9 +1542,9 @@
     ///
     /// It gives back true when the header line start with \c \@nodes,
-    /// and the header line's id and the reader's id are the same.
+    /// and the header line's name and the reader's name are the same.
     virtual bool header(const std::string& line) {
       std::istringstream ls(line);
       std::string command;
-      std::string name;
+      std::string id;
       ls >> command >> name;
       return command == "@nodes" && name == id;
@@ -1552,6 +1555,6 @@
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      if (!nodeIdReader->isIdReader()) {
-	throw DataFormatError("Cannot find nodeset or ID map");
+      if (!nodeLabelReader->isLabelReader()) {
+	throw DataFormatError("Cannot find nodeset or label map");
       }
       std::string line;
@@ -1562,5 +1565,5 @@
 	typename NodeReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
-	  it->second.read(nodeIdReader->read(ls));
+	  it->second.read(nodeLabelReader->read(ls));
 	  it->second.touch();
 	}	
@@ -1578,9 +1581,9 @@
   private:
 
-    std::string id;
+    std::string name;
 
     typedef std::map<std::string, _reader_bits::ItemStore<Node> > NodeReaders;
     NodeReaders readers;
-    std::auto_ptr<_reader_bits::IdReaderBase<Node> > nodeIdReader;
+    std::auto_ptr<_reader_bits::LabelReaderBase<Node> > nodeLabelReader;
   };
 
@@ -1588,6 +1591,6 @@
   /// \brief SectionReader for reading labeled edges.
   ///
-  /// The edges section's header line is \c \@edges \c edges_id, but the
-  /// \c edges_id may be empty.
+  /// The edges section's header line is \c \@edges \c edges_name, but the
+  /// \c edges_name may be empty.
   ///
   /// Each line in the section contains the name of the edge 
@@ -1607,12 +1610,12 @@
     /// attach it into the given LemonReader. It will use the given
     /// edge id reader to give back the edges. The reader will read the 
-    /// section only if the \c _id and the \c edges_id are the same. 
-    template <typename _IdReader>
-    EdgeReader(LemonReader& _reader, const _IdReader& _idReader, 
-	       const std::string& _id = std::string()) 
-      : Parent(_reader), id(_id) {
-      checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
-      edgeIdReader.reset(new _reader_bits::
-			 IdReader<Edge, _IdReader>(_idReader));
+    /// section only if the \c _name and the \c edges_name are the same. 
+    template <typename _LabelReader>
+    EdgeReader(LemonReader& _reader, const _LabelReader& _labelReader, 
+	       const std::string& _name = std::string()) 
+      : Parent(_reader), name(_name) {
+      checkConcept<_reader_bits::ItemLabelReader<Edge>, _LabelReader>();
+      edgeLabelReader.reset(new _reader_bits::
+			 LabelReader<Edge, _LabelReader>(_labelReader));
     }
 
@@ -1645,9 +1648,9 @@
     ///
     /// It gives back true when the header line start with \c \@edges,
-    /// and the header line's id and the reader's id are the same.
+    /// and the header line's name and the reader's name are the same.
     virtual bool header(const std::string& line) {
       std::istringstream ls(line);
       std::string command;
-      std::string name;
+      std::string id;
       ls >> command >> name;
       return command == "@edges" && name == id;
@@ -1658,6 +1661,6 @@
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      if (!edgeIdReader->isIdReader()) {
-	throw DataFormatError("Cannot find edgeset or ID map");
+      if (!edgeLabelReader->isLabelReader()) {
+	throw DataFormatError("Cannot find edgeset or label map");
       }
       std::string line;
@@ -1668,5 +1671,5 @@
 	typename EdgeReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
-	  it->second.read(edgeIdReader->read(ls));
+	  it->second.read(edgeLabelReader->read(ls));
 	  it->second.touch();
 	}	
@@ -1684,9 +1687,9 @@
   private:
 
-    std::string id;
+    std::string name;
 
     typedef std::map<std::string, _reader_bits::ItemStore<Edge> > EdgeReaders;
     EdgeReaders readers;
-    std::auto_ptr<_reader_bits::IdReaderBase<Edge> > edgeIdReader;
+    std::auto_ptr<_reader_bits::LabelReaderBase<Edge> > edgeLabelReader;
   };
 
@@ -1695,5 +1698,5 @@
   ///
   /// The undirected edges section's header line is \c \@undiredges 
-  /// \c undiredges_id, but the \c undiredges_id may be empty.
+  /// \c undiredges_name, but the \c undiredges_name may be empty.
   ///
   /// Each line in the section contains the name of the undirected edge 
@@ -1714,16 +1717,16 @@
     /// attach it into the given LemonReader. It will use the given
     /// undirected edge id reader to give back the edges. The reader will 
-    /// read the section only if the \c _id and the \c undiredges_id are 
+    /// read the section only if the \c _name and the \c undiredges_name are 
     /// the same. 
-    template <typename _IdReader>
-    UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader, 
-	       const std::string& _id = std::string()) 
-      : Parent(_reader), id(_id) {
-      checkConcept<_reader_bits::ItemIdReader<UndirEdge>, _IdReader>();
-      checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
-      undirEdgeIdReader.reset(new _reader_bits::
-			      IdReader<UndirEdge, _IdReader>(_idReader));
-      edgeIdReader.reset(new _reader_bits::
-			 IdReader<Edge, _IdReader>(_idReader));
+    template <typename _LabelReader>
+    UndirEdgeReader(LemonReader& _reader, const _LabelReader& _labelReader, 
+	       const std::string& _name = std::string()) 
+      : Parent(_reader), name(_name) {
+      checkConcept<_reader_bits::ItemLabelReader<UndirEdge>, _LabelReader>();
+      checkConcept<_reader_bits::ItemLabelReader<Edge>, _LabelReader>();
+      undirEdgeLabelReader.reset(new _reader_bits::
+			      LabelReader<UndirEdge, _LabelReader>(_labelReader));
+      edgeLabelReader.reset(new _reader_bits::
+			 LabelReader<Edge, _LabelReader>(_labelReader));
     }
 
@@ -1769,9 +1772,9 @@
     ///
     /// It gives back true when the header line start with \c \@edges,
-    /// and the header line's id and the reader's id are the same.
+    /// and the header line's name and the reader's name are the same.
     virtual bool header(const std::string& line) {
       std::istringstream ls(line);
       std::string command;
-      std::string name;
+      std::string id;
       ls >> command >> name;
       return command == "@undiredges" && name == id;
@@ -1782,9 +1785,9 @@
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      if (!edgeIdReader->isIdReader()) {
-	throw DataFormatError("Cannot find undirected edgeset or ID map");
-      }
-      if (!undirEdgeIdReader->isIdReader()) {
-	throw DataFormatError("Cannot find undirected edgeset or ID map");
+      if (!edgeLabelReader->isLabelReader()) {
+	throw DataFormatError("Cannot find undirected edgeset or label map");
+      }
+      if (!undirEdgeLabelReader->isLabelReader()) {
+	throw DataFormatError("Cannot find undirected edgeset or label map");
       }
       std::string line;
@@ -1796,5 +1799,5 @@
 	  typename UndirEdgeReaders::iterator it = undirEdgeReaders.find(id);
 	  if (it != undirEdgeReaders.end()) {
-	    it->second.read(undirEdgeIdReader->read(ls));
+	    it->second.read(undirEdgeLabelReader->read(ls));
 	    it->second.touch();
 	    continue;
@@ -1803,5 +1806,5 @@
 	  typename EdgeReaders::iterator it = edgeReaders.find(id);
 	  if (it != edgeReaders.end()) {
-	    it->second.read(edgeIdReader->read(ls));
+	    it->second.read(edgeLabelReader->read(ls));
 	    it->second.touch();
 	    continue;
@@ -1829,14 +1832,14 @@
   private:
 
-    std::string id;
+    std::string name;
 
     typedef std::map<std::string, 
 		     _reader_bits::ItemStore<UndirEdge> > UndirEdgeReaders;
     UndirEdgeReaders undirEdgeReaders;
-    std::auto_ptr<_reader_bits::IdReaderBase<UndirEdge> > undirEdgeIdReader;
+    std::auto_ptr<_reader_bits::LabelReaderBase<UndirEdge> > undirEdgeLabelReader;
 
     typedef std::map<std::string, _reader_bits::ItemStore<Edge> > EdgeReaders;
     EdgeReaders edgeReaders;
-    std::auto_ptr<_reader_bits::IdReaderBase<Edge> > edgeIdReader;
+    std::auto_ptr<_reader_bits::LabelReaderBase<Edge> > edgeLabelReader;
   };
 
@@ -1845,6 +1848,6 @@
   ///
   /// The lemon format can store multiple attribute set. Each set has
-  /// the header line \c \@attributes \c attributeset_id, but the 
-  /// attributeset_id may be empty.
+  /// the header line \c \@attributes \c attributeset_name, but the 
+  /// attributeset_name may be empty.
   ///
   /// The attributeset section contains several lines. Each of them starts
@@ -1861,8 +1864,8 @@
     /// Constructor for AttributeReader. It creates the AttributeReader and
     /// attach it into the given LemonReader. The reader process a section
-    /// only if the \c section_id and the \c _id are the same.
+    /// only if the \c section_name and the \c _name are the same.
     AttributeReader(LemonReader& _reader, 
-		    const std::string& _id = std::string()) 
-      : Parent(_reader), id(_id) {}
+		    const std::string& _name = std::string()) 
+      : Parent(_reader), name(_name) {}
 
     /// \brief Destructor.
@@ -1917,5 +1920,5 @@
       std::istringstream ls(line);
       std::string command;
-      std::string name;
+      std::string id;
       ls >> command >> name;
       return command == "@attributes" && name == id;
@@ -1934,5 +1937,5 @@
 	if (it != readers.end()) {
 	  it->second->read(ls);
-	  it->second->touch();
+ 	  it->second->touch();
 	}
       }
@@ -1948,5 +1951,5 @@
 
   private:
-    std::string id;
+    std::string name;
 
     typedef std::map<std::string, _reader_bits::ValueReaderBase*> Readers;
@@ -2204,9 +2207,9 @@
 
     void readMapNames(std::istream& is, std::vector<std::string>& maps) {
-      std::string line, id;
+      std::string line, name;
       std::getline(is, line);
       std::istringstream ls(line);
-      while (ls >> id) {
-	maps.push_back(id);
+      while (ls >> name) {
+	maps.push_back(name);
       }
       while (getline(is, line));
@@ -2214,9 +2217,9 @@
 
     void readItemNames(std::istream& is, std::vector<std::string>& maps) {
-      std::string line, id;
+      std::string line, name;
       while (std::getline(is, line)) {
 	std::istringstream ls(line);
-	ls >> id;
-	maps.push_back(id);
+	ls >> name;
+	maps.push_back(name);
       }
     }
