diff --git a/include/class.config.php b/include/class.config.php
index 7b1d16d120387cfd8c5904434c2959d4b1d97fc4..8b7dde5d8542e1e59f35bffd6a7c8021041579cc 100644
--- a/include/class.config.php
+++ b/include/class.config.php
@@ -13,6 +13,7 @@
 
     vim: expandtab sw=4 ts=4 sts=4:
 **********************************************************************/
+require_once INCLUDE_DIR . 'class.orm.php';
 
 class Config {
     var $config = array();
@@ -41,17 +42,13 @@ class Config {
 
         if (isset($_SESSION['cfg:'.$this->section]))
             $this->session = &$_SESSION['cfg:'.$this->section];
+
         $this->load();
     }
 
     function load() {
-
-        $sql='SELECT id, `key`, value, `updated` FROM '.$this->table
-            .' WHERE `'.$this->section_column.'` = '.db_input($this->section);
-
-        if(($res=db_query($sql)) && db_num_rows($res))
-            while ($row = db_fetch_array($res))
-                $this->config[$row['key']] = $row;
+        foreach ($this->items() as $I)
+            $this->config[$I->key] = $I;
     }
 
     function getNamespace() {
@@ -60,8 +57,8 @@ class Config {
 
     function getInfo() {
         $info = $this->defaults;
-        foreach ($this->config as $key=>$setting)
-            $info[$key] = $setting['value'];
+        foreach ($this->config as $key=>$item)
+            $info[$key] = $item->value;
         return $info;
     }
 
@@ -69,7 +66,7 @@ class Config {
         if (isset($this->session) && isset($this->session[$key]))
             return $this->session[$key];
         elseif (isset($this->config[$key]))
-            return $this->config[$key]['value'];
+            return $this->config[$key]->value;
         elseif (isset($this->defaults[$key]))
             return $this->defaults[$key];
 
@@ -95,20 +92,20 @@ class Config {
 
     function lastModified($key) {
         if (isset($this->config[$key]))
-            return $this->config[$key]['updated'];
-        else
-            return false;
+            return $this->config[$key]->updated;
+
+        return false;
     }
 
     function create($key, $value) {
-        $sql = 'INSERT INTO '.$this->table
-            .' SET `'.$this->section_column.'`='.db_input($this->section)
-            .', `key`='.db_input($key)
-            .', value='.db_input($value);
-        if (!db_query($sql) || !($id=db_insert_id()))
+        $item = ConfigItem::create([
+            $this->section_column => $this->section,
+            'key' => $key,
+            'value' => $value,
+        ]);
+        if (!$item->save())
             return false;
 
-        $this->config[$key] = array('key'=>$key, 'value'=>$value, 'id'=>$id);
         return true;
     }
 
@@ -118,17 +115,9 @@ class Config {
         elseif (!isset($this->config[$key]))
             return $this->create($key, $value);
 
-        $setting = &$this->config[$key];
-        if ($setting['value'] == $value)
-            return true;
-
-        if (!db_query('UPDATE '.$this->table.' SET updated=NOW(), value='
-                .db_input($value).' WHERE id='.db_input($setting['id'])))
-            return false;
-
-        $setting['value'] = $value;
-        $setting['updated'] = Misc::dbtime();
-        return true;
+        $item = $this->config[$key];
+        $item->value = $value;
+        return $item->save();
     }
 
     function updateAll($updates) {
@@ -139,12 +128,36 @@ class Config {
     }
 
     function destroy() {
+        unset($this->session);
+        return $this->items()->delete();
+    }
 
-        $sql='DELETE FROM '.$this->table
-            .' WHERE `'.$this->section_column.'` = '.db_input($this->section);
+    function items() {
+        static $items;
 
-        db_query($sql);
-        unset($this->session);
+        if (!isset($items))
+            $items = ConfigItem::items($this->section, $this->section_column);
+
+        return $items;
+    }
+}
+
+class ConfigItem
+extends VerySimpleModel {
+    static $meta = array(
+        'table' => CONFIG_TABLE,
+        'pk' => array('id'),
+    );
+
+    static function items($namespace, $column='namespace') {
+        return static::objects()
+            ->filter([$column => $namespace]);
+    }
+
+    function save($refetch=false) {
+        if ($this->dirty)
+            $this->updated = SqlFunction::NOW();
+        return parent::save($this->dirty || $refetch);
     }
 }
 
@@ -192,7 +205,7 @@ class OsticketConfig extends Config {
             $sql='SELECT * FROM '.$this->table.' WHERE id = 1';
             if (($res=db_query($sql)) && db_num_rows($res))
                 foreach (db_fetch_array($res) as $key=>$value)
-                    $this->config[$key] = array('value'=>$value);
+                    $this->config[$key] = new ConfigItem(array('value'=>$value));
         }
 
         return true;