diff --git a/src/gui/server/factory.cpp b/src/gui/server/factory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0edd6db31485997e6464a0e29260336a5325a81d
--- /dev/null
+++ b/src/gui/server/factory.cpp
@@ -0,0 +1,99 @@
+
+#include <iostream>
+#include <map>
+#include <stdexcept>
+#include <string>
+
+
+class Request
+{
+public:
+  Request()
+  {
+    std::cout << "This is a Normal Request" << std::endl;
+  }
+};
+
+class SpecificRequest : public Request
+{
+public:
+  SpecificRequest()
+  {
+    std::cout << "This is a Specific Request" << std::endl;
+  }
+};
+
+
+class RequestCreatorBase
+{
+public:
+  virtual Request *create() = 0;
+  virtual RequestCreatorBase *clone() = 0;
+};
+
+template< typename T >
+class RequestCreator : public RequestCreatorBase
+{
+public:
+  virtual Request *create()
+  {
+    return new T();
+  }
+
+  virtual RequestCreatorBase *clone()
+  {
+    return new RequestCreator< T >();
+  }
+};
+
+
+class RequestFactory
+{
+public:
+  Request *create(const std::string &requestname)
+  {
+    std::map< std::string, RequestCreatorBase * >::iterator pos = mRequests.find(requestname);
+    if(pos == mRequests.end()) {
+      throw std::runtime_error("there's no request of that name");
+    }
+    
+    return pos->second->create();
+  }
+
+  template< typename T >
+  void registerRequest(const std::string &requestname)
+  {
+    std::map< std::string, RequestCreatorBase * >::iterator pos = 
+      mRequests.find(requestname);
+    if(pos != mRequests.end()) {
+      delete pos->second;
+      mRequests.erase(pos);
+    }
+    
+    mRequests.insert(std::make_pair(requestname, new RequestCreator< T >()));
+  }
+
+ private:
+  std::map< std::string, RequestCreatorBase * > mRequests;
+};
+
+
+int main(int, char **) 
+{
+  RequestFactory factory;
+
+  factory.registerRequest< Request > ("requestsimple");
+  factory.registerRequest< SpecificRequest >("requestspecific");
+  
+  std::cout << "First one" << std::endl;
+  delete factory.create("requestsimple");
+  
+  std::cout << "Second one" << std::endl;
+  delete factory.create("requestspecific");
+
+  factory.registerRequest< SpecificRequest >("requestsimple");
+  std::cout << "Third one" << std::endl;
+  delete factory.create("requestsimple");
+
+  return 0;
+}