diff --git a/app_homepage/__pycache__/models.cpython-37.pyc b/app_homepage/__pycache__/models.cpython-37.pyc
index 3869d445de8560a569c1afb19fa0425663d192b1..03d012f4a9ceb0c1e8cbc9a817275a58a0fdd430 100644
Binary files a/app_homepage/__pycache__/models.cpython-37.pyc and b/app_homepage/__pycache__/models.cpython-37.pyc differ
diff --git a/app_homepage/__pycache__/tests.cpython-37.pyc b/app_homepage/__pycache__/tests.cpython-37.pyc
index dd513e03a93317ad2baee47f1f210ac2fab1dbbe..3af5b760dc98e6f7b9a54d5cb312ba6336d842af 100644
Binary files a/app_homepage/__pycache__/tests.cpython-37.pyc and b/app_homepage/__pycache__/tests.cpython-37.pyc differ
diff --git a/app_homepage/migrations/0001_initial.py b/app_homepage/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..d1f51bd1ee363cab3b08f10a81548700391952a2
--- /dev/null
+++ b/app_homepage/migrations/0001_initial.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.1 on 2019-09-25 09:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Item',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+            ],
+        ),
+    ]
diff --git a/app_homepage/migrations/0002_item_text.py b/app_homepage/migrations/0002_item_text.py
new file mode 100644
index 0000000000000000000000000000000000000000..02183b85d7d41369b1f189e0e4c0d3b8525637cd
--- /dev/null
+++ b/app_homepage/migrations/0002_item_text.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.1 on 2019-09-25 09:17
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('app_homepage', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='item',
+            name='text',
+            field=models.TextField(default=''),
+        ),
+    ]
diff --git a/app_homepage/migrations/__pycache__/0001_initial.cpython-37.pyc b/app_homepage/migrations/__pycache__/0001_initial.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e5acc0a56ef65389525d30d7e52d9f699069fd1b
Binary files /dev/null and b/app_homepage/migrations/__pycache__/0001_initial.cpython-37.pyc differ
diff --git a/app_homepage/migrations/__pycache__/0002_item_text.cpython-37.pyc b/app_homepage/migrations/__pycache__/0002_item_text.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e56f938c3ab9594f126b02e8c5b9e6d8d64656fe
Binary files /dev/null and b/app_homepage/migrations/__pycache__/0002_item_text.cpython-37.pyc differ
diff --git a/app_homepage/models.py b/app_homepage/models.py
index 71a836239075aa6e6e4ecb700e9c42c95c022d91..23391689c46e637c88b2f487e5a43f44dbe3faa8 100644
--- a/app_homepage/models.py
+++ b/app_homepage/models.py
@@ -1,3 +1,4 @@
 from django.db import models
 
-# Create your models here.
+class Item(models.Model):
+    text = models.TextField(default = '')
diff --git a/app_homepage/tests.py b/app_homepage/tests.py
index f798f5def2e6bd9bf1f75feebc594c3b6f065df4..7e88a004a2c69cb68b524ff39b91d10d685a0d5b 100644
--- a/app_homepage/tests.py
+++ b/app_homepage/tests.py
@@ -2,6 +2,7 @@ from django.test import TestCase
 from django.urls import resolve
 from django.http import HttpRequest
 from .views import home_page
+from .models import Item
 from django.template.loader import render_to_string
 
 # Create your tests here.
@@ -15,4 +16,23 @@ class HomePageTest(TestCase):
 		response = self.client.post('/', data={'item_text':'A new list item'})
 		self.assertIn('A new list item', response.content.decode())
 		self.assertTemplateUsed(response, 'app/home.html')
+
+class ItemModelTest(TestCase):
+
+    def test_saving_and_retrieving_items(self):
+        first_item = Item()
+        first_item.text = 'The first (ever) list item'
+        first_item.save()
+
+        second_item = Item()
+        second_item.text = 'Item the second'
+        second_item.save()
+
+        saved_items = Item.objects.all()
+        self.assertEqual(saved_items.count(), 2)
+
+        first_saved_item = saved_items[0]
+        second_saved_item = saved_items[1]
+        self.assertEqual(first_saved_item.text, 'The first (ever) list item')
+        self.assertEqual(second_saved_item.text, 'Item the second')
 	
\ No newline at end of file
diff --git a/db.sqlite3 b/db.sqlite3
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..84a97d59846267e90d4d32eb9caeb5944b75d86f 100644
Binary files a/db.sqlite3 and b/db.sqlite3 differ
diff --git a/functional_test.py b/functional_test.py
index 82f6057d270fe8d90819ad5673487524b925497a..c6268c40c1ea0305f3c4f5925d7fcf173d61e28e 100644
--- a/functional_test.py
+++ b/functional_test.py
@@ -11,6 +11,11 @@ class NewVisitorTest(unittest.TestCase):
     def tearDown(self):
         self.browser.quit()
 
+    def check_for_row_in_list_table(self, row_text):
+        table = self.browser.find_element_by_id('id_list_table')
+        rows = table.find_elements_by_tag_name('tr')
+        self.assertIn(row_text, [row_text for row in rows])
+
     def test_can_start_a_list_and_retrieve_it_later(self):
         # Edith has heard about a cool new online to-do app. She goes
         # to check out its homepage
@@ -21,6 +26,11 @@ class NewVisitorTest(unittest.TestCase):
         header_text = self.browser.find_element_by_tag_name('h1').text  
         self.assertIn('To-Do', header_text)
 
+        inputbox = self.browser.find_element_by_id('id_new_item')
+        inputbox.send_keys(Keys.ENTER)
+        time.sleep(1)
+        # The page updates again, and now shows both items on her list
+        self.check_for_row_in_list_table('1: Buy peacock feathers')
         # She is invited to enter a to-do item straight away
         # There is still a text box inviting her to add another item. She
         # enters "Use peacock feathers to make a fly" (Edith is very
@@ -31,13 +41,17 @@ class NewVisitorTest(unittest.TestCase):
         time.sleep(1)
 
         # The page updates again, and now shows both items on her list
-        table = self.browser.find_element_by_id('id_list_table')
-        rows = table.find_elements_by_tag_name('tr')
-        self.assertIn('1: Buy peacock feathers', [row.text for row in rows])
-        self.assertIn(
-            '2: Use peacock feathers to make a fly',
-             [row.text for row in rows]
-        )
+        self.check_for_row_in_list_table('1: Buy peacock feathers')
+        self.check_for_row_in_list_table('2: Use peacock feathers to make a fly')
+
+        # The page updates again, and now shows both items on her list
+        # table = self.browser.find_element_by_id('id_list_table')
+        # rows = table.find_elements_by_tag_name('tr')
+        # self.assertIn('1: Buy peacock feathers', [row.text for row in rows])
+        # self.assertIn(
+        #     '2: Use peacock feathers to make a fly',
+        #      [row.text for row in rows]
+        # )
 
         # Edith wonders whether the site will remember her list. Then she sees
         # that the site has generated a unique URL for her -- there is some
diff --git a/geckodriver.log b/geckodriver.log
index 5f7171acbb73c06ed4a3c3eebacbffc0ca037bb0..50662d2aa1603896dc837fb2b02a50798505001a 100644
--- a/geckodriver.log
+++ b/geckodriver.log
@@ -520,3 +520,61 @@ JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't fin
 [Child 11912, Chrome_ChJavaScript error: resource://gre/modules/ExtensionSettingsStore.jsm, line 117: Error: The ExtensionSettingsStore was accessed before the initialize promise resolved.
 console.error: (new Error("Transaction canceled due to a closed connection.", "resource://gre/modules/Sqlite.jsm", 613))
 console.error: (new Error("Transaction canceled due to a closed connection.", "resource://gre/modules/Sqlite.jsm", 613))
+1569290323575	mozrunner::runner	INFO	Running command: "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\\Users\\YUMNAP~1\\AppData\\Local\\Temp\\rust_mozprofileYP5ql9"
+1569290324406	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons
+1569290324406	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: telemetry
+1569290324406	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/
+1569290324407	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader*
+JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't find profile directory.
+1569290327278	Marionette	INFO	Listening on port 56936
+1569290327401	Marionette	WARN	TLS certificate errors will be ignored for this session
+1569290328922	Marionette	INFO	Stopped listening on port 56936
+JavaScript error: resource://activity-stream/lib/ActivityStreamPrefs.jsm, line 27: NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIPrefBranch.removeObserver]
+[Child 19360, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 19360, Chrome_ChildThread] WARNING[Child 6428, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 6428, Chrome_ChildThread] WARNING: pipe e[Parent 7632, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 13208, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 13208, Chrome_C
+###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
+
+[G
+###!!! [Child][MessageChannel::SendAndWait] Error: Channel error: cannot send/recv
+
+1569290599845	mozrunner::runner	INFO	Running command: "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\\Users\\YUMNAP~1\\AppData\\Local\\Temp\\rust_mozprofile3vJRSq"
+1569290600768	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons
+1569290600768	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: telemetry
+1569290600768	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/
+1569290600768	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader*
+JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't find profile directory.
+1569290609517	Marionette	INFO	Listening on port 57003
+1569290609684	Marionette	WARN	TLS certificate errors will be ignored for this session
+1569290610259	Marionette	INFO	Stopped listening on port 57003
+JavaScript error: resource://activity-stream/lib/ActivityStreamPrefs.jsm, line 27: NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIPrefBranch.removeObserver]
+[Child 6[Parent 18116, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 21176, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 21176, Chrome_JavaScript error: resource://gre/modules/ExtensionSettingsStore.jsm, line 117: Error: The ExtensionSettingsStore was accessed before the initialize promise resolved.
+JavaScript error: resource://gre/modules/Sqlite.jsm, line 912: Error: Connection is not open.
+
+###!!! [Parent][DispatchAsyncMessage] Error: PBackgroundIDBFactory::Msg_PBackgroundIDBFactoryRequestConstructor Value error: message was deserialized, but contained an illegal value
+
+[GPU 9480, Chrome
+###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
+
+_
+###!!! [Child][MessageChannel::SendAndWait] Error: Channel error: cannot send/recv
+
+1569290666739	mozrunner::runner	INFO	Running command: "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\\Users\\YUMNAP~1\\AppData\\Local\\Temp\\rust_mozprofileKddsnv"
+1569290667493	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons
+1569290667493	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: telemetry
+1569290667493	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/
+1569290667493	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader*
+JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't find profile directory.
+1569290670921	Marionette	INFO	Listening on port 57043
+1569290671052	Marionette	WARN	TLS certificate errors will be ignored for this session
+1569290673569	Marionette	INFO	Stopped listening on port 57043
+[Child 18832, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 18832, Ch[Child 12040, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 12040, Chrome_ChildThread] WARNIJavaScript error: resource://gre/modules/UrlClassifierListManager.jsm, line 680: TypeError: this.tablesData[table] is undefined
+[Parent 17632, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 18196, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
+[Child 18196, Chrome_Child
\ No newline at end of file