diff --git a/include/ajax.content.php b/include/ajax.content.php
index f535d3c2dd745b498c005fbddeb3c8d44ca152c7..b7c0700f27775e780467fef361bdac466835e351 100644
--- a/include/ajax.content.php
+++ b/include/ajax.content.php
@@ -138,14 +138,12 @@ class ContentAjaxAPI extends AjaxController {
         $content = Page::lookup($id, $lang);
 
         $langs = $cfg->getSecondaryLanguages();
-        $tags = array(
-            $content->getTranslateTag('body') => 'body',
-            $content->getTranslateTag('title') => 'title',
-        );
-        $translations = CustomDataTranslation::allTranslations(
-            array_keys($tags), 'article');
+        $tag = $content->getTranslateTag('title:body');
+        $translations = CustomDataTranslation::allTranslations($tag, 'article');
         foreach ($translations as $t) {
-            $info[$tags[$t->object_hash]][$t->lang] = $t->text;
+            list($title, $body) = explode("\x04", $t->text);
+            $info['title'][$t->lang] = $title;
+            $info['body'][$t->lang] = $body;
         }
 
         include STAFFINC_DIR . 'templates/content-manage.tmpl.php';
diff --git a/include/class.page.php b/include/class.page.php
index d39c39ab8f23406024e22ba619fb8ebee81eda84..5bf1e7b4e6b0cb54c0dbb8828024225375594b5b 100644
--- a/include/class.page.php
+++ b/include/class.page.php
@@ -82,21 +82,20 @@ class Page {
 
     function _fetchTranslation($lang=false) {
         if (!isset($this->_local) || $lang) {
-            $tags = array(
-                $this->getTranslateTag('body'),
-                $this->getTranslateTag('article'),
-            );
-            if (!$lang)
-                $lang = Internationalization::getCurrentLanguage();
-            $this->_local = CustomDataTranslation::allTranslations($tags, 'article', $lang);
+            $tag = $this->getTranslateTag('title:body');
+            $this->_local = CustomDataTranslation::allTranslations($tag, 'article', $lang);
         }
         return $this->_local;
     }
     function _getLocal($what, $lang=false) {
-        $tag = $this->getTranslateTag($what);
-        foreach ($this->_fetchTranslation($lang) as $t)
-            if ($tag == $t->object_hash)
-                return $t->text;
+        if (!$lang)
+            $lang = Internationalization::getCurrentLanguage();
+        foreach ($this->_fetchTranslation($lang) as $t) {
+            if ($lang == $t->lang) {
+                list($title, $body) = explode("\x04", $t->text, 2);
+                return $what == 'body' ? $body : $title;
+            }
+        }
 
         return $this->ht[$what];
     }
@@ -324,45 +323,44 @@ class Page {
     function saveTranslations($vars, &$errors) {
         global $thisstaff;
 
-        $tags = array(
-            'body' => $this->getTranslateTag('body'),
-            'title' => $this->getTranslateTag('title'),
-            $this->getTranslateTag('body') => 'body',
-            $this->getTranslateTag('title') => 'title',
-        );
-        $translations = CustomDataTranslation::allTranslations(array_values($tags), 'article');
+        $tag = $this->getTranslateTag('title:body');
+        $translations = CustomDataTranslation::allTranslations($tag, 'article');
         foreach ($translations as $t) {
-            $content = @$vars['trans'][$t->lang][$tags[$t->object_hash]];
-            if (!$content)
+            $title = @$vars['trans'][$t->lang]['title'];
+            $body = @$vars['trans'][$t->lang]['body'];
+            if (!$title && !$body)
                 continue;
-            $content = Format::sanitize($content);
             // Content is not new and shouldn't be added below
-            unset($vars['trans'][$t->lang][$tags[$t->object_hash]]);
+            unset($vars['trans'][$t->lang]['title']);
+            unset($vars['trans'][$t->lang]['body']);
+            $content = $title . "\x04" . Format::sanitize($body);
             if ($content == $t->text)
                 continue;
+
             $t->text = $content;
             $t->agent_id = $thisstaff->getId();
+            $t->updated = SqlFunction::NOW();
             if (!$t->save())
                 return false;
         }
         // New translations (?)
         foreach ($vars['trans'] as $lang=>$parts) {
-            foreach ($parts as $tag=>$content) {
-                $content = Format::sanitize($content);
-                if (!$content || !isset($tags[$tag]))
-                    continue;
-                $t = CustomDataTranslation::create(array(
-                    'type'      => 'article',
-                    'object_hash' => $tags[$tag],
-                    'lang'      => $lang,
-                    'text'      => $content,
-                    'revision'  => 1,
-                    'agent_id'  => $thisstaff->getId(),
-                    'updated'   => SqlFunction::NOW(),
-                ));
-                if (!$t->save())
-                    return false;
-            }
+            $title = @$parts['title'];
+            $body = @$parts['body'];
+            $content = $title . "\x04" . Format::sanitize($body);
+            if ($content == "\x04")
+                continue;
+            $t = CustomDataTranslation::create(array(
+                'type'      => 'article',
+                'object_hash' => $tag,
+                'lang'      => $lang,
+                'text'      => $content,
+                'revision'  => 1,
+                'agent_id'  => $thisstaff->getId(),
+                'updated'   => SqlFunction::NOW(),
+            ));
+            if (!$t->save())
+                return false;
         }
         return true;
     }