diff --git a/html/fragments.html b/html/fragments.html
index e167cce..be10cea 100644
--- a/html/fragments.html
+++ b/html/fragments.html
@@ -64,20 +64,7 @@
 
 ¤¤ product_page ¤¤
 <div id="product-table">
-  <form id="product-create"
-        action="./"
-        method="get">
-    <input type="hidden"
-           name="page"
-           value="products" />
-    <input type="hidden"
-           name="action"
-           value="new" />
-    <button>
-      Ny artikel
-    </button>
     ¤product_table¤
-  </form>
 </div>
 
 ¤¤ product_table ¤¤
@@ -125,9 +112,6 @@
     <datalist id="template_suggest"></datalist>
     <input type="hidden"
            name="page"
-           value="products" />
-    <input type="hidden"
-           name="action"
            value="new" />
     <input onFocus="JavaScript:suggest(this, 'template')"
            list="template_suggest"
diff --git a/include/NewPage.php b/include/NewPage.php
new file mode 100644
index 0000000..ffe6a48
--- /dev/null
+++ b/include/NewPage.php
@@ -0,0 +1,56 @@
+<?php
+class NewPage extends Page {
+    private $template = null;
+    
+    public function __construct() {
+        parent::__construct();
+        if(isset($_GET['template'])) {
+            $template = $_GET['template'];
+            if($template) {
+                try {
+                    $this->template = new Template($template, 'name');
+                } catch(Exception $e) {
+                    $this->template = null;
+                    $this->error = 'Det finns ingen mall med det namnet.';
+                }
+            }
+        }
+    }
+    
+    protected function render_body() {
+        print($this->build_new_page());
+    }
+    
+    private function build_new_page() {
+        $template = '';
+        $fields = '';
+        $tags = '';
+        if($this->template) {
+            $template = $this->template->get_name();
+            foreach($this->template->get_fields() as $field) {
+                $fields .= replace(array('name' => ucfirst($field),
+                                         'key' => $field,
+                                         'value' => ''),
+                                   $this->fragments['info_item']);
+            }
+            foreach($this->template->get_tags() as $tag) {
+                $tags .= replace(array('tag' => ucfirst($tag)),
+                                 $this->fragments['tag']);
+            }
+        }
+        $out = replace(array('template' => $template),
+                       $this->fragments['template_management']);
+        $out .= replace(array('id' => '',
+                              'name' => '',
+                              'brand' => '',
+                              'serial' => '',
+                              'invoice' => '',
+                              'tags' => $tags,
+                              'info' => $fields,
+                              'label' => '',
+                              'hidden' => 'hidden'),
+                        $this->fragments['product_details']);
+        return $out;
+    }
+}
+?>
diff --git a/include/Page.php b/include/Page.php
index 11149aa..b783547 100644
--- a/include/Page.php
+++ b/include/Page.php
@@ -9,6 +9,7 @@ abstract class Page extends Responder {
     protected $menuitems = array('checkout' => 'Låna',
                                  'return' => 'Lämna',
                                  'products' => 'Artiklar',
+                                 'new' => 'Ny artikel',
                                  'users' => 'Låntagare',
                                  'inventory' => 'Inventera',
                                  'history' => 'Historik',
@@ -167,7 +168,7 @@ abstract class Page extends Responder {
             $rows .= replace(array('status' => $status,
                                    'item_link' => $prodlink,
                                    'serial' => $product->get_serial(),
-                                   'note' => $note,),
+                                   'note' => $note),
                              $this->fragments['product_row']);
         }
         return replace(array('rows' => $rows),
diff --git a/include/Product.php b/include/Product.php
index 73327ca..7c0a0e6 100644
--- a/include/Product.php
+++ b/include/Product.php
@@ -1,22 +1,22 @@
 <?php
 class Product {
-    private $id;
-    private $brand;
-    private $name;
-    private $invoice;
-    private $serial;
-    private $createtime;
-    private $discardtime;
-    private $info;
-    private $tags;
+    private $id = 0;
+    private $brand = '';
+    private $name = '';
+    private $invoice = '';
+    private $serial = '';
+    private $createtime = null;
+    private $discardtime = null;
+    private $info = array();
+    private $tags = array();
     
     public static function create_product(
         $brand,
         $name,
         $invoice,
         $serial,
-        $info,
-        $tags
+        $info = array(),
+        $tags = array()
     ) {
         $now = time();
         begin_trans();
@@ -28,15 +28,11 @@ class Product {
             bind($ins_prod, 'ssssi', $brand, $name, $invoice, $serial, $now);
             execute($ins_prod);
             $product = new Product($serial, 'serial');
-            if(is_array($info)) {
-                foreach($info as $field => $value) {
-                    $product->set_info($field, $value);
-                }
+            foreach($info as $field => $value) {
+                $product->set_info($field, $value);
             }
-            if(is_array($tags)) {
-                foreach($tags as $tag) {
-                    $product->add_tag($tag);
-                }
+            foreach($tags as $tag) {
+                $product->add_tag($tag);
             }
             commit_trans();
             return $product;
@@ -50,12 +46,12 @@ class Product {
         $search = null;
         switch($type) {
             case 'id':
-                $search = prepare('select * from `product`
+                $search = prepare('select `id` from `product`
                                    where `id`=?');
                 bind($search, 'i', $clue);
                 break;
             case 'serial':
-                $search = prepare('select * from `product`
+                $search = prepare('select `id` from `product`
                                    where `serial`=?');
                 bind($search, 's', $clue);
                 break;
@@ -68,13 +64,9 @@ class Product {
             throw new Exception('Product does not exist.');
         }
         $this->id = $result['id'];
-        $this->brand = $result['brand'];
-        $this->name = $result['name'];
-        $this->invoice = $result['invoice'];
-        $this->serial = $result['serial'];
-        #$this->update_fields();
-        #$this->update_info();
-        #$this->update_tags();
+        $this->update_fields();
+        $this->update_info();
+        $this->update_tags();
     }
     
     private function update_fields() {
@@ -250,9 +242,6 @@ class Product {
     }
     
     public function get_info() {
-        if($this->info === null) {
-            $this->update_info();
-        }
         return $this->info;
     }
     
@@ -295,9 +284,6 @@ class Product {
     }
     
     public function get_tags() {
-        if($this->tags === null) {
-            $this->update_tags();
-        }
         return $this->tags;
     }
     
diff --git a/include/ProductPage.php b/include/ProductPage.php
index 78237a1..e385f62 100644
--- a/include/ProductPage.php
+++ b/include/ProductPage.php
@@ -1,7 +1,6 @@
 <?php
 class ProductPage extends Page {
     private $action = 'list';
-    private $template = null;
     private $product = null;
     
     public function __construct() {
@@ -9,17 +8,6 @@ class ProductPage extends Page {
         if(isset($_GET['action'])) {
             $this->action = $_GET['action'];
         }
-        if(isset($_GET['template'])) {
-            $template = $_GET['template'];
-            if($template) {
-                try {
-                    $this->template = new Template($template, 'name');
-                } catch(Exception $e) {
-                    $this->template = null;
-                    $this->error = 'Det finns ingen mall med det namnet.';
-                }
-            }
-        }
         if(isset($_GET['id'])) {
             $id = $_GET['id'];
             if($id) {
@@ -36,9 +24,6 @@ class ProductPage extends Page {
             case 'show':
                 $this->subtitle = 'Artikeldetaljer';
                 break;
-            case 'new':
-                $this->subtitle = 'Ny artikel';
-                break;
             case 'list':
                 $this->subtitle = 'Artikellista';
                 break;
@@ -55,9 +40,6 @@ class ProductPage extends Page {
             case 'show':
                 print($this->build_product_details());
                 break;
-            case 'new':
-                print($this->build_new_page());
-                break;
         }
     }
     
@@ -156,37 +138,5 @@ class ProductPage extends Page {
         return replace(array('attachments' => $items),
                        $this->fragments['attachment_list']);
     }
-
-    private function build_new_page() {
-        $template = '';
-        $fields = '';
-        $tags = '';
-        if($this->template) {
-            $template = $this->template->get_name();
-            foreach($this->template->get_fields() as $field) {
-                $fields .= replace(array('name' => ucfirst($field),
-                                         'key' => $field,
-                                         'value' => ''),
-                                   $this->fragments['info_item']);
-            }
-            foreach($this->template->get_tags() as $tag) {
-                $tags .= replace(array('tag' => ucfirst($tag)),
-                                 $this->fragments['tag']);
-            }
-        }
-        $out = replace(array('template' => $template),
-                       $this->fragments['template_management']);
-        $out .= replace(array('id' => '',
-                              'name' => '',
-                              'brand' => '',
-                              'serial' => '',
-                              'invoice' => '',
-                              'tags' => $tags,
-                              'info' => $fields,
-                              'label' => '',
-                              'hidden' => 'hidden'),
-                        $this->fragments['product_details']);
-        return $out;
-    }
 }
 ?>
diff --git a/include/functions.php b/include/functions.php
index ffb6c39..712ee91 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -85,6 +85,8 @@ function make_page($page) {
             return new SearchPage();
         case 'products':
             return new ProductPage();
+        case 'new':
+            return new NewPage();
         case 'users':
             return new UserPage();
         case 'inventory':