Index: src/UIElements/CommandLineUI/CommandLineDialog.hpp
===================================================================
--- src/UIElements/CommandLineUI/CommandLineDialog.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/CommandLineUI/CommandLineDialog.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -48,4 +48,7 @@
   #include <boost/preprocessor/facilities/empty.hpp>
 
+  virtual void queryVector(Parameter<Vector> &, const std::string ="", const std::string = "");
+  virtual void queryVectors(Parameter< std::vector<Vector> > &, const std::string ="", const std::string = "");
+
   // iterate over all parameter query types for query declarations
   #if defined GLOBALLISTOFPARAMETERQUERIES_Token && defined GLOBALLISTOFPARAMETERQUERIES_Type
@@ -57,4 +60,7 @@
   #undef SUFFIX
   #endif
+
+  class VectorCommandLineQuery;
+  class VectorsCommandLineQuery;
 
   // iterate over all parameter query types for forward declarations
Index: src/UIElements/CommandLineUI/CommandLineParser.cpp
===================================================================
--- src/UIElements/CommandLineUI/CommandLineParser.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/CommandLineUI/CommandLineParser.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -75,4 +75,5 @@
   shape("shape options"),
   fragmentation("Fragmentation options"),
+  geometry("Geometry options"),
   graph("Graph options"),
   molecule("Molecule options"),
@@ -93,4 +94,5 @@
   CmdParserLookup["shape"] = &shape;
   CmdParserLookup["fragmentation"] = &fragmentation;
+  CmdParserLookup["geometry"] = &geometry;
   CmdParserLookup["graph"] = &graph;
   CmdParserLookup["options"] = &options;
Index: src/UIElements/CommandLineUI/CommandLineParser.hpp
===================================================================
--- src/UIElements/CommandLineUI/CommandLineParser.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/CommandLineUI/CommandLineParser.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -62,4 +62,5 @@
   po::options_description shape;
   po::options_description fragmentation;
+  po::options_description geometry;
   po::options_description graph;
   po::options_description molecule;
Index: src/UIElements/CommandLineUI/CommandLineParser_validate.cpp
===================================================================
--- src/UIElements/CommandLineUI/CommandLineParser_validate.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/CommandLineUI/CommandLineParser_validate.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -66,4 +66,26 @@
         std::string("value"),
         std::string("VectorValue")
+    );
+#endif
+  }
+  VV.vectorstring = values.at(0);
+  v = boost::any(VectorValue(VV));
+}
+
+void validate(boost::any& v, const std::vector<std::string>& values, RealSpaceMatrixValue *, int)
+{
+  RealSpaceMatrixValue RSMV;
+  std::vector<std::string> components;
+
+  // split comma-separated values
+  if (values.size() != 1) {
+    std::cerr <<  "Not one vector but " << values.size() << " given " << std::endl;
+#if BOOST_VERSION < 104200
+    throw boost::program_options::validation_error("Unequal to one vector given");
+#else
+    throw boost::program_options::validation_error(
+        boost::program_options::validation_error::invalid_option_value,
+        std::string("value"),
+        std::string("BoxValue")
     );
 #endif
@@ -83,53 +105,4 @@
   components.push_back(std::string(Biter,argument.end()));
 
-  if (components.size() != 3) {
-    std::cerr <<  "Specified vector does not have three components but " << components.size() << std::endl;
-#if BOOST_VERSION < 104200
-    throw boost::program_options::validation_error("Specified vector does not have three components");
-#else
-    throw boost::program_options::validation_error(
-        boost::program_options::validation_error::invalid_option_value,
-        std::string("value"),
-        std::string("VectorValue")
-    );
-#endif
-  }
-  for (size_t i=0;i<NDIM;++i)
-    VV.vector[i] = boost::lexical_cast<double>(components.at(i));
-  v = boost::any(VectorValue(VV));
-}
-
-void validate(boost::any& v, const std::vector<std::string>& values, RealSpaceMatrixValue *, int)
-{
-  RealSpaceMatrixValue RSMV;
-  std::vector<std::string> components;
-
-  // split comma-separated values
-  if (values.size() != 1) {
-    std::cerr <<  "Not one vector but " << values.size() << " given " << std::endl;
-#if BOOST_VERSION < 104200
-    throw boost::program_options::validation_error("Unequal to one vector given");
-#else
-    throw boost::program_options::validation_error(
-        boost::program_options::validation_error::invalid_option_value,
-        std::string("value"),
-        std::string("BoxValue")
-    );
-#endif
-  }
-  std::string argument(values.at(0));
-  std::string::iterator Aiter = argument.begin();
-  std::string::iterator Biter = argument.begin();
-  for (; Aiter != argument.end(); ++Aiter) {
-    if (*Aiter == ',') {
-      components.push_back(std::string(Biter,Aiter));
-      do {
-        Aiter++;
-      } while (*Aiter == ' ' || *Aiter == '\t');
-      Biter = Aiter;
-    }
-  }
-  components.push_back(std::string(Biter,argument.end()));
-
   if (components.size() != 6) {
     std::cerr <<  "Specified vector does not have three components but " << components.size() << std::endl;
Index: src/UIElements/CommandLineUI/Query/CommandLineQuery.hpp
===================================================================
--- src/UIElements/CommandLineUI/Query/CommandLineQuery.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/CommandLineUI/Query/CommandLineQuery.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -24,4 +24,18 @@
 };
 
+class CommandLineDialog::VectorCommandLineQuery : public Dialog::TQuery<Vector> {
+public:
+  VectorCommandLineQuery(Parameter<Vector> &_param, const std::string &_title, const std::string &_description = "");
+  virtual ~VectorCommandLineQuery();
+  virtual bool handle();
+};
+
+class CommandLineDialog::VectorsCommandLineQuery : public Dialog::TQuery< std::vector<Vector> > {
+public:
+  VectorsCommandLineQuery(Parameter< std::vector<Vector> > &_param, const std::string &_title, const std::string &_description = "");
+  virtual ~VectorsCommandLineQuery();
+  virtual bool handle();
+};
+
   /** With the following boost::preprocessor code we generate forward declarations
    * of query class for all desired query types in the Qt specialization class of
Index: src/UIElements/CommandLineUI/Query/VectorCommandLineQuery.cpp
===================================================================
--- src/UIElements/CommandLineUI/Query/VectorCommandLineQuery.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/CommandLineUI/Query/VectorCommandLineQuery.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -53,14 +53,8 @@
 
 bool CommandLineDialog::VectorCommandLineQuery::handle() {
-  VectorValue _temp;
+  VectorValue temporary;
   if (CommandLineParser::getInstance().vm.count(getTitle())) {
-    try {
-      _temp = CommandLineParser::getInstance().vm[getTitle()].as< VectorValue >();
-    } catch(boost::bad_any_cast &e) {
-      for (size_t i=0;i<NDIM;++i)
-        _temp.vector[i] = 0.;
-      return false;
-    }
-    temp = _temp.toVector();
+    temporary = CommandLineParser::getInstance().vm[getTitle()].as< VectorValue >();
+    temp = temporary.vectorstring;
     return true;
   }
Index: src/UIElements/CommandLineUI/Query/VectorsCommandLineQuery.cpp
===================================================================
--- src/UIElements/CommandLineUI/Query/VectorsCommandLineQuery.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/CommandLineUI/Query/VectorsCommandLineQuery.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -46,5 +46,5 @@
 
 CommandLineDialog::VectorsCommandLineQuery::VectorsCommandLineQuery(Parameter<std::vector<Vector> > &_param, const std::string &_title, const std::string &_description) :
-    Dialog::TQuery<std::vector<Vector> >(_param, _title, _description)
+    Dialog::TQuery< std::vector<Vector> >(_param, _title, _description)
 {}
 
@@ -53,16 +53,8 @@
 
 bool CommandLineDialog::VectorsCommandLineQuery::handle() {
-  std::vector<VectorValue> temporary;
+  std::vector<std::string> temporary;
+  std::stringstream output;
   if (CommandLineParser::getInstance().vm.count(getTitle())) {
-    try {
-      temporary = CommandLineParser::getInstance().vm[getTitle()].as< std::vector<VectorValue> >();
-    } catch(boost::bad_any_cast &e) {
-      temporary.clear();
-      return false;
-    }
-    for(std::vector<VectorValue>::iterator iter = temporary.begin(); iter != temporary.end(); ++iter) {
-      Vector temp_element = (*iter).toVector();
-      temp.push_back(temp_element);
-    }
+    temp = CommandLineParser::getInstance().vm[getTitle()].as< std::vector<std::string> >();
     return true;
   }
Index: src/UIElements/Dialog.cpp
===================================================================
--- src/UIElements/Dialog.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Dialog.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -134,4 +134,32 @@
   queryEmpty(param, title, description);
 }*/
+template <>
+void Dialog::query<Vector>(Parameter<Vector> &param, const std::string title, const std::string description)
+{
+  queryVector(param, title, description);
+}
+template <>
+void Dialog::query< std::vector<Vector> >(Parameter< std::vector<Vector> > &param, const std::string title, const std::string description)
+{
+  queryVectors(param, title, description);
+}
+
+static const std::string concatenateStrings(const std::vector<std::string> &_strings)
+{
+  std::stringstream output;
+  for (std::vector<std::string>::const_iterator iter = _strings.begin();
+      iter != _strings.end(); ++iter)
+    output << *iter << " ";
+  return output.str();
+}
+
+bool Dialog::TQuery< std::vector<Vector> >::isValid()
+{
+  return param.isValidAsString(concatenateStrings(temp));
+}
+void Dialog::TQuery< std::vector<Vector> >::setResult()
+{
+  param.setAsString(concatenateStrings(temp));
+}
 
 /** With the following boost::preprocessor code we generate template
Index: src/UIElements/Dialog.hpp
===================================================================
--- src/UIElements/Dialog.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Dialog.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -158,4 +158,7 @@
   virtual void queryEmpty(const std::string ="", const std::string = "")=0;
 
+  virtual void queryVector(Parameter<Vector> &, const std::string ="", const std::string = "")=0;
+  virtual void queryVectors(Parameter< std::vector<Vector> > &, const std::string ="", const std::string = "")=0;
+
   /** With the following boost::preprocessor code we generate virtual function
    * definitions for all desired query types in the abstract class Dialog.
@@ -250,5 +253,4 @@
   };
 
-
   template<class T>
   class TQuery : public Query {
@@ -282,3 +284,45 @@
 };
 
+// we have specialization of Vector to allow internal storing as string
+template <>
+void Dialog::query<Vector>(Parameter<Vector> &, const std::string, const std::string);
+template <>
+void Dialog::query< std::vector<Vector> >(Parameter< std::vector<Vector> > &, const std::string, const std::string);
+
+/** Template specialization for Query<Vector> to allow internal storing of a
+ * string instead of a Vector.
+ *
+ * Because we need to evaluate the string as a possible GeometryRegistry key
+ * and we may do this only when the Action (whose options we are querying)
+ * is executed, not before.
+ */
+template <>
+class Dialog::TQuery<Vector> : public Query {
+public:
+  TQuery(Parameter<Vector> &_param, const std::string title, const std::string _description = "") :
+    Query(title, _description), param(_param) {}
+  virtual ~TQuery(){}
+  virtual bool handle()=0;
+  virtual bool isValid(){ return param.isValidAsString(temp);  }
+  virtual void setResult(){ param.setAsString(temp);  }
+protected:
+  std::string temp;
+  Parameter<Vector> &param;
+};
+
+template <>
+class Dialog::TQuery< std::vector<Vector> > : public Query {
+public:
+  TQuery(Parameter< std::vector<Vector> > &_param, const std::string title, const std::string _description = "") :
+    Query(title, _description), param(_param) {}
+  virtual ~TQuery(){}
+  virtual bool handle()=0;
+  virtual bool isValid();
+  virtual void setResult();
+protected:
+  std::vector<std::string> temp;
+  Parameter< std::vector<Vector> > &param;
+};
+
+
 #endif /* DIALOG_HPP_ */
Index: src/UIElements/GlobalListOfParameterQueries.hpp
===================================================================
--- src/UIElements/GlobalListOfParameterQueries.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/GlobalListOfParameterQueries.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -28,6 +28,4 @@
 	(Molecule) \
 	(Molecules) \
-	(Vector) \
-	(Vectors) \
 	(RealSpaceMatrix) \
 	(Element) \
@@ -52,6 +50,4 @@
 	(const molecule *) \
 	(std::vector<const molecule *> ) \
-	(Vector) \
-	(std::vector<Vector> ) \
 	(RealSpaceMatrix) \
 	(const element *) \
Index: src/UIElements/Makefile.am
===================================================================
--- src/UIElements/Makefile.am	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Makefile.am	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -190,4 +190,5 @@
   UIElements/Menu/Qt4/QtMenuPipe.cpp \
   UIElements/Views/Qt4/QtFragmentList.cpp \
+  UIElements/Views/Qt4/QtGeometryList.cpp \
   UIElements/Views/Qt4/QtHomologyList.cpp \
   UIElements/Views/Qt4/QtInfoBox.cpp \
@@ -225,4 +226,5 @@
   UIElements/Views/Qt4/MoleculeList/QtObservedMoleculeObserver.hpp \
   UIElements/Views/Qt4/QtFragmentList.hpp \
+  UIElements/Views/Qt4/QtGeometryList.hpp \
   UIElements/Views/Qt4/QtHomologyList.hpp \
   UIElements/Views/Qt4/QtInfoBox.hpp \
@@ -308,4 +310,5 @@
 	libMolecuilderParser.la \
 	libMolecuilderParameters.la \
+	libMolecuilderGeometry.la \
 	libMolecuilderShapes.la \
 	libMolecuilderLinkedCell.la \
Index: src/UIElements/Menu/MenuDescription.cpp
===================================================================
--- src/UIElements/Menu/MenuDescription.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Menu/MenuDescription.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -61,15 +61,16 @@
   // put each menu into its place, "" means top level
   MenuPositionMap->insert(std::make_pair("analysis",TopPosition("tools",1)));
-  MenuPositionMap->insert(std::make_pair("atom",TopPosition("edit",1)));
-  MenuPositionMap->insert(std::make_pair("bond",TopPosition("edit",2)));
+  MenuPositionMap->insert(std::make_pair("atom",TopPosition("edit",2)));
+  MenuPositionMap->insert(std::make_pair("bond",TopPosition("edit",3)));
   MenuPositionMap->insert(std::make_pair("command",TopPosition("",3)));
   MenuPositionMap->insert(std::make_pair("edit",TopPosition("",2)));
   MenuPositionMap->insert(std::make_pair("fill",TopPosition("tools",5)));
   MenuPositionMap->insert(std::make_pair("fragmentation",TopPosition("tools",3)));
+  MenuPositionMap->insert(std::make_pair("geometry",TopPosition("edit",5)));
   MenuPositionMap->insert(std::make_pair("graph",TopPosition("tools",4)));
-  MenuPositionMap->insert(std::make_pair("molecule",TopPosition("edit",3)));
+  MenuPositionMap->insert(std::make_pair("molecule",TopPosition("edit",4)));
   MenuPositionMap->insert(std::make_pair("potential",TopPosition("tools",7)));
-  MenuPositionMap->insert(std::make_pair("parser",TopPosition("edit",4)));
-  MenuPositionMap->insert(std::make_pair("selection",TopPosition("edit",5)));
+  MenuPositionMap->insert(std::make_pair("parser",TopPosition("edit",6)));
+  MenuPositionMap->insert(std::make_pair("selection",TopPosition("edit",1)));
   MenuPositionMap->insert(std::make_pair("tesselation",TopPosition("tools",2)));
   MenuPositionMap->insert(std::make_pair("shape",TopPosition("tools",6)));
@@ -85,4 +86,5 @@
   MenuDescriptionsMap->insert(std::make_pair("fill","Fill"));
   MenuDescriptionsMap->insert(std::make_pair("fragmentation","Fragmentation"));
+  MenuDescriptionsMap->insert(std::make_pair("geometry","Geometry"));
   MenuDescriptionsMap->insert(std::make_pair("graph","Graph"));
   MenuDescriptionsMap->insert(std::make_pair("molecule","Parse files into system"));
@@ -103,4 +105,5 @@
   MenuNameMap->insert(std::make_pair("fill","Fill"));
   MenuNameMap->insert(std::make_pair("fragmentation","Fragmentation"));
+  MenuNameMap->insert(std::make_pair("geometry","Geometry"));
   MenuNameMap->insert(std::make_pair("graph","Graph"));
   MenuNameMap->insert(std::make_pair("molecule","Molecules"));
Index: src/UIElements/Qt4/QtDialog.hpp
===================================================================
--- src/UIElements/Qt4/QtDialog.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Qt4/QtDialog.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -36,4 +36,7 @@
   virtual void queryEmpty(const std::string ="", const std::string = "");
 
+  virtual void queryVector(Parameter<Vector> &, const std::string ="", const std::string = "");
+  virtual void queryVectors(Parameter< std::vector<Vector> > &, const std::string ="", const std::string = "");
+
   /** With the following boost::preprocessor code we generate virtual function
    * definitions for all desired query types in the abstract class Dialog.
@@ -64,4 +67,7 @@
 
   class EmptyQtQuery;
+
+  class VectorQtQuery;
+  class VectorsQtQuery;
 
   /** With the following boost::preprocessor code we generate forward declarations
Index: src/UIElements/Qt4/QtMainWindow.cpp
===================================================================
--- src/UIElements/Qt4/QtMainWindow.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Qt4/QtMainWindow.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -59,4 +59,5 @@
 #include "Views/Qt4/QtHomologyList.hpp"
 #include "UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp"
+#include "Views/Qt4/QtGeometryList.hpp"
 #include "Views/Qt4/QtLogBox.hpp"
 #include "Views/Qt4/QtShapeController.hpp"
@@ -112,4 +113,5 @@
   homologyList = new QtHomologyList(worldTab);
   fragmentList = new QtFragmentList(worldTab);
+  geometryList = new QtGeometryList(worldTab);
   logBox = new QtLogBox(std::cout, worldTab);
   errorlogBox = new QtLogBox(std::cerr, worldTab);
@@ -147,4 +149,5 @@
   worldTab->addTab(fragmentList, "All Fragments");
   worldTab->addTab(homologyList, "All Homologies");
+  worldTab->addTab(geometryList, "All Geometries");
   worldTab->addTab(logBox, "Log");
   worldTab->addTab(errorlogBox, "Errors");
Index: src/UIElements/Qt4/QtMainWindow.hpp
===================================================================
--- src/UIElements/Qt4/QtMainWindow.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Qt4/QtMainWindow.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -27,4 +27,5 @@
 class QtElementList;
 class QtFragmentList;
+class QtGeometryList;
 class QtHomologyList;
 class QtLogBox;
@@ -60,4 +61,5 @@
   QtMoleculeList *moleculeList;
   QtElementList *elementList;
+  QtGeometryList *geometryList;
   QtHomologyList *homologyList;
   QtFragmentList *fragmentList;
Index: src/UIElements/Qt4/Query/QtQuery.hpp
===================================================================
--- src/UIElements/Qt4/Query/QtQuery.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Qt4/Query/QtQuery.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -414,4 +414,6 @@
 
 public slots:
+  void pageChanged(int);
+  void onUpdateName(int);
   void onUpdateX(double);
   void onUpdateY(double);
@@ -424,12 +426,16 @@
   QBoxLayout *subLayout;
   QBoxLayout *coordLayout;
-  QLabel *coordLabel;
   QDoubleSpinBox *coordInputX;
   QDoubleSpinBox *coordInputY;
   QDoubleSpinBox *coordInputZ;
   Dialog *dialog;
-};
-
-class QtDialog::VectorsQtQuery : public QWidget, public QtQuery<std::vector<Vector> >, public QtQueryList<Vector> {
+  QBoxLayout *nameLayout;
+  QComboBox *nameComboBox;
+};
+
+class QtDialog::VectorsQtQuery :
+    public QWidget,
+    public QtQuery<std::vector<Vector> >,
+    public QtQueryList<Vector> {
   Q_OBJECT
 public:
Index: src/UIElements/Qt4/Query/QtQueryList.hpp
===================================================================
--- src/UIElements/Qt4/Query/QtQueryList.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Qt4/Query/QtQueryList.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -100,4 +100,57 @@
   std::vector<T> &tempRef;
   Parameter<T> *subParam;
+};
+
+template<>
+class QtQueryList<Vector> : public QtQueryListUntyped {
+public:
+  QtQueryList(Parameter<std::vector<Vector> > &parentParam, QBoxLayout *parent, Dialog *_dialog, std::vector<std::string> &_temp) : QtQueryListUntyped(parent, _dialog), tempRef(_temp)
+  {
+    // do we have an STLVectorValidator?
+    Validator<std::vector<Vector> > *val = &parentParam.getValidator();
+    STLVectorValidator<std::vector<Vector> > *vector_val = NULL;
+
+    // might be hidden inside an And_Validator
+    And_Validator<std::vector<Vector> > * and_val = dynamic_cast<And_Validator<std::vector<Vector> > *>(val);
+    if (and_val){
+      if (dynamic_cast<STLVectorValidator<std::vector<Vector> > *>(and_val->getA()))
+        vector_val = dynamic_cast<STLVectorValidator<std::vector<Vector> > *>(and_val->getA());
+      else if (dynamic_cast<STLVectorValidator<std::vector<Vector> > *>(and_val->getB()))
+        vector_val = dynamic_cast<STLVectorValidator<std::vector<Vector> > *>(and_val->getB());
+    }else{
+      vector_val = dynamic_cast<STLVectorValidator<std::vector<Vector> > *>(val);
+    }
+
+    if (vector_val){
+      // if so, try to use its ElementwiseValidator
+      subParam = new Parameter<Vector>("sub-param", *(vector_val->getElementwiseValidator()));
+    }else{
+      subParam = new Parameter<Vector>("sub-param");
+    }
+  }
+  virtual ~QtQueryList()
+  {
+    delete(subParam);
+  }
+
+  void addElement() {
+    // add item to both
+    addElementToListWidget(subParam->getAsString());
+    tempRef.push_back(subParam->getAsString());
+    onUpdate();
+  }
+  void removeElements()
+  {
+    std::vector<int> rows = getSelectedRows();
+    removeSelectedRows(rows);
+    for (int i = rows.size() - 1; i >= 0; i --){
+      ASSERT((size_t)(rows[i]) < tempRef.size(), "QtQueryList<Vector>::removeElements() trying to remove invalid element.");
+      tempRef.erase(tempRef.begin() + rows[i]);
+    }
+    onUpdate();
+  }
+protected:
+  std::vector<std::string> &tempRef;
+  Parameter<Vector> *subParam;
 };
 
Index: src/UIElements/Qt4/Query/VectorQtQuery.cpp
===================================================================
--- src/UIElements/Qt4/Query/VectorQtQuery.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/Qt4/Query/VectorQtQuery.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -37,4 +37,5 @@
 #include <Qt/qcombobox.h>
 #include <Qt/qlabel.h>
+#include <Qt/qstackedwidget.h>
 
 //#include "CodePatterns/MemDebug.hpp"
@@ -42,4 +43,8 @@
 #include "UIElements/Qt4/Query/QtQuery.hpp"
 
+#include "CodePatterns/toString.hpp"
+
+#include "Geometry/GeometryRegistry.hpp"
+#include "Parameters/Specifics/Value_vector.hpp"
 
 QtDialog::VectorQtQuery::VectorQtQuery(Parameter<Vector> &_param, const std::string &_title, const std::string &_description, QBoxLayout *_parent,Dialog *_dialog) :
@@ -48,21 +53,40 @@
     dialog(_dialog)
 {
-  temp = Vector(0, 0, 0);
-  if (param.isSet())
-    temp = param.get();
+  Vector temporary(0, 0, 0);
+  temp = "0, 0, 0";
+  if (param.isSet()) {
+    temporary = param.get();
+    temp = param.getAsString();
+  }
   mainLayout= new QHBoxLayout();
   titleLabel = new QLabel(QString(getTitle().c_str()));
   titleLabel->setToolTip(QString(getDescription().c_str()));
   mainLayout->addWidget(titleLabel);
-  subLayout = new QVBoxLayout();
+  subLayout = new QHBoxLayout();
   mainLayout->addLayout(subLayout);
 //  QComboBox* inputBox = new QComboBox();
+
+  QWidget *firstPageWidget = new QWidget;
+  QWidget *secondPageWidget = new QWidget;
+
+  QStackedWidget *stackedWidget = new QStackedWidget;
+  stackedWidget->addWidget(firstPageWidget);
+  stackedWidget->addWidget(secondPageWidget);
+
+  QComboBox *pageComboBox = new QComboBox;
+  pageComboBox->addItem(tr("x,y,z"));
+  pageComboBox->addItem(tr("vector name"));
+  connect(pageComboBox, SIGNAL(activated(int)),
+      stackedWidget, SLOT(setCurrentIndex(int)));
+  connect(pageComboBox, SIGNAL(activated(int)),
+      this, SLOT(pageChanged(int)));
+  subLayout->addWidget(pageComboBox);
+  subLayout->addWidget(stackedWidget);
+
+   // first widget with coordinates
   coordLayout = new QHBoxLayout();
-  subLayout->addLayout(coordLayout);
-  coordLabel = new QLabel(QString("x,y,z"));
-  coordLayout->addWidget(coordLabel);
   coordInputX = new QDoubleSpinBox();
   coordInputX->setRange(-std::numeric_limits<double>::max(),std::numeric_limits<double>::max());
-  coordInputX->setValue(temp[0]);
+  coordInputX->setValue(temporary[0]);
 //  coordInputX->setRange(0,M.at(i,i));
   coordInputX->setDecimals(3);
@@ -70,5 +94,5 @@
   coordInputY = new QDoubleSpinBox();
   coordInputY->setRange(-std::numeric_limits<double>::max(),std::numeric_limits<double>::max());
-  coordInputY->setValue(temp[1]);
+  coordInputY->setValue(temporary[1]);
 //  coordInputY->setRange(0,M.at(i,i));
   coordInputY->setDecimals(3);
@@ -76,5 +100,5 @@
   coordInputZ = new QDoubleSpinBox();
   coordInputZ->setRange(-std::numeric_limits<double>::max(),std::numeric_limits<double>::max());
-  coordInputZ->setValue(temp[2]);
+  coordInputZ->setValue(temporary[2]);
 //  coordInputZ->setRange(0,M.at(i,i));
   coordInputZ->setDecimals(3);
@@ -83,4 +107,22 @@
   connect(coordInputY,SIGNAL(valueChanged(double)),this,SLOT(onUpdateY(double)));
   connect(coordInputZ,SIGNAL(valueChanged(double)),this,SLOT(onUpdateZ(double)));
+  firstPageWidget->setLayout(coordLayout);
+
+  // second widget with string field
+  nameLayout = new QHBoxLayout();
+  nameComboBox = new QComboBox;
+  GeometryRegistry &reg = GeometryRegistry::getInstance();
+//  nameComboBox->setEditable(true);
+  GeometryRegistry::const_iterator iter;
+  for (iter = reg.getBeginIter(); iter != reg.getEndIter(); iter ++){
+    GeometryObject *v = iter->second;
+    nameComboBox->addItem(tr(v->getName().c_str()));
+    nameComboBox->setItemData(nameComboBox->count()-1, tr(toString<Vector>(v->getVector()).c_str()), Qt::ToolTipRole);
+  }
+  connect(nameComboBox, SIGNAL(activated(int)),
+      this, SLOT(onUpdateName(int)));
+  nameLayout->addWidget(nameComboBox);
+  secondPageWidget->setLayout(nameLayout);
+
   parent->addLayout(mainLayout);
 }
@@ -89,16 +131,53 @@
 {}
 
+static void updateVectorString(std::string &_temp, const double newDouble, int component)
+{
+  //!> Internal converter from string to internal type
+  Vector vec = Value<Vector>::parseAsVector(_temp);
+  vec[component] = newDouble;
+  _temp = Value<Vector>::setFromVector(vec);
+}
+
+void QtDialog::VectorQtQuery::pageChanged(int pagenr) {
+  if (pagenr == 1) {
+    // change from x,y,z input
+    onUpdateName(nameComboBox->currentIndex());
+    dialog->update();
+  } else if (pagenr == 0) {
+    // change from name input
+    if (GeometryRegistry::getInstance().isPresentByName(temp)) {
+      const GeometryObject * const v = GeometryRegistry::getInstance().getByName(temp);
+      coordInputX->setValue(v->getVector()[0]);
+      coordInputY->setValue(v->getVector()[1]);
+      coordInputZ->setValue(v->getVector()[2]);
+    } else {
+      coordInputX->setValue(0.);
+      coordInputY->setValue(0.);
+      coordInputZ->setValue(0.);
+    }
+    dialog->update();
+  } else {
+    ASSERT(0, "VectorQtQuery::pageChanged() - unknown page for pageComboBox.");
+  }
+}
+
+void QtDialog::VectorQtQuery::onUpdateName(int index) {
+  const QString itemtext = nameComboBox->itemText(index);
+  temp = itemtext.toStdString();
+  dialog->update();
+}
+
 void QtDialog::VectorQtQuery::onUpdateX(double newDouble) {
-  temp[0] = newDouble;
+  updateVectorString(temp, newDouble, 0);
   dialog->update();
 }
 
 void QtDialog::VectorQtQuery::onUpdateY(double newDouble) {
-  temp[1] = newDouble;
+  updateVectorString(temp, newDouble, 1);
   dialog->update();
 }
 
 void QtDialog::VectorQtQuery::onUpdateZ(double newDouble) {
-  temp[2] = newDouble;
+  updateVectorString(temp, newDouble, 2);
   dialog->update();
 }
Index: src/UIElements/TextUI/Query/TextQuery.hpp
===================================================================
--- src/UIElements/TextUI/Query/TextQuery.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/TextUI/Query/TextQuery.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -24,4 +24,17 @@
 };
 
+class TextDialog::VectorTextQuery : public Dialog::TQuery<Vector> {
+public:
+  VectorTextQuery(Parameter<Vector> &_param, const std::string &_title, const std::string &_description = "");
+  virtual ~VectorTextQuery();
+  virtual bool handle();
+};
+
+class TextDialog::VectorsTextQuery : public Dialog::TQuery< std::vector<Vector> > {
+public:
+  VectorsTextQuery(Parameter< std::vector<Vector> > &_param, const std::string &_title, const std::string &_description = "");
+  virtual ~VectorsTextQuery();
+  virtual bool handle();
+};
 
   /** With the following boost::preprocessor code we generate forward declarations
Index: src/UIElements/TextUI/Query/VectorTextQuery.cpp
===================================================================
--- src/UIElements/TextUI/Query/VectorTextQuery.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/TextUI/Query/VectorTextQuery.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -83,5 +83,5 @@
 
   // check vector
-  return World::getInstance().getDomain().isValid(temp);
+  return true;
 }
 
Index: src/UIElements/TextUI/Query/VectorsTextQuery.cpp
===================================================================
--- src/UIElements/TextUI/Query/VectorsTextQuery.cpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/TextUI/Query/VectorsTextQuery.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -41,4 +41,5 @@
 #include "CodePatterns/Log.hpp"
 #include "CodePatterns/Verbose.hpp"
+#include "Geometry/GeometryRegistry.hpp"
 #include "LinearAlgebra/Vector.hpp"
 #include "LinearAlgebra/RealSpaceMatrix.hpp"
@@ -54,40 +55,29 @@
 
 bool TextDialog::VectorsTextQuery::handle() {
+  std::stringstream output;
   std::cout << getDescription() << std::endl;
   char coords[3] = {'x', 'y', 'z'};
   const RealSpaceMatrix &M = World::getInstance().getDomain().getM();
-  for (int i=0;i<3;i++)
-    std::cout << coords[i] << "[0.." << M.at(i,i) << ( (i!=2) ? "], " : "]: ");
+  std::cout << "Enter three comma-separated coordinates, vector name, ? for list or empty for end." << std::endl;
+  while (true) {
+    for (int i=0;i<3;i++)
+      std::cout << coords[i] << "[0.." << M.at(i,i) << ( (i!=2) ? "], " : "]: ");
 
-  std::string line;
-  getline(std::cin,line);
+    std::string line;
+    getline(std::cin,line);
 
-  // dissect by ","
-  double coord = 0.;
-  std::string::iterator olditerspace = line.begin();
-  std::string::iterator olditercomma = line.begin();
-  int counter = 0;
-  Vector temp_element;
-  for(std::string::iterator vectoriter = line.begin(); vectoriter != line.end(); ++vectoriter) {
-    if (*vectoriter == ',')
-      counter++;
-    if ((*vectoriter == ' ') && (counter == 2)) {
-      counter = 0;
-      for(std::string::iterator componentiter = olditerspace; (componentiter != vectoriter) && (counter !=3); ++componentiter) {
-        if (*componentiter == ',') {
-          std::istringstream stream(std::string(componentiter, olditercomma));
-          stream >> coord;
-          temp_element[counter++] = coord;
-          olditercomma = componentiter;
-        }
+    if (line == "?") {
+      GeometryRegistry &reg = GeometryRegistry::getInstance();
+
+      GeometryRegistry::const_iterator iter;
+      for (iter = reg.getBeginIter(); iter != reg.getEndIter(); iter ++){
+        GeometryObject *v = iter->second;
+        std::cout << "\t" << *v << std::endl;
       }
-      if ((olditercomma != line.begin()) && (counter != 3)) { // insert last part also
-        std::istringstream stream(std::string(olditercomma, vectoriter));
-        stream >> coord;
-        temp_element[counter++] = coord;
-      }
-      if (World::getInstance().getDomain().isValid(temp_element))
-        temp.push_back(temp_element);
-      olditerspace = vectoriter;
+    } else if (line.empty()) {
+      break;
+    } else {
+      // simply append with white-space delimiter
+      temp.push_back(line);
     }
   }
Index: src/UIElements/TextUI/TextDialog.hpp
===================================================================
--- src/UIElements/TextUI/TextDialog.hpp	(revision 15d21ee6aeb1c27bc4ac92eabe13c45084e33aaf)
+++ src/UIElements/TextUI/TextDialog.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -34,4 +34,7 @@
   virtual void queryEmpty(const std::string ="", const std::string = "");
 
+  virtual void queryVector(Parameter<Vector> &, const std::string ="", const std::string = "");
+  virtual void queryVectors(Parameter< std::vector<Vector> > &, const std::string ="", const std::string = "");
+
   /** With the following boost::preprocessor code we generate virtual function
    * definitions for all desired query types in the abstract class Dialog.
@@ -59,4 +62,7 @@
   class EmptyTextQuery;
 
+  class VectorTextQuery;
+  class VectorsTextQuery;
+
   /** With the following boost::preprocessor code we generate forward declarations
    * of query class for all desired query types in the Qt specialization class of
Index: src/UIElements/Views/Qt4/QtGeometryList.cpp
===================================================================
--- src/UIElements/Views/Qt4/QtGeometryList.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ src/UIElements/Views/Qt4/QtGeometryList.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,193 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2017 Frederik Heber. All rights reserved.
+ *
+ *
+ *   This file is part of MoleCuilder.
+ *
+ *    MoleCuilder 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 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    MoleCuilder 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 MoleCuilder.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * QtGeometryList.cpp
+ *
+ *  Created on: Mar 25, 2017
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "Views/Qt4/QtGeometryList.hpp"
+
+#include <iostream>
+
+//#include "CodePatterns/MemDebug.hpp"
+
+#include "CodePatterns/Observer/Notification.hpp"
+#include "CodePatterns/toString.hpp"
+
+#include "Geometry/GeometryRegistry.hpp"
+
+#include <QAbstractItemView>
+#include <QCoreApplication>
+
+using namespace std;
+
+const int QtGeometryList::COLUMNCOUNT = COLUMNTYPES_MAX;
+const char *QtGeometryList::COLUMNNAMES[QtGeometryList::COLUMNCOUNT]={"Name","Vector"};
+
+QtGeometryList::QtGeometryList(QWidget * _parent) :
+    QTreeWidget (_parent),
+    Observer("QtGeometryList")
+{
+  setColumnCount(COLUMNCOUNT);
+  setSelectionMode(QAbstractItemView::SingleSelection);
+  setSortingEnabled(true);
+
+  QStringList header;
+	for(int i=0; i<COLUMNCOUNT;++i)
+	  header << COLUMNNAMES[i];
+	setHeaderLabels(header);
+  sortByColumn(0);
+
+  setStyleSheet("QTreeView::item:hover{background-color:#999966;}");
+
+	refill(NULL);
+
+	GeometryRegistry::getInstance().signOn(this);
+	GeometryRegistry::getInstance().signOn(this, GeometryRegistry::GeometryInserted);
+	GeometryRegistry::getInstance().signOn(this, GeometryRegistry::GeometryRemoved);
+
+	QCoreApplication::instance()->installEventFilter(this);
+}
+
+QtGeometryList::~QtGeometryList()
+{
+  GeometryRegistry::getInstance().signOff(this);
+  GeometryRegistry::getInstance().signOff(this, GeometryRegistry::GeometryInserted);
+  GeometryRegistry::getInstance().signOff(this, GeometryRegistry::GeometryRemoved);
+}
+
+void QtGeometryList::update(Observable *publisher) {}
+
+void QtGeometryList::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
+  if (static_cast<GeometryRegistry*>(publisher) == GeometryRegistry::getPointer()) {
+    switch (notification->getChannelNo()) {
+      case GeometryRegistry::GeometryInserted:
+      {
+        refill(NULL);
+        break;
+      }
+      case GeometryRegistry::GeometryRemoved:
+      {
+        refill(GeometryRegistry::getInstance().lastChanged());
+        break;
+      }
+      default:
+        ASSERT(0, "QtGeometryList::recieveNotification() - we cannot get here.");
+        break;
+    }
+  }
+}
+
+void QtGeometryList::refill(::GeometryObject *ignore)
+{
+  clear();
+
+  GeometryRegistry &reg = GeometryRegistry::getInstance();
+
+  GeometryRegistry::const_iterator iter;
+  for (iter = reg.getBeginIter(); iter != reg.getEndIter(); iter ++){
+    ::GeometryObject *v = iter->second;
+    if (v == ignore)
+      continue;
+
+    QTreeWidgetItem *treeItem = new QTreeWidgetItem(this);
+    treeItem->setText(NAME, QString(v->getName().c_str()));
+    treeItem->setText(VECTOR, QString(toString(v->getVector()).c_str()));
+  }
+}
+
+#if 0
+void QtGeometryList::paintEvent(QPaintEvent * event)
+{
+  /*if (dirty)
+    refill(NULL);*/
+  QtGeometryList::paintEvent(event);
+}
+#endif
+
+void QtGeometryList::subjectKilled(Observable *publisher) {
+}
+
+bool QtGeometryList::eventFilter(QObject* object, QEvent* event)
+{
+    if(event->type() == QEvent::MouseMove)
+    {
+         mouseMoveFunction(static_cast<QMouseEvent*>(event));
+    }
+    // Repeat for other mouse events
+
+   // returning true blocks event returning false doesnt so if you want to block all mouse events except what your handling then return true inside each of your ifs
+   return false;
+}
+
+void QtGeometryList::mouseMoveFunction(QMouseEvent * event)
+{
+  if (event->type() == QEvent::MouseMove) {
+    QTreeWidgetItem* current = itemAt(event->pos());
+    if (current == NULL)
+      return;
+    // reset all tooltips
+    bool NoneSelected = true;
+    for (int i=0;i<topLevelItemCount();i++){
+      QTreeWidgetItem *item = topLevelItem(i);
+      item->setToolTip(NAME, tr(""));
+      item->setToolTip(VECTOR, tr(""));
+      NoneSelected &= !item->isSelected();
+    }
+    const std::string name = current->text(NAME).toStdString();
+    GeometryObject *v = GeometryRegistry::getInstance().getByName(name);
+    const Vector currentVec = v->getVector();
+    if ((NoneSelected) || (current->isSelected())) {
+      // show norm
+      std::string tooltiptext("Length:");
+      tooltiptext += toString<double>(currentVec.Norm());
+      tooltiptext += std::string(" AngstrÃ¶m");
+      current->setToolTip(NAME, trUtf8(tooltiptext.c_str()));
+      current->setToolTip(VECTOR, trUtf8(tooltiptext.c_str()));
+    } else {
+      for (int i=0;i<topLevelItemCount();i++){
+        QTreeWidgetItem *item = topLevelItem(i);
+        if (item->isSelected()) {
+          // show angle
+          const std::string othername = item->text(NAME).toStdString();
+          GeometryObject *otherv = GeometryRegistry::getInstance().getByName(othername);
+          const Vector otherVec = otherv->getVector();
+          std::string tooltiptext("Angle:");
+          tooltiptext += toString<double>(currentVec.Angle(otherVec)*180/M_PI);
+          tooltiptext += std::string(" deg");
+          current->setToolTip(NAME, trUtf8(tooltiptext.c_str()));
+          current->setToolTip(VECTOR, trUtf8(tooltiptext.c_str()));
+          break;
+        }
+      }
+    }
+  }
+}
Index: src/UIElements/Views/Qt4/QtGeometryList.hpp
===================================================================
--- src/UIElements/Views/Qt4/QtGeometryList.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ src/UIElements/Views/Qt4/QtGeometryList.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,49 @@
+/*
+ * QtGeometryList.hpp
+ *
+ *  Created on: Mar 25, 2017
+ *      Author: heber
+ */
+
+#ifndef QTGEOMETRYLIST_H_
+#define QTGEOMETRYLIST_H_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <QtGui/QTreeWidget>
+#include <QMouseEvent>
+
+#include "CodePatterns/Observer/Observer.hpp"
+
+class GeometryObject;
+
+class QtGeometryList: public QTreeWidget, public Observer
+{
+  Q_OBJECT
+
+public:
+  QtGeometryList(QWidget * _parent=0);
+  virtual ~QtGeometryList();
+
+protected:
+  bool eventFilter(QObject* object, QEvent* event);
+  void mouseMoveFunction(QMouseEvent * event);
+
+protected:
+  virtual void update(Observable *publisher);
+  virtual void subjectKilled(Observable *publisher);
+  virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
+  //virtual void paintEvent(QPaintEvent * event);
+  void refill(::GeometryObject *ignore);
+
+  static const int COLUMNCOUNT;
+  enum {NAME,VECTOR,COLUMNTYPES_MAX} COLUMNTYPES;
+  static const char *COLUMNNAMES[];
+
+};
+
+#endif /* QTGEOMETRYLIST_H_ */
