diff --git a/src/Checksum/ChecksumLoader.php b/src/Checksum/ChecksumLoader.php
index 5e1f4a00e810df8d56e4689399b4fb1b21650bfa..c02129938def185deac45a8f4e3ce97c7ec9c0ac 100644
--- a/src/Checksum/ChecksumLoader.php
+++ b/src/Checksum/ChecksumLoader.php
@@ -1,11 +1,28 @@
 <?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Checksum
+ */
 
 namespace jtl\Connector\Example\Checksum;
 
 use jtl\Connector\Checksum\IChecksumLoader;
+use jtl\Connector\Core\IO\Path;
+use jtl\Connector\Database\Sqlite3;
 
 class ChecksumLoader implements IChecksumLoader
 {
+    protected $db;
+
+    public function __construct()
+    {
+        $sqlite3 = Sqlite3::getInstance();
+        if (!$sqlite3->isConnected()) {
+            $sqlite3->connect(array('location' => Path::combine(CONNECTOR_DIR, 'db', 'connector.s3db')));
+        }
+
+        $this->db = $sqlite3;
+    }
 
     /**
      * Loads the checksum
@@ -16,7 +33,7 @@ class ChecksumLoader implements IChecksumLoader
      */
     public function read($endpointId, $type)
     {
-        // TODO: Implement read() method.
+        return $this->db->fetchSingle(sprintf('SELECT checksum FROM checksum WHERE endpoint = %s AND type = %s', $endpointId, $type));
     }
 
     /**
@@ -29,7 +46,9 @@ class ChecksumLoader implements IChecksumLoader
      */
     public function write($endpointId, $type, $checksum)
     {
-        // TODO: Implement write() method.
+        $id = $this->db->insert(sprintf('INSERT INTO checksum (endpoint, type, checksum) VALUES (%s, %s, %s)', $endpointId, $type, $checksum));
+
+        return $id !== false;
     }
 
     /**
@@ -41,6 +60,6 @@ class ChecksumLoader implements IChecksumLoader
      */
     public function delete($endpointId, $type)
     {
-        // TODO: Implement delete() method.
+        return $this->db->query(sprintf('DELETE FROM checksum WHERE endpoint = %s AND type = %s', $endpointId, $type));
     }
 }
diff --git a/src/Connector.php b/src/Connector.php
index d6301feab0e7ae093676de1fdd06ef138973943d..c5d8ba0dfd6453cc36d344cb4549ae22420c6266 100644
--- a/src/Connector.php
+++ b/src/Connector.php
@@ -20,7 +20,6 @@ use jtl\Connector\Result\Action;
  * Example Connector
  *
  * @access public
- * @author Christian Spoo <christian.spoo@jtl-software.com>
  */
 class Connector extends BaseConnector
 {
@@ -52,7 +51,7 @@ class Connector extends BaseConnector
     {
         $controller = RpcMethod::buildController($this->getMethod()->getController());
 
-        $class = "\\jtl\\Connector\\Magento\\Controller\\{$controller}";
+        $class = "\\jtl\\Connector\\Example\\Controller\\{$controller}";
         if (class_exists($class)) {
             $this->controller = $class::getInstance();
             $this->action = RpcMethod::buildAction($this->getMethod()->getAction());
diff --git a/src/Controller/Category.php b/src/Controller/Category.php
new file mode 100644
index 0000000000000000000000000000000000000000..244b368be0f9631e73b3119c8045867333daffa1
--- /dev/null
+++ b/src/Controller/Category.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class Category extends DataController
+{
+
+}
diff --git a/src/Controller/Connector.php b/src/Controller/Connector.php
index 340728c87176454b5dba6df094b5e6164f322b2b..96b4f1f4d35c91cc1e33c3ba4c71beec8b1d8f0b 100644
--- a/src/Controller/Connector.php
+++ b/src/Controller/Connector.php
@@ -1,63 +1,59 @@
 <?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
 
 namespace jtl\Connector\Example\Controller;
 
-use jtl\Connector\Core\Controller\Controller;
-use jtl\Connector\Core\Model\DataModel;
+use jtl\Connector\Core\Logger\Logger;
 use jtl\Connector\Core\Model\QueryFilter;
-use jtl\Connector\Core\Rpc\Error;
+use jtl\Connector\Example\Utility\Mmc;
+use jtl\Connector\Formatter\ExceptionFormatter;
 use jtl\Connector\Result\Action;
 use jtl\Connector\Model\ConnectorIdentification;
 
-class Connector extends Controller
+class Connector extends DataController
 {
-    private $controllers = array(
-        'Product'
-    );
-
-    public function push(DataModel $model)
-    {
-
-    }
-
-    public function delete(DataModel $model)
-    {
-
-    }
-
-    public function pull(QueryFilter $filter)
-    {
-
-    }
-
-    public function statistic(QueryFilter $filter)
+    /**
+     * Statistic
+     *
+     * @param \jtl\Connector\Core\Model\QueryFilter $queryFilter
+     * @return \jtl\Connector\Result\Action
+     */
+    public function statistic(QueryFilter $queryFilter)
     {
         $action = new Action();
         $action->setHandled(true);
 
-        try {
-            $result = array();
-
-            foreach ($this->controllers as $controller) {
-                $controller = __NAMESPACE__ . '\\' . $controller;
-                $obj = new $controller();
-
-                if (method_exists($obj, 'statistic')) {
-                    $method_result = $obj->statistic($filter);
-
-                    $result[] = $method_result->getResult();
+        $results = array();
+
+        $mainControllers = array(
+            'Category',
+            'Customer',
+            'CustomerOrder',
+            'CrossSelling',
+            'DeliveryNote',
+            'Image',
+            'Product',
+            'Manufacturer',
+            'Payment'
+        );
+
+        foreach ($mainControllers as $mainController) {
+            try {
+                $controller = Mmc::getController($mainController);
+                $result = $controller->statistic($queryFilter);
+                if ($result !== null && $result->isHandled() && !$result->isError()) {
+                    $results[] = $result->getResult();
                 }
+            } catch (\Exception $exc) {
+                Logger::write(ExceptionFormatter::format($exc), Logger::WARNING, 'controller');
             }
-
-            $action->setResult($result);
-        }
-        catch (\Exception $exc) {
-            $err = new Error();
-            $err->setCode($exc->getCode());
-            $err->setMessage($exc->getMessage());
-            $action->setError($err);
         }
 
+        $action->setResult($results);
+
         return $action;
     }
 
@@ -72,7 +68,7 @@ class Connector extends Controller
         $action->setHandled(true);
 
         $identification = new ConnectorIdentification();
-        $identification->setEndpointVersion('1.0.0.0')
+        $identification->setEndpointVersion('1.0.0')
             ->setPlatformName('Example')
             ->setPlatformVersion('1.0')
             ->setProtocolVersion(Application()->getProtocolVersion());
@@ -89,6 +85,10 @@ class Connector extends Controller
      */
     public function finish()
     {
+        $action = new Action();
+
+        $action->setHandled(true);
+        $action->setResult(true);
 
         return $action;
     }
diff --git a/src/Controller/CrossSelling.php b/src/Controller/CrossSelling.php
new file mode 100644
index 0000000000000000000000000000000000000000..a61e817b389fdec5a96982c86d9f445455123f10
--- /dev/null
+++ b/src/Controller/CrossSelling.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class CrossSelling extends DataController
+{
+
+}
diff --git a/src/Controller/Customer.php b/src/Controller/Customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..85d18951670e765c65608bcf569ddc587dd56ec7
--- /dev/null
+++ b/src/Controller/Customer.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class Customer extends DataController
+{
+
+}
diff --git a/src/Controller/CustomerOrder.php b/src/Controller/CustomerOrder.php
new file mode 100644
index 0000000000000000000000000000000000000000..68fe2448c84560974dc20136e593efeebcbfaf96
--- /dev/null
+++ b/src/Controller/CustomerOrder.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class CustomerOrder extends DataController
+{
+
+}
diff --git a/src/Controller/DataController.php b/src/Controller/DataController.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9d5fb6209ed8d0feef46c0d109fd075f1387d3d
--- /dev/null
+++ b/src/Controller/DataController.php
@@ -0,0 +1,143 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+use jtl\Connector\Core\Controller\Controller;
+use jtl\Connector\Core\Logger\Logger;
+use jtl\Connector\Core\Model\QueryFilter;
+use jtl\Connector\Core\Rpc\Error;
+use jtl\Connector\Core\Utilities\ClassName;
+use jtl\Connector\Example\Utility\Mmc;
+use jtl\Connector\Formatter\ExceptionFormatter;
+use jtl\Connector\Core\Model\DataModel;
+use jtl\Connector\Model\Statistic;
+use jtl\Connector\Result\Action;
+use jtl\Connector\Serializer\JMS\SerializerBuilder;
+
+abstract class DataController extends Controller
+{
+    /**
+     * Statistic
+     *
+     * @param \jtl\Connector\Core\Model\QueryFilter $queryFilter
+     * @return \jtl\Connector\Result\Action
+     */
+    public function statistic(QueryFilter $queryFilter)
+    {
+        $action = new Action();
+        $action->setHandled(true);
+
+        try {
+            $class = ClassName::getFromNS(get_called_class());
+
+            $statModel = new Statistic();
+            $mapper = Mmc::getMapper($class);
+
+            $statModel->setAvailable($mapper->fetchCount());
+            $statModel->setControllerName(lcfirst($class));
+
+            $action->setResult($statModel->getPublic());
+        } catch (\Exception $exc) {
+            $action->setError($this->handleException($exc));
+        }
+
+        return $action;
+    }
+
+    /**
+     * Insert or update
+     *
+     * @param \jtl\Connector\Core\Model\DataModel $model
+     * @return \jtl\Connector\Result\Action
+     */
+    public function push(DataModel $model)
+    {
+        $action = new Action();
+        $action->setHandled(true);
+
+        try {
+            $class = ClassName::getFromNS(get_called_class());
+
+            $mapper = Mmc::getMapper($class);
+            $mapper->save($model);
+            $action->setResult($model);
+        } catch (\Exception $exc) {
+            $action->setError($this->handleException($exc));
+        }
+
+        return $action;
+    }
+
+    /**
+     * Select
+     *
+     * @param \jtl\Connector\Core\Model\QueryFilter $queryFilter
+     * @return \jtl\Connector\Result\Action
+     */
+    public function pull(QueryFilter $queryFilter)
+    {
+        $action = new Action();
+        $action->setHandled(true);
+
+        try {
+            $result = [];
+            $limit = $queryFilter->isLimit() ? $queryFilter->getLimit() : 100;
+
+            $class = ClassName::getFromNS(get_called_class());
+
+            $mapper = Mmc::getMapper($class);
+            $models = $mapper->findAll($limit);
+
+            $serializer = SerializerBuilder::create();
+            foreach ($models as $model) {
+                $result[] = $serializer->deserialize($model, sprintf('jtl\Connector\Model\%s', $class), 'json');
+            }
+
+            $action->setResult($result);
+        } catch (\Exception $exc) {
+            $action->setError($this->handleException($exc));
+        }
+
+        return $action;
+    }
+
+    /**
+     * Delete
+     *
+     * @param \jtl\Connector\Core\Model\DataModel $model
+     * @return \jtl\Connector\Result\Action
+     */
+    public function delete(DataModel $model)
+    {
+        $action = new Action();
+        $action->setHandled(true);
+
+        try {
+            $class = ClassName::getFromNS(get_called_class());
+
+            $mapper = Mmc::getMapper($class);
+            $res = $mapper->delete($model);
+
+            $action->setResult($res);
+        } catch (\Exception $exc) {
+            $action->setError($this->handleException($exc));
+        }
+
+        return $action;
+    }
+
+    protected function handleException(\Exception $e)
+    {
+        Logger::write(ExceptionFormatter::format($e), Logger::WARNING, 'controller');
+
+        $err = new Error();
+        $err->setCode($e->getCode());
+        $err->setMessage($e->getMessage());
+
+        return $err;
+    }
+}
\ No newline at end of file
diff --git a/src/Controller/DeliveryNote.php b/src/Controller/DeliveryNote.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3aac4ae24ffcdd80fb296c76a8d951b14a652b7
--- /dev/null
+++ b/src/Controller/DeliveryNote.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class DeliveryNote extends DataController
+{
+
+}
diff --git a/src/Controller/Image.php b/src/Controller/Image.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c293f1726b63a55c666c647f59c8112c4e2d8c9
--- /dev/null
+++ b/src/Controller/Image.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class Image extends DataController
+{
+
+}
diff --git a/src/Controller/Manufacturer.php b/src/Controller/Manufacturer.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ee43214e7971b71f67132d02b291eb658e1ab25
--- /dev/null
+++ b/src/Controller/Manufacturer.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class Manufacturer extends DataController
+{
+
+}
diff --git a/src/Controller/Product.php b/src/Controller/Product.php
index d550e8c4ac096ca8a7674ebbc19791c998f765f2..3d93a231cdc768e6d06c62b5230af71c967c7634 100644
--- a/src/Controller/Product.php
+++ b/src/Controller/Product.php
@@ -1,30 +1,12 @@
 <?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
 
 namespace jtl\Connector\Example\Controller;
 
-use jtl\Connector\Core\Controller\Controller;
-use jtl\Connector\Core\Model\DataModel;
-use jtl\Connector\Core\Model\QueryFilter;
-
-class Product extends Controller
+class Product extends DataController
 {
-    public function push(DataModel $model)
-    {
-
-    }
-
-    public function delete(DataModel $model)
-    {
-
-    }
-
-    public function pull(QueryFilter $filter)
-    {
-
-    }
-
-    public function statistic(QueryFilter $filter)
-    {
 
-    }
 }
diff --git a/src/Controller/Specific.php b/src/Controller/Specific.php
new file mode 100644
index 0000000000000000000000000000000000000000..a65f23ca74e81bba16f215ac4d936614a32730ed
--- /dev/null
+++ b/src/Controller/Specific.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Controller;
+
+class Specific extends DataController
+{
+
+}
diff --git a/src/Mapper/Category.php b/src/Mapper/Category.php
new file mode 100644
index 0000000000000000000000000000000000000000..fc62eccf2eea5da4edb193a41e8c819580071a69
--- /dev/null
+++ b/src/Mapper/Category.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class Category extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/CrossSelling.php b/src/Mapper/CrossSelling.php
new file mode 100644
index 0000000000000000000000000000000000000000..455d9d22e50c9ef7312a8b370223d30ca2a1d299
--- /dev/null
+++ b/src/Mapper/CrossSelling.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class CrossSelling extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/Customer.php b/src/Mapper/Customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ed338263b828e60bf91bfc7ba538d0a02916c4b
--- /dev/null
+++ b/src/Mapper/Customer.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class Customer extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/CustomerOrder.php b/src/Mapper/CustomerOrder.php
new file mode 100644
index 0000000000000000000000000000000000000000..73d86bba1a5c01c6c8f194c0804e514f95285619
--- /dev/null
+++ b/src/Mapper/CustomerOrder.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class CustomerOrder extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/DataMapper.php b/src/Mapper/DataMapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..8f98c42199cde434439ff5312d2b735709bf5076
--- /dev/null
+++ b/src/Mapper/DataMapper.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Mapper
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+use jtl\Connector\Core\IO\Path;
+use jtl\Connector\Core\Utilities\ClassName;
+use jtl\Connector\Core\Utilities\Singleton;
+use jtl\Connector\Database\Sqlite3;
+use jtl\Connector\Model\DataModel;
+
+abstract class DataMapper extends Singleton
+{
+    protected $db;
+
+    protected function __construct()
+    {
+        $sqlite3 = Sqlite3::getInstance();
+        $sqlite3->connect(array('location' => Path::combine(CONNECTOR_DIR, 'db', 'connector.s3db')));
+
+        $this->db = $sqlite3;
+    }
+
+    public function find($id)
+    {
+        $id = (int) $id;
+        if ($id > 0) {
+            $type = strtolower(ClassName::getFromNS(get_called_class()));
+            return $this->db->fetchSingle(sprintf('SELECT data FROM %s WHERE id = %s', $type, $id));
+        }
+
+        return null;
+    }
+
+    public function findAll($limit = 100)
+    {
+        $result = [];
+        $type = strtolower(ClassName::getFromNS(get_called_class()));
+        $rows = $this->db->query(sprintf('SELECT data
+                                  FROM %s t
+                                  LEFT JOIN mapping m ON t.id = m.endpoint
+                                  WHERE m.host IS NULL
+                                  LIMIT %s', $type, $limit));
+
+        if ($rows !== null) {
+            foreach ($rows as $row) {
+                $result[] = $row['data'];
+            }
+        }
+
+        return $result;
+    }
+
+    public function save(DataModel &$model)
+    {
+        $json = $model->toJson();
+        $type = strtolower(ClassName::getFromNS(get_called_class()));
+        $id = $this->db->insert(sprintf('INSERT INTO %s (id, data) VALUES (null, %s)', $type, $json));
+
+        $model->getId()->setEndpoint($id);
+    }
+
+    public function remove($id)
+    {
+        $id = (int) $id;
+        if ($id > 0) {
+            $type = strtolower(ClassName::getFromNS(get_called_class()));
+
+            return $this->db->query(sprintf('DELETE FROM %s WHERE id = %s', $type, $id));
+        }
+
+        return false;
+    }
+
+    public function fetchCount()
+    {
+        $type = strtolower(ClassName::getFromNS(get_called_class()));
+        return (int) $this->db->fetchSingle(sprintf('SELECT count(*)
+                                                      FROM %s t
+                                                      LEFT JOIN mapping m ON t.id = m.endpoint
+                                                      WHERE m.host IS NULL', $type));
+    }
+}
\ No newline at end of file
diff --git a/src/Mapper/DeliveryNote.php b/src/Mapper/DeliveryNote.php
new file mode 100644
index 0000000000000000000000000000000000000000..a96c40c36257ee446f378016d6571e84f13c90ac
--- /dev/null
+++ b/src/Mapper/DeliveryNote.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class DeliveryNote extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/Image.php b/src/Mapper/Image.php
new file mode 100644
index 0000000000000000000000000000000000000000..b72206f4d7f6f9006582c26439fdaa78a6c117e5
--- /dev/null
+++ b/src/Mapper/Image.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class Image extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/Manufacturer.php b/src/Mapper/Manufacturer.php
new file mode 100644
index 0000000000000000000000000000000000000000..7898e3e42d24c49617b03a68e79196bbaf942d60
--- /dev/null
+++ b/src/Mapper/Manufacturer.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class Manufacturer extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/PrimaryKeyMapper.php b/src/Mapper/PrimaryKeyMapper.php
index 3f0d83de73483779a53ffbad250a70baa2f0765b..27eb77eee953a29fd040cc523dca1eb4aa46008b 100644
--- a/src/Mapper/PrimaryKeyMapper.php
+++ b/src/Mapper/PrimaryKeyMapper.php
@@ -1,14 +1,28 @@
 <?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Mapper
+ */
 
 namespace jtl\Connector\Example\Mapper;
 
-use jtl\Connector\Core\Logger\Logger;
-use jtl\Connector\Drawing\ImageRelationType;
-use jtl\Connector\Linker\IdentityLinker;
+use jtl\Connector\Core\IO\Path;
+use jtl\Connector\Database\Sqlite3;
 use jtl\Connector\Mapper\IPrimaryKeyMapper;
 
 class PrimaryKeyMapper implements IPrimaryKeyMapper
 {
+    protected $db;
+
+    public function __construct()
+    {
+        $sqlite3 = Sqlite3::getInstance();
+        if (!$sqlite3->isConnected()) {
+            $sqlite3->connect(array('location' => Path::combine(CONNECTOR_DIR, 'db', 'connector.s3db')));
+        }
+
+        $this->db = $sqlite3;
+    }
 
     /**
      * Host ID getter
@@ -19,7 +33,7 @@ class PrimaryKeyMapper implements IPrimaryKeyMapper
      */
     public function getHostId($endpointId, $type)
     {
-        // TODO: Implement getHostId() method.
+        return $this->db->fetchSingle(sprintf('SELECT host FROM mapping WHERE endpoint = %s AND type = %s', $endpointId, $type));
     }
 
     /**
@@ -31,7 +45,7 @@ class PrimaryKeyMapper implements IPrimaryKeyMapper
      */
     public function getEndpointId($hostId, $type)
     {
-        // TODO: Implement getEndpointId() method.
+        return $this->db->fetchSingle(sprintf('SELECT endpoint FROM mapping WHERE host = %s AND type = %s', $hostId, $type));
     }
 
     /**
@@ -44,7 +58,9 @@ class PrimaryKeyMapper implements IPrimaryKeyMapper
      */
     public function save($endpointId, $hostId, $type)
     {
-        // TODO: Implement save() method.
+        $id = $this->db->insert(sprintf('INSERT INTO mapping (endpoint, host, type) VALUES (%s, %s, %s)', $endpointId, $hostId, $type));
+
+        return $id !== false;
     }
 
     /**
@@ -57,7 +73,16 @@ class PrimaryKeyMapper implements IPrimaryKeyMapper
      */
     public function delete($endpointId = null, $hostId = null, $type)
     {
-        // TODO: Implement delete() method.
+        $where = '';
+        if ($endpointId !== null && $hostId !== null) {
+            $where = sprintf('WHERE endpoint = %s AND host = %s AND type = %s', $endpointId, $hostId, $type);
+        } elseif ($endpointId !== null) {
+            $where = sprintf('WHERE endpoint = %s AND type = %s', $endpointId, $type);
+        } elseif ($hostId !== null) {
+            $where = sprintf('WHERE host = %s AND type = %s', $hostId, $type);
+        }
+
+        return $this->db->query(sprintf('DELETE FROM mapping %s'), $where);
     }
 
     /**
@@ -67,7 +92,7 @@ class PrimaryKeyMapper implements IPrimaryKeyMapper
      */
     public function clear()
     {
-        // TODO: Implement clear() method.
+        return $this->db->query('DELETE FROM mapping');
     }
 
     /**
@@ -77,6 +102,6 @@ class PrimaryKeyMapper implements IPrimaryKeyMapper
      */
     public function gc()
     {
-        // TODO: Implement gc() method.
+        return true;
     }
 }
diff --git a/src/Mapper/Product.php b/src/Mapper/Product.php
new file mode 100644
index 0000000000000000000000000000000000000000..c64feab1a4035873e39271dfef6d40891b756782
--- /dev/null
+++ b/src/Mapper/Product.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class Product extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Mapper/Specific.php b/src/Mapper/Specific.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab33ab720a280beed816befcd1e3c5c167701228
--- /dev/null
+++ b/src/Mapper/Specific.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Controller
+ */
+
+namespace jtl\Connector\Example\Mapper;
+
+class Specific extends DataMapper
+{
+
+}
\ No newline at end of file
diff --git a/src/Utility/Mmc.php b/src/Utility/Mmc.php
new file mode 100644
index 0000000000000000000000000000000000000000..556907da2bc47a772dbbe0142bb4f621724d73a8
--- /dev/null
+++ b/src/Utility/Mmc.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * @copyright 2010-2013 JTL-Software GmbH
+ * @package jtl\Connector\Example\Utility
+ */
+
+namespace jtl\Connector\Example\Utility;
+
+/**
+ * Model Mapper Controller Class
+ */
+final class Mmc
+{
+    const NAMESPACE_MODEL = "\\jtl\\Connector\\Model\\";
+    const NAMESPACE_MAPPER = "\\jtl\\Connector\\Example\\Mapper\\";
+    const NAMESPACE_CONTROLLER = "\\jtl\\Connector\\Example\\Controller\\";
+
+    private function __construct()
+    {
+    }
+
+    /**
+     * Model Getter
+     *
+     * @param string $class
+     * @param boolean $useNamespace
+     * @throws \Exception
+     * @return string|mixed
+     */
+    public static function getModel($class, $useNamespace = false)
+    {
+        if (class_exists(self::NAMESPACE_MODEL . $class)) {
+            if ($useNamespace) {
+                return self::NAMESPACE_MODEL . $class;
+            } else {
+                $class = self::NAMESPACE_MODEL . $class;
+
+                return new $class();
+            }
+        }
+
+        throw new \Exception("Class '" . self::NAMESPACE_MODEL . $class . "' not found");
+    }
+
+    /**
+     * Mapper Getter
+     *
+     * @param string $class
+     * @param boolean $useNamespace
+     * @throws \Exception
+     * @return string|mixed
+     */
+    public static function getMapper($class, $useNamespace = false)
+    {
+        if (class_exists(self::NAMESPACE_MAPPER . $class)) {
+            if ($useNamespace) {
+                return self::NAMESPACE_MAPPER . $class;
+            } else {
+                $class = self::NAMESPACE_MAPPER . $class;
+
+                return $class::getInstance();
+            }
+        }
+
+        throw new \Exception("Mapper '" . self::NAMESPACE_MAPPER . $class . "' not found");
+    }
+
+    /**
+     * Controller Getter
+     *
+     * @param string $class
+     * @param boolean $useNamespace
+     * @throws \Exception
+     * @return string|mixed
+     */
+    public static function getController($class, $useNamespace = false)
+    {
+        if (class_exists(self::NAMESPACE_CONTROLLER . $class)) {
+            if ($useNamespace) {
+                return self::NAMESPACE_CONTROLLER . $class;
+            } else {
+                $class = self::NAMESPACE_CONTROLLER . $class;
+
+                return $class::getInstance();
+            }
+        }
+
+        throw new \Exception("Controller '" . self::NAMESPACE_CONTROLLER . $class . "' not found");
+    }
+}