Index: src/Shapes/ShapeRegistry.cpp
===================================================================
--- src/Shapes/ShapeRegistry.cpp	(revision 1c95882265b58588cd99b3ea7195b86467099a6b)
+++ src/Shapes/ShapeRegistry.cpp	(revision 8f12de70abbc748dfb3f3ce791b30c7615cf0cb8)
@@ -53,4 +53,90 @@
 }
 
+void ShapeRegistry::selectShape(const std::string& name)
+{
+  OBSERVE;
+  NOTIFY(SelectionChanged);
+  ASSERT(isPresentByName(name),"Shape selected that was not in the registry");
+  selectedShapes[name]=getByName(name);
+}
+
+void ShapeRegistry::selectShape(Shape* s)
+{
+  ASSERT(s,"Invalid pointer in selection of shape");
+  selectShape(s->getName());
+}
+
+void ShapeRegistry::unselectShape(const std::string& name)
+{
+  OBSERVE;
+  NOTIFY(SelectionChanged);
+  ASSERT(isPresentByName(name),"Shape unselected that was not in the registry");
+  selectedShapes.erase(name);
+}
+
+void ShapeRegistry::unselectShape(Shape* s)
+{
+  ASSERT(s,"Invalid pointer in unselection of shape");
+  unselectShape(s->getName());
+}
+
+void ShapeRegistry::selectAllShapes()
+{
+  OBSERVE;
+  NOTIFY(SelectionChanged);
+  const_iterator iter;
+  for (iter = getBeginIter(); iter != getEndIter(); iter ++)
+    if (!isSelected(iter->first))
+      selectedShapes[iter->first] = iter->second;
+}
+
+void ShapeRegistry::unselectAllShapes()
+{
+  OBSERVE;
+  NOTIFY(SelectionChanged);
+  selectedShapes.clear();
+}
+
+void ShapeRegistry::invertShapeSelection()
+{
+  OBSERVE;
+  NOTIFY(SelectionChanged);
+  std::map<std::string, Shape*> inverted;
+  const_iterator iter;
+  for (iter = getBeginIter(); iter != getEndIter(); iter ++)
+    if (!isSelected(iter->first))
+      inverted[iter->first] = iter->second;
+  selectedShapes = inverted;
+}
+
+bool ShapeRegistry::isSelected(const std::string& name) const
+{
+  return selectedShapes.find(name) != selectedShapes.end();
+}
+
+bool ShapeRegistry::isSelected(Shape* s) const
+{
+  ASSERT(s,"Invalid pointer in selection query of shape");
+  return isSelected(s->getName());
+}
+
+int ShapeRegistry::countSelectedShapes() const
+{
+  size_t count = 0;
+  for (const_iterator iter = selectedShapes.begin(); iter != selectedShapes.end(); ++iter)
+    count++;
+  return count;
+}
+
+std::vector<Shape*> ShapeRegistry::getSelectedShapes() const
+{
+  std::vector<Shape*> returnShapes;
+  returnShapes.resize(countSelectedShapes());
+  int count = 0;
+  for (const_iterator iter = selectedShapes.begin(); iter != selectedShapes.end(); ++iter)
+    returnShapes[count++] = iter->second;
+  return returnShapes;
+}
+
 ShapeRegistry::~ShapeRegistry()
 {
Index: src/Shapes/ShapeRegistry.hpp
===================================================================
--- src/Shapes/ShapeRegistry.hpp	(revision 1c95882265b58588cd99b3ea7195b86467099a6b)
+++ src/Shapes/ShapeRegistry.hpp	(revision 8f12de70abbc748dfb3f3ce791b30c7615cf0cb8)
@@ -15,4 +15,6 @@
 #endif
 
+#include <map>
+
 #include "CodePatterns/Observer/Observable.hpp"
 #include "CodePatterns/Registry.hpp"
@@ -28,6 +30,6 @@
   void addShape(Shape s);
   void removeShape(const std::string &name);
-  Shape* getShapeByName(const std::string name);
-  bool isShapePresentByName(const std::string name) const;
+  //Shape* getShapeByName(const std::string name);
+  //bool isShapePresentByName(const std::string name) const;
   std::string getDefaultNameForShape(Shape s) const;
 
@@ -39,4 +41,16 @@
   };
 
+  void selectShape(const std::string &name);
+  void selectShape(Shape *s);
+  void unselectShape(const std::string &name);
+  void unselectShape(Shape *s);
+  void selectAllShapes();
+  void unselectAllShapes();
+  void invertShapeSelection();
+  bool isSelected(const std::string &name) const;
+  bool isSelected(Shape *s) const;
+  int countSelectedShapes() const;
+  std::vector<Shape*> getSelectedShapes() const;
+
 private:
   // private constructor and destructor due to singleton
@@ -44,4 +58,5 @@
   virtual ~ShapeRegistry();
 
+  std::map<std::string, Shape*> selectedShapes;
 };
 
