diff --git a/acptemplate/messageLog.tpl b/acptemplate/messageLog.tpl
new file mode 100644
index 0000000..97c6341
--- /dev/null
+++ b/acptemplate/messageLog.tpl
@@ -0,0 +1,77 @@
+{include file='header' pageTitle='chat.acp.log.title'}
+
+
+ {lang}{@$pageTitle}{/lang}
+
+
+
+
+{if $messages|count == 0}
+ {if $errorField === ""}
+ {lang}wcf.global.noItems{/lang}
+ {/if}
+{else}
+
+
+ {lang}chat.acp.log.title{/lang} {#$messages|count}
+
+
+
+
+
+ {lang}wcf.global.objectID{/lang} |
+ {lang}chat.general.time{/lang} |
+ {lang}wcf.user.username{/lang} |
+ {lang}chat.acp.log.message{/lang} |
+
+
+
+
+ {foreach from=$messages item='message'}
+
+ {$message->messageID} |
+ {$message->time|date:'H:i:s'} |
+ {@$message->getUserProfile()->getAvatar()->getImageTag(24)} |
+ {$message->username} |
+ {@$message->getFormattedMessage('text/simplified-html')} |
+
+ {/foreach}
+
+
+
+{/if}
+
+{include file='footer'}
diff --git a/file/lib/acp/page/MessageLogPage.class.php b/file/lib/acp/page/MessageLogPage.class.php
new file mode 100644
index 0000000..ccfc254
--- /dev/null
+++ b/file/lib/acp/page/MessageLogPage.class.php
@@ -0,0 +1,144 @@
+
+ * @package be.bastelstu.chat
+ * @subpackage acp.page
+ */
+class MessageLogPage extends \wcf\page\AbstractPage {
+ /**
+ * @see \wcf\page\AbstractPage::$activeMenuItem
+ */
+ public $activeMenuItem = 'chat.acp.menu.link.log';
+
+ /**
+ * @see \wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array(
+ 'mod.chat.canReadLog'
+ );
+
+ /**
+ * name of error field
+ * @var string
+ */
+ public $errorField = '';
+
+ /**
+ * error type
+ * @var string
+ */
+ public $errorType = '';
+
+ /**
+ * messages for the given day
+ *
+ * @var array<\chat\data\message\Message>
+ */
+ public $messages = array();
+
+ /**
+ * given roomID
+ *
+ * @var integer
+ */
+ public $roomID = 0;
+
+ /**
+ * given date
+ *
+ * @var integer
+ */
+ public $date = 0;
+
+ /**
+ * active room
+ *
+ * @var \chat\data\room\Room
+ */
+ public $room = null;
+
+ /**
+ * available rooms
+ *
+ * @var array<\chat\data\room\Room>
+ */
+ public $rooms = array();
+
+ /**
+ * @see \wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ try {
+ if($this->date > TIME_NOW) {
+ throw new \wcf\system\exception\UserInputException('date', 'inFuture');
+ }
+ } catch(\wcf\system\exception\UserInputException $e) {
+ $this->errorField = $e->getField();
+ $this->errorType = $e->getType();
+ return;
+ }
+
+ try {
+ if($this->date < strtotime('today 00:00:00 -'.ceil(CHAT_LOG_ARCHIVETIME / 1440).'day')) {
+ throw new \wcf\system\exception\UserInputException('date', 'tooLongAgo');
+ }
+ } catch(\wcf\system\exception\UserInputException $e) {
+ $this->errorField = $e->getField();
+ $this->errorType = $e->getType();
+ return;
+ }
+
+ $this->messages = \chat\data\message\ViewableMessageList::getMessagesBetween($this->room, $this->date, $this->date + 86399);
+ }
+
+ /**
+ * @see \wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ $this->rooms = \chat\data\room\RoomCache::getInstance()->getRooms();
+
+ foreach($this->rooms as $id => $room) {
+ if (!$room->permanent)
+ unset($this->rooms[$key]);
+ }
+
+ if (isset($_REQUEST['id'])) $this->roomID = intval($_REQUEST['id']);
+ else $this->roomID = reset($this->rooms)->roomID;
+
+ $this->room = \chat\data\room\RoomCache::getInstance()->getRoom($this->roomID);
+
+ if (!$this->room) throw new \wcf\system\exception\IllegalLinkException();
+
+ if (isset($_REQUEST['date'])) $date = $_REQUEST['date'].' 00:00:00';
+ else $date = 'today 00:00:00';
+ $this->date = @strtotime($date);
+ if ($this->date === false) throw new \wcf\system\exception\IllegalLinkException();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'messages' => $this->messages,
+ 'rooms' => $this->rooms,
+ 'room' => $this->room,
+ 'date' => $this->date,
+ 'errorField' => $this->errorField,
+ 'errorType' => $this->errorType
+ ));
+ }
+}