Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.cpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.cpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -47,9 +47,12 @@
 
 
-GLMoleculeObject::GLMoleculeObject(QGLSceneNode *mesh, QObject *parent)
+double GLMoleculeObject::detailMinDistance[GLMoleculeObject::DETAILTYPES_MAX] = {0, 15, 30, 42};
+
+GLMoleculeObject::GLMoleculeObject(QGLSceneNode *mesh[], QObject *parent)
    : QObject(parent)
 {
    //mesh->setParent(this);
-   m_mesh = mesh;
+   for (int i=0;i<DETAILTYPES_MAX;i++)
+     m_mesh[i] = mesh[i];
    m_scale = 1.0f;
    m_scaleZ = 1.0f;
@@ -67,5 +70,7 @@
 {
    scene->setParent(this);
-   m_mesh = scene->mainNode();
+   m_mesh[0] = scene->mainNode();
+   m_mesh[1] = scene->mainNode();
+   m_mesh[2] = scene->mainNode();
    m_scale = 1.0f;
    m_scaleZ = 1.0f;
@@ -118,5 +123,5 @@
 }
 
-void GLMoleculeObject::draw(QGLPainter *painter)
+void GLMoleculeObject::draw(QGLPainter *painter, const QVector4D &cameraPlane)
 {
    // Position the model at its designated position, scale, and orientation.
@@ -154,5 +159,15 @@
 
    // Draw the geometry mesh.
-   m_mesh->draw(painter);
+   QVector4D pos4d(m_position, -1);
+   qreal distance = QVector4D::dotProduct(cameraPlane, pos4d);
+
+   if (distance > detailMinDistance[DETAIL_LOW])
+     m_mesh[DETAIL_LOW]->draw(painter);
+   else if (distance > detailMinDistance[DETAIL_MEDIUM])
+     m_mesh[DETAIL_MEDIUM]->draw(painter);
+   else if (distance > detailMinDistance[DETAIL_HIGH])
+     m_mesh[DETAIL_HIGH]->draw(painter);
+   else if (distance > detailMinDistance[DETAIL_HIGHEST])
+     m_mesh[DETAIL_HIGHEST]->draw(painter);
 
    // Draw a box around the mesh, if selected.
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -37,5 +37,5 @@
    friend class GLWorldScene;
 public:
-   explicit GLMoleculeObject(QGLSceneNode *mesh, QObject *parent=0);
+   explicit GLMoleculeObject(QGLSceneNode *mesh[], QObject *parent=0);
    explicit GLMoleculeObject(QGLAbstractScene *scene, QObject *parent=0);
    virtual ~GLMoleculeObject();
@@ -70,5 +70,5 @@
    void initStaticMaterials();
    void initialize(QGLView *view, QGLPainter *painter);
-   void draw(QGLPainter *painter);
+   void draw(QGLPainter *painter, const QVector4D &cameraPlane);
    void drawSelectionBox(QGLPainter *painter);
 
@@ -91,7 +91,12 @@
    static ElementMaterialMap ElementNoMaterialMap;
 
+public:
+   enum{DETAIL_HIGHEST, DETAIL_HIGH, DETAIL_MEDIUM, DETAIL_LOW, DETAILTYPES_MAX} DetailType;
+
 private:
 
-   QGLSceneNode *m_mesh;
+   static double detailMinDistance[DETAILTYPES_MAX];
+
+   QGLSceneNode *m_mesh[DETAILTYPES_MAX];
    QGLAbstractScene *m_scene;
    QVector3D m_position;
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -36,5 +36,5 @@
 #include "World.hpp"
 
-GLMoleculeObject_atom::GLMoleculeObject_atom(QGLSceneNode *mesh, QObject *parent, const atom *atomref) :
+GLMoleculeObject_atom::GLMoleculeObject_atom(QGLSceneNode *mesh[], QObject *parent, const atom *atomref) :
   GLMoleculeObject(mesh, parent),
   Observer(std::string("GLMoleculeObject_atom")+toString(atomref->getId())),
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -27,5 +27,5 @@
   Q_OBJECT
 public:
-  GLMoleculeObject_atom(QGLSceneNode *mesh, QObject *parent, const atom *atomref);
+  GLMoleculeObject_atom(QGLSceneNode *mesh[], QObject *parent, const atom *atomref);
   virtual ~GLMoleculeObject_atom();
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -37,5 +37,5 @@
 #include "LinearAlgebra/Vector.hpp"
 
-GLMoleculeObject_bond::GLMoleculeObject_bond(QGLSceneNode *mesh, QObject *parent, const bond *bondref, const enum SideOfBond side) :
+GLMoleculeObject_bond::GLMoleculeObject_bond(QGLSceneNode *mesh[], QObject *parent, const bond *bondref, const enum SideOfBond side) :
   GLMoleculeObject(mesh, parent),
   Observer(std::string("GLMoleculeObject_bond")
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -28,5 +28,5 @@
   enum SideOfBond { left, right };
 
-  GLMoleculeObject_bond(QGLSceneNode *mesh, QObject *parent, const bond *bondref, const enum SideOfBond side);
+  GLMoleculeObject_bond(QGLSceneNode *mesh[], QObject *parent, const bond *bondref, const enum SideOfBond side);
   virtual ~GLMoleculeObject_bond();
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -39,5 +39,5 @@
 #include "World.hpp"
 
-GLMoleculeObject_molecule::GLMoleculeObject_molecule(QGLSceneNode *mesh, QObject *parent, const molecule *molref) :
+GLMoleculeObject_molecule::GLMoleculeObject_molecule(QGLSceneNode *mesh[], QObject *parent, const molecule *molref) :
   GLMoleculeObject(mesh, parent),
   Observer(std::string("GLMoleculeObject_molecule")+toString(molref->getId())),
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -28,5 +28,5 @@
   Q_OBJECT
 public:
-  GLMoleculeObject_molecule(QGLSceneNode *mesh, QObject *parent, const molecule *molref);
+  GLMoleculeObject_molecule(QGLSceneNode *mesh[], QObject *parent, const molecule *molref);
   virtual ~GLMoleculeObject_molecule();
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -61,23 +61,18 @@
      hoverAtom(NULL)
 {
-  QGLBuilder builder0;
-  meshEmpty = builder0.finalizedSceneNode();
-  QGLBuilder builder1;
-  builder1 << QGLSphere(2.0, 5);
-  meshSphereHi = builder1.finalizedSceneNode();
-  QGLBuilder builder2;
-  builder2 << QGLSphere(2.0, 1);
-  meshSphereLo = builder2.finalizedSceneNode();
-  QGLBuilder builder3;
-  builder3 << QGLCylinder(.25,.25,1.0,16);
-  meshCylinderHi = builder3.finalizedSceneNode();
-  QGLBuilder builder4;
-  builder4 << QGLCylinder(.25,.25,1.0,16);
-  meshCylinderLo = builder4.finalizedSceneNode();
-
-  meshSphereHi->setOption(QGLSceneNode::CullBoundingBox, true);
-  meshSphereLo->setOption(QGLSceneNode::CullBoundingBox, true);
-  meshCylinderHi->setOption(QGLSceneNode::CullBoundingBox, true);
-  meshCylinderLo->setOption(QGLSceneNode::CullBoundingBox, true);
+  int sphereDetails[] = {5, 3, 2, 0};
+  int cylinderDetails[] = {16, 8, 6, 3};
+  for (int i=0;i<GLMoleculeObject::DETAILTYPES_MAX;i++){
+    QGLBuilder emptyBuilder;
+    meshEmpty[i] = emptyBuilder.finalizedSceneNode();
+    QGLBuilder sphereBuilder;
+    sphereBuilder << QGLSphere(2.0, sphereDetails[i]);
+    meshSphere[i] = sphereBuilder.finalizedSceneNode();
+    meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true);
+    QGLBuilder cylinderBuilder;
+    cylinderBuilder << QGLCylinder(.25,.25,1.0,cylinderDetails[i]);
+    meshCylinder[i] = cylinderBuilder.finalizedSceneNode();
+    meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true);
+  }
 
   setSelectionMode(SelectAtom);
@@ -132,5 +127,5 @@
 {
   LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_atom->getId())+".");
-  GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(meshSphereHi, this, _atom);
+  GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(meshSphere, this, _atom);
   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_atom->getId());
   ASSERT(iter == AtomsinSceneMap.end(),
@@ -252,5 +247,5 @@
 #endif
   GLMoleculeObject_bond *bondObject =
-      new GLMoleculeObject_bond(meshCylinderHi, this, _bond, side);
+      new GLMoleculeObject_bond(meshCylinder, this, _bond, side);
   connect (
       bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
@@ -295,5 +290,5 @@
 }
 
-void GLWorldScene::draw(QGLPainter *painter) const
+void GLWorldScene::draw(QGLPainter *painter, const QVector4D &cameraPlane) const
 {
    // Draw all of the mesh objects that we have as children.
@@ -301,5 +296,5 @@
      GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
        if (meshobj)
-         meshobj->draw(painter);
+         meshobj->draw(painter, cameraPlane);
    }
 }
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -55,5 +55,5 @@
 
   void initialize(QGLView *view, QGLPainter *painter) const;
-  void draw(QGLPainter *painter) const;
+  void draw(QGLPainter *painter, const QVector4D &cameraPlane) const;
 
   enum SelectionModeType{
@@ -100,9 +100,7 @@
   MoleculeNodeMap MoleculesinSceneMap;
 
-  QGLSceneNode *meshEmpty;
-  QGLSceneNode *meshSphereHi;
-  QGLSceneNode *meshSphereLo;
-  QGLSceneNode *meshCylinderHi;
-  QGLSceneNode *meshCylinderLo;
+  QGLSceneNode *meshEmpty[GLMoleculeObject::DETAILTYPES_MAX];
+  QGLSceneNode *meshSphere[GLMoleculeObject::DETAILTYPES_MAX];
+  QGLSceneNode *meshCylinder[GLMoleculeObject::DETAILTYPES_MAX];
 
   SelectionModeType selectionMode;
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision b7b7529e093f7e052cf8a0bfdc71df38ce36f36d)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 72a4c1dda0b76cb7b68789163463b8e8a1582f81)
@@ -369,5 +369,9 @@
     changesPresent = false;
   }
-  worldscene->draw(painter);
+
+  QVector3D cameraDir = camera()->center() - camera()->eye();
+  cameraDir.normalize();
+  QVector4D cameraPlane(cameraDir, QVector3D::dotProduct(cameraDir, camera()->eye()));
+  worldscene->draw(painter, cameraPlane);
 
   drawDreiBein(painter);
