diff --git a/src/node.cpp b/src/node.cpp
new file mode 100644
--- /dev/null
+++ b/src/node.cpp
@@ -0,0 +1,225 @@
+/*
+ *
+ * This file is part of the Virtual Leaf.
+ *
+ * The Virtual Leaf is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Virtual Leaf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Virtual Leaf. If not, see .
+ *
+ * Copyright 2010 Roeland Merks.
+ *
+ */
+
+#include
+#include
+#ifdef QTGRAPHICS
+#include
+#include
+#endif
+#include "node.h"
+#include "cell.h"
+#include "mesh.h"
+#include "random.h"
+#include "parameter.h"
+#include "sqr.h"
+#include "pi.h"
+#include "warning.h"
+
+static const std::string _module_id("$Id$");
+
+extern Parameter par;
+
+int Node::nnodes=0;
+double Node::target_length=1;
+
+ostream &Edge::print(ostream &os) const {
+ return os << "{ " << first->Index() << ", " << second->Index() << " }";
+}
+
+ostream &Neighbor::print(ostream &os) const {
+
+ os << " {" << cell->Index() << " " << nb1->Index() << " " << nb2->Index() << "}";
+ return os;
+
+}
+
+ostream &operator<<(ostream &os, const Neighbor &n) {
+ n.print(os);
+ return os;
+}
+
+
+Node::Node(void) : Vector() {
+
+ index=(nnodes++);
+ node_set =0;
+ fixed=false;
+ boundary=false;
+ sam=false;
+ dead=false;
+}
+
+Node::Node(int ind) : Vector() {
+ node_set =0;
+ index=ind;
+ fixed=false;
+ boundary=false;
+ sam=false;
+ dead=false;
+}
+
+Node::Node(const Vector &src) : Vector(src) {
+
+ node_set = 0;
+ index=(nnodes++);
+ fixed=false;
+ boundary=false;
+ sam=false;
+ dead = false;
+}
+
+Node::Node(double x,double y, double z) : Vector (x,y,z) {
+
+ node_set = 0;
+ index=(nnodes++);
+ fixed=false;
+ boundary=false;
+ sam=false;
+ dead = false;
+}
+
+Node::Node(const Node &src) : Vector(src) {
+
+ node_set=0;
+ owners=src.owners;
+ m=src.m;
+ index=src.index;
+ fixed = src.fixed;
+ boundary = src.boundary;
+ sam=src.sam;
+ dead = src.dead;
+}
+
+
+Cell &Node::getCell(const Neighbor &i) {
+ return *i.getCell(); // use accessor!
+}
+
+
+ostream &Node::print(ostream &os) const {
+
+ if (!dead)
+ os << "Node ";
+ else
+ os << "DEAD NODE ";
+
+ os << index << "[ {" << x << ", " << y << ", " << z << "}: {";
+
+ os << "Neighbors = { ";
+
+ for (list::const_iterator i = owners.begin(); i!=owners.end(); i++) {
+ os << " {" << i->cell->Index() << " " << i->nb1->Index() << " " << i->nb2->Index() << "} ";
+ }
+ os << " } " << endl;
+
+ return os;
+
+}
+
+
+#ifdef QTGRAPHICS
+void Node::DrawIndex(QGraphicsScene *c) const {
+
+ //return DrawOwners(c);
+ stringstream text;
+ text << index;
+ QGraphicsSimpleTextItem *number = new QGraphicsSimpleTextItem ( QString (text.str().c_str()), 0, c );
+ number->setFont( QFont( "Helvetica", par.nodenumsize, QFont::Bold) );
+ number->setPen( QPen (par.textcolor) );
+ number->setZValue(20);
+ number->show();
+ Vector offs=Cell::Offset();
+ number -> setPos(
+ ((offs.x+x)*Cell::Factor()),
+ ((offs.y+y)*Cell::Factor()) );
+}
+
+void Node::DrawOwners(QGraphicsScene *c) const {
+
+ stringstream text;
+
+
+
+ text << owners.size();
+
+
+ QGraphicsSimpleTextItem *number = new QGraphicsSimpleTextItem ( QString (text.str().c_str()), 0, c );
+ number->setFont( QFont( "Helvetica", par.nodenumsize, QFont::Bold) );
+ number->setPen( QPen(par.textcolor) );
+ number->setZValue(20);
+ number->show();
+ Vector offs=Cell::Offset();
+
+ number ->setPos(((offs.x+x)*Cell::Factor()),
+ ((offs.y+y)*Cell::Factor()) );
+}
+
+
+
+QVector Node::NeighbourAngles(void) {
+
+ QVector angles;
+ for (list::iterator i=owners.begin();
+ i!=owners.end();
+ i++) {
+
+ Vector v1 = (*this - *i->nb1).Normalised();
+ Vector v2 = (*this - *i->nb2).Normalised();
+
+ //angles.push_back(atan2(v2.y,v2.x)-atan2(v1.y,v1.x));
+ //angles.push_back(atan2(v2.y,v2.x)-atan2(v1.y,v1.x));
+ double angle = v1.SignedAngle(v2);
+ if (angle<0) {
+ //cerr << "Changing sign of angle " << angle << endl;
+ angle = angle + 2*Pi;
+ }
+ angles.push_back(angle);
+
+ //cerr << "Cell " << i->cell->Index() << ": " << v1 << " and " << v2 << ": angle = " << angles.back() << ", " << v1.Angle(v2) << endl;
+
+ }
+
+ double sum=0.;
+ for (QVector::iterator i=angles.begin();
+ i!=angles.end();
+ i++) {
+ sum+=*i;
+ }
+ //cerr << "Angle sum = " << sum << endl;
+ // Check if the summed angle is different from 2 Pi
+ if (fabs(sum-(2*Pi))>0.0001) {
+
+ MyWarning::warning("sum = %f",sum);
+ }
+ return angles;
+}
+
+
+
+#endif
+
+
+ostream &operator<<(ostream &os, const Node &n) {
+ n.print(os);
+ return os;
+}
+