[med-svn] [openmolar] 01/01: Imported Upstream version 0.6.0

Dmitry Smirnov onlyjob at moszumanska.debian.org
Fri Jul 4 06:53:46 UTC 2014


This is an automated email from the git hooks/post-receive script.

onlyjob pushed a commit to branch upstream
in repository openmolar.

commit cbb542a (upstream)
Author: Dmitry Smirnov <onlyjob at member.fsf.org>
Date:   Fri Jul 4 06:48:09 2014

    Imported Upstream version 0.6.0
---
 .gitignore                                         |    5 -
 MANIFEST                                           |  470 ++
 PKG-INFO                                           |   10 +
 README.md                                          |    6 -
 TODO.txt                                           |  126 -
 bin/openmolar.1                                    |   22 +-
 build_scripts/Makefile                             |  118 -
 build_scripts/code_cleaner.py                      |  228 -
 build_scripts/get_git_branch.py                    |   60 -
 build_scripts/om_pyuic4.py                         |  160 -
 setup.py                                           |    1 -
 src/openmolar/GPLv3.txt                            |  674 --
 src/openmolar/__init__.py                          |    1 +
 src/openmolar/backports/advisor.py                 |  288 +
 src/openmolar/connect.py                           |  202 +-
 src/openmolar/create_db.py                         |  142 +
 src/openmolar/createdemodatabase.py                |   87 -
 src/openmolar/dbtools/accounts.py                  |   17 +-
 src/openmolar/dbtools/appointments.py              |  135 +-
 src/openmolar/dbtools/brief_patient.py             |    2 +-
 src/openmolar/dbtools/cashbook.py                  |   13 +-
 src/openmolar/dbtools/courseHistory.py             |  401 +-
 src/openmolar/dbtools/daybook.py                   |   46 +
 src/openmolar/dbtools/db_patients.py               |    2 +-
 src/openmolar/dbtools/db_settings.py               |  326 +-
 src/openmolar/dbtools/distinct_statuses.py         |    8 +-
 src/openmolar/dbtools/estimate_synopsis.py         |    6 +-
 src/openmolar/dbtools/estimates.py                 |  252 +
 src/openmolar/dbtools/estimatesHistory.py          |   93 +-
 src/openmolar/dbtools/extend_books.py              |   65 -
 src/openmolar/dbtools/families.py                  |   21 +-
 src/openmolar/dbtools/feescales.py                 |  113 +-
 src/openmolar/dbtools/patient_class.py             |  235 +-
 src/openmolar/dbtools/patient_write_changes.py     |  533 +-
 src/openmolar/dbtools/paymentHistory.py            |    5 +-
 src/openmolar/dbtools/queries.py                   |   46 +-
 src/openmolar/dbtools/recall.py                    |   20 +-
 src/openmolar/dbtools/referral.py                  |  190 +
 src/openmolar/dbtools/schema_version.py            |   40 +-
 src/openmolar/dbtools/search.py                    |  100 +-
 src/openmolar/dbtools/treatment_course.py          |  275 +-
 src/openmolar/dbtools/writeNewPatient.py           |    6 +-
 src/openmolar/firstRun.py                          |  465 --
 .../images/thumbs/Screenshot-Patient Finder.png    |  Bin 16324 -> 0 bytes
 src/openmolar/html/images/thumbs/Screenshot.png    |  Bin 25066 -> 0 bytes
 src/openmolar/html/images/thumbs/altered_db.png    |  Bin 23820 -> 0 bytes
 .../html/images/thumbs/appointment_diff_dent.png   |  Bin 7151 -> 0 bytes
 src/openmolar/html/images/thumbs/appt_ov.png       |  Bin 24423 -> 0 bytes
 src/openmolar/html/images/thumbs/appts.png         |  Bin 23867 -> 0 bytes
 .../images/thumbs/complete_tooth_treatment.png     |  Bin 12623 -> 0 bytes
 .../html/images/thumbs/complete_treatment.png      |  Bin 14804 -> 0 bytes
 src/openmolar/html/images/thumbs/confirm_appt.png  |  Bin 5835 -> 0 bytes
 src/openmolar/html/images/thumbs/cpitn.png         |  Bin 6372 -> 0 bytes
 src/openmolar/html/images/thumbs/crown_choice.png  |  Bin 6975 -> 0 bytes
 .../images/thumbs/dayllis_printing_wiizard.png     |  Bin 15202 -> 0 bytes
 .../html/images/thumbs/edit_patient_details.png    |  Bin 15131 -> 0 bytes
 .../html/images/thumbs/enter_appointment.png       |  Bin 8479 -> 0 bytes
 .../html/images/thumbs/estimates_plan.png          |  Bin 12609 -> 0 bytes
 src/openmolar/html/images/thumbs/exam_wizard.png   |  Bin 15716 -> 0 bytes
 src/openmolar/html/images/thumbs/exit_record.png   |  Bin 10147 -> 0 bytes
 src/openmolar/html/images/thumbs/feescales.png     |  Bin 12000 -> 0 bytes
 src/openmolar/html/images/thumbs/find.png          |  Bin 16296 -> 0 bytes
 .../html/images/thumbs/hygenist_wizard.png         |  Bin 20093 -> 0 bytes
 src/openmolar/html/images/thumbs/letter_review.png |  Bin 12408 -> 0 bytes
 .../html/images/thumbs/letter_text_entry.png       |  Bin 5585 -> 0 bytes
 .../html/images/thumbs/make_appointment.png        |  Bin 15873 -> 0 bytes
 .../html/images/thumbs/make_appointment_any.png    |  Bin 20575 -> 0 bytes
 src/openmolar/html/images/thumbs/newPt.png         |  Bin 13821 -> 0 bytes
 src/openmolar/html/images/thumbs/newlogo.png       |  Bin 17370 -> 0 bytes
 src/openmolar/html/images/thumbs/notes.png         |  Bin 18490 -> 0 bytes
 src/openmolar/html/images/thumbs/perio_charts.png  |  Bin 27081 -> 0 bytes
 .../html/images/thumbs/place_appointment.png       |  Bin 9694 -> 0 bytes
 src/openmolar/html/images/thumbs/plan_treament.png |  Bin 9584 -> 0 bytes
 .../html/images/thumbs/plan_treatment.png          |  Bin 10535 -> 0 bytes
 src/openmolar/html/images/thumbs/reception.png     |  Bin 12647 -> 0 bytes
 .../images/thumbs/reception_welcome_screen.png     |  Bin 9852 -> 0 bytes
 src/openmolar/html/images/thumbs/startscreen.png   |  Bin 14540 -> 0 bytes
 .../html/images/thumbs/surgery_welcome.png         |  Bin 12991 -> 0 bytes
 .../html/images/thumbs/toothplan_screen.png        |  Bin 21155 -> 0 bytes
 .../html/images/thumbs/treatment_plan_page.png     |  Bin 14986 -> 0 bytes
 src/openmolar/html/images/thumbs/whats_changed.png |  Bin 10969 -> 0 bytes
 src/openmolar/locale/messages.pot                  | 7143 +++++++++++---------
 src/openmolar/main.py                              |  360 +-
 src/openmolar/ptModules/course_checker.py          |  194 +
 src/openmolar/ptModules/debug_html.py              |    2 -
 src/openmolar/ptModules/estimates.py               |   31 +-
 src/openmolar/ptModules/hidden_notes.py            |    5 +-
 src/openmolar/ptModules/patientDetails.py          |  154 +-
 src/openmolar/ptModules/perio.py                   |   79 -
 src/openmolar/ptModules/plan.py                    |   85 +-
 src/openmolar/ptModules/reception_summary.py       |    2 +-
 src/openmolar/ptModules/referral.py                |  129 -
 src/openmolar/qt-designer/activeDentStartFinish.ui |   89 -
 src/openmolar/qt-designer/addTreatment.ui          |  115 -
 src/openmolar/qt-designer/appointment_length.ui    |  137 -
 src/openmolar/qt-designer/apptOpenDay.ui           |  307 -
 src/openmolar/qt-designer/apptTools.ui             |  100 -
 src/openmolar/qt-designer/apptWizard.ui            |  103 -
 src/openmolar/qt-designer/apptWizardItem.ui        |   69 -
 src/openmolar/qt-designer/aslotEdit.ui             |  245 -
 src/openmolar/qt-designer/blockSlot.ui             |  342 -
 src/openmolar/qt-designer/block_wizard.ui          |  270 -
 src/openmolar/qt-designer/bridge_denture.ui        |  242 -
 src/openmolar/qt-designer/bulkmail_options.ui      |  179 -
 src/openmolar/qt-designer/choose_clinicians.ui     |   77 -
 src/openmolar/qt-designer/choose_language.ui       |  165 -
 src/openmolar/qt-designer/choose_tooth.ui          |   93 -
 src/openmolar/qt-designer/codeChecker.ui           |  141 -
 src/openmolar/qt-designer/completionDate.ui        |  157 -
 src/openmolar/qt-designer/customTreatment.ui       |  151 -
 src/openmolar/qt-designer/daylist_print.ui         |  203 -
 src/openmolar/qt-designer/diary_widget.ui          |  953 ---
 src/openmolar/qt-designer/editmemos.ui             |  123 -
 src/openmolar/qt-designer/enter_letter_text.ui     |   80 -
 src/openmolar/qt-designer/exam_wizard.ui           |  171 -
 src/openmolar/qt-designer/finalise_appt_time.ui    |  148 -
 src/openmolar/qt-designer/forumPost.ui             |  162 -
 src/openmolar/qt-designer/hygenist_wizard.ui       |  233 -
 src/openmolar/qt-designer/initialise.ui            |  890 ---
 src/openmolar/qt-designer/main.ui                  | 5491 ---------------
 src/openmolar/qt-designer/medhist.ui               |  362 -
 src/openmolar/qt-designer/memo_item.ui             |   62 -
 src/openmolar/qt-designer/newBPE.ui                |  309 -
 src/openmolar/qt-designer/newCourse.ui             |  146 -
 src/openmolar/qt-designer/newSetup.ui              |  686 --
 src/openmolar/qt-designer/ortho_ref_wizard.ui      |  406 --
 src/openmolar/qt-designer/patient_diary.ui         |  270 -
 src/openmolar/qt-designer/patient_finder.ui        |  319 -
 src/openmolar/qt-designer/payments.ui              |  419 --
 src/openmolar/qt-designer/permissions.ui           |   88 -
 src/openmolar/qt-designer/quick_daylist_print.ui   |  105 -
 src/openmolar/qt-designer/record_tools.ui          | 1053 ---
 src/openmolar/qt-designer/saveMemo.ui              |  152 -
 src/openmolar/qt-designer/select_patient.ui        |   73 -
 src/openmolar/qt-designer/showMemo.ui              |  107 -
 src/openmolar/qt-designer/specify_appointment.ui   |  420 --
 src/openmolar/qt-designer/staff_diary.ui           |  212 -
 src/openmolar/qt-designer/startscreen.ui           |  301 -
 src/openmolar/qt-designer/surgeryNumber.ui         |  135 -
 src/openmolar/qt-designer/toothPerioProps.ui       |  330 -
 src/openmolar/qt-designer/toothProps.ui            |  548 --
 src/openmolar/qt-designer/toothprops_full_edit.ui  |  143 -
 src/openmolar/qt-designer/treatmentItemWidget.ui   |   56 -
 .../qt4gui/appointment_gui_modules/list_models.py  |    8 +-
 .../appointment_gui_modules/pt_diary_treemodel.py  |    2 +
 src/openmolar/qt4gui/charts/charts_gui.py          |   62 +-
 .../qt4gui/compiled_uis/Ui_apptOpenDay.py          |  219 -
 src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py  |   98 -
 .../qt4gui/compiled_uis/Ui_block_wizard.py         |  162 -
 .../qt4gui/compiled_uis/Ui_bridge_denture.py       |  164 -
 .../qt4gui/compiled_uis/Ui_completionDate.py       |  104 -
 src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py  |   90 -
 src/openmolar/qt4gui/compiled_uis/Ui_initialise.py |  637 --
 src/openmolar/qt4gui/compiled_uis/Ui_main.py       |  377 +-
 src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py  |   64 -
 src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py   |  408 --
 .../qt4gui/compiled_uis/Ui_patient_finder.py       |    6 +-
 .../qt4gui/compiled_uis/Ui_permissions.py          |   70 -
 .../qt4gui/compiled_uis/Ui_record_tools.py         |  362 +-
 .../qt4gui/compiled_uis/Ui_select_patient.py       |   66 -
 .../qt4gui/compiled_uis/Ui_startscreen.py          |  186 -
 .../qt4gui/compiled_uis/Ui_toothPerioProps.py      |  183 -
 .../qt4gui/customwidgets/appointmentwidget.py      |    2 +-
 src/openmolar/qt4gui/customwidgets/aptOVcontrol.py |   92 +-
 src/openmolar/qt4gui/customwidgets/calendars.py    |  172 +-
 .../qt4gui/customwidgets/dent_hyg_selector.py      |   65 +-
 .../qt4gui/customwidgets/estimate_item_widget.py   |   51 +-
 .../qt4gui/customwidgets/estimate_widget.py        |   65 +-
 .../qt4gui/customwidgets/fiveminutetimeedit.py     |   15 +-
 .../qt4gui/customwidgets/perioChartWidget.py       |  247 -
 src/openmolar/qt4gui/customwidgets/toothProps.py   |   43 +-
 .../qt4gui/customwidgets/upper_case_line_edit.py   |    5 +-
 .../qt4gui/customwidgets/warning_label.py          |   46 +-
 src/openmolar/qt4gui/dialogs/__init__.py           |   54 -
 .../qt4gui/dialogs/add_clinician_dialog.py         |  206 +
 src/openmolar/qt4gui/dialogs/add_user_dialog.py    |  100 +
 .../dialogs/advanced_record_management_dialog.py   |  290 +
 src/openmolar/qt4gui/dialogs/alterAday.py          |    4 +-
 .../qt4gui/dialogs/alter_cashbook_dialog.py        |    9 +-
 .../qt4gui/dialogs/alter_denture_dialog.py         |    9 +-
 .../dialogs/appointments_insert_blocks_dialog.py   |  252 +
 .../qt4gui/dialogs/appointments_memo_dialog.py     |  155 +
 src/openmolar/qt4gui/dialogs/apptOpenDay.py        |  235 -
 src/openmolar/qt4gui/dialogs/base_dialogs.py       |   44 +-
 src/openmolar/qt4gui/dialogs/block_wizard.py       |  137 -
 src/openmolar/qt4gui/dialogs/blockslot.py          |   20 +-
 src/openmolar/qt4gui/dialogs/bridge_denture.py     |  161 -
 .../qt4gui/dialogs/close_course_dialog.py          |  103 +
 .../qt4gui/dialogs/complete_treatment_dialog.py    |    2 -
 .../qt4gui/dialogs/course_consistency_dialog.py    |  107 +
 src/openmolar/qt4gui/dialogs/course_edit_dialog.py |  143 +
 .../course_history_options_dialog.py}              |   76 +-
 .../qt4gui/dialogs/course_merge_dialog.py          |  180 +
 .../qt4gui/dialogs/daybook_edit_dialog.py          |    1 +
 src/openmolar/qt4gui/dialogs/denture_dialog.py     |    2 +-
 .../dialogs/{__init__.py => dialog_collection.py}  |   36 +-
 .../qt4gui/dialogs/duplicate_receipt_dialog.py     |   10 +-
 .../qt4gui/dialogs/edit_practice_dialog.py         |  116 +
 .../qt4gui/dialogs/edit_referral_centres_dialog.py |  305 +
 .../qt4gui/dialogs/edit_treatment_dialog.py        |  141 +
 .../qt4gui/dialogs/estimate_edit_dialog.py         |  135 +
 src/openmolar/qt4gui/dialogs/exam_wizard.py        |   43 +-
 .../qt4gui/dialogs/family_manage_dialog.py         |    4 +-
 .../qt4gui/dialogs/find_patient_dialog.py          |  117 +-
 src/openmolar/qt4gui/dialogs/first_run_dialog.py   |  789 +++
 .../qt4gui/dialogs/initial_check_dialog.py         |  155 +
 src/openmolar/qt4gui/dialogs/login_dialog.py       |  307 +
 src/openmolar/qt4gui/dialogs/newBPE.py             |   21 +-
 src/openmolar/qt4gui/dialogs/new_denture_dialog.py |   88 +-
 src/openmolar/qt4gui/dialogs/permissions.py        |  110 +-
 .../{denture_dialog.py => recall_prompt_dialog.py} |   91 +-
 .../qt4gui/dialogs/save_discard_cancel.py          |   15 +-
 src/openmolar/qt4gui/diary_widget.py               |  206 +-
 src/openmolar/qt4gui/fees/course_module.py         |  197 +-
 src/openmolar/qt4gui/fees/fees_module.py           |   10 +-
 src/openmolar/qt4gui/fees/manipulate_plan.py       |  101 +-
 .../qt4gui/feescale_editor/feescale_editor.py      |   79 +-
 src/openmolar/qt4gui/maingui.py                    | 1425 ++--
 src/openmolar/qt4gui/new_patient_gui.py            |   27 +-
 src/openmolar/qt4gui/printing/bulk_mail.py         |    4 +-
 src/openmolar/qt4gui/printing/gp17/gp17_data.py    |   13 +-
 src/openmolar/qt4gui/printing/gp17/gp17v1_front.py |    6 +
 src/openmolar/qt4gui/printing/mh_print.py          |    5 +-
 src/openmolar/qt4gui/printing/om_printing.py       |   33 +-
 src/openmolar/qt4gui/printing/recallprint.py       |  190 +-
 src/openmolar/qt4gui/pt_diary_widget.py            |    7 +-
 src/openmolar/qt4gui/schema_updater.py             |  319 +-
 src/openmolar/qt4gui/tools/__init__.py             |   23 -
 src/openmolar/qt4gui/tools/apptTools.py            |  148 -
 src/openmolar/qt4gui/tools/new_setup.py            |  457 --
 src/openmolar/qt4gui/tools/recordtools.py          |  381 --
 src/openmolar/resources/demodump.sql               | 1306 ----
 src/openmolar/resources/referral_data.xml          |  136 -
 src/openmolar/resources/schema.sql                 | 1619 +++++
 .../schema_upgrades/database_updater_thread.py     |  152 +
 .../schema_upgrades/formatted_notes1_9.py          |  107 -
 src/openmolar/schema_upgrades/schema1_0to1_1.py    |  138 +-
 src/openmolar/schema_upgrades/schema1_1to1_2.py    |  157 +-
 src/openmolar/schema_upgrades/schema1_2to1_3.py    |  121 +-
 src/openmolar/schema_upgrades/schema1_3to1_4.py    |  239 +-
 src/openmolar/schema_upgrades/schema1_4to1_5.py    |  154 +-
 src/openmolar/schema_upgrades/schema1_5to1_6.py    |  176 +-
 src/openmolar/schema_upgrades/schema1_6to1_7.py    |  321 +-
 src/openmolar/schema_upgrades/schema1_7to1_8.py    |  127 +-
 src/openmolar/schema_upgrades/schema1_8to1_9.py    |  180 +-
 src/openmolar/schema_upgrades/schema1_9to2_0.py    |  106 +-
 src/openmolar/schema_upgrades/schema2_0to2_1.py    |  144 +-
 src/openmolar/schema_upgrades/schema2_1to2_2.py    |  265 +-
 src/openmolar/schema_upgrades/schema2_2to2_3.py    |  172 +-
 src/openmolar/schema_upgrades/schema2_3to2_4.py    |  110 +-
 src/openmolar/schema_upgrades/schema2_4to2_5.py    |  132 +
 src/openmolar/schema_upgrades/schema2_5to2_6.py    |   91 +
 src/openmolar/schema_upgrades/schema2_6to2_7.py    |  166 +
 src/openmolar/schema_upgrades/schema2_7to2_8.py    |  320 +
 src/openmolar/schema_upgrades/schema2_8to2_9.py    |   92 +
 src/openmolar/settings/localsettings.py            |  310 +-
 src/openmolar/settings/version.py                  |   34 +-
 src/standalone_chart/lib_om_chart/__init__.py      |   23 -
 src/standalone_chart/lib_om_chart/chart_colours.py |   51 -
 src/standalone_chart/lib_om_chart/chart_widget.py  |  967 ---
 src/standalone_chart/lib_om_chart/config.py        |   83 -
 src/standalone_chart/lib_om_chart/config_dialog.py |  155 -
 src/standalone_chart/lib_om_chart/connect.py       |   77 -
 src/standalone_chart/lib_om_chart/main_window.py   |  421 --
 src/standalone_chart/lib_om_chart/patient.py       |  131 -
 .../lib_om_chart/restorable_app.py                 |   56 -
 src/standalone_chart/om_chart.py                   |  236 -
 src/tests/appt_drag_test.py                        |  151 -
 268 files changed, 16685 insertions(+), 37353 deletions(-)

diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index aba5e9f..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*.pyc
-*~
-builds/*
-dist/*
-MANIFEST
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..82411cf
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,470 @@
+# file GENERATED by distutils, do NOT edit
+INSTALL.txt
+LICENSE
+MANIFEST
+MANIFEST.in
+README
+openmolar
+setup.py
+bin/openmolar.1
+bin/openmolar.desktop
+bin/openmolar.svg
+src/openmolar/__init__.py
+src/openmolar/connect.py
+src/openmolar/create_db.py
+src/openmolar/main.py
+src/openmolar/backports/__init__.py
+src/openmolar/backports/advisor.py
+src/openmolar/backports/ordered_dict.py
+src/openmolar/backports/printed_form.py
+src/openmolar/dbtools/__init__.py
+src/openmolar/dbtools/accounts.py
+src/openmolar/dbtools/appointments.py
+src/openmolar/dbtools/appt_prefs.py
+src/openmolar/dbtools/brief_patient.py
+src/openmolar/dbtools/calldurr.py
+src/openmolar/dbtools/cashbook.py
+src/openmolar/dbtools/courseHistory.py
+src/openmolar/dbtools/day_class.py
+src/openmolar/dbtools/daybook.py
+src/openmolar/dbtools/daybookHistory.py
+src/openmolar/dbtools/db_notes.py
+src/openmolar/dbtools/db_patients.py
+src/openmolar/dbtools/db_settings.py
+src/openmolar/dbtools/distinct_statuses.py
+src/openmolar/dbtools/docsimported.py
+src/openmolar/dbtools/docsprinted.py
+src/openmolar/dbtools/est_logger.py
+src/openmolar/dbtools/estimate_synopsis.py
+src/openmolar/dbtools/estimates.py
+src/openmolar/dbtools/estimatesHistory.py
+src/openmolar/dbtools/families.py
+src/openmolar/dbtools/feescales.py
+src/openmolar/dbtools/forum.py
+src/openmolar/dbtools/memos.py
+src/openmolar/dbtools/nhs_claims.py
+src/openmolar/dbtools/patient_class.py
+src/openmolar/dbtools/patient_write_changes.py
+src/openmolar/dbtools/paymentHistory.py
+src/openmolar/dbtools/phrasebook.py
+src/openmolar/dbtools/plan_data.py
+src/openmolar/dbtools/queries.py
+src/openmolar/dbtools/recall.py
+src/openmolar/dbtools/referral.py
+src/openmolar/dbtools/schema_version.py
+src/openmolar/dbtools/search.py
+src/openmolar/dbtools/treatment_course.py
+src/openmolar/dbtools/updateMH.py
+src/openmolar/dbtools/writeNewCourse.py
+src/openmolar/dbtools/writeNewPatient.py
+src/openmolar/html/index.html
+src/openmolar/html/omstyle.css
+src/openmolar/html/firstrun/firstrun0.png
+src/openmolar/html/firstrun/firstrun1.png
+src/openmolar/html/firstrun/firstrun2.png
+src/openmolar/html/firstrun/firstrun3.png
+src/openmolar/html/firstrun/firstrun5.png
+src/openmolar/html/firstrun/firstrun6.png
+src/openmolar/html/firstrun/firstrun7.png
+src/openmolar/html/firstrun/firstrun8.png
+src/openmolar/html/firstrun/index.html
+src/openmolar/html/images/Screenshot-Patient Finder.png
+src/openmolar/html/images/Screenshot.png
+src/openmolar/html/images/altered_db.png
+src/openmolar/html/images/appointment_diff_dent.png
+src/openmolar/html/images/appt_ov.png
+src/openmolar/html/images/appts.png
+src/openmolar/html/images/complete_tooth_treatment.png
+src/openmolar/html/images/complete_treatment.png
+src/openmolar/html/images/confirm_appt.png
+src/openmolar/html/images/cpitn.png
+src/openmolar/html/images/crown_choice.png
+src/openmolar/html/images/dayllis_printing_wiizard.png
+src/openmolar/html/images/edit_patient_details.png
+src/openmolar/html/images/enter_appointment.png
+src/openmolar/html/images/estimates_plan.png
+src/openmolar/html/images/exam_wizard.png
+src/openmolar/html/images/exit_record.png
+src/openmolar/html/images/feescales.png
+src/openmolar/html/images/find.png
+src/openmolar/html/images/hygenist_wizard.png
+src/openmolar/html/images/letter_review.png
+src/openmolar/html/images/letter_text_entry.png
+src/openmolar/html/images/make_appointment.png
+src/openmolar/html/images/make_appointment_any.png
+src/openmolar/html/images/newPt.png
+src/openmolar/html/images/newlogo.png
+src/openmolar/html/images/notes.png
+src/openmolar/html/images/perio_charts.png
+src/openmolar/html/images/place_appointment.png
+src/openmolar/html/images/plan_treament.png
+src/openmolar/html/images/plan_treatment.png
+src/openmolar/html/images/reception.png
+src/openmolar/html/images/reception_welcome_screen.png
+src/openmolar/html/images/startscreen.png
+src/openmolar/html/images/surgery_welcome.png
+src/openmolar/html/images/toothplan_screen.png
+src/openmolar/html/images/treatment_plan_page.png
+src/openmolar/html/images/whats_changed.png
+src/openmolar/locale/af.po
+src/openmolar/locale/da.po
+src/openmolar/locale/de.po
+src/openmolar/locale/el.po
+src/openmolar/locale/en_AU.po
+src/openmolar/locale/en_GB.po
+src/openmolar/locale/es.po
+src/openmolar/locale/fr.po
+src/openmolar/locale/hu.po
+src/openmolar/locale/id.po
+src/openmolar/locale/it.po
+src/openmolar/locale/messages.pot
+src/openmolar/locale/oc.po
+src/openmolar/locale/pl.po
+src/openmolar/locale/pt.po
+src/openmolar/locale/ro.po
+src/openmolar/locale/sk.po
+src/openmolar/locale/tr.po
+src/openmolar/ptModules/__init__.py
+src/openmolar/ptModules/course_checker.py
+src/openmolar/ptModules/debug_html.py
+src/openmolar/ptModules/dec_perm.py
+src/openmolar/ptModules/estimates.py
+src/openmolar/ptModules/formatted_notes.py
+src/openmolar/ptModules/hidden_notes.py
+src/openmolar/ptModules/nhsDetails.py
+src/openmolar/ptModules/notes.py
+src/openmolar/ptModules/patientDetails.py
+src/openmolar/ptModules/plan.py
+src/openmolar/ptModules/planDetails.py
+src/openmolar/ptModules/reception_summary.py
+src/openmolar/ptModules/standardletter.py
+src/openmolar/ptModules/tooth_history.py
+src/openmolar/qt4gui/__init__.py
+src/openmolar/qt4gui/colours.py
+src/openmolar/qt4gui/contract_gui_module.py
+src/openmolar/qt4gui/diary_widget.py
+src/openmolar/qt4gui/forum_gui_module.py
+src/openmolar/qt4gui/maingui.py
+src/openmolar/qt4gui/new_patient_gui.py
+src/openmolar/qt4gui/pt_diary_widget.py
+src/openmolar/qt4gui/resources_rc.py
+src/openmolar/qt4gui/schema_updater.py
+src/openmolar/qt4gui/appointment_gui_modules/__init__.py
+src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py
+src/openmolar/qt4gui/appointment_gui_modules/draggable_list.py
+src/openmolar/qt4gui/appointment_gui_modules/list_models.py
+src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
+src/openmolar/qt4gui/charts/__init__.py
+src/openmolar/qt4gui/charts/charts_gui.py
+src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py
+src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py
+src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py
+src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py
+src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py
+src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py
+src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py
+src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py
+src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py
+src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py
+src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py
+src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py
+src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py
+src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py
+src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py
+src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py
+src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py
+src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_main.py
+src/openmolar/qt4gui/compiled_uis/Ui_medhist.py
+src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py
+src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py
+src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py
+src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
+src/openmolar/qt4gui/compiled_uis/Ui_payments.py
+src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py
+src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
+src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py
+src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py
+src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py
+src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py
+src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py
+src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py
+src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py
+src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py
+src/openmolar/qt4gui/compiled_uis/__init__.py
+src/openmolar/qt4gui/customwidgets/__init__.py
+src/openmolar/qt4gui/customwidgets/appointment_overviewwidget.py
+src/openmolar/qt4gui/customwidgets/appointmentwidget.py
+src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
+src/openmolar/qt4gui/customwidgets/calendars.py
+src/openmolar/qt4gui/customwidgets/chainLabel.py
+src/openmolar/qt4gui/customwidgets/chartwidget.py
+src/openmolar/qt4gui/customwidgets/confirming_check_box.py
+src/openmolar/qt4gui/customwidgets/currency_label.py
+src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
+src/openmolar/qt4gui/customwidgets/diary_view_controller.py
+src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
+src/openmolar/qt4gui/customwidgets/estimate_widget.py
+src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
+src/openmolar/qt4gui/customwidgets/money_line_edit.py
+src/openmolar/qt4gui/customwidgets/notification_widget.py
+src/openmolar/qt4gui/customwidgets/perioToothProps.py
+src/openmolar/qt4gui/customwidgets/resources_rc.py
+src/openmolar/qt4gui/customwidgets/schedule_control.py
+src/openmolar/qt4gui/customwidgets/simple_chartwidget.py
+src/openmolar/qt4gui/customwidgets/static_control_panel.py
+src/openmolar/qt4gui/customwidgets/toothProps.py
+src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
+src/openmolar/qt4gui/customwidgets/warning_label.py
+src/openmolar/qt4gui/dialogs/__init__.py
+src/openmolar/qt4gui/dialogs/account_severity_dialog.py
+src/openmolar/qt4gui/dialogs/add_clinician_dialog.py
+src/openmolar/qt4gui/dialogs/add_treatment_dialog.py
+src/openmolar/qt4gui/dialogs/add_user_dialog.py
+src/openmolar/qt4gui/dialogs/address_match_dialog.py
+src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py
+src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py
+src/openmolar/qt4gui/dialogs/alterAday.py
+src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
+src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
+src/openmolar/qt4gui/dialogs/alter_todays_notes.py
+src/openmolar/qt4gui/dialogs/appointment_card_dialog.py
+src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py
+src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py
+src/openmolar/qt4gui/dialogs/appt_mode_dialog.py
+src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py
+src/openmolar/qt4gui/dialogs/appt_wizard_dialog.py
+src/openmolar/qt4gui/dialogs/assistant_select_dialog.py
+src/openmolar/qt4gui/dialogs/auto_address_dialog.py
+src/openmolar/qt4gui/dialogs/base_dialogs.py
+src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py
+src/openmolar/qt4gui/dialogs/blockslot.py
+src/openmolar/qt4gui/dialogs/bridge_dialog.py
+src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py
+src/openmolar/qt4gui/dialogs/child_smile_dialog.py
+src/openmolar/qt4gui/dialogs/choose_clinicians.py
+src/openmolar/qt4gui/dialogs/choose_tooth_dialog.py
+src/openmolar/qt4gui/dialogs/clinician_select_dialog.py
+src/openmolar/qt4gui/dialogs/close_course_dialog.py
+src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
+src/openmolar/qt4gui/dialogs/course_consistency_dialog.py
+src/openmolar/qt4gui/dialogs/course_edit_dialog.py
+src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
+src/openmolar/qt4gui/dialogs/course_merge_dialog.py
+src/openmolar/qt4gui/dialogs/crown_choice_dialog.py
+src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
+src/openmolar/qt4gui/dialogs/daybook_item_dialog.py
+src/openmolar/qt4gui/dialogs/denture_dialog.py
+src/openmolar/qt4gui/dialogs/dialog_collection.py
+src/openmolar/qt4gui/dialogs/document_dialog.py
+src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
+src/openmolar/qt4gui/dialogs/edit_practice_dialog.py
+src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py
+src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py
+src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py
+src/openmolar/qt4gui/dialogs/exam_wizard.py
+src/openmolar/qt4gui/dialogs/family_manage_dialog.py
+src/openmolar/qt4gui/dialogs/finalise_appt_time.py
+src/openmolar/qt4gui/dialogs/find_patient_dialog.py
+src/openmolar/qt4gui/dialogs/first_run_dialog.py
+src/openmolar/qt4gui/dialogs/gp17_printdialog.py
+src/openmolar/qt4gui/dialogs/hygTreatWizard.py
+src/openmolar/qt4gui/dialogs/implant_choice_dialog.py
+src/openmolar/qt4gui/dialogs/initial_check_dialog.py
+src/openmolar/qt4gui/dialogs/login_dialog.py
+src/openmolar/qt4gui/dialogs/med_notes_dialog.py
+src/openmolar/qt4gui/dialogs/newBPE.py
+src/openmolar/qt4gui/dialogs/newCourse.py
+src/openmolar/qt4gui/dialogs/new_bridge_dialog.py
+src/openmolar/qt4gui/dialogs/new_denture_dialog.py
+src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py
+src/openmolar/qt4gui/dialogs/payment_dialog.py
+src/openmolar/qt4gui/dialogs/permissions.py
+src/openmolar/qt4gui/dialogs/post_choice_dialog.py
+src/openmolar/qt4gui/dialogs/print_record_dialog.py
+src/openmolar/qt4gui/dialogs/recall_dialog.py
+src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
+src/openmolar/qt4gui/dialogs/saveMemo.py
+src/openmolar/qt4gui/dialogs/save_discard_cancel.py
+src/openmolar/qt4gui/dialogs/select_language.py
+src/openmolar/qt4gui/dialogs/toothprop_fulledit.py
+src/openmolar/qt4gui/fees/__init__.py
+src/openmolar/qt4gui/fees/cashbook_module.py
+src/openmolar/qt4gui/fees/course_module.py
+src/openmolar/qt4gui/fees/daybook_module.py
+src/openmolar/qt4gui/fees/fee_table_model.py
+src/openmolar/qt4gui/fees/fees_module.py
+src/openmolar/qt4gui/fees/feescale_tester.py
+src/openmolar/qt4gui/fees/manipulate_plan.py
+src/openmolar/qt4gui/fees/treatment_list_models.py
+src/openmolar/qt4gui/feescale_editor/__init__.py
+src/openmolar/qt4gui/feescale_editor/feescale_choice_dialog.py
+src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py
+src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py
+src/openmolar/qt4gui/feescale_editor/feescale_editor.py
+src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py
+src/openmolar/qt4gui/feescale_editor/feescale_list_model.py
+src/openmolar/qt4gui/feescale_editor/feescale_parser.py
+src/openmolar/qt4gui/feescale_editor/feescale_xml_editor.py
+src/openmolar/qt4gui/phrasebook/__init__.py
+src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py
+src/openmolar/qt4gui/phrasebook/phrasebook_editor.py
+src/openmolar/qt4gui/phrasebook/phrasebook_model.py
+src/openmolar/qt4gui/printing/__init__.py
+src/openmolar/qt4gui/printing/accountPrint.py
+src/openmolar/qt4gui/printing/apptcardPrint.py
+src/openmolar/qt4gui/printing/bookprint.py
+src/openmolar/qt4gui/printing/bulk_mail.py
+src/openmolar/qt4gui/printing/chartPrint.py
+src/openmolar/qt4gui/printing/daylistprint.py
+src/openmolar/qt4gui/printing/estimatePrint.py
+src/openmolar/qt4gui/printing/letterprint.py
+src/openmolar/qt4gui/printing/mh_print.py
+src/openmolar/qt4gui/printing/multiDayListPrint.py
+src/openmolar/qt4gui/printing/om_printing.py
+src/openmolar/qt4gui/printing/recallprint.py
+src/openmolar/qt4gui/printing/receiptPrint.py
+src/openmolar/qt4gui/printing/gp17/__init__.py
+src/openmolar/qt4gui/printing/gp17/gp17_back.py
+src/openmolar/qt4gui/printing/gp17/gp17_config.py
+src/openmolar/qt4gui/printing/gp17/gp17_data.py
+src/openmolar/qt4gui/printing/gp17/gp17_front.py
+src/openmolar/qt4gui/printing/gp17/gp17_printer.py
+src/openmolar/qt4gui/printing/gp17/gp17v1_back.py
+src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
+src/openmolar/resources/appointment_shortcuts.xml
+src/openmolar/resources/appt_ov.png
+src/openmolar/resources/hdp.png
+src/openmolar/resources/hdp_small.png
+src/openmolar/resources/logo.png
+src/openmolar/resources/logo1.png
+src/openmolar/resources/newlogo.png
+src/openmolar/resources/newlogo_launchpadSize.png
+src/openmolar/resources/nhs_scot.png
+src/openmolar/resources/openmolar.svg
+src/openmolar/resources/private.png
+src/openmolar/resources/resources.qrc
+src/openmolar/resources/schema.sql
+src/openmolar/resources/style.css
+src/openmolar/resources/feescales/example_feescale.xml
+src/openmolar/resources/feescales/feescale_schema.xsd
+src/openmolar/resources/gp17/back.jpg
+src/openmolar/resources/gp17/front.jpg
+src/openmolar/resources/gp17-1/back.png
+src/openmolar/resources/gp17-1/front.png
+src/openmolar/resources/icons/Speaker_Icon.svg
+src/openmolar/resources/icons/action.png
+src/openmolar/resources/icons/add_user.png
+src/openmolar/resources/icons/agt_back.png
+src/openmolar/resources/icons/agt_family.png
+src/openmolar/resources/icons/agt_forward.png
+src/openmolar/resources/icons/agt_home.png
+src/openmolar/resources/icons/agt_reload.png
+src/openmolar/resources/icons/alert.png
+src/openmolar/resources/icons/back.png
+src/openmolar/resources/icons/button_ok.png
+src/openmolar/resources/icons/chain-broken.png
+src/openmolar/resources/icons/chain.png
+src/openmolar/resources/icons/contract.svg
+src/openmolar/resources/icons/database.png
+src/openmolar/resources/icons/down.png
+src/openmolar/resources/icons/eraser.png
+src/openmolar/resources/icons/exit.png
+src/openmolar/resources/icons/expand.svg
+src/openmolar/resources/icons/gohome.png
+src/openmolar/resources/icons/home.png
+src/openmolar/resources/icons/kaddressbook.png
+src/openmolar/resources/icons/karm.png
+src/openmolar/resources/icons/kdmconfig.png
+src/openmolar/resources/icons/kfm.png
+src/openmolar/resources/icons/kfm_home.png
+src/openmolar/resources/icons/logo.png
+src/openmolar/resources/icons/lower_implant.svg
+src/openmolar/resources/icons/mail_new.png
+src/openmolar/resources/icons/memos.png
+src/openmolar/resources/icons/month.png
+src/openmolar/resources/icons/number1.png
+src/openmolar/resources/icons/pencil.png
+src/openmolar/resources/icons/pin.png
+src/openmolar/resources/icons/ps.png
+src/openmolar/resources/icons/save_all.png
+src/openmolar/resources/icons/schedule.png
+src/openmolar/resources/icons/schedule_active.png
+src/openmolar/resources/icons/search.png
+src/openmolar/resources/icons/separate.png
+src/openmolar/resources/icons/txt.png
+src/openmolar/resources/icons/upper_implant.svg
+src/openmolar/resources/icons/vcalendar.png
+src/openmolar/resources/icons/vcard.png
+src/openmolar/resources/icons/warning.png
+src/openmolar/resources/icons/widelogo.png
+src/openmolar/resources/icons/wikipedia.png
+src/openmolar/resources/phrasebook/phrasebook.xsd
+src/openmolar/resources/teeth/ll1.png
+src/openmolar/resources/teeth/ll2.png
+src/openmolar/resources/teeth/ll3.png
+src/openmolar/resources/teeth/ll4.png
+src/openmolar/resources/teeth/ll5.png
+src/openmolar/resources/teeth/ll6.png
+src/openmolar/resources/teeth/ll7.png
+src/openmolar/resources/teeth/ll8.png
+src/openmolar/resources/teeth/lr1.png
+src/openmolar/resources/teeth/lr2.png
+src/openmolar/resources/teeth/lr3.png
+src/openmolar/resources/teeth/lr4.png
+src/openmolar/resources/teeth/lr5.png
+src/openmolar/resources/teeth/lr6.png
+src/openmolar/resources/teeth/lr7.png
+src/openmolar/resources/teeth/lr8.png
+src/openmolar/resources/teeth/ul1.png
+src/openmolar/resources/teeth/ul2.png
+src/openmolar/resources/teeth/ul3.png
+src/openmolar/resources/teeth/ul4.png
+src/openmolar/resources/teeth/ul5.png
+src/openmolar/resources/teeth/ul6.png
+src/openmolar/resources/teeth/ul7.png
+src/openmolar/resources/teeth/ul8.png
+src/openmolar/resources/teeth/ur1.png
+src/openmolar/resources/teeth/ur2.png
+src/openmolar/resources/teeth/ur3.png
+src/openmolar/resources/teeth/ur4.png
+src/openmolar/resources/teeth/ur5.png
+src/openmolar/resources/teeth/ur6.png
+src/openmolar/resources/teeth/ur7.png
+src/openmolar/resources/teeth/ur8.png
+src/openmolar/resources/user_manual/index.html
+src/openmolar/resources/user_manual/styles.css
+src/openmolar/resources/user_manual/treatment-planning.html
+src/openmolar/schema_upgrades/__init__.py
+src/openmolar/schema_upgrades/database_updater_thread.py
+src/openmolar/schema_upgrades/schema1_0to1_1.py
+src/openmolar/schema_upgrades/schema1_1to1_2.py
+src/openmolar/schema_upgrades/schema1_2to1_3.py
+src/openmolar/schema_upgrades/schema1_3to1_4.py
+src/openmolar/schema_upgrades/schema1_4to1_5.py
+src/openmolar/schema_upgrades/schema1_5to1_6.py
+src/openmolar/schema_upgrades/schema1_6to1_7.py
+src/openmolar/schema_upgrades/schema1_7to1_8.py
+src/openmolar/schema_upgrades/schema1_8to1_9.py
+src/openmolar/schema_upgrades/schema1_9to2_0.py
+src/openmolar/schema_upgrades/schema2_0to2_1.py
+src/openmolar/schema_upgrades/schema2_1to2_2.py
+src/openmolar/schema_upgrades/schema2_2to2_3.py
+src/openmolar/schema_upgrades/schema2_3to2_4.py
+src/openmolar/schema_upgrades/schema2_4to2_5.py
+src/openmolar/schema_upgrades/schema2_5to2_6.py
+src/openmolar/schema_upgrades/schema2_6to2_7.py
+src/openmolar/schema_upgrades/schema2_7to2_8.py
+src/openmolar/schema_upgrades/schema2_8to2_9.py
+src/openmolar/settings/__init__.py
+src/openmolar/settings/allowed.py
+src/openmolar/settings/appointment_shortcuts.py
+src/openmolar/settings/fee_tables.py
+src/openmolar/settings/images.py
+src/openmolar/settings/localsettings.py
+src/openmolar/settings/urls.py
+src/openmolar/settings/utilities.py
+src/openmolar/settings/version.py
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..0bb11b9
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: openmolar
+Version: 0.6.0
+Summary: Open Source Dental Practice Management Software
+Home-page: https://www.openmolar.com
+Author: Neil Wallace
+Author-email: neil at openmolar.com
+License: GPL v3
+Description: UNKNOWN
+Platform: UNKNOWN
diff --git a/README.md b/README.md
deleted file mode 100644
index 84379c5..0000000
--- a/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-openmolar1
-==========
-
-Dental Practice Management Software.
-
-see www.openmolar.com for description
diff --git a/TODO.txt b/TODO.txt
deleted file mode 100644
index 4570074..0000000
--- a/TODO.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-0.5.00
-    Issues and code now tracked on github.
-    This release is imminent, barring a few release blocking bugs.
-    All debian and rpm work has been removed from git repository.
-
-0.4.10
-    TODO incisal angles, max per tooth, extraction visits, special tray,
-    1st in arch, partial dentures(n teeth)
-    tidy up addition from feescale.
-    much of this work will be on the database itself,
-    but the codebase will also need tweaking
-
-    estimates.recalculate_estimate needs to be rewritten
-    undoing multiple identical items is problematic (hence the
-        "just checking" placeholder currently in use.)
-
-0.4.09
-    as a result of 0.4.08 - the deepcopying of the patient class finally
-    bit me in the bum (deepcopy does not work with compiled regexes.)
-    this version is radically more efficient in the way a snapshot is taken.
-    BUGFIX - when completing chart tx by double clicking on the plan chart the
-    treatment lineEntry box is updated.
-
-0.4.08
-    new feescale logic. An attempt to tighten up on NHS regulations.
-
-0.4.07
-    print new gp17-1 for courses started after 1st July 2013
-
-0.4.06
-    pt refund addeed to payment dialog functionality
-
-0.4.05
-    ordereddict backports method fix (phrasebook was out of order!)
-
-0.4.04
-    GP17 date issue fixed
-
-0.4.03
-    GP17 form
-        printing badly from some stations.
-
-
-0.4.02
-    BUGFIXES.
-        FindPatientDialog throwing an exception when called via diary widget
-        pt_diary update is unnecessary (and fails) if no patient is loaded
-        fixed print dialog parent when printing gp17
-
-    NEW FUNCTIONALITY
-        when synching addresses, it is not always obvious which is the best one
-        NHS form printing - should now always raise print dialog to
-            allow printer choice.
-        Phrasebook - allow subheadings and spacers
-        opalite cr recognition by feescales - ordered dict issue??
-
-0.4.0
-    reception front page better html
-    Tidied up recall bulk mail
-
-0.3.9
-    NEW FUNCTIONALITY
-        Ability to print out a personalised MH form from record card
-
-    UNDECIDED (not yet implemented
-        Ability to print out a personalised MH form for all patients
-            attending today. Suggest alphabetical order?
-
-0.3.8
-    NEW FUNCTIONALITY
-        MRS or MISS when entering patient details should toggle sex
-        Alert the user (not just via terminal) if a feescale doesnt parse!
-        Add a patient to a known family set.
-        Allow easy change of address to the stored value
-            (not just for new patients)
-
-0.3.7
-    NEW FUNCTIONALITY
-        allow modification of todays cashbook entries
-        (+ more advanced edits for supervisors)
-
-
-0.3.6
-    BUGS FIXED
-        hidden notes is not working when user deletes (
-        as opposed to uncompletes using the check box) treatments.
-
-	dialog that pops up for multiple items on the estimate will now
-	self close if it is no longer required (prevents an index error)
-
-0.3.5 (bzr 810)
-    BUGS FIXED
-        possible to create 2 open course on one day.
-        this can be fixed with SQL, however, the client needs to give
-        appropriate messages.
-
-        advanced record tools fails to parse hidden notes.
-
-
-0.3.4 (bzr 807)
-    BUGS FIXED.
-        save new patient -> "patient already loaded"
-
-        pt diary not collapsing past appointments
-
-0.3.3 (bzr 805)
-    BUG FIXES.
-        patient records do not "reload" when clicking on current patient
-        in the appointment book, hence save dialog comes up.
-            (fixed with 801)
-
-        bulk mailer needs to use appt_prefs!
-            fixed with 802
-
-        recall changes when doing an exam should inform the user more.
-            done with 805
-
-
-
-0.3.2 BUG FIXES.
-    entering notes mode of diary doesnt show notes widget
-        fixed with 799
-    diary widget "advise" function is a problem on older Qts (lucid)
-        fixed with 799
-    user not informed if recall is set to "do not recall"
-        fixed with 799
diff --git a/bin/openmolar.1 b/bin/openmolar.1
index b6b2035..ff1de28 100644
--- a/bin/openmolar.1
+++ b/bin/openmolar.1
@@ -1,12 +1,22 @@
-.TH OPENMOLAR "1" "March 2014" "OpenMolar 0.5.0" "User Commands"
+.\" Manpage for openmolar.
+.\" Contact neil at openmolar.com to correct errors or typos.
+.TH OPENMOLAR "1" "June 2014" "OpenMolar 0.5.6" "User Commands"
 .SH NAME
 OpenMolar \- dental practice management software.
 .SH DESCRIPTION
 dental practice management software.
+.SH SYNOPSIS
+openmolar [-v -q --firstrun --version --help]
 .SH OPTIONS
 .TP
+\fB\-q\fR
+quiet (minimal logging to console)
+.TP
+\fB\-v\fR
+verbose logging to console (for debugging)
+.TP
 \fB\-\-help\fR
-show this text
+show command line options
 .TP
 \fB\-\-firstrun\fR
 offer the firstrun config and demodatabase generation
@@ -16,3 +26,11 @@ takes you to the admin page
 .TP
 \fB\-\-version\fR
 show the versioning and exit
+.TP
+\fB\-\-no\-dev\-login\fR
+Ignore dev login (advanced)
+.TP
+\fB\-\-ignore\-schema\-check\fR
+proceed even if client and database versions clash (NOT ADVISABLE!)
+.SH AUTHOR
+Neil Wallace (neil at openmolar.com)
diff --git a/build_scripts/Makefile b/build_scripts/Makefile
deleted file mode 100755
index 08286c6..0000000
--- a/build_scripts/Makefile
+++ /dev/null
@@ -1,118 +0,0 @@
-define USEAGE 
-This is the build script for openmolar tarballs.
-
-USAGE
-   make [options] target
-
-TARGETS
-   version
-   git_tag
-   tarball
-   
-EXAMPLES
-	make NEW_VERSION=0.5.0-beta1 version
-		this will update version.py, but will not update the git tag
-
-	make git-tag
-		this will tag the git repo with the version number set in version.py
-		performs the following
-		git tag -a v0.5.0-beta1 -m "v0.5.0-beta1" 
-
-	make FORCE=true git-tag
-		as above, but deleting any other reference to the tag
-		performsthe following
-		git tag -f -a v0.5.0-beta1 -m "v0.5.0-beta1"
-
-	make tarball
-		create a tarball
-		needn't be a tagged (or even clean repo) for this
-
-usual steps for a release would be as follows.
-	export NEW_VERION=0.5.1
-	make version
-	git commit -a
-	git push
-	make git_tag
-	make tarball
-	make sign_tarball
-
-endef
-	
-export USEAGE
-
-PACKAGE=openmolar
-CURRENT_MAKEFILE_LIST := $(MAKEFILE_LIST)
-BUILD_SCRIPTS_DIR := $(abspath $(dir $(firstword $(CURRENT_MAKEFILE_LIST))))/
-HEAD = $(shell $(BUILD_SCRIPTS_DIR)get_git_branch.py)/
-BUILDS_DIR=$(HEAD)builds/
-
-DIST_DIR=$(HEAD)dist/
-
-#VERSION=`git describe | sed s/v//`
-VERSION=`python $(HEAD)setup.py --version`
-
-ifeq ($(NEW_VERSION), )
-	NEW_VERSION=$(VERSION)
-endif
-
-ifeq ($(FORCE), true)
-	FORCE_TAG=-f
-endif
-
-
-TARBALL = $(PACKAGE)-$(VERSION).tar.gz
-
-TMP_DIR=$(HEAD)tmp/
-
-.phony:
-	make help
-
-help:
-	@echo "$$USEAGE"
-
-examples:
-	@echo "$$EXAMPLES"
-	
-clean_tmp:
-	mkdir -p $(TMP_DIR)
-	rm -rf $(TMP_DIR)*
-
-resources:
-	pyrcc4 -py2 $(HEAD)/src/openmolar/resources/resources.qrc > $(HEAD)/src/openmolar/qt4gui/resources_rc.py
-
-ui_files:
-	./om_pyuic4.py
-
-clean_codebase:
-	./code_cleaner.py
-
-git_tag:
-	@echo "writing git tag  - if this fails and you haven't pushed tags to parent repo, try 'make FORCE=true git_tag'" 
-	git tag $(FORCE_TAG) -a v$(NEW_VERSION) -m "$(NEW_VERSION)"
-
-version:
-	@echo "modding version.py"
-	echo "sed -i  0,/VERSION/s/VERSION = \".*\"/VERSION = \"$(NEW_VERSION)\"/ src/openmolar/settings/version.py"
-	cd $(HEAD) ;\
-		sed -i  0,/VERSION/s/VERSION\ =\ \".*\"/VERSION\ =\ \"$(NEW_VERSION)\"/ src/openmolar/settings/version.py
-	@echo "version updated"
-
-tarball:
-	echo "making  tarball (using setup.py sdist)"
-	make clean_tmp
-	cd $(HEAD) ;\
-		python setup.py sdist ;\
-	echo "tarball created!"
-	mkdir -p $(BUILDS_DIR)
-	echo "moving tarball to $(BUILDS_DIR)"
-	cp -av $(DIST_DIR)$(TARBALL) $(BUILDS_DIR);
-	@echo "tarball is located $(BUILDS_DIR)$(TARBALL)"
-
-	@if [ -e "$(BUILDS_DIR)$(TARBALL)" ]; then echo "SUCCESS!"; fi
-	
-sign_tarball:
-	cd $(BUILDS_DIR) ;\
-	gpg --armor --sign --detach-sig -u rowinggolfer at googlemail.com $(TARBALL) ;\
-	md5sum $(TARBALL) | sed "s/ .*//" > $(PACKAGE)-$(VERSION)_md5.txt 	
-	
-	
diff --git a/build_scripts/code_cleaner.py b/build_scripts/code_cleaner.py
deleted file mode 100755
index cfd1933..0000000
--- a/build_scripts/code_cleaner.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-This module cleans and standardises the openmolar code.
-autopep8 should be installed for full functionality
-
-USEAGE is ./code_cleaner.py
-
-OPTIONS:
-     ALL      - modify all python files above the git repository
-     no-pep8  - do not apply autopep8
-
-EXAMPLES:
-    ./code_cleaner.py
-        this will check formatting of any file marked as new or modified
-        in the git repo this should be done before each commit!
-
-    ./code_cleaner.py ALL
-        check and modify all files.
-
-    ./code_cleaner.py ALL no-pep8
-        does not apply the autopep8 tool, so only changes will be the
-        shebang lines and license.
-'''
-
-import git
-import logging
-import os
-import re
-import subprocess
-import sys
-
-logging.basicConfig(level=logging.INFO)
-LOGGER = logging.getLogger("code_cleaner")
-
-SHEBANG_LINE = "#! /usr/bin/env python"
-ENCODING_LINE = "# -*- coding: utf-8 -*-"
-LICENSE = '''
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-'''
-
-
-class CodeCleaner(object):
-
-    '''
-    A class which takes a git repository, and cleans up python code within.
-    '''
-    pep8 = True
-    license_lines = set([])
-
-    def __init__(self, repository, all_files=False):
-        self.repo = repository
-        self.root_path = self.repo.working_dir
-
-        self.files = self._all_files if all_files else self._changed_files
-        LOGGER.info("CodeCleaner object created")
-
-    def _valid_file(self, filename):
-        '''
-        check to see if file is a python file
-        '''
-        if filename.endswith("resources_rc.py"):
-            return False
-        return filename == "openmolar" or re.match(".*.py$", filename)
-
-    def _changed_files(self):
-        '''
-        use git to get only those files which have been altered.
-        files object will be in this form
-
-         M src/standalone_chart/om_chart.py
-         M src/tests/appt_drag_test.py
-        ?? build_scripts/code_cleaner.py
-
-        so some regex work is required to pull the filename.
-        '''
-        files = self.repo.git.status("--porcelain")
-        LOGGER.debug(files)
-        for info in files.split("\n"):
-            operation = info[:3].strip(" ")
-            file_ = info[3:]
-            if operation in ("M", "A") and self._valid_file(file_):
-                yield os.path.join(self.root_path, file_)
-
-    def _all_files(self):
-        '''
-        an iterator returning all files in child directories of the git repo
-        which conform with _valid_file
-        '''
-        for root, dir_, files in os.walk(self.root_path):
-            for file_ in files:
-                if self._valid_file(file_):
-                    file_path = os.path.join(root, file_)
-                    yield file_path
-
-    def autopep8(self, file_path):
-        '''
-        apply the wonderful autopep8 tool
-        '''
-        if self.pep8:
-            LOGGER.debug("applying  autopep8")
-            p = subprocess.Popen(
-                ["autopep8", "-v", "--in-place", "-a", "-a", file_path])
-            p.wait()
-
-    def clean_files(self):
-        count = 0
-        changed = 0
-        for file_path in self.files():
-            count += 1
-            LOGGER.info("cleaning %s" % file_path)
-
-            self.autopep8(file_path)
-
-            f = open(file_path)
-            data = f.read()
-            f.close()
-
-            new_data = self._check_shebang(data)
-            new_data = self._check_encoding(new_data)
-            if not "compiled_uis" in file_path:
-                new_data = self._change_license(new_data)
-
-            if new_data != data:
-                changed += 1
-                f = open(file_path, "w")
-                f.write(new_data)
-                f.close()
-
-        LOGGER.info("changed %d out of %d files" % (changed, count))
-
-    def _check_shebang(self, data):
-        '''
-        apply the python shebang line if not present
-        '''
-        if data.split("\n")[0] == SHEBANG_LINE:
-            return data
-        return "%s\n%s" % (SHEBANG_LINE, data)
-
-    def _check_encoding(self, data):
-        '''
-        apply the encoding shebang line if not present
-        '''
-        lines = data.split("\n")
-        if lines[1] == ENCODING_LINE:
-            return data
-        lines.insert(1, ENCODING_LINE)
-        return "\n".join(lines)
-
-    def _change_license(self, data):
-        '''
-        remove any old license present, and replace with LICENSE
-        '''
-        lines = data.split("\n")
-        removals = []
-        for i, line in enumerate(lines[2:]):
-            if line.startswith("#") or line.strip(" ") == "":
-                removals.append(i + 2)
-            else:
-                break
-        for i in sorted(removals, reverse=True):
-            line = lines.pop(i)
-            self.license_lines.add(line)
-
-        for i, new_line in enumerate(LICENSE.split("\n")):
-            lines.insert(i + 2, new_line)
-        return "\n".join(lines)
-
-
-def help_():
-    '''
-    print a help message and exit
-    '''
-    print __doc__
-    sys.exit(0)
-
-if __name__ == "__main__":
-    if "help" in sys.argv:
-        help_()
-    LOGGER.setLevel(logging.DEBUG)
-    repo = git.Repo(os.getcwd())
-    cc = CodeCleaner(repo, "ALL" in sys.argv)
-    cc.pep8 = not "no-pep8" in sys.argv
-    cc.clean_files()
-
-    LOGGER.warning(
-        "removed the following license lines!%s" % "\n".join(cc.license_lines))
diff --git a/build_scripts/get_git_branch.py b/build_scripts/get_git_branch.py
deleted file mode 100755
index 8422e28..0000000
--- a/build_scripts/get_git_branch.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-usage is:
-    'get_git_branch.py' to return the repo working directory
-    'get_git_branch.py main' to return path to the maingui.py file
-    'get_git_branch.py module' to return the path which contains the openmolar modules"
-'''
-import git
-import os
-import sys
-
-userdir = os.path.expanduser("~")
-
-file_path = os.path.abspath(os.curdir)
-
-if not file_path.startswith(userdir):
-    sys.exit("command not run from a subdirectory of %s" % userdir)
-
-try:
-    repo = git.Repo(file_path)
-except git.InvalidGitRepositoryError:
-    sys.exit(1)
-
-module_path = os.path.join(repo.working_dir, "src")
-main_path = os.path.join(module_path, "openmolar", "qt4gui", "maingui.py")
-
-if "help" in sys.argv or "--help" in sys.argv:
-    print (__doc__)
-elif "module" in sys.argv:
-    print (module_path)
-elif "main" in sys.argv:
-    print (main_path)
-else:
-    print (repo.working_dir)
-
-if __name__ == "__main__":
-    sys.exit(0)
diff --git a/build_scripts/om_pyuic4.py b/build_scripts/om_pyuic4.py
deleted file mode 100755
index f007b58..0000000
--- a/build_scripts/om_pyuic4.py
+++ /dev/null
@@ -1,160 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-Use this in preference to pyuic4, because it adapts the files to utilise
-pygettext style translations
-'''
-
-import git
-import logging
-import re
-import os
-import sys
-
-from PyQt4 import uic
-
-logging.basicConfig(level=logging.INFO)
-
-logger = logging.getLogger("om_pyuic4")
-
-# can be switched off so generated files are not executable
-MAKE_EX = True
-
-# change the commented line if you want all redone!!
-CHANGED_ONLY = True
-if "ALL" in sys.argv:
-    CHANGED_ONLY = False
-
-REMOVALS = [
-    '''try:
-    _encoding = QtGui.QApplication.UnicodeUTF8
-    def _translate(context, text, disambig):
-        return QtGui.QApplication.translate(context, text, disambig, _encoding)
-except AttributeError:
-    def _translate(context, text, disambig):
-        return QtGui.QApplication.translate(context, text, disambig)
-'''
-]
-
-REPLACEMENT1 = (
-    "import resources_rc",
-    "from openmolar.qt4gui import resources_rc"
-)
-
-REPLACEMENT2 = (
-    '''if __name__ == "__main__":
-''',
-    '''if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-''')
-
-
-def translate_middle(match):
-    return '_(%s)' % match.groups()[0].strip(" ")
-
-
-def compile_ui(ui_fname, outdir=""):
-    if outdir == "":
-        outdir = os.path.dirname(ui_fname)
-    name = os.path.basename(ui_fname)
-    outname = "Ui_%s.py" % name.rstrip(".ui")
-    pyfile = os.path.join(outdir, outname)
-
-    logger.info("compiling %s" % ui_fname)
-
-    try:
-        f = open(pyfile, "w")
-        uic.compileUi(ui_fname, f, execute=MAKE_EX)
-    except IOError:  # ui has been removed by git?
-        pass
-    finally:
-        f.close()
-
-    f = open(pyfile, "r")
-    data = f.read()
-    f.close()
-
-    newdata = data
-    for removal in REMOVALS:
-        newdata = newdata.replace(removal, "")
-
-    newdata = re.sub('_translate\(".*?", (".*?"), None\)', translate_middle,
-                     newdata, 0, re.DOTALL)
-
-    orig, new = REPLACEMENT1
-    newdata = newdata.replace(orig, new)
-
-    if MAKE_EX:
-        orig, new = REPLACEMENT2
-        newdata = newdata.replace(orig, new)
-
-    # some hacks for 4.5/4.6 compatibility
-    # newdata = newdata.replace('setShowSortIndicator',"setSortIndicatorShown")
-
-    if newdata != data:
-        f = open(pyfile, "w")
-        f.write(newdata)
-        f.close()
-    else:
-        logger.warning("om_pyuic made no changes to the standard uic output!")
-
-    return pyfile
-
-
-def get_changed_ui_files(repo):
-    files = repo.git.status("--porcelain")
-    for file_ in files.split("\n"):
-        if re.match(".*.ui$", file_):
-            yield file_[3:]
-
-
-def get_all_ui_files(dirname):
-    for ui_file in os.listdir(dirname):
-        if re.match(".*.ui$", ui_file):
-            yield ui_file
-
-if __name__ == "__main__":
-    repo = git.Repo(os.getcwd())
-
-    uipath = os.path.join(repo.working_dir, "src", "openmolar", "qt-designer")
-
-    outpath = os.path.join(
-        repo.working_dir, "src", "openmolar", "qt4gui", "compiled_uis")
-
-    if CHANGED_ONLY:
-        logger.info("using only ui files modified since last commit")
-        ui_files = get_changed_ui_files(repo)
-    else:
-        logger.info("converting all ui files")
-        ui_files = get_all_ui_files(uipath)
-
-    for ui_file in ui_files:
-        path = os.path.join(uipath, os.path.basename(ui_file))
-        pyfile = compile_ui(path, outpath)
-        if pyfile:
-            print "created/updated py file", pyfile
-
-    logger.info("ALL DONE!")
diff --git a/setup.py b/setup.py
index 1232ac2..fe98557 100755
--- a/setup.py
+++ b/setup.py
@@ -147,7 +147,6 @@ setup(
                 'openmolar.qt4gui.phrasebook',
                 'openmolar.qt4gui.printing',
                 'openmolar.qt4gui.printing.gp17',
-                'openmolar.qt4gui.tools',
                 'openmolar.settings',
                 'openmolar.ptModules'],
     package_data={'openmolar': ['resources/icons/*.*',
diff --git a/src/openmolar/GPLv3.txt b/src/openmolar/GPLv3.txt
deleted file mode 100644
index 94a9ed0..0000000
--- a/src/openmolar/GPLv3.txt
+++ /dev/null
@@ -1,674 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/src/openmolar/__init__.py b/src/openmolar/__init__.py
index f61f321..9993dbe 100755
--- a/src/openmolar/__init__.py
+++ b/src/openmolar/__init__.py
@@ -45,6 +45,7 @@ if "-q" in sys.argv:
     LOGGER.setLevel(logging.WARNING)
 elif "-v" in sys.argv:
     LOGGER.setLevel(logging.DEBUG)
+    LOGGER.warning("verbose logging called by -v flag in sys.argv")
 else:
     LOGGER.setLevel(logging.INFO)
 
diff --git a/src/openmolar/backports/advisor.py b/src/openmolar/backports/advisor.py
new file mode 100644
index 0000000..2245a98
--- /dev/null
+++ b/src/openmolar/backports/advisor.py
@@ -0,0 +1,288 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+from PyQt4 import QtGui, QtCore
+
+
+class MessagePopup(QtGui.QWidget):
+
+    '''
+    A custom Widget which can be used as a brief non-modal message box.
+    '''
+
+    def __init__(self, message, parent=None):
+        super(MessagePopup, self).__init__(parent)
+        padding = 12
+
+        # create a QTextDocument, which will handle any rich text in our
+        # messages.
+        doc = QtGui.QTextDocument(self)
+        doc.setHtml(message)
+        doc.setDocumentMargin(padding)
+        doc.adjustSize()
+        self.doc = doc
+
+        doc_width, doc_height = doc.size().width(), doc.size().height()
+
+        icon = QtGui.QIcon(":/openmolar.svg")
+        self.pixmap = icon.pixmap(48, 48)
+
+        pic_width, pic_height = self.pixmap.width(), self.pixmap.height()
+
+        self.setBrushes()
+
+        self.setMouseTracking(True)
+
+        width = doc_width + pic_width + padding * 2
+        if width < self.minimumWidth():
+            width = self.minimumWidth()
+
+        height = doc_height
+        if height < pic_height:
+            height = pic_height
+        height += padding * 2
+
+        self.setFixedSize(width, height)
+
+        # values required at painttime.
+        self.rect_f = QtCore.QRectF(0, 0, width, height)
+
+        self.text_rectf = QtCore.QRectF(padding, padding, doc_width,
+                                        doc_height)
+
+        self.icon_rectf = QtCore.QRectF(padding + doc_width,
+                                        padding, pic_width, pic_height)
+
+    def setIcon(self, icon):
+        self.pixmap = icon.pixmap(30, 30)
+        self.pixmapRect = QtCore.QRectF(self.pixmap.rect())
+
+    def setBrushes(self, alpha=150):
+        self.fully_visible = alpha == 150
+
+        pal = self.palette()
+
+        col = pal.shadow().color()
+        col.setAlpha(alpha)
+        self.border_brush = QtGui.QBrush(col)
+
+        col = pal.toolTipBase().color()
+        col.setAlpha(alpha)
+        self.back_brush = QtGui.QBrush(col)
+
+        pen_colour = pal.toolTipText().color()
+        pen_colour.setAlpha(alpha + 50)
+        self.pen = QtGui.QPen(pen_colour)
+
+    def minimumWidth(self):
+        w = 300
+        if self.parent() is not None:
+            if self.parent().width() > w * 4:
+                w = self.parent().width() / 4
+        return w
+
+    def toggleMouseEvents(self, off=True):
+        self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, off)
+
+    def mouseMoveEvent(self, event):
+        self.update()
+
+    def mousePressEvent(self, event):
+        self.toggleMouseEvents()
+
+    def leaveEvent(self, *args):
+        # gets called after toggleMouseEvents :(
+        self.update()
+
+    def leaveEvent_(self, *args):
+        '''
+        widget won't be mouse aware for leaveEvent..
+        so this has to be called by parent
+        '''
+        self.toggleMouseEvents(False)
+        self.update()
+
+    def paintEvent(self, event):
+        cursor_pos = self.mapFromGlobal(self.cursor().pos())
+        if self.rect().contains(cursor_pos):
+            self.setBrushes(40)
+        else:
+            self.setBrushes()
+
+        painter = QtGui.QPainter(self)
+
+        rect_f = self.rect_f.adjusted(0, 0, -1, -1)
+        # above line allows for pen width
+
+        painter.setPen(QtGui.QPen(self.border_brush, 1))
+        painter.setBrush(self.border_brush)
+        painter.drawRoundedRect(rect_f, 15, 15)
+
+        rect_f = rect_f.adjusted(5, 5, -5, -5)
+        painter.setPen(QtGui.QPen(self.back_brush, 1))
+        painter.setBrush(self.back_brush)
+        painter.drawRoundedRect(rect_f, 15, 15)
+
+        painter.drawPixmap(self.icon_rectf, self.pixmap,
+                           QtCore.QRectF(self.pixmap.rect()))
+
+        painter.setPen(self.pen)
+
+        # a hack because documentLayout.drawText method is sluggish
+        # when used with a semi-transparent pen.
+        # faint version will lack italics and bold styles etc.. but isn't
+        # an issue in practice!
+        if self.fully_visible:
+            dl = self.doc.documentLayout()
+            dl.draw(painter, dl.PaintContext())
+        else:
+            option = QtGui.QTextOption()
+            option.setWrapMode(option.WrapAnywhere)
+            painter.drawText(self.text_rectf, self.doc.toPlainText(), option)
+
+
+class Advisor(QtGui.QWidget):
+
+    '''
+    provides various notifications to the user
+    '''
+
+    def __init__(self, parent=None):
+        '''
+        Advisor.__init__(self, parent=None)
+        '''
+        QtGui.QWidget.__init__(self, parent)
+        self.brief_messages = []
+        self.briefMessagePosition = QtCore.QPoint(10, 10)
+
+        self.brief_message_box = None
+        self.single_shot = QtCore.QTimer(self)
+        self.single_shot.setSingleShot(True)
+        self.single_shot.timeout.connect(self.hide_brief_message)
+
+        self.right_to_left = False
+
+    def setBriefMessagePosition(self, point, right_to_left=False):
+        '''
+        set the position the brief message label will appear
+        arg is QtCore.QPoint,
+        if right_to_left is true, then this point is the top right of the box.
+        '''
+        self.briefMessagePosition = point
+        self.right_to_left = right_to_left
+
+    def hide_brief_message(self):
+        if self.brief_message_box:
+            self.brief_message_box.hide()
+            self.brief_message_box.deleteLater()
+        self.brief_message_box = None
+
+    def advise_dl(self, message):
+        '''
+        convenience function which calls advise with a default of 1.
+        useful when connected to a signal
+        '''
+        self.advise(message, 1)
+
+    def advise_err(self, message):
+        '''
+        convenience function which calls advise with a default of 1.
+        useful when connected to a signal
+        '''
+        self.advise(message, 2)
+
+    def advise(self, message, warning_level=0):
+        '''
+        inform the user of events -
+        warning level0 = no interaction popup.
+        warning level 1 advisory, requires user response.
+        warning level 2 warning, and logged in output.
+        '''
+        def show_brief_messages():
+            self.hide_brief_message()
+            full_message = u"<body>"
+            for mess in self.brief_messages:
+                full_message += u"%s <hr />" % mess
+            full_message = full_message.rstrip("<hr />") + "</body>"
+            self.brief_message_box = MessagePopup(full_message, self)
+            self.brief_message_box.right_to_left = self.right_to_left
+            self.brief_message_box.show()
+            self.brief_message_box.raise_()
+            if self.right_to_left:
+                x = (self.briefMessagePosition.x() -
+                     self.brief_message_box.width())
+                pos = QtCore.QPoint(x, self.briefMessagePosition.y())
+            else:
+                pos = self.briefMessagePosition
+            self.brief_message_box.move(pos)
+            app = QtGui.QApplication.instance()
+            if app:
+                app.processEvents()
+
+        def hide_brief_message():
+            first_message = self.brief_messages[0]
+            self.brief_messages.remove(first_message)
+            if self.brief_messages == []:
+                self.single_shot.setInterval(2000)
+                self.single_shot.start()
+            else:
+                self.single_shot.stop()
+                show_brief_messages()
+
+        if warning_level == 0:
+            self.brief_messages.append(message)
+            show_brief_messages()
+            QtCore.QTimer.singleShot(7000, hide_brief_message)  # 7 seconds
+
+            try:
+                self.statusbar.showMessage(message, 10000)
+            except AttributeError as a:
+                pass
+
+        elif warning_level == 1:
+            QtGui.QMessageBox.information(self, _("Advisory"), message)
+
+        elif warning_level == 2:
+            QtGui.QMessageBox.warning(self, _("Error"), message)
+
+    def wait(self, waiting=True):
+        app = QtGui.QApplication.instance()
+        if waiting:
+            app.setOverrideCursor(QtCore.Qt.WaitCursor)
+        else:
+            app.restoreOverrideCursor()
+
+
+if __name__ == "__main__":
+    import gettext
+    gettext.install("")
+
+    app = QtGui.QApplication([])
+
+    advisor = Advisor()
+    advisor.show()
+    advisor.advise("hello world")
+    advisor.advise("hello world", 1)
+    advisor.advise("hello world", 2)
+    app.exec_()
diff --git a/src/openmolar/connect.py b/src/openmolar/connect.py
index 0b4e4fc..9eed67d 100755
--- a/src/openmolar/connect.py
+++ b/src/openmolar/connect.py
@@ -43,61 +43,84 @@ if __name__ == "__main__":
 
 mainconnection = None
 
-LOGGER.debug("parsing the global settings file")
-dom = minidom.parse(localsettings.cflocation)
-
-settingsversion = dom.getElementsByTagName("version")[0].firstChild.data
-sysPassword = dom.getElementsByTagName("system_password")[0].firstChild.data
-
-xmlnode = dom.getElementsByTagName("server")[localsettings.chosenserver]
-command_nodes = xmlnode.getElementsByTagName("command")
-for command_node in command_nodes:
-    LOGGER.info("commands found in conf file!")
-    commands = command_node.getElementsByTagName("str")
-    command_list = []
-    for command in commands:
-        command_list.append(command.firstChild.data)
-    if command_list:
-        LOGGER.info("executing %s" % str(command_list))
-        subprocess.Popen(command_list)
-
-myHost = xmlnode.getElementsByTagName("location")[0].firstChild.data
-myPort = int(xmlnode.getElementsByTagName("port")[0].firstChild.data)
-sslnode = xmlnode.getElementsByTagName("ssl")
-
-xmlnode = dom.getElementsByTagName("database")[localsettings.chosenserver]
-myUser = xmlnode.getElementsByTagName("user")[0].firstChild.data
-myPassword = xmlnode.getElementsByTagName("password")[0].firstChild.data
-if settingsversion == "1.1":
-    myPassword = base64.b64decode(myPassword)
-
-myDb = xmlnode.getElementsByTagName("dbname")[0].firstChild.data
-
-
-def database_name():
-    return "%s %s:%s" % (myDb, myHost, myPort)
-
-kwargs = {
-    "host": myHost,
-    "port": myPort,
-    "user": myUser,
-    "passwd": myPassword,
-    "db": myDb,
-    "use_unicode": True,
-    "charset": "utf8"
-}
-
-if sslnode and sslnode[0].firstChild.data == "True":
-    #-- to enable ssl... add <ssl>True</ssl> to the conf file
-    LOGGER.debug("using ssl")
-    #-- note, dictionary could have up to 5 params.
-    #-- ca, cert, key, capath and cipher
-    #-- however, IIUC, just using ca will encrypt the data
-    kwargs["ssl_settings"] = {'ca': '/etc/mysql/ca-cert.pem'}
-else:
-    LOGGER.warning("not using ssl (you really should!)")
-
-dom.unlink()
+
+class DB_Params(object):
+
+    def __init__(self):
+        self.host = ""
+        self.port = 0
+        self.user = ""
+        self.db_name = ""
+        try:
+            self.reload()
+        except IOError:
+            LOGGER.warning("no such file exists %s", localsettings.cflocation)
+
+    def reload(self):
+        dom = minidom.parse(localsettings.cflocation)
+        settingsversion = dom.getElementsByTagName(
+            "version")[0].firstChild.data
+        xmlnode = dom.getElementsByTagName(
+            "server")[localsettings.chosenserver]
+        command_nodes = xmlnode.getElementsByTagName("command")
+        for command_node in command_nodes:
+            LOGGER.info("commands found in conf file!")
+            commands = command_node.getElementsByTagName("str")
+            command_list = []
+            for command in commands:
+                command_list.append(command.firstChild.data)
+            if command_list:
+                LOGGER.info("executing %s" % str(command_list))
+                subprocess.Popen(command_list)
+
+        self.host = xmlnode.getElementsByTagName("location")[0].firstChild.data
+        self.port = int(
+            xmlnode.getElementsByTagName("port")[0].firstChild.data)
+        sslnode = xmlnode.getElementsByTagName("ssl")
+        self.use_ssl = sslnode and sslnode[0].firstChild.data == "True"
+
+        xmlnode = dom.getElementsByTagName(
+            "database")[localsettings.chosenserver]
+        self.user = xmlnode.getElementsByTagName("user")[0].firstChild.data
+        self.password = xmlnode.getElementsByTagName(
+            "password")[0].firstChild.data
+        if settingsversion == "1.1":
+            self.password = base64.b64decode(self.password)
+
+        self.db_name = xmlnode.getElementsByTagName(
+            "dbname")[0].firstChild.data
+
+        if not self.use_ssl:
+            #-- to enable ssl... add <ssl>True</ssl> to the conf file
+            LOGGER.debug("using ssl")
+        else:
+            LOGGER.warning("not using ssl (you really should!)")
+
+        dom.unlink()
+
+    @property
+    def kwargs(self):
+        kwargs = {
+            "host": self.host,
+            "port": self.port,
+            "user": self.user,
+            "passwd": self.password,
+            "db": self.db_name,
+            "use_unicode": True,
+            "charset": "utf8"
+        }
+        if self.use_ssl:
+                #-- note, dictionary could have up to 5 params.
+            #-- ca, cert, key, capath and cipher
+            #-- however, IIUC, just using ca will encrypt the data
+            kwargs["ssl_settings"] = {'ca': '/etc/mysql/ca-cert.pem'}
+        return kwargs
+
+    @property
+    def database_name(self):
+        return "%s %s:%s" % (self.db_name, self.host, self.port)
+
+params = DB_Params()
 
 GeneralError = MySQLdb.Error
 ProgrammingError = MySQLdb.ProgrammingError
@@ -105,49 +128,6 @@ IntegrityError = MySQLdb.IntegrityError
 OperationalError = MySQLdb.OperationalError
 
 
-class omSQLresult(object):
-
-    '''
-    a class used in returning the result of sql queries
-    '''
-
-    def __init__(self):
-        self.message = ""
-        self.number = 0
-        self.result = False
-
-    def __nonzero__(self):
-        '''
-        used in case the class is used thus
-        if omSQLresult:
-        '''
-        return self.result
-
-    def setMessage(self, arg):
-        '''
-        set the message associated with the result
-        '''
-        self.message = arg
-
-    def getMessage(self):
-        '''
-        get the message associated with the result
-        '''
-        return self.message
-
-    def setNumber(self, arg):
-        '''
-        set the number of rows grabbed by the result
-        '''
-        self.number = arg
-
-    def getNumber(self):
-        '''
-        get the number of rows grabbed by the result
-        '''
-        return self.number
-
-
 def connect():
     '''
     returns a MySQLdb object, connected to the database specified in the
@@ -159,10 +139,8 @@ def connect():
         try:
             if not (mainconnection and mainconnection.open):
                 LOGGER.info("New database connection needed")
-                LOGGER.debug(
-                    "connecting to %s on %s port %s" % (myDb, myHost, myPort))
-
-                mainconnection = MySQLdb.connect(**kwargs)
+                LOGGER.debug("connecting to %s", params.database_name)
+                mainconnection = MySQLdb.connect(**params.kwargs)
                 mainconnection.autocommit(True)
             else:
                 mainconnection.commit()
@@ -178,32 +156,26 @@ def connect():
     raise exc
 
 if __name__ == "__main__":
-    import time
-    from openmolar.settings import localsettings
-    localsettings.initiate()
-
-    LOGGER.setLevel(logging.DEBUG)
-
     LOGGER.debug("using conffile -  %s" % localsettings.cflocation)
     for i in range(1, 11):
         try:
             LOGGER.debug("connecting....")
             dbc = connect()
-            LOGGER.info(dbc.info())
+            LOGGER.info(dbc)
             LOGGER.debug('ok... we can make Mysql connections!!')
             LOGGER.debug("    loop no %d " % i)
             if i == 2:
                 # close the db... let's check it reconnects
                 dbc.close()
             if i == 4:
-                # make a slightly bad query... let's check we get a warning
-                c = dbc.cursor()
-                c.execute(
-                    'update patients set dob="196912091" where serialno=4')
-                c.close()
+                LOGGER.debug(
+                    "making a slightly bad query... let's check we get a warning")
+                cursor = dbc.cursor()
+                cursor.execute(
+                    'update new_patients set dob="196912091" where serialno=4')
+                cursor.close()
         except Exception as exc:
             LOGGER.exception("exception caught?")
-
         time.sleep(5)
 
     dbc.close()
diff --git a/src/openmolar/create_db.py b/src/openmolar/create_db.py
new file mode 100644
index 0000000..58311ea
--- /dev/null
+++ b/src/openmolar/create_db.py
@@ -0,0 +1,142 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+'''
+this module takes the demo dump and creates a database from it with the
+correct user permissions.
+'''
+
+import logging
+import os
+
+import MySQLdb
+from openmolar.settings import localsettings
+
+LOGGER = logging.getLogger("openmolar")
+
+DROP_QUERY = "DROP DATABASE IF EXISTS %s"
+CREATE_QUERY = "CREATE DATABASE %s"
+
+#-- note for production deployments, only grant
+#-- select,insert,update,delete privileges
+PRIVS_QUERY = "GRANT ALL PRIVILEGES ON %s.* TO '%s'@'%s' IDENTIFIED BY '%s'"
+
+
+def exists_already(host_, port_, db_name, privileged_user_pass,
+privileged_user="root"):
+    '''
+    returns true if database 'db_name' exists
+    '''
+    try:
+        db = MySQLdb.connect(host=host_,
+                             port=port_,
+                             user=privileged_user,
+                             passwd=privileged_user_pass,
+                            db=db_name
+                            )
+        if db.open:
+            db.close()
+            return True
+    except:
+        LOGGER.warning("exists already through error, passing silently")
+        pass
+    return False
+
+def create_database(host_, port_, user_, pass_wd, db_name,
+privileged_user_pass, privileged_user="root"):
+    '''
+    creates a database called "db_name" on host_, port_, passwd,
+    '''
+    try:
+        #-- connect as mysqlroot to create the database
+        db = MySQLdb.connect(host=host_,
+                             port=port_,
+                             user=privileged_user,
+                             passwd=privileged_user_pass
+                             )
+
+        cursor = db.cursor()
+        LOGGER.info("deleting any existing openmolar_demo database....")
+        cursor.execute(DROP_QUERY % db_name)
+
+        LOGGER.info("creating database %s", db_name)
+        cursor.execute(CREATE_QUERY % db_name)
+
+        LOGGER.info("setting privileges for '%s'", user_)
+        cursor.execute(PRIVS_QUERY % (db_name, user_, host_, pass_wd))
+        cursor.close()
+        db.commit()
+        db.close()
+        LOGGER.info("db created successfully")
+        return True
+    except:
+        LOGGER.exception("error creating database")
+
+
+def create_tables(host_, port_, user_, pass_wd, db_name):
+    try:
+        wkdir = localsettings.determine_path()
+        f = open(os.path.join(wkdir, "resources", "schema.sql"), "r")
+        sql_statements = f.read()
+        f.close()
+
+        db = MySQLdb.connect(host=host_,
+                             port=port_,
+                             user=user_,
+                             db=db_name,
+                             passwd=pass_wd)
+
+        cursor = db.cursor()
+        cursor.execute(sql_statements)
+        cursor.close()
+        db.commit()
+        db.close()
+        return True
+    except:
+        LOGGER.exception("error creating database tables")
+
+if __name__ == "__main__":
+    root_pass = raw_input("please enter your MySQL root users password :")
+    print "exists already", exists_already("localhost",
+                       3306,
+                       "openmolar_demo",
+                       root_pass
+                       )
+
+    if create_database("localhost",
+                       3306,
+                       "openmolar",
+                       "password",
+                       "openmolar_demo",
+                       root_pass
+                       ):
+        LOGGER.debug("New database created successfully")
+
+        create_tables(
+            "localhost",
+            3306,
+            "openmolar",
+            "password",
+            "openmolar_demo")
+
diff --git a/src/openmolar/createdemodatabase.py b/src/openmolar/createdemodatabase.py
deleted file mode 100644
index 75aa53e..0000000
--- a/src/openmolar/createdemodatabase.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-this module takes the demo dump and creates a database from it with the
-correct user permissions.
-'''
-
-import MySQLdb
-import os
-from openmolar.settings import localsettings
-
-
-def create_database(myhost, myport, myuser, mypassword, databaseName,
-                    rootMySQLpassword):
-    #-- connect as mysqlroot to create the database
-
-    db = MySQLdb.connect(
-        host=myhost, port=myport, user="root", passwd=rootMySQLpassword)
-
-    cursor = db.cursor()
-    try:
-        print "deleting any existing openmolar_demo database....",
-        print cursor.execute("DROP DATABASE IF EXISTS %s" % databaseName)
-    except:
-        print "non found... skipping"
-        pass
-    print "creating database...",
-    print cursor.execute("CREATE DATABASE %s" % databaseName)
-
-    #-- note for production deployments, only grant
-    #-- select,insert,update,delete privileges
-    query = 'GRANT ALL PRIVILEGES ON %s.* TO %s@%s IDENTIFIED BY "%s"' % (
-        databaseName, myuser, myhost, mypassword)
-    print "setting privileges for '%s'" % myuser
-    cursor.execute(query)
-    cursor.close()
-    db.commit()
-    db.close()
-    print "db created sucessfully"
-    return True
-
-
-def loadTables(myhost, myport, myuser, mypassword, databaseName):
-    wkdir = localsettings.determine_path()
-    f = open(os.path.join(wkdir, "resources", "demodump.sql"), "r")
-    dumpString = f.read()
-    f.close()
-    print myhost, myport, myuser, databaseName, mypassword
-    db = MySQLdb.connect(host=myhost, port=myport,
-                         user=myuser, db=databaseName, passwd=mypassword)
-
-    cursor = db.cursor()
-    cursor.execute(dumpString)
-    cursor.close()
-    db.commit()
-    db.close()
-    return True
-
-if __name__ == "__main__":
-    rootpass = raw_input("please enter your MySQL root users password :")
-    if create_database("localhost", 3306, "OMuser", "password",
-                       "openmolar_demo", rootpass):
-        print "New database created sucessfully"
-
-    loadTables("localhost", 3306, "OMuser", "password", "openmolar_demo")
diff --git a/src/openmolar/dbtools/accounts.py b/src/openmolar/dbtools/accounts.py
index 3f43597..dd4663b 100644
--- a/src/openmolar/dbtools/accounts.py
+++ b/src/openmolar/dbtools/accounts.py
@@ -29,6 +29,14 @@ module to retrieve a list of patients who owe money
 from openmolar.settings import localsettings
 from openmolar.connect import connect
 
+QUERY = '''select dnt1, serialno, cset, fname, sname, dob, memo, pd4,
+billdate, billtype, billct, courseno0,
+(money0 + money1 + money9 + money10 - money2 - money3 - money8) as fees
+from new_patients join patient_money on serialno = patient_money.pt_sno
+join patient_dates on serialno = patient_dates.pt_sno
+where (money0 + money1 + money9 + money10 - money2 - money3 - money8) > 0
+order by pd4 desc'''
+
 
 def details():
     '''
@@ -36,16 +44,9 @@ def details():
     '''
     db = connect()
     cursor = db.cursor()
-    query = '''select dnt1,serialno ,cset, fname,sname,dob,memo,pd4,billdate,
-    billtype,billct,courseno0,
-    (money0 + money1 + money9 + money10 - money2 - money3 - money8) as fees
-    from patients where
-    (money0 + money1 + money9 + money10 - money2 - money3 - money8) > 0
-    order by pd4 desc'''
-    cursor.execute(query)
+    cursor.execute(QUERY)
     rows = cursor.fetchall()
     cursor.close()
-    # db.close()
     return rows
 
 if __name__ == "__main__":
diff --git a/src/openmolar/dbtools/appointments.py b/src/openmolar/dbtools/appointments.py
index 76c1b96..a721bf5 100755
--- a/src/openmolar/dbtools/appointments.py
+++ b/src/openmolar/dbtools/appointments.py
@@ -26,11 +26,21 @@ import datetime
 import logging
 
 from openmolar.settings import localsettings
-from openmolar.connect import (connect,
-    omSQLresult, ProgrammingError, OperationalError)
+from openmolar.connect import connect, ProgrammingError, OperationalError
 
 LOGGER = logging.getLogger("openmolar")
 
+INSERT_APPT_QUERY = '''INSERT INTO aslot (adate,apptix,start,end,name,serialno,
+code0,code1,code2,note,flag0,flag1,flag2,flag3)
+VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
+
+APPOINTMENTS_QUERY = '''
+SELECT start, end, name, concat(title," ",fname," ",sname),
+new_patients.serialno, concat(code0," ",code1," ",code2),
+note, cset
+FROM new_patients right join aslot on new_patients.serialno=aslot.serialno
+WHERE adate = %s and apptix = %s  order by start'''
+
 
 class FreeSlot(object):
 
@@ -669,67 +679,23 @@ def getLengthySlots(slots, length):
     return retlist
 
 
-def updateAday(uddate, arg):
+def updateAday(date_, data):
     '''
     takes an instance of the workingDay class
     and updates the database
-    returns an omSQLresult
     '''
     db = connect()
     cursor = db.cursor()
-    result = omSQLresult()
     query = '''insert into aday (memo, adate, apptix, start, end, flag)
     values (%s,%s, %s, %s, %s, %s)
     on duplicate key
     update memo=%s, adate=%s, apptix=%s, start=%s, end=%s, flag=%s'''
 
-    values = (arg.memo, uddate, arg.apptix, arg.sqlStart(), arg.sqlFinish(),
-    arg.active) * 2
-
-    result.setNumber(cursor.execute(query, values))
-
-    if result:
-        db.commit()
-    return result
-
-
-def alterDay(arg):
-    '''
-    takes a DentistDay object tries to change the aday table
-    returns an omSQLresult
-    '''
-    #-- this method is called from the apptOpenDay Dialog, which is deprecated!!
-    print "DEPRECATED FUNCTION CALLED alterDay"
-    db = connect()
-    cursor = db.cursor()
-    result = omSQLresult()
-    query = 'SELECT flag FROM aday WHERE adate="%s" and apptix=%d' % (
-        arg.date, arg.apptix)
-
-    if cursor.execute(query):
-        #-- dentists diary includes this date
-        query = '''update aday set start=%s,end=%s,flag=%s, memo=%s
-        where adate=%s and apptix=%s'''
-        values = (arg.start, arg.end, arg.flag, arg.memo, arg.date,
-        arg.ix)
-
-        result.setNumber(cursor.execute(query, values))
+    values = (data.memo, date_, data.apptix, data.sqlStart(), data.sqlFinish(),
+    data.active) * 2
 
-        if result.getNumber() == 1:
-            result.setMessage("Date sucessfully modified")
-        else:
-            result.setMessage(
-                "No changes applied - the values you supplied " +
-                "are the same as the existing.")
-
-        db.commit()
-
-    else:
-        result.setMessage("The date you have tried to modify is " +
-        "beyond the dates opened for dentist %s" % (
-                          localsettings.ops.get(arg.ix),))
-
-    return result
+    n_rows = cursor.execute(query, values)
+    return n_rows
 
 
 def todays_patients(dents):
@@ -880,6 +846,22 @@ def getBankHol(adate):
     return retarg
 
 
+def getMemos(adate):
+    '''
+    get Memos for one specific date
+    '''
+    db = connect()
+    cursor = db.cursor()
+
+    query = '''SELECT apptix, memo FROM aday WHERE adate=%s'''
+    cursor.execute(query, (adate, ))
+    dict_ = {}
+    for apptix, memo in cursor.fetchall():
+        dict_[apptix] = memo
+    cursor.close()
+    return dict_
+
+
 def getGlobalMemo(date):
     '''
     get global memo for one specific date
@@ -1065,12 +1047,7 @@ def printableDaylistData(adate, dent):
         retlist.append(daydata[0][2])
         dayend = daydata[0][1]
         #--now get data for those days so that we can find slots within
-        query = '''SELECT start,end,name,
-        concat(patients.title," ",patients.fname," ",patients.sname),
-        patients.serialno,concat(code0," ",code1," ",code2),note,patients.cset
-        FROM patients right join aslot on patients.serialno=aslot.serialno
-        WHERE adate = %s and apptix = %s  order by start'''
-        cursor.execute(query, values)
+        cursor.execute(APPOINTMENTS_QUERY, values)
 
         results = cursor.fetchall()
 
@@ -1384,16 +1361,13 @@ code2, note, flag0, flag1, flag2, flag3):
 
     db = connect()
     cursor = db.cursor()
-    query = '''INSERT INTO aslot (adate,apptix,start,end,name,serialno,
-    code0,code1,code2,note,flag0,flag1,flag2,flag3)
-    VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
 
     values = (make_date, apptix, start, end, name, serialno, code0,
     code1, code2, note, flag0, flag1, flag2, flag3)
 
     result = False
     try:
-        result = cursor.execute(query, values)
+        result = cursor.execute(INSERT_APPT_QUERY, values)
     except OperationalError as exc:
         LOGGER.exception("couldn't insert into aslot %s %s %s serialno %d" % (
             make_date, apptix, start, serialno))
@@ -1631,51 +1605,42 @@ def future_slots(startdate, enddate, dents, override_emergencies=False):
     get a list of possible appointment positions
     (between startdate and enddate) that can be offered to the patient
     '''
-    if dents == ():
+    if len(dents) == 0:
         return ()
 
     db = connect()
     cursor = db.cursor()
-    values = [startdate, enddate]
+    values = [startdate, enddate] + list(dents)
 
-    mystr = " and ("
-    for dent in dents:
-        mystr += "apptix=%s or "
-        values.append(dent)
-    mystr = mystr[0:mystr.rindex(" or")] + ")"
-
-    if override_emergencies:
-        emer_sql = ' and name!="emergency" '
-    else:
-        emer_sql = ""
+    format_dents = ",".join(('%s',) * len(dents))  # %s, %s, %s
 
     fullquery = '''SELECT adate, apptix, start, end FROM aday
-    WHERE adate>=%%s AND adate<=%%s AND (flag=1 OR flag= 2) %s
-    ORDER BY adate''' % mystr
+    WHERE adate>=%%s AND adate<=%%s AND (flag=1 OR flag= 2) AND apptix in (%s)
+    ORDER BY adate''' % format_dents
 
     cursor.execute(fullquery, values)
-
     possible_days = cursor.fetchall()
+    cursor.close()
+    cursor = db.cursor()
+
     #--get days when a suitable appointment is possible
-    query = ""
+    #--flag0!=72 necessary to avoid zero length apps like pain/double/fam
+
+    query = '''select start, end from aslot
+    where adate = %%s and apptix = %%s and flag0!=72 %s order by start
+    ''' % (' and name!="emergency" ' if override_emergencies else "")
+
     slotlist = []
     #--now get data for those days so that we can find slots within
     for day in possible_days:
         adate, apptix, daystart, dayfin = day
         values = (adate, apptix)
-        query = '''select start, end from aslot
-        where adate = %%s and apptix = %%s and flag0!=72 %s order by start
-        ''' % emer_sql
 
-        #--flag0!=72 necessary to avoid zero length apps like pain/double/fam
         cursor.execute(query, values)
-
         results = cursor.fetchall()
-        slotlist += slots(
-            adate, apptix, daystart, results, dayfin)
+        slotlist += slots(adate, apptix, daystart, results, dayfin)
 
     cursor.close()
-    # db.close()
     return slotlist
 
 if __name__ == "__main__":
diff --git a/src/openmolar/dbtools/brief_patient.py b/src/openmolar/dbtools/brief_patient.py
index 200da23..9712865 100644
--- a/src/openmolar/dbtools/brief_patient.py
+++ b/src/openmolar/dbtools/brief_patient.py
@@ -32,7 +32,7 @@ from openmolar.dbtools.appt_prefs import ApptPrefs
 LOGGER = logging.getLogger("openmolar")
 
 QUERY = '''SELECT title, fname, sname, dob, cset, dnt1, dnt2
-from patients where serialno = %s'''
+from new_patients where serialno = %s'''
 
 
 class BriefPatient(object):
diff --git a/src/openmolar/dbtools/cashbook.py b/src/openmolar/dbtools/cashbook.py
index 08955d9..4456aa1 100644
--- a/src/openmolar/dbtools/cashbook.py
+++ b/src/openmolar/dbtools/cashbook.py
@@ -72,7 +72,7 @@ class CashBookCodesDict(dict):
             rows = cursor.fetchall()
             for row in rows:
                 self[int(row[0])] = row[1]
-            LOGGER.debug("cashbook codes loaded sucessfully")
+            LOGGER.debug("cashbook codes loaded successfully")
         except Exception as exc:
             LOGGER.exception("error loading cashbook codes")
         finally:
@@ -185,7 +185,7 @@ def details(dent, startdate, enddate,
         retarg += '<td>%s</td><td>%s</td>' % (row[0], row[1])
         retarg += '<td>%s</td>' % localsettings.ops.get(row[2])
         retarg += '<td>%s</td>' % row[3]
-        CODE = cashbookCodesDict.get(row[4])
+        CODE = localsettings.cashbookCodesDict.get(row[4])
         retarg += '<td>%s</td>' % CODE
         amt = row[5]
         amt_str = localsettings.formatMoney(amt)
@@ -244,12 +244,7 @@ def details(dent, startdate, enddate,
     # db.close()
     return retarg
 
-#--initiate the cashbook dictionary on module import
-cashbookCodesDict = CashBookCodesDict()
-
 if __name__ == "__main__":
-    from PyQt4.QtCore import QDate
-
     localsettings.initiate()
-    print cashbookCodesDict
-    print cashbookCodesDict.viewitems()
+    print localsettings.cashbookCodesDict
+    print localsettings.cashbookCodesDict.viewitems()
diff --git a/src/openmolar/dbtools/courseHistory.py b/src/openmolar/dbtools/courseHistory.py
index 843bf6d..00785f3 100644
--- a/src/openmolar/dbtools/courseHistory.py
+++ b/src/openmolar/dbtools/courseHistory.py
@@ -26,231 +26,224 @@
 a module to search for previous course items
 '''
 
+import datetime
+import logging
+
 from openmolar.settings import localsettings
 from openmolar.connect import connect
-from openmolar.dbtools.treatment_course import CURRTRT_ATTS
+from openmolar.dbtools.treatment_course import TreatmentCourse
 from openmolar.dbtools import estimatesHistory
+from openmolar.dbtools import daybook
 
-uppers = ('ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1',
-          'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8')
-lowers = ('lr8', 'lr7', 'lr6', 'lr5', 'lr4', 'lr3', 'lr2', 'lr1',
-          'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8')
-
-
-class txCourse():
-
-    '''
-    a custom class to hold the data within a currtrtmt row of the database
-    '''
-
-    def __init__(self, vals):
-        i = 0
-        for att in CURRTRT_ATTS:
-            val = vals[i]
-            self.__dict__[att] = val
-            i += 1
-
-    def toHtml(self):
-        '''
-        returns an HTML representation of itself
-        '''
-
-        retarg = '''<table width = "100%%" border = "2">
-        <tr><th colspan = "3" bgcolor = "yellow">CourseNo %s</th>
-        <//tr>''' % self.courseno
-
-        headers = [("Acceptance Date", self.accd),
-                   ("Completion Date", self.cmpd)]
+from openmolar.ptModules.course_checker import CourseChecker
 
-        for header in headers:
-            retarg += '<tr><th colspan = "2">%s</th><td>%s</td></tr>\n' % header
-
-        #-plan row.
-        for planned in ("pl", "cmp"):
-            rows = []
-
-            if planned == "pl":
-                bgcolor = ' bgcolor = "#eeeeee"'
-                header = "PLANNED / INCOMPLETE"
-            else:
-                bgcolor = ' bgcolor = "#ddeeee"'
-                header = "COMPLETED"
-                if self.examt != "":
-                    exam_details = self.examt
-                    if self.examd and self.examd != self.accd:
-                        exam_details += " dated - %s" % self.examd
-                    cells = "<th%s>%s</th><td%s>%s</td>" % (bgcolor,
-                                                            _("Exam"), bgcolor, exam_details)
-                    rows.append(cells)
+LOGGER = logging.getLogger("openmolar")
 
-            for att, con_att in (
-                ("perio", _("perio")),
-                ("xray", _('xray')),
-                ("anaes", _('anaes')),
-                ("other", _('other')),
-                ("custom", _("custom"))
-            ):
-                if self.__dict__[att + planned] != "":
-                    cells = "<th%s>%s</th><td%s>%s</td>" % (bgcolor,
-                                                            con_att, bgcolor, self.__dict__[att + planned])
-                    rows.append(cells)
+QUERY = '''SELECT courseno FROM currtrtmt2 WHERE serialno=%s
+ORDER BY courseno desc, accd desc'''
 
-            dentureWork = ""
-            for att in ('ndu', 'ndl', 'odu', 'odl'):
-                val = self.__dict__[att + planned]
-                if val != "":
-                    dentureWork += "%s - '%s' " % (att, val)
-            if dentureWork != "":
-                cells = "<th%s>%s</th><td%s>%s</td>" % (
-                    bgcolor, _("Denture Work"), bgcolor, dentureWork)
+ALLOW_EDIT = False
 
-                rows.append(cells)
 
-            showChart = False
-            cells = '''<th%s>Chart</th><td>
-            <table width = "100%%" border = "1"><tr>''' % bgcolor
-
-            for att in uppers:
-                work = self.__dict__[att + planned]
-                cells += '<td align = "center"%s>%s</td>' % (
-                    bgcolor, work)
-                showChart = showChart or work != ""
-
-            cells += "</tr><tr>"
-            for att in uppers:
-                cells += '<td align = "center"%s>%s</td>' % (
-                    bgcolor, att.upper())
-
-            cells += "</tr><tr>"
-            for att in lowers:
-                cells += '<td align = "center"%s>%s</td>' % (
-                    bgcolor, att.upper())
-
-            cells += "</tr><tr>"
-            for att in lowers:
-                work = self.__dict__[att + planned]
-                cells += '<td align = "center"%s>%s</td>' % (
-                    bgcolor, work)
-                showChart = showChart or work != ""
-
-            cells += "</tr></table></td>"
-
-            if showChart:
-                rows.append(cells)
-
-            row_span = len(rows)
-
-            if rows != []:
-                retarg += '<tr><th rowspan = "%s"%s>%s</th>' % (
-                    row_span, bgcolor, header)
-            for row in rows:
-                if row == rows[0]:
-                    retarg += "%s</tr>\n" % row
-                else:
-                    retarg += "<tr>%s</tr>\n" % row
-
-        retarg += '</table>\n'
-        return retarg
-
-
-def details(sno):
-    '''
-    returns an html page showing pt's Treatment History
-    '''
+def _get_courses(sno, current_csno):
+    # query allows exclusion of current course.
+    if current_csno is None:
+        query = QUERY
+        values = (sno,)
+    else:
+        query = QUERY.replace("ORDER", " AND courseno!=%s ORDER")
+        values = (sno, current_csno)
     db = connect()
     cursor = db.cursor()
-    fields = CURRTRT_ATTS
-    query = ""
-
-    for field in fields:
-        if field in ('examd', 'accd', 'cmpd'):
-            query += 'DATE_FORMAT(%s, "%s"),' % (
-                field, localsettings.OM_DATE_FORMAT)
-
-        else:
-            query += field + ","
-
-    query = query.strip(",")
-
-    cursor.execute('''SELECT %s from currtrtmt2 where serialno = %d
-    order by courseno desc''' % (query, sno))
-
+    cursor.execute(query, values)
     rows = cursor.fetchall()
     cursor.close()
 
-    courses = []
     for row in rows:
-        course = txCourse(row)
-        courses.append(course)
-
-    claimNo = len(courses)
-    retarg = "<h2>Past Courses of Treatment - %d rows found</h2>" % claimNo
-
-    for course in courses:
-        retarg += course.toHtml()
-        retarg += "<br /><hr /><br />"
-    # db.close()
-    return retarg
+        yield TreatmentCourse(sno, row[0])
 
 
-def all_details(sno):
+def details(sno, current_csno, include_estimates=False, include_daybook=False):
     '''
-    returns an html page showing pt's Treatment History
+    returns an html page showing pt's Treatment History along with estimates
     '''
-    db = connect()
-    cursor = db.cursor()
-    fields = CURRTRT_ATTS
-    query = ""
-
-    for field in fields:
-        if field in ('examd', 'accd', 'cmpd'):
-            query += 'DATE_FORMAT(%s, "%s"),' % (
-                field, localsettings.OM_DATE_FORMAT)
-
-        else:
-            query += field + ","
-
-    query = query.strip(",")
-
-    cursor.execute('''SELECT %s from currtrtmt2 where serialno = %d
-    order by courseno desc''' % (query, sno))
-
-    rows = cursor.fetchall()
-    cursor.close()
-
-    courses = []
-    for row in rows:
-        course = txCourse(row)
-        courses.append(course)
-
-    claimNo = len(courses)
-    retarg = "<h2>Past Courses of Treatment - %d rows found</h2>" % claimNo
-
-    estimatesList = estimatesHistory.getEsts(sno)
-
-    for course in courses:
-        retarg += course.toHtml()
-        estTableStarted = False
-        for est in estimatesList:
-            if est.courseno == course.courseno:
-                if not estTableStarted:
-                    retarg += '''<h3>Estimate for course number %d</h3>
-                    <table width="100%%" border="1">''' % est.courseno
-                    estTableStarted = True
-                    retarg += est.htmlHeader()
-                retarg += est.toHtmlRow()
+    courses = list(_get_courses(sno, current_csno))
+    estimates_list = estimatesHistory.getEsts(sno) if include_estimates else []
+    daybook_list = list(daybook.all_data(sno)) if include_daybook else []
+    daybook_course_guesses = {}
+    displayed_ests = []
+    course_checker_errors = 0
+
+    html = "<body><html><!-- ERRORS --><!-- ORPHANS --><h2>%s - %d %s</h2>" % (
+        _("Past Courses of Treatment"),
+        len(courses),
+        _("found")
+    )
+
+    if current_csno is not None:
+        html += "<strong>%s %s %s</strong><br />" % (
+            _("Ignoring course number"),
+            current_csno,
+            _("as this is active")
+        )
+
+    days_elapsed = None
+
+    for i, course in enumerate(courses):
+        course_html = course.to_html(ALLOW_EDIT, days_elapsed)
+        course_ests = []
+
+        if include_estimates:
+            est_table_init = False
+            for est in estimates_list:
+                if est.courseno == course.courseno:
+                    course_ests.append(est)
+                    if not est_table_init:
+                        header = est.htmlHeader()
+                        if estimatesHistory.ALLOW_EDIT:
+                            header = header.replace(
+                                "<!--editlink-->",
+                                estimatesHistory.EDIT_STRING % est.courseno)
+                        course_html += (
+                            '<table width="100%%" border="1">%s ' % header)
+                        est_table_init = True
+                    course_html += est.toHtmlRow()
+
+            if est_table_init:
+                course_html += '</table>\n'
+            else:
+                course_html += "%s %d" % (_("no estimate found for courseno"),
+                                          course.courseno)
+        displayed_ests += course_ests
+
+        if include_daybook:
+            daybook_html = ""
+            if course.accd is None:
+                accd = datetime.date(1980, 1, 1)
+                course_html += "<em>%s</em><br />" % _(
+                    "Warning - No course acceptance date")
+            else:
+                accd = course.accd
+            if course.cmpd is None:
+                cmpd = datetime.date.today()
+                course_html += "<em>%s</em><br />" % _(
+                    "Warning - No course completion date, "
+                    "using today to gather daybook items.")
+            else:
+                cmpd = course.cmpd
+            for daybook_entry in daybook_list:
+                if accd <= daybook_entry.date <= cmpd:
+                    try:
+                        daybook_course_guesses[course.courseno].append(
+                            daybook_entry)
+                    except KeyError:
+                        daybook_course_guesses[
+                            course.courseno] = [
+                            daybook_entry]
+
+                    gap = cmpd - daybook_entry.date
+                    if daybook.ALLOW_TX_EDITS:
+                        id_col = '<a href="daybook_id_edit?%s">%s</a>' % (
+                            daybook_entry.id, _("Edit Tx"))
+                    else:
+                        id_col = str(daybook_entry.id)
+                    daybook_html += "<tr><td>%s</td></tr>" % (
+                        "</td><td> ".join(
+                            (localsettings.formatDate(daybook_entry.date),
+                             daybook_entry.coursetype,
+                             localsettings.ops.get(daybook_entry.dntid),
+                             localsettings.ops.get(daybook_entry.trtid, "-"),
+                             daybook_entry.diagn, daybook_entry.perio,
+                             daybook_entry.anaes, daybook_entry.misc,
+                             daybook_entry.ndu, daybook_entry.ndl,
+                             daybook_entry.odu, daybook_entry.odl, daybook_entry.other,
+                             daybook_entry.chart.strip(chr(0) + " \n"),
+                             localsettings.formatMoney(daybook_entry.feesa),
+                             localsettings.formatMoney(daybook_entry.feesb),
+                             id_col))
+                    )
+            if daybook_html:
+                header_rows = daybook.all_data_header()
+                if course.cmpd is None:
+                    header_rows = header_rows.replace(
+                        "<!--gap-->", _("Course is Ongoing"))
+                elif gap.days != 0:
+                    header_rows = header_rows.replace(
+                        "<!--gap-->",
+                        "%s %s %s" % (_("Course closed"),
+                                      gap.days,
+                                      _("days after last treatment")))
+                course_html += '<table width="100%%" border=1>%s%s</table>' % (
+                    header_rows, daybook_html)
+            else:
+                course_html += "%s<br />" % _(
+                    "Course dates not found in daybook")
+
+            if include_estimates and include_daybook:
+                course_check = CourseChecker(
+                    course,
+                    course_ests,
+                    daybook_course_guesses.get(course.courseno, []))
+
+                if course_check.has_errors:
+                    course_checker_errors += 1
+                    course_html += course_check.results
+                    course_html += '''<br />
+                        <a href="consistent_courseno?%s">%s</a>''' % (
+                        course.courseno, _("Examine these Issues."))
+
+        days_elapsed = ""
+        try:
+            prev_course = courses[i + 1]
+            if ALLOW_EDIT:
+                merge_link = '<br /><a href="merge_courses?%s+%s">%s?</a>' % (
+                    course.courseno, prev_course.courseno,
+                    _("Merge with previous course")
+                )
+                course_html = course_html.replace("<!--merge-->", merge_link)
+            days_elapsed = (course.accd - prev_course.cmpd).days
+        except IndexError:
+            days_elapsed = None
+            pass
+        except TypeError:
+            pass
+        finally:
+            course_html += '<br /><hr /><br />'
+
+        html += course_html
+
+    html += "</html></body>"
+
+    orphaned_html = ""
+    i = 0
+    for est in estimates_list:
+        if not est in displayed_ests:
+            if i == 0:
+                orphaned_html += '''<h1>%s %s</h1>
+                <table width="100%%" border="1">%s ''' % (
+                    _("WARNING"),
+                    _("ORPHANED ESTIMATE DATA"),
+                    est.htmlHeader().replace("#ffff99", "red")
+                )
+            orphaned_html += est.toHtmlRow()
+            i += 1
 
-        if estTableStarted:
-            retarg += '</table>\n'
-        else:
-            retarg += "no estimate found for courseno %d" % course.courseno
-        retarg += "<br /><hr /><br />"
-    # db.close()
-    return retarg
+    if course_checker_errors:
+        html = html.replace(
+            "<!-- ERRORS -->",
+            "<h3>%d %s</h3>" % (course_checker_errors, _("Errors Found"))
+        )
 
+    if i == 0:
+        return html
+    return html.replace("<!-- ORPHANS -->",
+                        "%s</table><em>%s</em><br />" % (
+                            orphaned_html,
+                            _("This shouldn't happen!"))
+                        )
 
 if __name__ == "__main__":
+    from gettext import gettext as _
+    # ALLOW_EDIT = True
     localsettings.initiate()
-    print'<html><body>'
-    print details(17322)
-    print "</body></html>"
+    print details(27107, 0, True, True).encode("ascii", "replace")
diff --git a/src/openmolar/dbtools/daybook.py b/src/openmolar/dbtools/daybook.py
index ccdae96..f0d432d 100644
--- a/src/openmolar/dbtools/daybook.py
+++ b/src/openmolar/dbtools/daybook.py
@@ -26,6 +26,7 @@
 this module provides read/write tools for the daybook database table
 '''
 
+from collections import namedtuple
 import logging
 
 from PyQt4.QtCore import QDate
@@ -58,6 +59,11 @@ DETAILS_QUERY = '''select DATE_FORMAT(date,'%s'), daybook.serialno,
         date >= %%s and date <= %%s {{FILTERS}} order by date''' % (
     localsettings.OM_DATE_FORMAT.replace("%", "%%"))
 
+DAYBOOK_QUERY = '''select date, coursetype, dntid,
+        trtid, diagn, perio, anaes, misc, ndu, ndl, odu, odl, other, chart,
+        feesa, feesb, feesc, id
+        from daybook where serialno=%s order by date'''
+
 FIELD_NAMES_QUERY = '''
 SELECT concat(table_name, ".", column_name) as fieldname FROM
 information_schema.columns
@@ -76,11 +82,20 @@ UPDATE_TREATMENTS_QUERY = ('update daybook '
                            'set diagn=%s, perio=%s, anaes=%s, misc=%s, ndu=%s, ndl=%s, '
                            'odu=%s, odl=%s, other=%s, chart=%s where id = %s')
 
+# custom class for daybook data
+DaybookEntry = namedtuple('DaybookEntry',
+                         ('date', 'coursetype', 'dntid', 'trtid', 'diagn', 'perio',
+                          'anaes', 'misc', 'ndu', 'ndl', 'odu', 'odl', 'other', 'chart',
+                          'feesa', 'feesb', 'feesc', 'id')
+                          )
+
 
 def add(sno, cset, dent, trtid, t_dict, fee, ptfee, tx_hashes):
     '''
     add a row to the daybook table
     '''
+    if trtid in (0, None):
+        LOGGER.warning("no clinician login - daybook will contain junk!")
     db = connect.connect()
     cursor = db.cursor()
 
@@ -287,6 +302,36 @@ def delete_row(id):
     return result
 
 
+def all_data(serialno):
+    db = connect.connect()
+    cursor = db.cursor()
+    cursor.execute(DAYBOOK_QUERY, (serialno,))
+    rows = cursor.fetchall()
+    cursor.close()
+    for row in rows:
+        yield DaybookEntry(*row)
+
+
+def all_data_header():
+    color_string = ' bgcolor="#ffff99"'
+
+    return '''
+    <tr>
+    <th%s colspan="14">%s</th><th%s colspan="3"><!--gap--></th>
+    </tr>
+    <tr><th%s>%s</th></tr>
+    ''' % (color_string,
+           _("Daybook Items during this Period"),
+           color_string, color_string,
+           ("</th><th%s>" % color_string).join(
+           ("date", "cset", "dntid", "trtid",
+            "diagn", "perio", "anaes", "misc",
+            "ndu", "ndl", "odu", "odl", "other",
+            "chart", "feesa", "feesb", "id")
+           )
+           )
+
+
 class FilterHelp(object):
     _field_names = None
 
@@ -325,6 +370,7 @@ class FilterHelp(object):
 
 _filter_help = FilterHelp()
 
+
 def filter_help_text():
     return _filter_help.help_text()
 
diff --git a/src/openmolar/dbtools/db_patients.py b/src/openmolar/dbtools/db_patients.py
index eda3423..51f5ceb 100644
--- a/src/openmolar/dbtools/db_patients.py
+++ b/src/openmolar/dbtools/db_patients.py
@@ -32,7 +32,7 @@ from openmolar.settings.localsettings import PatientNotFoundError
 
 
 def name(serialno):
-    query = 'SELECT title, fname, sname from patients where serialno = %s'
+    query = 'SELECT title, fname, sname from new_patients where serialno = %s'
 
     db = connect()
     cursor = db.cursor()
diff --git a/src/openmolar/dbtools/db_settings.py b/src/openmolar/dbtools/db_settings.py
index ad754f9..4657f96 100644
--- a/src/openmolar/dbtools/db_settings.py
+++ b/src/openmolar/dbtools/db_settings.py
@@ -25,74 +25,310 @@
 '''
 this module reads and write to the settings table of the database
 '''
+import datetime
+import logging
+import re
 
 from openmolar import connect
+from openmolar.settings import localsettings
 
+LOGGER = logging.getLogger("openmolar")
 
-def getData(value):
-    try:
-        db = connect.connect()
-        cursor = db.cursor()
-        query = 'select data from settings where value = %s'
-        cursor.execute(query, value)
-        rows = cursor.fetchall()
-        cursor.close()
-        return rows
-    except connect.ProgrammingError:
-        return ()
+PT_COUNT_QUERY = "select count(*) from new_patients"
+# PRACTITIONERS_QUERY = "select id, inits, apptix from practitioners"
+DENTIST_DATA_QUERY = "select id,inits,name,formalname,fpcno,quals from practitioners where flag0=1"
+# APPTIX_QUERY = "select apptix,inits from practitioners where flag3=1"
+# ACTIVE_DENTS_QUERY = "select apptix, inits from practitioners where flag3=1 and flag0=1"
+# ACTIVE_HYGS_QUERY = "select apptix, inits from practitioners where
+# flag3=1 and flag0=0"
+
+
+CLINICIANS_QUERY = '''
+SELECT ix, apptix, initials, name, formal_name, qualifications, type,
+speciality, data, start_date, end_date FROM
+clinicians JOIN clinician_dates on clinicians.ix = clinician_dates.clinician_ix
+LEFT JOIN diary_link on ix = diary_link.clinician_ix
+'''
+
+ACTIVE_CLINICIANS_QUERY = CLINICIANS_QUERY + \
+    '''WHERE start_date<now() AND (end_date IS NULL OR end_date>now());'''
 
+LOGINS_QUERY = "select id from opid"
+INSERT_OPID_QUERY = "INSERT INTO opid (id) values (%s)"
 
-def insertData(value, data, user):
+INSERT_CLINICIAN_QUERIES = (
+    '''INSERT INTO clinicians
+(initials, name, formal_name, qualifications, type, speciality, data, comments)
+  VALUES(%s, %s, %s, %s, %s, %s, %s, %s)
+''',
     '''
-    insert a setting (leaving old values behind)
+INSERT INTO clinician_dates(clinician_ix, start_date, end_date)
+VALUES (%s, %s, %s)
+''',
     '''
+INSERT INTO diary_link(clinician_ix, apptix)
+VALUES (%s, %s)
+''')
+
+INSERT_SETTING_QUERY = \
+    '''INSERT INTO settings (value, data, modified_by, time_stamp)
+values (%s, %s, %s, NOW())'''
+
+UPDATE_SETTING_QUERY = \
+    '''UPDATE settings SET data = %s, modified_by = %s, time_stamp = NOW()
+where value=%s'''
+
+
+def insert_login(opid):
     db = connect.connect()
     cursor = db.cursor()
-    query = '''insert into settings (value,data,modified_by,time_stamp)
-    values (%s, %s, %s, NOW())'''
+    result = cursor.execute(INSERT_OPID_QUERY, (opid,))
+    cursor.close()
+    return result
+
+
+def insertData(value, data, user=None):
+    '''
+    insert a setting (leaving old values behind)
+    '''
+    LOGGER.info("saving setting (%s, %s) to settings table", value, data)
+    if user is None:
+        user = localsettings.operator
     values = (value, data, user)
 
-    print "saving setting (%s, %s) to settings table" % (value, data)
-    cursor.execute(query, values)
-    db.commit()
+    db = connect.connect()
+    cursor = db.cursor()
+    result = cursor.execute(INSERT_SETTING_QUERY, values)
+    cursor.close()
     return True
 
 
-def updateData(value, data, user):
+def updateData(value, data, user=None):
     '''
-    update a setting
+    update a setting - if no update occurs, will insert
     '''
+    LOGGER.info("updating setting (%s, %s) to settings table", value, data)
+    if user is None:
+        user = localsettings.operator
+    values = (data, user, value)
     db = connect.connect()
     cursor = db.cursor()
-    query = '''update settings set data = %s, modified_by = %s,
-    time_stamp = NOW() where value=%s'''
-    values = (data, user, value)
-
-    print "updating setting (%s, %s) to settings table" % (value, data)
-    if not cursor.execute(query, values):
-        return insertData(value, data, user)
-    else:
-        db.commit()
+    if cursor.execute(UPDATE_SETTING_QUERY, values):
+        cursor.close()
         return True
+    return insertData(value, data, user)
 
 
-def getWikiUrl():
-    '''
-    the database may know of the url (presumably an internally facing ip)
-    for the practice wiki??
-    '''
+def insert_practice_name(practice_name):
+    return insertData("practice name", practice_name)
+
+
+def insert_practice_address(address):
+    return insertData("practice address", address)
+
+
+def insert_clinician(clinician):
+    result = False
+    comments = "added by client - %s" % datetime.datetime.now().strftime(
+        "%m %h %Y %H:%M")
+    db = connect.connect()
     try:
-        db = connect.connect()
+        db.autocommit = False
         cursor = db.cursor()
-        query = 'select data from settings where value = "wikiurl"'
-        cursor.execute(query)
-        rows = cursor.fetchall()
-    except connect.ProgrammingError as ex:
-        print "no wikiurl loaded as there is no settings table??"
-    if rows:
-        return rows[-1][0]
-    else:
-        return "http://openmolar.wikidot.com/"
+        cursor.execute(INSERT_CLINICIAN_QUERIES[0],
+                      (clinician.initials,
+                       clinician.name,
+                       clinician.formal_name,
+                       clinician.qualifications,
+                       clinician.type,
+                       clinician.speciality,
+                       clinician.data,
+                       comments)
+                       )
+
+        ix = db.insert_id()
+        cursor.execute(INSERT_CLINICIAN_QUERIES[1], (ix,
+                                                     clinician.start_date,
+                                                     clinician.end_date)
+                       )
+
+        if clinician.new_diary:
+            cursor.execute(INSERT_CLINICIAN_QUERIES[2], (ix, ix))
+        cursor.close()
+        db.commit()
+        result = True
+    except:
+        LOGGER.exception("failed to insert clinician")
+        db.rollback()
+    finally:
+        db.autocommit = True
+    return result
+
+
+class SettingsFetcher(object):
+
+    def __init__(self):
+        self._cursor = None
+        self.loaded = False
+        self.PT_COUNT = 0
+
+    @property
+    def cursor(self):
+        if self._cursor is None:
+            db = connect.connect()
+            self._cursor = db.cursor()
+        return self._cursor
+
+    def close_cursor(self):
+        if self._cursor is not None:
+            self._cursor.close()
+            self._cursor = None
+
+    def fetch(self):
+        self.cursor.execute(PT_COUNT_QUERY)
+        self.PT_COUNT = self.cursor.fetchone()[0]
+        self._get_clinicians()
+        self.loaded = True
+        self.close_cursor()
+
+    def getData(self, key):
+        try:
+            query = 'select data from settings where value = %s order by ix'
+            self.cursor.execute(query, (key,))
+            rows = self.cursor.fetchall()
+            return rows
+        except connect.ProgrammingError:
+            return ()
+
+    def get_unique_value(self, key):
+        '''
+        get a single value from the settings table.
+        by default gets the last entry
+        '''
+        try:
+            return self.getData(key)[-1][0]
+        except IndexError:
+            LOGGER.warning("no key '%s' found in settings", key)
+
+    @property
+    def allowed_logins(self):
+        self.cursor.execute(LOGINS_QUERY)
+        # grab initials of those currently allowed to log in
+        trows = self.cursor.fetchall()
+        allowed_logins = []
+        for row in trows:
+            allowed_logins.append(row[0])
+        return allowed_logins
+
+    @property
+    def wiki_url(self):
+        '''
+        the database may know of the url (presumably an internally facing ip)
+        for the practice wiki??
+        '''
+        wiki_url = self.get_unique_value("wikiurl")
+        return wiki_url if wiki_url else "http://openmolar.com/wiki"
+
+    @property
+    def book_end(self):
+        book_end = self.get_unique_value("bookend")
+        try:
+            year, month, day = book_end.split(",")
+            return datetime.date(int(year), int(month), int(day))
+        except AttributeError:
+            pass
+        except ValueError:
+            LOGGER.warning("Badly formatted value for bookend in settings")
+        return datetime.date.today() + datetime.timedelta(days=183)
+
+    @property
+    def practice_name(self):
+        name = self.get_unique_value("practice name")
+        if name:
+            return name
+        return _("Example Dental Practice")
+
+    @property
+    def practice_address(self):
+        address = self.get_unique_value("practice address")
+        address_list = [self.practice_name]
+        try:
+            for line_ in address.split("|"):
+                address_list.append(line_)
+        except AttributeError:
+            address_list += ["My Street", "My Town", "POST CODE"]
+        except ValueError:
+            LOGGER.warning(
+                "Badly formatted value for practice_address in settings")
+            address_list.append(unicode(address))
+        return tuple(address_list)
+
+    @property
+    def supervisor_pword(self):
+        hash_ = self.get_unique_value("supervisor_pword")
+        if hash_:
+            return hash_
+        LOGGER.warning("#" * 30)
+        LOGGER.warning("WARNING - no supervisor password is set")
+        LOGGER.warning("#" * 30)
+        # hash of salted ""
+        return "c1219df26de403348e211a314ff2fce58aa6e28d"
+
+    def _get_clinicians(self):
+        '''
+        poll the database and retrieve all practitioners (past and present)
+        '''
+        self.ops, self.ops_reverse = {}, {}
+        self.apptix_dict, self.apptix_reverse = {}, {}
+        active_dent_initials, active_dent_ixs = [], []
+        active_hyg_initials, active_hyg_ixs = [], []
+        self.dentist_data = {}
+
+        self.cursor.execute(CLINICIANS_QUERY)
+        rows = self.cursor.fetchall()
+        for (ix, apptix, initials, name, formal_name, qualifications, type_,
+             speciality, data, start_date, end_date) in rows:
+            self.ops[ix] = initials
+            self.ops_reverse[initials] = ix
+            today = datetime.date.today()
+
+            if apptix:
+                self.apptix_reverse[apptix] = initials
+            if start_date <= today and (end_date is None or end_date >= today):
+                if apptix:
+                    self.apptix_dict[initials] = apptix
+                if type_ == 1:
+                    active_dent_initials.append(initials)
+                    active_dent_ixs.append(ix)
+                elif type_ in (2, 3):   # hygienist and therapist
+                    active_hyg_initials.append(initials)
+                    active_hyg_ixs.append(ix)
+            if type_ == 1:
+                list_no = ""
+                if data:
+                    m = re.search("list_no=([^ ]*)", data)
+                    if m:
+                        list_no = m.groups()[0]
+
+                self.dentist_data[ix] = (
+                    initials,
+                    name,
+                    formal_name,
+                    list_no,
+                    qualifications)
+
+        self.active_dents = tuple(active_dent_initials), tuple(active_dent_ixs)
+        self.active_hygs = tuple(active_hyg_initials), tuple(active_hyg_ixs)
 
 if __name__ == "__main__":
-    print getData("enddate")
+    sf = SettingsFetcher()
+    sf.fetch()
+
+    print sf.PT_COUNT
+    print sf.wiki_url
+    print sf.book_end
+    print sf.supervisor_pword
+    print sf.getData("enddate")
+    print sf.active_dents
+    print sf.active_hygs
+    print sf.dentist_data
diff --git a/src/openmolar/dbtools/distinct_statuses.py b/src/openmolar/dbtools/distinct_statuses.py
index bc8bbf3..c770cf3 100644
--- a/src/openmolar/dbtools/distinct_statuses.py
+++ b/src/openmolar/dbtools/distinct_statuses.py
@@ -27,7 +27,7 @@ from openmolar import connect
 
 LOGGER = logging.getLogger("openmolar")
 
-QUERY = "select distinct status from patients"
+QUERY = "select distinct status from new_patients"
 
 
 class DistinctStatuses(object):
@@ -42,12 +42,12 @@ class DistinctStatuses(object):
             rows = cursor.fetchall()
             cursor.close()
 
-            self._distinct_statuses = []
+            self._distinct_statuses = set(["", _("DECEASED")])
             for row in sorted(rows):
                 if row[0] not in (None, "BAD DEBT"):
-                    self._distinct_statuses.append(row[0])
+                    self._distinct_statuses.add(row[0])
 
-        return self._distinct_statuses
+        return sorted(self._distinct_statuses)
 
 if __name__ == "__main__":
     ds = DistinctStatuses()
diff --git a/src/openmolar/dbtools/estimate_synopsis.py b/src/openmolar/dbtools/estimate_synopsis.py
index 510f113..38ea612 100644
--- a/src/openmolar/dbtools/estimate_synopsis.py
+++ b/src/openmolar/dbtools/estimate_synopsis.py
@@ -27,11 +27,11 @@ from openmolar.connect import connect
 
 QUERY = '''SELECT description, ptfee, est_link2.completed
 from newestimates right join est_link2 on newestimates.ix = est_link2.est_id
-where courseno = %s order by itemcode, description'''
+where serialno=%s AND courseno=%s order by itemcode, description'''
 
 
-def html(courseno):
-    values = (courseno,)
+def html(serialno, courseno):
+    values = (serialno, courseno)
     db = connect()
     cursor = db.cursor()
     cursor.execute(QUERY, values)
diff --git a/src/openmolar/dbtools/estimates.py b/src/openmolar/dbtools/estimates.py
new file mode 100644
index 0000000..37bf35d
--- /dev/null
+++ b/src/openmolar/dbtools/estimates.py
@@ -0,0 +1,252 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from openmolar import connect
+from openmolar.settings import localsettings
+from openmolar.ptModules.estimates import TXHash, Estimate
+
+
+LOGGER = logging.getLogger("openmolar")
+
+
+ESTS_QUERY = '''SELECT newestimates.ix, number, itemcode, description,
+fee, ptfee, feescale, csetype, dent, est_link2.completed, tx_hash, courseno
+from newestimates right join est_link2 on newestimates.ix = est_link2.est_id
+where serialno=%s and courseno=%s order by itemcode, ix'''
+
+ESTS_INS_QUERY = ('insert into newestimates (serialno, '
+                  'courseno, number, itemcode, description, fee, ptfee, feescale, '
+                  'csetype, dent, modified_by, time_stamp) values '
+                  '(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())')
+
+EST_LINK_INS_QUERY = (
+    'insert into est_link2 (est_id, tx_hash, completed) values (%s, %s, %s)')
+
+EST_DEL_QUERY = "delete from newestimates where ix=%s"
+EST_LINK_DEL_QUERY = "delete from est_link2 where est_id=%s"
+
+ESTS_UPDATE_QUERY = '''UPDATE newestimates SET
+number=%s, itemcode=%s, description=%s, fee=%s, ptfee=%s, feescale=%s,
+csetype=%s, dent=%s, modified_by=%s, time_stamp=NOW() WHERE ix=%s
+'''.replace("\n", " ")
+
+
+# too risky not to check these are unique before updating.
+EST_DAYBOOK_ALTERATION_QUERIES = [
+    'select daybook_id from daybook_link where tx_hash = %s',
+
+    '''select sum(fee), sum(ptfee) from newestimates join est_link2
+on newestimates.ix = est_link2.est_id where tx_hash in
+(select tx_hash from daybook join daybook_link
+on daybook.id = daybook_link.daybook_id where id=%s)''',
+
+    'update daybook set feesa = %s, feesb = %s where serialno=%s and id=%s'
+]
+
+
+def get_ests(serialno, courseno):
+    '''
+    get estimate data
+    '''
+    db = connect.connect()
+    cursor = db.cursor()
+
+    cursor.execute(ESTS_QUERY, (serialno, courseno))
+
+    rows = cursor.fetchall()
+    ests = []
+
+    for row in rows:
+        hash_ = row[10]
+        completed = bool(row[9])
+
+        tx_hash = TXHash(hash_, completed)
+
+        ix = row[0]
+
+        found = False
+        # use existing est if one relates to multiple treatments
+        for existing_est in ests:
+            if existing_est.ix == ix:
+                existing_est.tx_hashes.append(tx_hash)
+                found = True
+                break
+        if found:
+            continue
+
+        # initiate a custom data class
+        est = Estimate()
+
+        est.ix = ix
+        est.courseno = row[11]
+        est.number = row[1]
+        est.itemcode = row[2]
+        est.description = row[3]
+        est.fee = row[4]
+        est.ptfee = row[5]
+        est.feescale = row[6]
+        est.csetype = row[7]
+        est.dent = row[8]
+
+        est.tx_hashes = [tx_hash]
+        ests.append(est)
+
+    cursor.close()
+    return ests
+
+
+def update_daybook_after_estimate_change(values):
+    '''
+    if the value of a treatment item has been changed after completion,
+    update the daybook.
+    most common example of this is when an exemption is applied to a course of
+    treatment at reception (altering the charges put into the system in the
+    surgery)
+    note - use of serialno here is purely for precautionary reasons.
+    Hash collisions shouldn't occur... but easy to be cautious here.
+    '''
+    serialno, tx_hash = values
+    db = connect.connect()
+    cursor = db.cursor()
+    query = EST_DAYBOOK_ALTERATION_QUERIES[0]
+    cursor.execute(query, (tx_hash.hash,))
+    rows = cursor.fetchall()
+    if len(rows) != 1:
+        LOGGER.warning(
+            "unable to update daybook after estimate change - abandoning")
+        return
+    daybook_id = rows[0][0]
+    LOGGER.debug("updating daybook row %s" % daybook_id)
+
+    query = EST_DAYBOOK_ALTERATION_QUERIES[1]
+    cursor.execute(query, (daybook_id,))
+    feesa, feesb = cursor.fetchone()
+
+    LOGGER.debug(
+        "updating row with feesa, feesb = %s and %s" %
+        (feesa, feesb))
+    query = EST_DAYBOOK_ALTERATION_QUERIES[2]
+    rows_changed = cursor.execute(
+        query, (feesa, feesb, serialno, daybook_id))
+    LOGGER.info("changes applied = %s" % bool(rows_changed))
+
+
+def apply_changes(pt, old_ests, new_ests):
+
+    LOGGER.info("APPLY ESTIMATE CHANGES")
+    estimate_insertions = []
+    estimate_updates = []
+    estimate_deletions = []
+    post_cleanup_commands = []
+
+    result = True
+
+    old_ests_dict = {}
+
+    for est in old_ests:
+        if est.ix is not None:
+            old_ests_dict[est.ix] = est
+
+    for est in new_ests:
+        if est.ix is None:  # --new item
+            values = (pt.serialno, est.courseno, est.number,
+                      est.itemcode, est.description,
+                      est.fee, est.ptfee, est.feescale, est.csetype,
+                      est.dent, localsettings.operator)
+
+            estimate_insertions.append((ESTS_INS_QUERY, values, est.tx_hashes))
+
+        elif est.ix in old_ests_dict.keys():
+            oldEst = old_ests_dict[est.ix]
+            if oldEst != est:
+                values = (est.number,
+                          est.itemcode, est.description,
+                          est.fee, est.ptfee, est.feescale, est.csetype,
+                          est.dent, localsettings.operator, est.ix)
+
+                estimate_updates.append((ESTS_UPDATE_QUERY, values, est))
+                for tx_hash in est.tx_hashes:
+                    values = (pt.serialno, tx_hash)
+                    post_cleanup_commands.append(
+                        (update_daybook_after_estimate_change, values))
+
+            old_ests_dict.pop(est.ix)
+
+    #-- all that is left in old_ests_dict now are items which
+    #-- have been removed.
+    #-- so remove from database if they are current course!
+    for ix, old_est in old_ests_dict.iteritems():
+        #--removed
+        if old_est.courseno == pt.courseno0:
+            values = (ix,)
+            estimate_deletions.append((EST_DEL_QUERY, values))
+            estimate_deletions.append((EST_LINK_DEL_QUERY, values))
+            for tx_hash in old_est.tx_hashes:
+                values = (pt.serialno, tx_hash)
+                post_cleanup_commands.append(
+                    (update_daybook_after_estimate_change, values))
+
+    db = connect.connect()
+    cursor = db.cursor()
+
+    for query, values, tx_hashes in estimate_insertions:
+        LOGGER.debug(query)
+        LOGGER.debug(values)
+        cursor.execute(query, values)
+        ix = cursor.lastrowid
+        for tx_hash in tx_hashes:
+            vals = (ix, tx_hash.hash, tx_hash.completed)
+            cursor.execute(EST_LINK_INS_QUERY, vals)
+
+    for query, values, estimate in estimate_updates:
+        LOGGER.debug(query)
+        LOGGER.debug(values)
+        cursor.execute(query, values)
+        cursor.execute(EST_LINK_DEL_QUERY, (estimate.ix,))
+        for tx_hash in estimate.tx_hashes:
+            cursor.execute(EST_LINK_INS_QUERY,
+                          (estimate.ix, tx_hash.hash,
+                           tx_hash.completed)
+                           )
+
+    for query, values in estimate_deletions:
+        LOGGER.debug(query)
+        LOGGER.debug(values)
+        cursor.execute(query, values)
+
+    cursor.close()
+
+    for func, values in post_cleanup_commands:
+        func.__call__(values)
+
+    return result
+
+
+if __name__ == "__main__":
+    ests = get_ests(11956, 29749)
+    print ests
+    print "equality test   (should be True)     ", ests[0] == ests[0]
+    print "inequality test (should also be True)", ests[0] != ests[1]
diff --git a/src/openmolar/dbtools/estimatesHistory.py b/src/openmolar/dbtools/estimatesHistory.py
index c458497..2b03c87 100644
--- a/src/openmolar/dbtools/estimatesHistory.py
+++ b/src/openmolar/dbtools/estimatesHistory.py
@@ -26,20 +26,38 @@ from openmolar.settings import localsettings
 from openmolar.connect import connect
 from openmolar.ptModules.estimates import Estimate, TXHash
 
+try:
+    from collections import OrderedDict
+except ImportError:
+    # OrderedDict only came in python 2.7
+    LOGGER.warning("using openmolar.backports for OrderedDict")
+    from openmolar.backports import OrderedDict
+
 QUERY = '''SELECT newestimates.ix, number, itemcode, description,
 fee, ptfee, feescale, csetype, dent, est_link2.completed, tx_hash, courseno
 from newestimates right join est_link2 on newestimates.ix = est_link2.est_id
 where serialno=%s order by courseno desc, itemcode, ix'''
 
+COURSE_QUERY = QUERY.replace(
+    "order by courseno desc,", "and courseno = %s order by")
+
+ALLOW_EDIT = False
+
+EDIT_STRING = '<a href="edit_estimate?%%s">%s</a>' % _("Edit this Estimate")
 
-def getEsts(sno):
+
+def getEsts(sno, courseno=None):
     db = connect()
     cursor = db.cursor()
-    cursor.execute(QUERY, (sno,))
+
+    if courseno is None:
+        cursor.execute(QUERY, (sno,))
+    else:
+        cursor.execute(COURSE_QUERY, (sno, courseno))
     rows = cursor.fetchall()
     cursor.close()
 
-    estimates = []
+    estimates = OrderedDict()
 
     for row in rows:
         hash_ = row[10]
@@ -49,19 +67,7 @@ def getEsts(sno):
 
         ix = row[0]
 
-        found = False
-        # use existing est if one relates to multiple treatments
-        for existing_est in estimates:
-            if existing_est.ix == ix:
-                existing_est.tx_hashes.append(tx_hash)
-                found = True
-                break
-        if found:
-            continue
-
-        # initiate a custom data class
-        est = Estimate()
-
+        est = estimates.get(ix, Estimate())
         est.ix = ix
         est.courseno = row[11]
         est.number = row[1]
@@ -72,42 +78,49 @@ def getEsts(sno):
         est.feescale = row[6]
         est.csetype = row[7]
         est.dent = row[8]
+        try:
+            est.tx_hashes.append(tx_hash)
+        except AttributeError:
+            est.tx_hashes = [tx_hash]
 
-        # est.category = "TODO"
-        # est.type_ = "TODO"
-
-        est.tx_hashes = [tx_hash]
-        estimates.append(est)
-
-        cursor.close()
+        estimates[ix] = est
 
-    return estimates
+    return estimates.values()
 
 
 def details(sno):
     '''
     returns an html page showing pt's old estimates
     '''
-    estimatesList = getEsts(sno)
-    claimNo = len(estimatesList)
-    retarg = "<h2>Past Estimates - %d rows found</h2>" % claimNo
+    estimates = getEsts(sno)
+    claimNo = len(estimates)
+    html = "<h2>%s - %d %s</h2>" % (
+        _("Past Estimates"),
+        claimNo,
+        _("found")
+    )
     if claimNo == 0:
-        return retarg
-    courseno = -1
-    firstRow = True
-    for est in estimatesList:
+        return html
+    courseno = None
+
+    for i, est in enumerate(estimates):
         if est.courseno != courseno:
-            if not firstRow:
-                retarg += "</table>"
-                firstRow = False
-            retarg += '''</table><h3>Estimate for course number %d</h3>
-            <table width="100%%" border="1">''' % est.courseno
-            retarg += est.htmlHeader()
+            header = est.htmlHeader()
+            if ALLOW_EDIT:
+                header = header.replace(
+                    "<!--editlink-->",
+                    EDIT_STRING % est.courseno
+                )
+
+            if i > 0:
+                html += "</table><hr />"
+            html += '<table width="100%%" border="1">%s' % header
             courseno = est.courseno
-        retarg += est.toHtmlRow()
-    retarg += '</table>\n'
 
-    return retarg
+        html += est.toHtmlRow()
+    html += '</table>\n'
+
+    return html
 
 if __name__ == "__main__":
     localsettings.initiate()
diff --git a/src/openmolar/dbtools/extend_books.py b/src/openmolar/dbtools/extend_books.py
deleted file mode 100644
index c6d7cc9..0000000
--- a/src/openmolar/dbtools/extend_books.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-import datetime
-from openmolar.connect import connect, IntegrityError
-from openmolar.settings import localsettings
-
-
-def extend(dents, startdate, enddate):
-    '''
-    inserts new days into the aday table for dents
-    this is like buying next year's diary
-    '''
-
-    delta = datetime.timedelta(days=1)
-    query = '''insert into aday (adate, apptix, start, end, flag, memo)
-values (%s, %s, %s, %s, %s, %s)'''
-
-    db = connect()
-    cursor = db.cursor()
-
-    for dent in dents:
-        curdate = startdate
-        while curdate <= enddate:
-            values = (curdate, dent, 0, 0, 0, "")
-            try:
-                if cursor.execute(query, values):
-                    print "successfully added %s for dent %s" % (curdate, dent)
-            except IntegrityError:
-                print "%s already present for dent %s" % (curdate, dent)
-            curdate += delta
-
-    cursor.close()
-    db.commit()
-    return True
-
-
-if __name__ == "__main__":
-
-    #-- test procedures......
-
-    startdate = datetime.date(2010, 1, 1)
-    enddate = datetime.date(2010, 2, 1)
-    extend((4, 5, 6, 7, 13, 14), startdate, enddate)
diff --git a/src/openmolar/dbtools/families.py b/src/openmolar/dbtools/families.py
index 17a6555..0c29189 100644
--- a/src/openmolar/dbtools/families.py
+++ b/src/openmolar/dbtools/families.py
@@ -26,21 +26,22 @@ from openmolar.connect import connect
 from openmolar.settings import localsettings
 
 QUERY = '''select serialno, title, fname, sname,
-addr1, addr2, addr3, town, county, pcde, dob, status, tel1 from patients
+addr1, addr2, addr3, town, county, pcde, dob, status, tel1 from new_patients
 where familyno = %s order by dob'''
 
 PATIENT_QUERY = QUERY.replace("familyno", "serialno")
 
-LINK_QUERY = 'update patients set familyno=%s where serialno=%s'
+LINK_QUERY = 'update new_patients set familyno=%s where serialno=%s'
 
-SYNC_QUERY = '''update patients set
+SYNC_QUERY = '''update new_patients set
 addr1=%s, addr2=%s, addr3=%s, town=%s, county=%s, pcde=%s
 where familyno=%s'''
 
-NEXT_FAMILYNO_QUERY = "select max(familyno)+1 from patients"
-NEW_GROUP_QUERY = "update patients set familyno=%s where serialno=%s"
+NEXT_FAMILYNO_QUERY = "select max(familyno)+1 from new_patients"
+NEW_GROUP_QUERY = "update new_patients set familyno=%s where serialno=%s"
 
-DELETE_FAMILYNO_QUERY = "update patients set familyno=NULL where familyno=%s"
+DELETE_FAMILYNO_QUERY = \
+    "update new_patients set familyno=NULL where familyno=%s"
 
 ADDRESS_MATCH_QUERY = '''select
     case when addr1 = %s then 4 else 0 end +
@@ -50,11 +51,11 @@ ADDRESS_MATCH_QUERY = '''select
     case when town like %s then 1 else 0 end +
     case when pcde = %s then 5 else 0 end as matches ,
     serialno, title, fname, sname, dob, addr1, addr2, addr3, town, pcde
-from patients
+from new_patients
 where
 addr1 like %s or
-((addr2 != "" and addr2 is not NULL) and addr2 like %s) or
-((town != "" and town is not NULL) and town like %s)or
+(addr2 != "" and addr2 like %s) or
+(town != "" and town like %s) or
 (pcde=%s and pcde != "")
 order by matches desc
 limit 12
@@ -69,6 +70,8 @@ def new_group(serialno):
     cursor = db.cursor()
     cursor.execute(NEXT_FAMILYNO_QUERY)
     family_no = cursor.fetchone()[0]
+    if family_no is None:
+        family_no = 1
     cursor.execute(NEW_GROUP_QUERY, (family_no, serialno))
     cursor.close()
     return family_no
diff --git a/src/openmolar/dbtools/feescales.py b/src/openmolar/dbtools/feescales.py
index b169997..4845235 100644
--- a/src/openmolar/dbtools/feescales.py
+++ b/src/openmolar/dbtools/feescales.py
@@ -35,13 +35,25 @@ from openmolar.settings import localsettings
 LOGGER = logging.getLogger("openmolar")
 
 
+def FEESCALE_DIR():
+    '''
+    this is dynamic in case user switches database
+    '''
+    return os.path.join(
+        localsettings.localFileDirectory,
+        "feescales",
+        connect.params.database_name.replace(" ", "_").replace(":", "_PORT_")
+    )
+
+
 def write_readme():
-    LOGGER.info("creating directory %s" % FEESCALE_DIR)
-    os.makedirs(FEESCALE_DIR)
-    f = open(os.path.join(FEESCALE_DIR, "README.txt"), "w")
+    dir_path = FEESCALE_DIR()
+    LOGGER.info("creating directory %s" % dir_path)
+    os.makedirs(dir_path)
+    f = open(os.path.join(dir_path, "README.txt"), "w")
     f.write('''
 This folder is created by openmolar to store xml copies of the feescales in
-your database (see feescales table).
+database %s.
 Filenames herein are IMPORTANT!
 feescale1.xml relates to the xml stored in row 1 of that table
 feescale2.xml relates to the xml stored in row 2 of that table
@@ -50,13 +62,11 @@ whilst you are free to edit these files using an editor of your choice,
 validation against feescale_schema.xsd is highly recommended.
 
 note - openmolar has a build in application for doing this.
-    ''')
-    f.close()
 
+in addition - why not use some version control for this folder?
+    ''' % connect.params.database_name)
+    f.close()
 
-FEESCALE_DIR = os.path.join(localsettings.localFileDirectory, "feescales")
-if not os.path.exists(FEESCALE_DIR):
-    write_readme()
 
 QUERY = 'select ix, xml_data from feescales'
 
@@ -67,7 +77,19 @@ UPDATE_QUERY = "update feescales set xml_data = %s where ix = %s"
 NEW_FEESCALE_QUERY = "insert into feescales (xml_data) values(%s)"
 
 
+def get_digits(string_value):
+    '''
+    used as a key for sort function for filenames.
+    I want foo_10 to be after foo_9 etc..
+    '''
+    m = re.search("(\d+)", string_value)
+    if not m:
+        return None
+    return int(m.groups()[0])
+
+
 class FeescaleHandler(object):
+    ixs_in_db = set([])
 
     def get_feescale_from_database(self, ix):
         '''
@@ -90,6 +112,8 @@ class FeescaleHandler(object):
         query = QUERY
         if in_use_only:
             query += ' where in_use = True'
+        else:  # if called by feescale editor
+            self.ixs_in_db = set([])
         if priority_order:
             query += ' order by priority desc'
         db = connect.connect()
@@ -98,6 +122,8 @@ class FeescaleHandler(object):
         rows = cursor.fetchall()
         cursor.close()
         LOGGER.debug("%d feescales retrieved" % len(rows))
+        for ix, xml_data in rows:
+            self.ixs_in_db.add(ix)
         return rows
 
     def save_file(self, ix, xml_data):
@@ -115,9 +141,6 @@ class FeescaleHandler(object):
 
             yield xml_file
 
-            # self.save_file(ix, xml_data)
-        # LOGGER.info("feescales data written to local filesystem")
-
     def non_existant_and_modified_local_files(self):
         '''
         returns 2 lists
@@ -136,25 +159,50 @@ class FeescaleHandler(object):
         return unwritten, modified
 
     def index_to_local_filepath(self, ix):
-        return os.path.join(FEESCALE_DIR, "feescale_%d.xml" % ix)
+        return os.path.join(FEESCALE_DIR(), "feescale_%d.xml" % ix)
+
+    def check_dir(self):
+        if not os.path.exists(FEESCALE_DIR()):
+            write_readme()
 
     @property
     def local_files(self):
-        for file_ in sorted(os.listdir(FEESCALE_DIR)):
-            m = re.match(".*(\d+)\.xml$", file_)
+        self.check_dir()
+        dirname = FEESCALE_DIR()
+        for file_ in sorted(os.listdir(dirname), key=get_digits):
+            m = re.match("feescale_(\d+)\.xml$", file_)
             if m:
                 ix = int(m.groups()[0])
-                yield ix, os.path.join(FEESCALE_DIR, file_)
+                yield ix, os.path.join(dirname, file_)
+
+    def temp_move(self, file_ix):
+        '''
+        after insert, a local file may need to move.
+        this is done cautiously as could overwrite another
+        '''
+        path = self.index_to_local_filepath(file_ix)
+        shutil.move(path, path + "temp")
+
+    def final_move(self, file_ix, db_ix):
+        '''
+        finalised temp_move
+        '''
+        temp_path = self.index_to_local_filepath(file_ix) + "temp"
+        final_path = self.index_to_local_filepath(db_ix)
+        shutil.move(temp_path, final_path)
 
     def update_db_all(self):
         '''
         apply all local file changes to the database.
         '''
         message = ""
+        insert_ids = []
         for ix, filepath in self.local_files:
-            message += self.update_db(ix)
-
-        return message
+            if ix in self.ixs_in_db:
+                message += self.update_db(ix)
+            else:
+                insert_ids.append(ix)
+        return message, insert_ids
 
     def update_db(self, ix):
         message = ""
@@ -182,6 +230,31 @@ class FeescaleHandler(object):
 
         return message
 
+    def insert_db(self, ix):
+        message = ""
+        filepath = self.index_to_local_filepath(ix)
+        LOGGER.debug("inserting new feescale into database %s" % ix)
+        if not os.path.isfile(filepath):
+            message = "FATAL %s does not exist!" % filepath
+        else:
+            db = connect.connect()
+            cursor = db.cursor()
+
+            f = open(filepath)
+            data = f.read()
+            f.close()
+
+            values = (data,)
+            cursor.execute(NEW_FEESCALE_QUERY, values)
+            db_ix = db.insert_id()
+            self.ixs_in_db.add(db_ix)
+
+            r_message = "inserting new feescale '%s' to database." % filepath
+            db.close()
+
+            LOGGER.info(r_message)
+            return db_ix
+
     def save_xml(self, ix, xml):
         file_path = self.index_to_local_filepath(ix)
         LOGGER.info("saving %s" % file_path)
@@ -206,4 +279,6 @@ if __name__ == "__main__":
 
     fh = FeescaleHandler()
     fh.get_feescales_from_database()
+    for ix, local_file in fh.local_files:
+        print ix, local_file
     print fh.non_existant_and_modified_local_files()
diff --git a/src/openmolar/dbtools/patient_class.py b/src/openmolar/dbtools/patient_class.py
index 46cd57d..7b98e75 100644
--- a/src/openmolar/dbtools/patient_class.py
+++ b/src/openmolar/dbtools/patient_class.py
@@ -29,15 +29,17 @@ import re
 import sys
 
 from openmolar import connect
-from openmolar.ptModules import perio, dec_perm, estimates, notes, formatted_notes
+from openmolar.ptModules import dec_perm, formatted_notes
 from openmolar.settings import localsettings
 
 from openmolar.dbtools.appt_prefs import ApptPrefs
 from openmolar.dbtools.treatment_course import TreatmentCourse
 from openmolar.dbtools.plan_data import PlanData
 from openmolar.dbtools.est_logger import EstLogger
+from openmolar.dbtools import estimates as db_estimates
 
-from openmolar.dbtools.queries import ESTS_QUERY, PATIENT_QUERY
+from openmolar.dbtools.queries import \
+    PATIENT_QUERY_FIELDS, PATIENT_QUERY, FUTURE_EXAM_QUERY, PSN_QUERY, FAMILY_COUNT_QUERY
 
 LOGGER = logging.getLogger("openmolar")
 
@@ -49,53 +51,35 @@ dateFields = ("dob", "pd0", "pd1", "pd2", "pd3", "pd4", "pd5", "pd6",
 nullDate = None
 
 patientTableAtts = (
-    'pf0', 'pf1', 'pf2', 'pf3', 'pf4', 'pf5', 'pf6', 'pf7', 'pf8', 'pf9', 'pf10', 'pf11',
-    'pf12', 'pf14', 'pf15', 'pf16', 'pf17', 'pf18', 'pf19',
-    'money0', 'money1', 'money2', 'money3', 'money4', 'money5', 'money6', 'money7',
-    'money8', 'money9', 'money10',
-    'pd0', 'pd1', 'pd2', 'pd3', 'pd4', 'pd5', 'pd6', 'pd7', 'pd8', 'pd9', 'pd10', 'pd11',
-    'pd12', 'pd13', 'pd14',
-    'sname', 'fname', 'title', 'sex', 'dob', 'addr1', 'addr2', 'addr3', 'pcde', 'tel1',
-    'tel2', 'occup',
-    'nhsno', 'cnfd', 'psn', 'cset', 'dnt1', 'dnt2', 'courseno0', 'courseno1',
+    'sname', 'fname', 'title', 'sex', 'dob',
+    'addr1', 'addr2', 'addr3', 'pcde', 'town', 'county',
+    'tel1', 'tel2', 'mobile', 'fax', 'email1', 'email2',
+    'occup', 'nhsno', 'cnfd', 'cset', 'dnt1', 'dnt2', 'courseno0',
+    'billdate', 'billct', 'billtype', 'familyno', 'memo', 'status'
+)
+
+money_table_atts = ('money0', 'money1', 'money2', 'money3', 'money4',
+    'money5', 'money6', 'money7', 'money8', 'money9', 'money10', 'money11')
+
+nhs_table_atts = ('initaccept', 'lastreaccept', 'lastclaim', 'expiry',
+    'cstatus', 'transfer', 'pstatus')
+
+static_table_atts = (
     'ur8st', 'ur7st', 'ur6st', 'ur5st', 'ur4st', 'ur3st', 'ur2st', 'ur1st',
     'ul1st', 'ul2st', 'ul3st', 'ul4st', 'ul5st', 'ul6st', 'ul7st', 'ul8st',
     'll8st', 'll7st', 'll6st', 'll5st', 'll4st', 'll3st', 'll2st', 'll1st',
     'lr1st', 'lr2st', 'lr3st', 'lr4st', 'lr5st', 'lr6st', 'lr7st', 'lr8st',
-    'dent0', 'dent1', 'dent2', 'dent3',
-    'dmask', 'minstart', 'maxend', 'billdate', 'billct',
-    'billtype', 'pf20', 'money11', 'pf13', 'familyno', 'memo',
-    'town', 'county', 'mobile', 'fax', 'email1', 'email2', 'status', 'source',
-    'enrolled', 'archived',
-    'initaccept', 'lastreaccept', 'lastclaim', 'expiry', 'cstatus', 'transfer',
-    'pstatus', 'courseno2')
+    'dent0', 'dent1', 'dent2', 'dent3')
 
-exemptionTableAtts = ('exemption', 'exempttext')
+date_table_atts = (
+    'pd0', 'pd1', 'pd2', 'pd3', 'pd4', 'pd5', 'pd6', 'pd7', 'pd8', 'pd9',
+    'pd10', 'pd11', 'pd12', 'pd13', 'pd14')
 
-patientTableVals = (
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate,
-    nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate,
-    '', '', '', '', nullDate, '', '', '', '', '', '', '',
-    '', nullDate, '', '', 0, 0, 0, 0,
-    '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '',
-    0, 0, 0, 0,
-    'YYYYYYY', 0, 0, nullDate, 0, None,
-    0, 0, 0, 0, '', '',
-    '', '', '', '', '', '', '', '',
-    nullDate, 0,
-    nullDate, nullDate, nullDate, nullDate, 0, nullDate,
-    0, 0)
+exemptionTableAtts = ('exemption', 'exempttext')
 
 bpeTableAtts = ('bpedate', 'bpe')
 bpeTableVals = (nullDate, '', ())
 
-perioTableAtts = ('chartdate', 'chartdata')
-
 mnhistTableAtts = ('chgdate', 'ix', 'note')
 
 notesTableAtts = ('lineno', 'line')
@@ -112,6 +96,14 @@ decidmouth = ['***', '***', '***', 'ulE', 'ulD', 'ulC', 'ulB', 'ulA',
 
 clinical_memos = ("synopsis",)
 
+_atts = []
+for att in PATIENT_QUERY_FIELDS:
+    if re.match("[ul][lr]\d$", att):
+        _atts.append(att + "st")
+    else:
+        _atts.append(att)
+patient_query_atts = tuple(_atts)
+
 
 class patient(object):
 
@@ -126,25 +118,6 @@ class patient(object):
 
         # patient table atts
         self.courseno0 = None
-        self.pf0 = 0
-        self.pf1 = 0
-        self.pf2 = 0
-        self.pf3 = 0
-        self.pf4 = 0
-        self.pf5 = 0
-        self.pf6 = 0
-        self.pf7 = 0
-        self.pf8 = 0
-        self.pf9 = 0
-        self.pf10 = 0
-        self.pf11 = 0
-        self.pf12 = 0
-        self.pf14 = 0
-        self.pf15 = 0
-        self.pf16 = 0
-        self.pf17 = 0
-        self.pf18 = 0
-        self.pf19 = 0
         self.money0 = 0
         self.money1 = 0
         self.money2 = 0
@@ -185,11 +158,9 @@ class patient(object):
         self.occup = ''
         self.nhsno = ''
         self.cnfd = None
-        self.psn = ''
         self.cset = ''
         self.dnt1 = 0
         self.dnt2 = 0
-        self.courseno1 = 0
         self.ur8st = ''
         self.ur7st = ''
         self.ur6st = ''
@@ -226,15 +197,10 @@ class patient(object):
         self.dent1 = 0
         self.dent2 = 0
         self.dent3 = 0
-        self.dmask = "YYYYYYY"
-        self.minstart = 0
-        self.maxend = 0
         self.billdate = None
         self.billct = 0
         self.billtype = None
-        self.pf20 = 0
         self.money11 = 0
-        self.pf13 = 0
         self.familyno = localsettings.last_family_no
         self.memo = ''
         self.town = ''
@@ -244,9 +210,6 @@ class patient(object):
         self.email1 = ''
         self.email2 = ''
         self.status = ''
-        self.source = ''
-        self.enrolled = ''
-        self.archived = None
         self.initaccept = 0
         self.lastreaccept = None
         self.lastclaim = None
@@ -254,7 +217,6 @@ class patient(object):
         self.cstatus = None
         self.transfer = 0
         self.pstatus = None
-        self.courseno2 = 0
 
         # TABLE 'mnhist'#######
         self.chgdate = nullDate   # date 	YES 	 	None
@@ -269,7 +231,6 @@ class patient(object):
         # NEIL'S STUFF####
         self.exemption = ""
         self.exempttext = ""
-        self.perioData = {}
         self.bpe = []
         self.bpedate = nullDate
         self.chartdate = nullDate
@@ -284,6 +245,9 @@ class patient(object):
         self._dayBookHistory = None
         self.treatment_course = None
         self.est_logger = None
+        self._most_recent_daybook_entry = None
+        self._has_exam_booked = None
+        self._previous_surnames = None
 
         if self.serialno == 0:
             return
@@ -302,7 +266,7 @@ class patient(object):
         if values == ():
             raise localsettings.PatientNotFoundError
 
-        for i, att in enumerate(patientTableAtts):
+        for i, att in enumerate(patient_query_atts):
             value = values[0][i]
             if value is not None:
                 self.__dict__[att] = value
@@ -335,17 +299,6 @@ class patient(object):
 
         self.getNotesTuple()
 
-        query = 'select chartdate,chartdata from perio where serialno=%s'
-        cursor.execute(query, self.serialno)
-        perioData = cursor.fetchall()
-
-        for data in perioData:
-            self.perioData[localsettings.formatDate(data[0])] = (
-                perio.get_perioData(data[1]))
-            #--perioData is
-            #--a dictionary (keys=dates) of dictionaries with keys
-            #--like "ur8" and containing 7 tuples of data
-
         query = 'select drnm,adrtel,curmed,oldmed,allerg,heart,lungs,' +\
             'liver,kidney,bleed,anaes,other,alert,chkdate from mednotes' +\
             ' where serialno=%s'
@@ -393,6 +346,36 @@ class patient(object):
             cursor.close()
         return self._dayBookHistory
 
+    @property
+    def last_treatment_date(self):
+        max_date = localsettings.currentDay()
+        if (self.treatment_course.cmp_txs !=
+        self.dbstate.treatment_course.cmp_txs):
+            return max_date
+        if self._most_recent_daybook_entry is None:
+            db = connect.connect()
+            cursor = db.cursor()
+            query = 'select max(date) from daybook where serialno=%s'
+            if cursor.execute(query, self.serialno):
+                max_date = cursor.fetchone()[0]
+            cursor.close()
+            self._most_recent_daybook_entry = max_date
+        return self._most_recent_daybook_entry
+
+    def forget_exam_booked(self):
+        self._has_exam_booked = None
+
+    @property
+    def has_exam_booked(self):
+        if self._has_exam_booked is None:
+            db = connect.connect()
+            cursor = db.cursor()
+            cursor.execute(FUTURE_EXAM_QUERY, self.serialno)
+            self._has_exam_booked = bool(cursor.fetchone()[0])
+            cursor.close()
+
+        return self._has_exam_booked
+
     def __repr__(self):
         return "'Patient_class instance - serialno %d'" % self.serialno
 
@@ -477,7 +460,7 @@ class patient(object):
                 cse_accd = localsettings.currentDay()
             else:
                 cse_accd = self.treatment_course.accd
-            for table in localsettings.FEETABLES.tables.values():
+            for table in reversed(localsettings.FEETABLES.tables.values()):
                 LOGGER.debug(
                     "checking feescale %s to see if suitable a feetable" % (
                         table))
@@ -502,51 +485,7 @@ class patient(object):
         '''
         get estimate data
         '''
-        db = connect.connect()
-        cursor = db.cursor()
-
-        cursor.execute(ESTS_QUERY, (self.serialno, self.courseno0))
-
-        rows = cursor.fetchall()
-        self.estimates = []
-
-        for row in rows:
-            hash_ = row[10]
-            completed = bool(row[9])
-
-            tx_hash = estimates.TXHash(hash_, completed)
-
-            ix = row[0]
-
-            found = False
-            # use existing est if one relates to multiple treatments
-            for existing_est in self.estimates:
-                if existing_est.ix == ix:
-                    existing_est.tx_hashes.append(tx_hash)
-                    found = True
-                    break
-            if found:
-                continue
-
-            # initiate a custom data class
-            est = estimates.Estimate()
-
-            est.ix = ix
-            est.courseno = row[11]
-            est.number = row[1]
-            est.itemcode = row[2]
-            est.description = row[3]
-            est.fee = row[4]
-            est.ptfee = row[5]
-            est.feescale = row[6]
-            est.csetype = row[7]
-            est.dent = row[8]
-
-            est.tx_hashes = [tx_hash]
-            self.estimates.append(est)
-
-        cursor.close()
-
+        self.estimates = db_estimates.get_ests(self.serialno, self.courseno0)
         self.est_logger = EstLogger(self.courseno0)
 
     def getSynopsis(self):
@@ -697,8 +636,7 @@ class patient(object):
         for est in self.estimates:
             if (est.csetype.startswith("N") and
                (not completed_only or est.completed == 2)
-                ):
-                # yield est
+                    ):
                 claims.append(est)
         return claims
 
@@ -706,9 +644,8 @@ class patient(object):
         '''
         re-written for schema 1.9
         '''
-        LOGGER.info(
-            "patient.addHiddenNote(ntype='%s',note='%s', attempt_delete='%s'" % (
-                ntype, note, attempt_delete))
+        LOGGER.info("(ntype='%s',note='%s', attempt_delete='%s'",
+                ntype, note, attempt_delete)
 
         HN = ()
         if ntype == "payment":
@@ -737,7 +674,8 @@ class patient(object):
             HN = ("INTERIM: ", note)
 
         if not HN:
-            print "unable to add Hidden Note notetype '%s' not found" % ntype
+            LOGGER.warning(
+                "unable to add Hidden Note notetype '%s' not found", ntype)
             return
 
         reversing_note = ("UNCOMPLETED", "{%s}" % note)
@@ -746,6 +684,8 @@ class patient(object):
             try:
                 self.HIDDENNOTES.remove(HN)
             except ValueError:
+                LOGGER.debug("'%s' not in hiddenotes", HN)
+                LOGGER.debug(self.HIDDENNOTES)
                 self.HIDDENNOTES.append(reversing_note)
         else:
             try:
@@ -784,12 +724,31 @@ class patient(object):
             self.title, self.fname, self.sname)
 
     @property
+    def psn(self):
+        '''
+        previous surname
+        '''
+        try:
+            return self.previous_surnames[0]
+        except IndexError:
+            return ""
+
+    @property
+    def previous_surnames(self):
+        if self._previous_surnames is None:
+            db = connect.connect()
+            cursor = db.cursor()
+            cursor.execute(PSN_QUERY, (self.serialno,))
+            self._previous_surnames = [s[0] for s in cursor.fetchall()]
+            cursor.close()
+        return self._previous_surnames
+
+    @property
     def n_family_members(self):
         if self._n_family_members is None:
             db = connect.connect()
             cursor = db.cursor()
-            cursor.execute("select count(*) from patients where familyno=%s",
-                (self.familyno,))
+            cursor.execute(FAMILY_COUNT_QUERY, (self.familyno,))
             self._n_family_members = cursor.fetchone()[0]
 
         return self._n_family_members
@@ -811,9 +770,9 @@ class patient(object):
         '''
         these are what is copied over into pt.dbstate
         '''
-        return (patientTableAtts +
+        return (patient_query_atts +
             exemptionTableAtts + bpeTableAtts + mnhistTableAtts +
-            perioTableAtts + clinical_memos + (
+            clinical_memos + (
                 "fees", "estimate_charges", "serialno", "estimates",
             "appt_prefs", "treatment_course", "chartgrid"))
 
diff --git a/src/openmolar/dbtools/patient_write_changes.py b/src/openmolar/dbtools/patient_write_changes.py
index f77aa33..6465e3b 100644
--- a/src/openmolar/dbtools/patient_write_changes.py
+++ b/src/openmolar/dbtools/patient_write_changes.py
@@ -31,7 +31,9 @@ import MySQLdb
 from openmolar.connect import connect
 from openmolar.settings import localsettings
 from openmolar.dbtools import patient_class
+from openmolar.dbtools import estimates
 from openmolar.dbtools.treatment_course import CURRTRT_ATTS
+from openmolar.dbtools.treatment_course import UPDATE_CURRTTMT2_QUERY
 
 LOGGER = logging.getLogger("openmolar")
 
@@ -42,76 +44,12 @@ EXMPT_INS_QUERY = ('insert into exemptions '
                    '(serialno, exemption, exempttext, datestamp) '
                    'values (%s,%s,%s, NOW())')
 
-ESTS_INS_QUERY = ('insert into newestimates (serialno, '
-                  'courseno, number, itemcode, description, fee, ptfee, feescale, '
-                  'csetype, dent, modified_by, time_stamp) values '
-                  '(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())')
-
-EST_LINK_INS_QUERY = (
-    'insert into est_link2 (est_id, tx_hash, completed) values (%s, %s, %s)')
-
-EST_DEL_QUERY = "delete from newestimates where ix=%s"
-EST_LINK_DEL_QUERY = "delete from est_link2 where est_id=%s"
-
-
-# too risky not to check these are unique before updating.
-EST_DAYBOOK_ALTERATION_QUERIES = [
-    'select daybook_id from daybook_link where tx_hash = %s',
-    '''select sum(fee), sum(ptfee) from newestimates join est_link2 on newestimates.ix = est_link2.est_id
-where tx_hash in (select tx_hash from daybook join daybook_link on daybook.id = daybook_link.daybook_id where id=%s)''',
-    'update daybook set feesa = %s, feesb = %s where serialno=%s and id=%s'
-]
-
 
 SYNOPSIS_INS_QUERY = '''
 insert into clinical_memos (serialno, synopsis, author, datestamp)
 values (%s, %s, %s, NOW())'''
 
 
-def update_daybook_after_estimate_change(values):
-    '''
-    if the value of a treatment item has been changed after completion,
-    update the daybook.
-    most common example of this is when an exemption is applied to a course of
-    treatment at reception (altering the charges put into the system in the
-    surgery)
-    note - use of serialno here is purely for precautionary reasons.
-    Hash collisions shouldn't occur... but easy to be cautious here.
-    '''
-    serialno, tx_hash = values
-    result = True
-    db = connect()
-    cursor = db.cursor()
-    try:
-        query = EST_DAYBOOK_ALTERATION_QUERIES[0]
-        cursor.execute(query, (tx_hash.hash,))
-        rows = cursor.fetchall()
-        if len(rows) != 1:
-            LOGGER.warning(
-                "unable to update daybook after estimate change - abandoning")
-            return True
-        daybook_id = rows[0][0]
-        LOGGER.debug("updating daybook row %s" % daybook_id)
-
-        query = EST_DAYBOOK_ALTERATION_QUERIES[1]
-        cursor.execute(query, (daybook_id,))
-        feesa, feesb = cursor.fetchone()
-
-        LOGGER.debug(
-            "updating row with feesa, feesb = %s and %s" %
-            (feesa, feesb))
-        query = EST_DAYBOOK_ALTERATION_QUERIES[2]
-        rows_changed = cursor.execute(
-            query, (feesa, feesb, serialno, daybook_id))
-        LOGGER.info("changes applied = %s" % bool(rows_changed))
-
-    except Exception as exc:
-        LOGGER.exception("error executing query %s" % query)
-        result = False
-
-    return result
-
-
 def all_changes(pt, changes):
     LOGGER.debug("writing_changes to patient - %s" % str(changes))
     if changes == []:
@@ -120,229 +58,202 @@ def all_changes(pt, changes):
                 pt.serialno)
         )
         return True
-    else:
-        # set up some booleans to prevent multiple updates of the same data
-        # example exemption AND exemption text have changed..
-        exemptionsHandled = False
-
-        if pt.HIDDENNOTES != []:
-            #-- hidden notes is
-            #-- treatment codes... money, printing etc..
-            LOGGER.debug("saving hiddennotes")
-            toNotes(pt.serialno, pt.HIDDENNOTES)
-            pt.clearHiddenNotes()
-
-        sqlcommands = {}
-        estimate_commands = {}
-        patchanges, patvalues = "", []
-        trtchanges, trtvalues = "", []
-        post_cleanup_commands = []
-
-        for change in changes:
-            if change == "courseno":
-                pass  # these values should never get munged.
-
-            elif change in ("money0, money1"):
-                diff = pt.__dict__[change] - pt.dbstate.__dict__[change]
-                patvalues.append(diff)
-                patchanges += '%s = %s + %%s,' % (change, change)
-
-            elif change in patient_class.patientTableAtts:
-                patvalues.append(pt.__dict__[change])
-                patchanges += '%s = %%s,' % change
-
-            elif (change in patient_class.exemptionTableAtts and
-                  not exemptionsHandled):
-                values = (pt.serialno, pt.exemption, pt.exempttext)
-                sqlcommands['exemptions'] = ((EXMPT_INS_QUERY, values),)
-                exemptionsHandled = True
-
-            elif change == "bpe":
-                values = (pt.serialno,
-                          pt.bpe[-1][0],
-                          pt.bpe[-1][1],
-                          pt.bpe[-1][1]
-                          )
-                sqlcommands['bpe'] = ((BPE_INS_QUERY, values),)
-
-            elif change == "synopsis":
-                values = (pt.serialno, pt.synopsis,
-                          localsettings.operator)
-
-                sqlcommands['clinical_memos'] = ((SYNOPSIS_INS_QUERY, values),)
-
-            elif change == "estimates":
-                estimate_commands["insertions"] = []
-                estimate_commands["updates"] = []
-                sqlcommands["estimate_deletions"] = []
-                sqlcommands["estimate_daybook_alterations"] = []
-
-                oldEstDict = {}
-
-                for est in pt.dbstate.estimates:
-                    #-- generate a dictionary with the
-                    #-- autogenerated db indexas key
-                    if est.ix is not None:
-                        oldEstDict[est.ix] = est
-
-                for est in pt.estimates:
-                    if est.ix is None:  # --new item
-                        values = (pt.serialno, est.courseno, est.number,
-                                  est.itemcode, est.description,
-                                  est.fee, est.ptfee, est.feescale, est.csetype,
-                                  est.dent, localsettings.operator)
-
-                        estimate_commands["insertions"].append(
-                            (ESTS_INS_QUERY, values, est.tx_hashes)
-                        )
-
-                    elif est.ix in oldEstDict.keys():
-                        oldEst = oldEstDict[est.ix]
-
-                        if str(oldEst) != str(est):
-                            #-- have to use the str because est class does not
-                            #-- have a _eq_ property ??
-                            query = 'update newestimates set '
-                            values = []
-                            if oldEst.number != est.number:
-                                query += "number=%s,"
-                                values.append(est.number)
-                            if oldEst.itemcode != est.itemcode:
-                                query += 'itemcode=%s,'
-                                values.append(est.itemcode)
-                            if oldEst.description != est.description:
-                                query += 'description=%s,'
-                                values.append(est.description)
-                            if oldEst.fee != est.fee:
-                                query += 'fee=%s,'
-                                values.append(est.fee)
-                            if oldEst.ptfee != est.ptfee:
-                                query += "ptfee=%s,"
-                                values.append(est.ptfee)
-                            if oldEst.feescale != est.feescale:
-                                query += 'feescale=%s,'
-                                values.append(pt.feescale)
-                            if oldEst.csetype != est.csetype:
-                                query += 'csetype=%s,'
-                                values.append(est.csetype)
-                            if oldEst.dent != est.dent:
-                                query += 'dent=%d,'
-                                values.append(est.dent)
-
-                            query += ('modified_by = %s, '
-                                      'time_stamp = NOW() where ix = %s')
-
-                            values.append(localsettings.operator)
-                            values.append(est.ix)
-
-                            estimate_commands["updates"].append(
-                                (query, tuple(values), est))
-                            for tx_hash in est.tx_hashes:
-                                values = (pt.serialno, tx_hash)
-                                post_cleanup_commands.append(
-                                    (update_daybook_after_estimate_change, values))
-
-                        oldEstDict.pop(est.ix)
-
-                #-- all that is left in oldEstDict now are items which
-                #-- have been removed.
-                #-- so remove from database if they are current course!
-                for ix, old_est in oldEstDict.iteritems():
-                    #--removed
-                    if old_est.courseno == pt.courseno0:
-                        values = (ix,)
-                        deletions = sqlcommands["estimate_deletions"]
-                        deletions.append((EST_DEL_QUERY, values))
-                        deletions.append((EST_LINK_DEL_QUERY, values))
-                        for tx_hash in old_est.tx_hashes:
-                            values = (pt.serialno, tx_hash)
-                            post_cleanup_commands.append(
-                                (update_daybook_after_estimate_change, values))
-
-            elif change == "treatment_course":  # patient.CURRTRT_ATTS:
-                for trt_att in CURRTRT_ATTS:
-                    value = pt.treatment_course.__dict__[trt_att]
-                    existing = pt.dbstate.treatment_course.__dict__[trt_att]
-                    if pt.has_new_course or value != existing:
-                        trtchanges += '%s = %%s ,' % trt_att
-                        trtvalues.append(value)
-
-            elif change == "appt_prefs":
-                pt.appt_prefs.commit_changes()
-
-    result = True
-    if patchanges != "":
+    success = True
+    # set up some booleans to prevent multiple updates of the same data
+    # example exemption AND exemption text have changed..
+    exemptionsHandled = False
+
+    if pt.HIDDENNOTES != []:
+        #-- hidden notes is
+        #-- treatment codes... money, printing etc..
+        LOGGER.debug("saving hiddennotes")
+        toNotes(pt.serialno, pt.HIDDENNOTES)
+        pt.clearHiddenNotes()
+
+    sqlcommands = {}
+    estimate_commands = {}
+    patchanges, patvalues = [], []
+    static_changes, static_values = [], []
+    date_changes, date_values = [], []
+    nhs_changes, nhs_values = [], []
+    trtchanges, trtvalues = "", []
+
+    # money handled slightly differently. more complex query.
+    money_changes, money_values = [], []
+
+    for change in changes:
+        if change == "courseno":
+            pass  # these values should never get munged.
+
+        elif change in patient_class.money_table_atts:
+            money_changes.append(change)
+            money_values.append(pt.__dict__[change])
+
+        elif change in patient_class.patientTableAtts:
+            # patchanges += '%s = %%s,' % change
+            patchanges.append(change)
+            patvalues.append(pt.__dict__[change])
+
+        elif change in patient_class.date_table_atts:
+            date_changes.append(change)
+            date_values.append(pt.__dict__[change])
+
+        elif change in patient_class.static_table_atts:
+            static_changes.append(change.rstrip("st"))
+            static_values.append(pt.__dict__[change])
+
+        elif change in patient_class.nhs_table_atts:
+            nhs_changes.append(change)
+            nhs_values.append(pt.__dict__[change])
+
+        elif (change in patient_class.exemptionTableAtts and
+              not exemptionsHandled):
+            values = (pt.serialno, pt.exemption, pt.exempttext)
+            sqlcommands['exemptions'] = ((EXMPT_INS_QUERY, values),)
+            exemptionsHandled = True
+
+        elif change == "bpe":
+            values = (pt.serialno,
+                      pt.bpe[-1][0],
+                      pt.bpe[-1][1],
+                      pt.bpe[-1][1]
+                      )
+            sqlcommands['bpe'] = ((BPE_INS_QUERY, values),)
+
+        elif change == "synopsis":
+            values = (pt.serialno, pt.synopsis,
+                      localsettings.operator)
+
+            sqlcommands['clinical_memos'] = ((SYNOPSIS_INS_QUERY, values),)
+
+        elif change == "treatment_course":  # patient.CURRTRT_ATTS:
+            for trt_att in CURRTRT_ATTS:
+                value = pt.treatment_course.__dict__[trt_att]
+                existing = pt.dbstate.treatment_course.__dict__[trt_att]
+                if pt.has_new_course or value != existing:
+                    trtchanges += '%s = %%s ,' % trt_att
+                    trtvalues.append(value)
+
+        elif change == "appt_prefs":
+            pt.appt_prefs.commit_changes()
+
+        elif change == "estimates":
+            pass  # dealt with below
+
+    if patchanges:
+        query = "update new_patients SET %s where serialno=%%s" % \
+            ", ".join(["%s = %%s" % change for change in patchanges])
         patvalues.append(pt.serialno)
-        values = tuple(patvalues)
+        sqlcommands['patients'] = ((query, patvalues),)
+
+    if static_changes:
+        LOGGER.warning(
+            "applying static_changes %s values %s",
+            static_changes,
+            static_values)
+        query = '''insert into static_chart (pt_sno, %s) values (%%s, %s)
+        on duplicate key update %s''' % (
+            ", ".join(static_changes),
+            ", ".join(("%s",) * len(static_changes)),
+            ", ".join(["%s = %%s" % change for change in static_changes])
+        )
+        values = [pt.serialno] + static_values * 2
+        sqlcommands['static'] = ((query, values),)
 
-        query = "update patients SET %s where serialno=%%s" % patchanges.strip(
-            ",")
+    if nhs_changes:
+        LOGGER.warning(
+            "applying nhs_changes %s values %s",
+            nhs_changes,
+            nhs_values)
+        query = '''insert into patient_nhs (pt_sno, %s) values (%%s, %s)
+        on duplicate key update %s''' % (
+            ", ".join(nhs_changes),
+            ", ".join(("%s",) * len(nhs_changes)),
+            ", ".join(["%s = %%s" % change for change in nhs_changes])
+        )
+        values = [pt.serialno] + nhs_values * 2
+        sqlcommands['nhs'] = ((query, values),)
 
-        sqlcommands['patients'] = ((query, values),)
+    if date_changes:
+        LOGGER.warning(
+            "applying date_changes %s values %s",
+            date_changes,
+            date_values)
+        query = '''insert into patient_dates (pt_sno, %s) values (%%s, %s)
+        on duplicate key update %s''' % (
+            ", ".join(date_changes),
+            ", ".join(("%s",) * len(date_changes)),
+            ", ".join(["%s = %%s" % change for change in date_changes])
+        )
+        values = [pt.serialno] + date_values * 2
+        sqlcommands['patient_dates'] = ((query, values),)
+
+    if money_changes:
+        update_money_values = []
+        update_query = "update "
+        for i, change in enumerate(money_changes):
+            if change in ("money0", "money1"):
+                diff = pt.__dict__[change] - pt.dbstate.__dict__[change]
+                update_money_values.append(diff)
+                update_query += "%s=%s +%%s, " % (change, change)
+            else:
+                update_money_values.append(money_values[i])
+                update_query += "%s=%%s, " % change
+
+        LOGGER.warning(
+            "applying money_changes %s values %s addition_values %s",
+            money_changes,
+            money_values,
+            update_money_values)
+        query = '''insert into patient_money (pt_sno, %s) values (%%s, %s)
+        on duplicate key %s''' % (
+            ", ".join(money_changes),
+            ", ".join(("%s",) * len(money_changes)),
+            update_query.rstrip(", ")
+        )
+        values = [pt.serialno] + money_values + update_money_values
+        LOGGER.debug(query.replace("\n", " "))
+        LOGGER.debug(values)
+        sqlcommands['patient_money'] = ((query, values),)
 
     if trtchanges != "":
         trtvalues.append(pt.serialno)
         trtvalues.append(pt.treatment_course.courseno)
-        values = tuple(trtvalues)
 
-        query = ('update currtrtmt2 SET '
-                 '%s where serialno=%%s and courseno=%%s' % (trtchanges.strip(",")))
-        sqlcommands['currtrtmt'] = ((query, values),)
+        query = UPDATE_CURRTTMT2_QUERY % (trtchanges.strip(","))
+        sqlcommands['currtrtmt'] = ((query, trtvalues),)
 
-    if sqlcommands != {} or estimate_commands != {}:
-        LOGGER.debug(sqlcommands)
-        LOGGER.debug(estimate_commands)
+    try:
         db = connect()
-        cursor = db.cursor()
-        tables = sqlcommands.keys()
-        for table in tables:
-            for query, values in sqlcommands[table]:
-                try:
-                    cursor.execute(query, values)
-                except Exception as exc:
-                    LOGGER.exception("error executing query %s" % query)
-                    result = False
-
-        insert_commands = estimate_commands.get("insertions", [])
-        for query, values, tx_hashes in insert_commands:
-            try:
-                cursor.execute(query, values)
-                ix = cursor.lastrowid
-                try:
-                    for tx_hash in tx_hashes:
-                        vals = (ix, tx_hash.hash, tx_hash.completed)
-                        cursor.execute(EST_LINK_INS_QUERY, vals)
-                except Exception as exc:
-                    LOGGER.exception("error executing query\n %s\n %s" % (
-                        EST_LINK_INS_QUERY, vals))
-                    result = False
-            except Exception as exc:
-                LOGGER.exception("error executing query\n %s\n %s" % (
-                    query, str(values)))
-                result = False
-
-        update_commands = estimate_commands.get("updates", [])
-        for query, values, estimate in update_commands:
-            try:
-                cursor.execute(query, values)
-                cursor.execute(EST_LINK_DEL_QUERY, (estimate.ix,))
-                for tx_hash in estimate.tx_hashes:
-                    cursor.execute(EST_LINK_INS_QUERY,
-                                  (estimate.ix, tx_hash.hash,
-                                   tx_hash.completed)
-                                   )
-            except Exception as exc:
-                LOGGER.exception("error updating estimate %s" % estimate)
-                result = False
-
-        cursor.close()
-
-        for func, values in post_cleanup_commands:
-            func.__call__(values)
-
+        db.autocommit = False
+
+        if sqlcommands != {}:
+            LOGGER.debug(sqlcommands)
+            cursor = db.cursor()
+            tables = sqlcommands.keys()
+            for table in tables:
+                for query, values in sqlcommands[table]:
+                    try:
+                        cursor.execute(query, values)
+                    except Exception as exc:
+                        LOGGER.error("error executing query %s" % query)
+                        raise exc
+
+            cursor.close()
+
+        if "estimates" in changes:
+            estimates.apply_changes(pt, pt.dbstate.estimates, pt.estimates)
         db.commit()
 
-    return result
+    except Exception as exc:
+        LOGGER.exception("rolling back database")
+        db.rollback()
+        success = False
+        raise exc
+    finally:
+        db.autocommit = True
+
+    return success
 
 
 def toNotes(serialno, newnotes):
@@ -406,42 +317,50 @@ def toNotes(serialno, newnotes):
     return rows > 0
 
 
-def discreet_changes(pt_changed, changes):
+def discreet_changes(pt, changes):
     '''
     this updates only the selected atts
     (usually called by automated proc such as recalls...
     and accounts) only updates the patients table
     '''
-    LOGGER.debug("write changes - discreet changes")
+    LOGGER.warning("discreet changes sno=%s %s", pt.serialno, changes)
+    if not changes:
+        LOGGER.error("no changes passed")
+    values = []
+    for change in changes:
+        values.append(pt.__dict__[change])
+    values.append(pt.serialno)
+
+    query = "update new_patients SET %s where serialno=%%s" % \
+        ", ".join(["%s = %%s" % change for change in changes])
 
-    sqlcond = ""
+    db = connect()
+    cursor = db.cursor()
+    cursor.execute(query, values)
+    db.commit()
+    cursor.close()
+    return True
+
+
+def discreet_money_changes(pt, changes):
+    '''
+    update patient_monet attributes.
+    '''
+    LOGGER.warning("discreet_money_changes sno=%s %s", pt.serialno, changes)
+    if not changes:
+        LOGGER.error("no changes passed!")
+        return
+    values = []
     for change in changes:
-        value = pt_changed.__dict__[change]
-        LOGGER.debug("discreet change %s %s" % (change, type(value)))
-        if change in patient_class.dateFields:
-            if value != "" and value is not None:
-                sqlcond += '%s="%s" ,' % (change, value)
-        elif value is None:
-            sqlcond += '%s=NULL ,' % change
-        elif type(value) in (int, int):
-            sqlcond += '%s=%s ,' % (change, value)
-        else:
-            sqlcond += '%s="%s" ,' % (change, value)
-
-    sqlcommand = "update patients SET %s where serialno=%%s" % (
-        sqlcond.strip(","))
-
-    LOGGER.debug("%s (%s,)" % (sqlcommand, pt_changed.serialno))
-
-    result = True
-    if sqlcond != "":
-        db = connect()
-        cursor = db.cursor()
-        try:
-            cursor.execute(sqlcommand, (pt_changed.serialno,))
-            db.commit()
-        except Exception as e:
-            LOGGER.exception("unable to write discreet changes")
-            result = False
-        cursor.close()
-    return result
+        values.append(pt.__dict__[change])
+    values.append(pt.serialno)
+
+    query = "update patient_money SET %s where pt_sno=%%s" % \
+            ", ".join(["%s = %%s" % change for change in changes])
+
+    db = connect()
+    cursor = db.cursor()
+    cursor.execute(query, values)
+    db.commit()
+    cursor.close()
+    return True
diff --git a/src/openmolar/dbtools/paymentHistory.py b/src/openmolar/dbtools/paymentHistory.py
index 889562b..80558ea 100644
--- a/src/openmolar/dbtools/paymentHistory.py
+++ b/src/openmolar/dbtools/paymentHistory.py
@@ -25,7 +25,6 @@
 from __future__ import division
 from openmolar.settings import localsettings
 from openmolar.connect import connect
-from openmolar.dbtools.cashbook import cashbookCodesDict
 
 HEADERS = (
     _("Date"),
@@ -81,7 +80,7 @@ def summary_details(sno, start_date):
 
         retarg += '<td>%s</td>' % (row[0])
         retarg += '<td>%s</td>' % localsettings.ops.get(row[1])
-        CODE = cashbookCodesDict.get(row[2], "UNKNOWN")
+        CODE = localsettings.cashbookCodesDict.get(row[2], "UNKNOWN")
         retarg += '<td>%s</td>' % CODE
         amt = row[3]
 
@@ -137,7 +136,7 @@ def details(sno):
         retarg += '<td>%s</td>' % (row[0])
         retarg += '<td>%s</td>' % localsettings.ops.get(row[1])
         retarg += '<td>%s</td>' % row[2]
-        CODE = cashbookCodesDict.get(row[3], "UNKNOWN")
+        CODE = localsettings.cashbookCodesDict.get(row[3], "UNKNOWN")
         retarg += '<td>%s</td>' % CODE
         amt = row[4]
         amt_str = localsettings.formatMoney(amt)
diff --git a/src/openmolar/dbtools/queries.py b/src/openmolar/dbtools/queries.py
index be17ce0..3125d34 100644
--- a/src/openmolar/dbtools/queries.py
+++ b/src/openmolar/dbtools/queries.py
@@ -22,22 +22,32 @@
 # #                                                                          # #
 # ############################################################################ #
 
-ESTS_QUERY = '''SELECT newestimates.ix, number, itemcode, description,
-fee, ptfee, feescale, csetype, dent, est_link2.completed, tx_hash, courseno
-from newestimates right join est_link2 on newestimates.ix = est_link2.est_id
-where serialno=%s and courseno=%s order by itemcode, ix'''
+PATIENT_QUERY_FIELDS = (
+"money0", "money1", "money2", "money3", "money4", "money5", "money6", "money7", "money8", "money9", "money10",
+"pd0", "pd1", "pd2", "pd3", "pd4", "pd5", "pd6", "pd7", "pd8", "pd9", "pd10", "pd11", "pd12", "pd13",
+"pd14", "sname", "fname", "title", "sex", "dob", "addr1", "addr2", "addr3", "pcde", "tel1", "tel2",
+"occup", "nhsno", "cnfd", "cset", "dnt1", "dnt2", "courseno0",
+"ur8", "ur7", "ur6", "ur5", "ur4", "ur3", "ur2", "ur1", "ul1", "ul2", "ul3",
+"ul4", "ul5", "ul6", "ul7", "ul8", "ll8", "ll7", "ll6", "ll5", "ll4", "ll3",
+"ll2", "ll1", "lr1", "lr2", "lr3", "lr4", "lr5", "lr6", "lr7", "lr8", "dent0",
+"dent1", "dent2", "dent3", "billdate", "billct", "billtype",
+"money11", "familyno", "memo", "town", "county", "mobile", "fax", "email1",
+"email2", "status", "initaccept", "lastreaccept",
+"lastclaim", "expiry", "cstatus", "transfer", "pstatus"
+)
 
-PATIENT_QUERY = '''SELECT pf0, pf1, pf2, pf3, pf4, pf5, pf6, pf7, pf8, pf9,
-pf10, pf11, pf12, pf14, pf15, pf16, pf17, pf18, pf19, money0, money1, money2,
-money3, money4, money5, money6, money7, money8, money9, money10,
-pd0, pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd8, pd9, pd10, pd11, pd12, pd13,
-pd14, sname, fname, title, sex, dob, addr1, addr2, addr3, pcde, tel1, tel2,
-occup, nhsno, cnfd, psn, cset, dnt1, dnt2, courseno0, courseno1,
-ur8st, ur7st, ur6st, ur5st, ur4st, ur3st, ur2st, ur1st, ul1st, ul2st, ul3st,
-ul4st, ul5st, ul6st, ul7st, ul8st, ll8st, ll7st, ll6st, ll5st, ll4st, ll3st,
-ll2st, ll1st, lr1st, lr2st, lr3st, lr4st, lr5st, lr6st, lr7st, lr8st, dent0,
-dent1, dent2, dent3, dmask, minstart, maxend, billdate, billct, billtype,
-pf20, money11, pf13, familyno, memo, town, county, mobile, fax, email1,
-email2, status, source, enrolled, archived, initaccept, lastreaccept,
-lastclaim, expiry, cstatus, transfer, pstatus, courseno2
-from patients where serialno = %s'''
+PATIENT_QUERY = '''SELECT %s
+from new_patients
+left join patient_money on serialno = patient_money.pt_sno
+left join static_chart on serialno = static_chart.pt_sno
+left join patient_dates on serialno = patient_dates.pt_sno
+left join patient_nhs on serialno = patient_nhs.pt_sno
+where serialno = %%s''' % ", ".join(PATIENT_QUERY_FIELDS)
+
+FUTURE_EXAM_QUERY = '''select count(*) from aslot
+where serialno=%s
+and (code0="EXAM" or code1="EXAM" or code2="EXAM") and adate >= CURDATE()'''
+
+PSN_QUERY = "select psn from previous_snames where serialno=%s order by ix desc"
+
+FAMILY_COUNT_QUERY = "select count(*) from new_patients where familyno=%s"
diff --git a/src/openmolar/dbtools/recall.py b/src/openmolar/dbtools/recall.py
index d1b725c..e2803bc 100644
--- a/src/openmolar/dbtools/recall.py
+++ b/src/openmolar/dbtools/recall.py
@@ -35,6 +35,16 @@ HEADERS = (
     _("County"), _("PostCode"), _("Dentist"), _("Family No"), _("Recall Date"))
 
 
+# note the word CONDITIONS in this query - replaced dynamically at runtime
+RECALL_QUERY = '''
+select new_patients.serialno, title, fname, sname, dnt1, familyno, dob,
+addr1, addr2, addr3, town, county, pcde, recdent
+from new_patients join appt_prefs
+on new_patients.serialno = appt_prefs.serialno
+where CONDITIONS and status != "DECEASED"
+order by familyno DESC, addr1, dob, fname, sname'''
+
+
 class RecalledPatient(object):
 
     '''
@@ -142,14 +152,8 @@ def getpatients(conditions="", values=()):
     '''
     assert isinstance(conditions, bytes), "conditions must be a string"
     assert isinstance(values, tuple), "values must be a tuple"
-    query = '''
-    select patients.serialno, title, fname, sname, dnt1, familyno, dob,
-    addr1, addr2, addr3, town, county, pcde, recdent
-    from patients join appt_prefs on patients.serialno = appt_prefs.serialno
-    where CONDITIONS and status != "DECEASED"
-    order by familyno DESC, addr1, dob, fname, sname'''
 
-    query = query.replace("CONDITIONS", conditions)
+    query = RECALL_QUERY.replace("CONDITIONS", conditions)
 
     db = connect()
     cursor = db.cursor()
@@ -176,7 +180,7 @@ def getpatients(conditions="", values=()):
 
 if __name__ == "__main__":
     localsettings.initiate()
-    conditions = "recd>=%s and recd<=%s and dnt1=%s"
+    conditions = "recdent>=%s and recdent<=%s and dnt1=%s"
     values = date(2012, 7, 1), date(2012, 7, 31), 6
     patients = getpatients(conditions, values)
     print patients
diff --git a/src/openmolar/dbtools/referral.py b/src/openmolar/dbtools/referral.py
new file mode 100644
index 0000000..5bfe5f8
--- /dev/null
+++ b/src/openmolar/dbtools/referral.py
@@ -0,0 +1,190 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+#
+# Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+#
+# This file is part of OpenMolar.                                          # #
+#
+# OpenMolar is free software: you can redistribute it and/or modify        # #
+# it under the terms of the GNU General Public License as published by     # #
+# the Free Software Foundation, either version 3 of the License, or        # #
+# (at your option) any later version.                                      # #
+#
+# OpenMolar is distributed in the hope that it will be useful,             # #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# GNU General Public License for more details.                             # #
+#
+# You should have received a copy of the GNU General Public License        # #
+# along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+#
+#
+
+import time
+import datetime
+from collections import namedtuple
+
+from openmolar.settings import localsettings
+from openmolar.connect import connect
+
+QUERY = "SELECT description FROM referral_centres"
+
+ADDRESS_QUERY = '''
+SELECT greeting, addr1, addr2, addr3, addr4, addr5, addr6, addr7
+FROM referral_centres where description = %s'''
+
+EDIT_QUERY = '''SELECT ix, description, greeting, addr1, addr2,
+addr3, addr4, addr5, addr6, addr7 FROM referral_centres order by ix'''
+
+UPDATE_QUERY = '''UPDATE referral_centres
+SET description=%s, greeting=%s, addr1=%s, addr2=%s,
+addr3=%s, addr4=%s, addr5=%s, addr6=%s, addr7=%s WHERE ix=%s'''
+
+INSERT_QUERY = '''INSERT INTO referral_centres
+(description, greeting, addr1, addr2, addr3, addr4, addr5, addr6, addr7)
+VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)'''
+
+DELETE_QUERY = 'DELETE FROM referral_centres WHERE ix=%s'
+
+HTML = '''
+<html><body>
+<br /><br /><br /><br /><br /><br />
+<b>%s</b><!-- referral centre postal address -->
+<br /><br />
+%s<!-- date -->
+<br /><br />
+%s<!-- greeting -->
+<br />
+<div align="center">
+<b>%s %s %s - %s %s</b><br /><!-- patient name and dob -->
+%s<!-- patient address -->
+<br />
+%s<!-- patient tel -->
+</div>
+<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
+%s<!-- sign off -->
+<br /><br />
+</body></html>'''
+
+
+ReferralCentre = namedtuple('ReferralCentre',
+    ('ix', 'description', 'greeting', 'addr1', 'addr2',
+'addr3', 'addr4', 'addr5', 'addr6', 'addr7')
+    )
+
+
+def getDescriptions():
+    descriptions = []
+    db = connect()
+    cursor = db.cursor()
+    cursor.execute(QUERY)
+    for row in cursor.fetchall():
+        descriptions.append(row[0])
+    cursor.close()
+    return descriptions
+
+def get_referral_centres():
+    db = connect()
+    cursor = db.cursor()
+    cursor.execute(EDIT_QUERY)
+    for row in cursor.fetchall():
+        yield ReferralCentre(*row)
+    cursor.close()
+
+def insert_centres(centres):
+    values = []
+    for centre in centres:
+        values.append((centre.description,
+                      centre.greeting,
+                      centre.addr1,
+                      centre.addr2,
+                      centre.addr3,
+                      centre.addr4,
+                      centre.addr5,
+                      centre.addr6,
+                      centre.addr7)
+                    )
+    if values != []:
+        db = connect()
+        cursor = db.cursor()
+        cursor.executemany(INSERT_QUERY, values)
+        cursor.close()
+
+def update_centres(centres):
+    values = []
+    for centre in centres:
+        values.append((centre.description,
+                      centre.greeting,
+                      centre.addr1,
+                      centre.addr2,
+                      centre.addr3,
+                      centre.addr4,
+                      centre.addr5,
+                      centre.addr6,
+                      centre.addr7,
+                      centre.ix)
+                    )
+    if values != []:
+        db = connect()
+        cursor = db.cursor()
+        cursor.executemany(UPDATE_QUERY, values)
+        cursor.close()
+
+def delete_centres(centres):
+    values = []
+    for centre in centres:
+        values.append((centre.ix,))
+    if values != []:
+        db = connect()
+        cursor = db.cursor()
+        cursor.executemany(DELETE_QUERY, values)
+        cursor.close()
+
+def getHtml(description, pt):
+    '''
+    get the HTML for a letter to
+    referral_centre identified by description about this pt
+    '''
+    descriptions = []
+    db = connect()
+    cursor = db.cursor()
+    cursor.execute(ADDRESS_QUERY, (description,))
+    row = cursor.fetchone()
+    cursor.close()
+    if not row:
+        return HTML
+
+    greeting, addr1, addr2, addr3, addr4, addr5, addr6, addr7 = row
+
+    tel = _("Telephone") + " :- "
+    for i, val in enumerate((pt.tel1, pt.tel2, pt.mobile)):
+        if val != "":
+            tel += "%s %s " % (
+                (_("home"), _("work "), _("mobile "))[i],
+                val)
+
+    return HTML % (
+
+        "<br />".join(
+            [a for a in (
+                addr1, addr2, addr3, addr4, addr5, addr6, addr7) if a != ""]),
+        localsettings.longDate(localsettings.currentDay()),
+        greeting,
+        pt.title.title(), pt.fname.title(), pt.sname.title(),
+        _("D.O.B."), localsettings.formatDate(pt.dob),
+        ",".join(
+            [a for a in
+             (pt.addr1, pt.addr2, pt.addr3, pt.town,
+                  pt.county, pt.pcde) if a != ""]),
+        tel,
+        _("Yours Sincerely"))
+
+if __name__ == "__main__":
+    localsettings.initiate()
+    from openmolar.dbtools import patient_class
+    pt = patient_class.patient(4)
+    d = getDescriptions()
+    print d
+    print getHtml(d[0], pt)
diff --git a/src/openmolar/dbtools/schema_version.py b/src/openmolar/dbtools/schema_version.py
index 26d15d4..57ed5ab 100644
--- a/src/openmolar/dbtools/schema_version.py
+++ b/src/openmolar/dbtools/schema_version.py
@@ -28,24 +28,27 @@ from openmolar.settings import localsettings
 
 LOGGER = logging.getLogger("openmolar")
 
+SELECT_QUERY = 'select max(data) from settings where value = "Schema_Version"'
+
+INSERT_QUERY = '''insert into settings (value,data,modified_by,time_stamp)
+values (%s, %s, %s, NOW())'''
+
+DELETE_QUERY = 'delete from settings where value = "compatible_clients"'
+
+COMPAT_QUERY = '''insert into settings (value, data, modified_by, time_stamp)
+values ("compatible_clients", %s, 'Update script', NOW())'''
+
 
 def getVersion():
     try:
         db = connect.connect()
         cursor = db.cursor()
-        query = 'select data from settings where value = "Schema_Version"'
-        cursor.execute(query)
-        rows = cursor.fetchall()
+        cursor.execute(SELECT_QUERY)
+        version = cursor.fetchone()[0]
     except connect.ProgrammingError as ex:
         LOGGER.warning("no settings table! %s" % ex)
         LOGGER.warning("schema assumed to be 1.0")
-        return "1.0"
-
-    version = ""
-    for row in rows:
-        data = row[0]
-        if data > version:
-            version = data
+        version = "1.0"
     localsettings.DB_SCHEMA_VERSION = version
     return version
 
@@ -76,21 +79,16 @@ def update(schemas, user):
     latest_schema = schemas[-1]
     db = connect.connect()
     cursor = db.cursor()
-    query = '''insert into settings (value,data,modified_by,time_stamp)
-            values (%s, %s, %s, NOW())'''
     values = ("Schema_Version", latest_schema, user)
 
     LOGGER.info("making the db aware of it's schema version")
-    cursor.execute(query, values)
+    cursor.execute(INSERT_QUERY, values)
+
+    LOGGER.info("disabling ALL old clients")
+    cursor.execute(DELETE_QUERY)
 
-    LOGGER.info("disabling old clients")
-    query = '''delete from settings where value = "compatible_clients"'''
-    cursor.execute(query)
-    db.commit()
+    LOGGER.info("enabling compatible clients")
     for schema in schemas:
-        query = '''insert into settings (value, data, modified_by, time_stamp)
-        values ("compatible_clients", %s, 'Update script', NOW())'''
         values = (schema,)
-        cursor.execute(query, values)
-    db.commit()
+        cursor.execute(COMPAT_QUERY, values)
     return True
diff --git a/src/openmolar/dbtools/search.py b/src/openmolar/dbtools/search.py
index 015a2e6..1aac891 100644
--- a/src/openmolar/dbtools/search.py
+++ b/src/openmolar/dbtools/search.py
@@ -25,72 +25,88 @@
 '''this script connects to the database and performs searches'''
 
 import datetime
+import logging
 import sys
 from openmolar.connect import connect
 from openmolar.settings import localsettings
 
 
+LOGGER = logging.getLogger("openmolar")
+
+ALL_PATIENTS_QUERY = \
+    '''SELECT serialno, status, title, fname, sname, dob, addr1, addr2, town,
+pcde, tel1, tel2, mobile FROM new_patients ORDER BY sname, fname'''
+
+
+def all_patients():
+    db = connect()
+    cursor = db.cursor()
+    cursor.execute(ALL_PATIENTS_QUERY)
+    results = cursor.fetchall()
+    cursor.close()
+
+    return results
+
+
 def getcandidates(dob, addr, tel, sname, similar_sname, fname,
                   similar_fname, pcde):
     '''
     this searches the database for patients matching the given fields
     '''
-    query = ''
+    conditions = []
     values = []
     if addr != '':
-        query += '(ADDR1 like %s or ADDR2 like %s) and '
-        values.append("%" + addr + "%")
-        values.append("%" + addr + "%")
+        conditions.append('(ADDR1 like %s or ADDR2 like %s or town like %s)')
+        values += ["%" + addr + "%"] * 3
     if tel != '':
-        query += 'tel1 like %s and '
-        values.append("%" + tel + "%")
+        conditions.append('tel1 like %s or tel2 like %s or mobile like %s')
+        values += ["%" + tel + "%"] * 3
     if dob != datetime.date(1900, 1, 1):
-        query += 'dob = %s and '
+        conditions.append('dob = %s')
         values.append(dob)
     if pcde != '':
-        query += 'pcde like %s and '
+        conditions.append('pcde like %s')
         values.append("%" + pcde + "%")
     if sname != '':
         if similar_sname:
-            query += 'sname sounds like %s and '
+            conditions.append('sname sounds like %s')
             values.append(sname)
         else:
             sname += "%"
             if "'" in sname:
-                query += '(sname like %s or sname like %s) and '
+                conditions.append('(sname like %s or sname like %s)')
                 values.append(sname)
                 values.append(sname.replace("'", ""))
             elif sname[:1] == "o":
-                query += '(sname like %s or sname like %s) and '
+                conditions.append('(sname like %s or sname like %s)')
                 values.append(sname)
                 values.append("o'" + sname[1:])
             elif sname[:2] == "mc":
-                query += '(sname like %s or sname like %s) and '
+                conditions.append('(sname like %s or sname like %s)')
                 values.append(sname)
                 values.append(sname.replace("mc", "mac"))
             elif sname[:3] == "mac":
-                query += '(sname like %s or sname like %s) and '
+                conditions.append('(sname like %s or sname like %s)')
                 values.append(sname)
                 values.append(sname.replace("mac", "mc"))
             else:
-                query += 'sname like %s and '
+                conditions.append('sname like %s')
                 values.append(sname)
 
     if fname != '':
         if similar_fname:
-            query += 'fname sounds like %s and '
+            conditions.append('fname sounds like %s')
             values.append(fname)
         else:
-            query += 'fname like %s and '
+            conditions.append('fname like %s')
             values.append(fname + "%")
 
-    if query != '':
-        fields = '''serialno, sname, fname, dob, addr1, addr2, pcde, tel1,
-        tel2, mobile'''
-
-        query = "select %s from patients where %s order by sname, fname" % (
-            fields, query[0: query.rindex("and")])
+    if conditions:
+        conditional = "WHERE %s ORDER BY" % " AND ".join(conditions)
+        query = ALL_PATIENTS_QUERY.replace("ORDER BY", conditional)
 
+        LOGGER.debug(query.replace("\n", " "))
+        LOGGER.debug(values)
         db = connect()
         cursor = db.cursor()
         cursor.execute(query, tuple(values))
@@ -103,24 +119,28 @@ def getcandidates(dob, addr, tel, sname, similar_sname, fname,
 
 
 def getcandidates_from_serialnos(list_of_snos):
-    query = ""
-    for sno in list_of_snos:
-        query += "serialno=%d or " % sno
-    if query != '':
-        fields = 'serialno,sname,fname,dob, addr1,addr2,pcde,tel1,tel2,mobile'
-        query = "select %s from patients where %s order by sname,fname" % (
-            fields, query[:query.rindex("or")])
+    '''
+    this probably never actually gets called now, as it relates to a time when
+    "double appointments" were commonplace.
+    '''
+    format_snos = ",". join(('%s',) * len(list_of_snos))  # %s,%s,%s
+    conditional = "WHERE serialno in (%s) ORDER BY" % format_snos
+    query = ALL_PATIENTS_QUERY.replace("ORDER BY", conditional)
 
-        db = connect()
-        cursor = db.cursor()
-        cursor.execute(query)
-        results = cursor.fetchall()
-        cursor.close()
-        # db.close()
-        return results
-    else:
-        return()
+    db = connect()
+    cursor = db.cursor()
+    cursor.execute(query, list_of_snos)
+    results = cursor.fetchall()
+    cursor.close()
+    return results
 
 if __name__ == '__main__':
-    print getcandidates(datetime.date(1900, 1, 1), "", "", "smit", "", "", "", "")
-    # print getcandidates_from_serialnos((1,2,3,4))
+    values = (datetime.date(1969, 12, 9), "Gables", "772378",
+              "wallace", "", "neil", "", "IV2")
+    new_vals = getcandidates(*values)
+    for candidate in new_vals:
+        print candidate
+
+    snos = (1, 2, 3)
+    for candidate in getcandidates_from_serialnos(snos):
+        print candidate
diff --git a/src/openmolar/dbtools/treatment_course.py b/src/openmolar/dbtools/treatment_course.py
index 04b1ff6..0c7355e 100644
--- a/src/openmolar/dbtools/treatment_course.py
+++ b/src/openmolar/dbtools/treatment_course.py
@@ -22,39 +22,42 @@
 # #                                                                          # #
 # ############################################################################ #
 
-from copy import deepcopy
 import logging
-import re
 
 from openmolar import connect
 from openmolar.settings import localsettings
 
 LOGGER = logging.getLogger("openmolar")
 
-CURRTRT_NON_TOOTH_ATTS = ('xray', 'perio', 'anaes',
-                          'other', 'ndu', 'ndl', 'odu', 'odl', 'custom')
-
-CURRTRT_ROOT_ATTS = CURRTRT_NON_TOOTH_ATTS + (
-    'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1', 'ul1',
-    'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8', 'll8', 'll7', 'll6', 'll5',
-    'll4', 'll3', 'll2', 'll1', 'lr1', 'lr2', 'lr3', 'lr4', 'lr5', 'lr6', 'lr7',
-    'lr8')
-
-CURRTRT_ATTS = ('courseno', 'xraypl', 'periopl', 'anaespl', 'otherpl',
-                'ndupl', 'ndlpl', 'odupl', 'odlpl', "custompl",
-                'xraycmp', 'periocmp', 'anaescmp', 'othercmp', 'nducmp', 'ndlcmp',
-                'oducmp', 'odlcmp', "customcmp", 'ur8pl', 'ur7pl',
-                'ur6pl', 'ur5pl', 'ur4pl', 'ur3pl', 'ur2pl', 'ur1pl', 'ul1pl', 'ul2pl', 'ul3pl',
-                'ul4pl', 'ul5pl', 'ul6pl', 'ul7pl',
-                'ul8pl', 'll8pl', 'll7pl', 'll6pl', 'll5pl', 'll4pl', 'll3pl', 'll2pl', 'll1pl',
-                'lr1pl', 'lr2pl', 'lr3pl', 'lr4pl',
-                'lr5pl', 'lr6pl', 'lr7pl', 'lr8pl', 'ur8cmp', 'ur7cmp', 'ur6cmp', 'ur5cmp',
-                'ur4cmp', 'ur3cmp', 'ur2cmp', 'ur1cmp',
-                'ul1cmp', 'ul2cmp', 'ul3cmp', 'ul4cmp', 'ul5cmp', 'ul6cmp', 'ul7cmp', 'ul8cmp',
-                'll8cmp', 'll7cmp', 'll6cmp', 'll5cmp',
-                'll4cmp', 'll3cmp', 'll2cmp', 'll1cmp', 'lr1cmp', 'lr2cmp', 'lr3cmp', 'lr4cmp',
-                'lr5cmp', 'lr6cmp', 'lr7cmp', 'lr8cmp',
-                'examt', 'examd', 'accd', 'cmpd')
+CURRTRT_NON_TOOTH_ATTS = (
+    'xray', 'perio', 'anaes', 'other', 'ndu', 'ndl', 'odu', 'odl', 'custom')
+
+UPPERS = ('ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1',
+          'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8')
+
+LOWERS = ('lr8', 'lr7', 'lr6', 'lr5', 'lr4', 'lr3', 'lr2', 'lr1',
+          'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8')
+
+CURRTRT_ROOT_ATTS = CURRTRT_NON_TOOTH_ATTS + UPPERS + LOWERS
+
+CURRTRT_ATTS = (
+    'courseno', 'xraypl', 'periopl', 'anaespl', 'otherpl',
+    'ndupl', 'ndlpl', 'odupl', 'odlpl', "custompl", 'xraycmp',
+    'periocmp', 'anaescmp', 'othercmp', 'nducmp', 'ndlcmp',
+    'oducmp', 'odlcmp', "customcmp",
+    'ur8pl', 'ur7pl', 'ur6pl', 'ur5pl', 'ur4pl', 'ur3pl', 'ur2pl', 'ur1pl',
+    'ul1pl', 'ul2pl', 'ul3pl', 'ul4pl', 'ul5pl', 'ul6pl', 'ul7pl', 'ul8pl',
+    'll8pl', 'll7pl', 'll6pl', 'll5pl', 'll4pl', 'll3pl', 'll2pl', 'll1pl',
+    'lr1pl', 'lr2pl', 'lr3pl', 'lr4pl', 'lr5pl', 'lr6pl', 'lr7pl', 'lr8pl',
+    'ur8cmp', 'ur7cmp', 'ur6cmp', 'ur5cmp',
+    'ur4cmp', 'ur3cmp', 'ur2cmp', 'ur1cmp',
+    'ul1cmp', 'ul2cmp', 'ul3cmp', 'ul4cmp',
+    'ul5cmp', 'ul6cmp', 'ul7cmp', 'ul8cmp',
+    'll8cmp', 'll7cmp', 'll6cmp', 'll5cmp',
+    'll4cmp', 'll3cmp', 'll2cmp', 'll1cmp',
+    'lr1cmp', 'lr2cmp', 'lr3cmp', 'lr4cmp',
+    'lr5cmp', 'lr6cmp', 'lr7cmp', 'lr8cmp',
+    'examt', 'examd', 'accd', 'cmpd', 'ftr')
 
 QUERY = "SELECT "
 for field in CURRTRT_ATTS:
@@ -62,6 +65,61 @@ for field in CURRTRT_ATTS:
 QUERY = QUERY.rstrip(", ")
 QUERY += " from currtrtmt2 where serialno=%s and courseno=%s"
 
+MAX_COURSE_QUERY = "select max(courseno) from currtrtmt2 where serialno=%s"
+DATE_QUERY = "select accd, cmpd, examd from currtrtmt2 where courseno=%s"
+UPDATE_DATES_QUERY = "update currtrtmt2 set accd=%s, cmpd=%s where courseno=%s"
+
+UPDATE_CURRTTMT2_QUERY = (
+    'UPDATE currtrtmt2 SET %s WHERE serialno=%%s and courseno=%%s')
+
+DELETE_CURRTTMT2_QUERY = (
+    'DELETE from currtrtmt2 WHERE serialno=%s and courseno=%s')
+
+UPDATE_ESTS_COURSENO_QUERY = (
+    'UPDATE newestimates SET courseno=%s WHERE courseno=%s')
+
+
+def get_course_dates(courseno):
+    db = connect.connect()
+    cursor = db.cursor()
+    cursor.execute(DATE_QUERY, (courseno, ))
+    row = cursor.fetchone()
+    cursor.close()
+    return row
+
+
+def update_course_dates(accd, cmpd, courseno):
+    db = connect.connect()
+    cursor = db.cursor()
+    cursor.execute(UPDATE_DATES_QUERY, (accd, cmpd, courseno, ))
+    cursor.close()
+
+
+def update_estimate_courseno(courseno_orig, courseno_new):
+    db = connect.connect()
+    cursor = db.cursor()
+    cursor.execute(UPDATE_ESTS_COURSENO_QUERY, (courseno_new, courseno_orig))
+    cursor.close()
+
+
+def update_course(query_insert, values, serialno, courseno):
+    assert len(values) == query_insert.count("=")
+    query = UPDATE_CURRTTMT2_QUERY % query_insert
+    values.append(serialno)
+    values.append(courseno)
+    db = connect.connect()
+    cursor = db.cursor()
+    result = cursor.execute(query, values)
+    cursor.close()
+    return result
+
+
+def delete_course(serialno, courseno):
+    db = connect.connect()
+    cursor = db.cursor()
+    cursor.execute(DELETE_CURRTTMT2_QUERY % (serialno, courseno))
+    cursor.close()
+
 
 class TreatmentCourse(object):
 
@@ -158,14 +216,13 @@ class TreatmentCourse(object):
         self.examd = ''
         self.accd = None
         self.cmpd = None
+        self.ftr = None
 
+        # this next line gives me a way to create a Mock Instance of the class
         if self.courseno == 0:
             return
 
-        db = connect.connect()
-        cursor = db.cursor()
         self.getCurrtrt()
-        cursor.close()
 
     def __repr__(self):
         message = "TreatmentCourse for patient %s courseno %s\n" % (
@@ -206,26 +263,21 @@ class TreatmentCourse(object):
     def getCurrtrt(self):
         db = connect.connect()
         cursor = db.cursor()
-
         cursor.execute(QUERY, (self.serialno, self.courseno))
-
         for value in cursor.fetchall():
             for i, field in enumerate(CURRTRT_ATTS):
                 self.__dict__[field] = value[i]
-                # LOGGER.debug("getCurrtrt '%s' = '%s'"% (field, value[i]))
         cursor.close()
 
     @property
     def underTreatment(self):
-        return (not self.accd in ("", None) and self.cmpd in ("", None))
+        return not self.accd in ("", None) and self.cmpd in ("", None)
 
     @property
     def max_tx_courseno(self):
         db = connect.connect()
         cursor = db.cursor()
-        if cursor.execute(
-            "select max(courseno) from currtrtmt2 where serialno=%s",
-                (self.serialno,)):
+        if cursor.execute(MAX_COURSE_QUERY, (self.serialno,)):
             cno = cursor.fetchone()[0]
         else:
             cno = 0
@@ -254,6 +306,12 @@ class TreatmentCourse(object):
         '''
         self.cmpd = cmpd
 
+    def set_ftr(self, ftr):
+        '''
+        ftr = "Failed to Return"
+        '''
+        self.ftr = ftr
+
     @property
     def has_treatment_outstanding(self):
         for att in CURRTRT_ATTS:
@@ -356,26 +414,143 @@ class TreatmentCourse(object):
         '''
         return self.cmp_txs(att) + self.pl_txs(att)
 
+    @property
+    def course_duration(self):
+        if not self.cmpd:
+            return (_("still ongoing"))
+        else:
+            days = (self.cmpd - self.accd).days + 1
+            if days == 1:
+                return "1 %s" % _("day")
+            return "%s %s" % (days, _("days"))
+
+    def to_html(self, allow_edit=False, days_elapsed=None, completed_only=False):
+        def sorted_work(work):
+            items = work.split(" ")
+            return " ".join(sorted([item for item in items if item != ""]))
+
+        if allow_edit:
+            edit_str = '''<a href="edit_courseno?%s">%s</a><br />
+            <a href="edit_tx_courseno?%s">%s</a>
+            <!--merge-->''' % (
+                self.courseno, _("Edit Course Dates"),
+                self.courseno, _("Edit Treatments"))
+        else:
+            edit_str = ""
+
+        if days_elapsed is None:
+            days_str = ""
+        else:
+            days_str = " (%s %s)" % (days_elapsed, _("days earlier"))
+
+        html = '''
+        <h4>%s %s %s</h4>
+        <font color="red">%s</font>
+        <table width = "100%%" border = "1">
+        <tr>
+            <th width="20%%" colspan="1" bgcolor="#ffff99">%s</th>
+            <th width="20%%" colspan="1" bgcolor="#ffff99">
+                %s %s<br />%s %s
+            </th>
+            <th width="60%%" bgcolor="#ffff99">%s %s</th>
+        </tr>
+        ''' % (
+            _("Course Number"), self.courseno, days_str,
+            _("PATIENT FAILED TO RETURN") if self.ftr else "",
+            edit_str,
+            _("Opened"), localsettings.formatDate(self.accd),
+            _("Closed"), localsettings.formatDate(self.cmpd),
+            _("Duration"), self.course_duration,
+        )
+
+        attributes = ("cmp",) if completed_only else ("pl", "cmp")
+
+        #-plan row.
+        for planned in attributes:
+            rows = []
+
+            if planned == "pl":
+                bgcolor = ' bgcolor = "#eeeeee"'
+                header = "%s<br />%s" % (_("Planned"), _("or incomplete"))
+            else:
+                bgcolor = ' bgcolor = "#ddeeee"'
+                header = _("Completed")
+                if self.examt != "":
+                    exam_details = self.examt
+                    if self.examd:
+                        exam_details += " %s - %s" % (
+                            _("dated"),
+                            localsettings.formatDate(self.examd))
+                    cells = "<th%s>%s</th>\n<td>%s</td>\n" % (
+                        bgcolor, _("Exam"), exam_details)
+                    rows.append(cells)
+
+            for att, con_att in (
+                ("perio", _("perio")),
+                ("xray", _('xray')),
+                ("anaes", _('anaes')),
+                ("other", _('other')),
+                ("custom", _("custom")),
+                ('ndu', _("New Denture (upper)")),
+                ('ndl', _("New Denture (lower)")),
+                ('odu', _("Other Denture (upper)")),
+                ('odl', _("Other Denture (lower)")),
+            ):
+                work = self.__dict__[att + planned]
+                if work.strip(" ") != "":
+                    cells = "<th%s>%s</th>\n<td>%s</td>\n" % (
+                        bgcolor, con_att, sorted_work(work))
+                    rows.append(cells)
+
+            show_chart = False
+            row1, row2, row3, row4 = "<tr>", "<tr>", "<tr>", "<tr>"
+
+            for att in UPPERS:
+                work = self.__dict__[att + planned]
+                row1 += '<td>%s</td>\n' % sorted_work(work)
+                row2 += '<td align="center"%s>%s</td>\n' % (
+                    bgcolor, att.upper())
+                show_chart = show_chart or work.strip(" ") != ""
+
+            for att in LOWERS:
+                work = self.__dict__[att + planned]
+                row3 += '<td align="center"%s>%s</td>\n' % (
+                    bgcolor, att.upper())
+                row4 += '<td>%s</td>\n' % sorted_work(work)
+                show_chart = show_chart or work.strip(" ") != ""
+
+            if show_chart:
+                chart_cells = '''<td colspan="2">
+                    <table width = "100%%" border = "1">
+                    %s</tr>\n%s</tr>\n%s</tr>\n%s</tr>\n</table></td>
+                    ''' % (row1, row2, row3, row4)
+                rows.append(chart_cells)
+
+            row_span = len(rows)
+
+            if rows != []:
+                html += '<tr>\n<th rowspan = "%s"%s>%s</th>\n' % (
+                    row_span, bgcolor, header)
+            for row in rows:
+                if row == rows[0]:
+                    html += "%s</tr>\n" % row
+                else:
+                    html += "<tr>%s</tr>\n" % row
+
+        html += '</table>\n'
+        return html
+
 if __name__ == "__main__":
     '''
     testing stuff
     '''
-
-    TEST_SNO = 11956
-    db = connect.connect()
-    cursor = db.cursor()
-    cursor.execute("select courseno0 from patients where serialno = %s",
-                  (TEST_SNO,))
-    courseno = cursor.fetchone()[0]
-    cursor.close()
-
-    tc = TreatmentCourse(TEST_SNO, 0)
-    print tc
-    print tc.underTreatment
-
-    tc = TreatmentCourse(TEST_SNO, courseno)
+    tc = TreatmentCourse(14469, 45869)
     print tc
 
     print tc.non_tooth_plan_items
     print tc.non_tooth_cmp_items
     print tc.all_txs("ur5")
+
+    f = open("/home/neil/out.html", "w")
+    f.write(tc.to_html())
+    f.close()
diff --git a/src/openmolar/dbtools/writeNewPatient.py b/src/openmolar/dbtools/writeNewPatient.py
index 2820b14..cc2d981 100644
--- a/src/openmolar/dbtools/writeNewPatient.py
+++ b/src/openmolar/dbtools/writeNewPatient.py
@@ -37,9 +37,9 @@ def commit(pt):
             sqlcond += '%s = %%s,' % attr
             values.append(value)
 
-    sqlcommand = "insert into patients SET %s serialno=%%s" % sqlcond
+    sqlcommand = "insert into new_patients SET %s serialno=%%s" % sqlcond
 
-    query = "select max(serialno) from patients"
+    query = "select max(serialno) from new_patients"
 
     Attempts = 0
     while True:
@@ -64,7 +64,7 @@ def commit(pt):
             newSerialno = -1
 
         Attempts += 1
-        if Attemps > 20:
+        if Attempts > 20:
             break
     # db.close()
     return newSerialno
diff --git a/src/openmolar/firstRun.py b/src/openmolar/firstRun.py
deleted file mode 100755
index 75dbe13..0000000
--- a/src/openmolar/firstRun.py
+++ /dev/null
@@ -1,465 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-this module is only called if a settings file isn't found
-'''
-
-import sys
-import os
-import hashlib
-import base64
-import MySQLdb
-from PyQt4 import QtGui, QtCore
-from xml.dom import minidom
-
-from openmolar.qt4gui.compiled_uis.Ui_newSetup import Ui_MainWindow
-from openmolar.settings import localsettings
-
-blankXML = '''<?xml version="1.1" ?>
-<settings>
-<system_password> </system_password>
-<connection name="existing_database">
-    <version>1.1</version>
-    <server>
-        <location> </location>
-        <port> </port>
-    </server>
-    <database>
-        <dbname> </dbname>
-        <user> </user>
-    <password> </password>
-    </database>
-</connection>
-</settings>'''
-
-
-class NewSetupMainWindow(QtGui.QMainWindow, Ui_MainWindow):
-
-    '''
-    a new setup - creates and saves a config file
-    creates a database if required
-    loads a demo set of data.
-    '''
-    completed = False
-
-    def __init__(self, parent=None):
-        super(NewSetupMainWindow, self).__init__(parent)
-        self.setupUi(self)
-        self.stackedWidget.setCurrentIndex(0)
-        self.PASSWORD = ""
-        self.HOST = ""
-        self.PORT = 3306
-        self.DB = ""
-        self.MysqlPassword = ""
-        self.MysqlUser = ""
-        self.rootpass = ""
-        self.signals()
-        self.back_pushButton.hide()
-        self.groupBox.setEnabled(False)
-        self.specificLabel()
-
-    def specificLabel(self):
-        '''
-        offer customised advice depending on the OS
-        '''
-        if "win" in sys.platform:
-            advice = _("If you ever need to run this again, ")
-            advice += _("delete the openmolar.conf file in ")
-            advice += "C:\\Program Files\\openmolar\\"
-        else:
-            advice = _("If you ever need to run this wizard again, ") +\
-                "(" + _("Eg. if your server location changes, ") +\
-                _("or you require a new password") + ")"
-            advice += "<br>" + _("type") + " 'openmolar firstrun' "
-            advice += _("on the command line, or delete the file")
-            advice += "<br />" + "~/.openmolar/openmolar.conf" + "<br />" * 2
-            advice += _(
-                "For a more secure setup, you should move this file to")
-            advice += "/etc/openmolar/openmolar.conf"
-
-        self.sysAdvice_label.setText(advice)
-
-    def signals(self):
-        self.connect(self.go_pushButton, QtCore.SIGNAL("clicked()"), self.next)
-
-        self.connect(self.back_pushButton,
-                     QtCore.SIGNAL("clicked()"), self.back)
-
-        self.connect(self.rootPassword_checkBox, QtCore.SIGNAL(
-                     "stateChanged(int)"), self.rootechomode)
-
-        self.connect(self.mainpassword_checkBox, QtCore.SIGNAL(
-                     "stateChanged(int)"), self.echomode)
-
-        self.connect(self.dbpassword_checkBox, QtCore.SIGNAL(
-                     "stateChanged(int)"), self.dbechomode)
-
-        self.connect(self.existingDB_radioButton, QtCore.SIGNAL(
-                     "toggled(bool)"), self.demo_or_existing)
-
-        self.connect(self.testDB_pushButton,
-                     QtCore.SIGNAL("clicked()"), self.testConnection)
-
-        self.connect(self.stackedWidget,
-                     QtCore.SIGNAL("currentChanged (int)"), self.title_label_update)
-
-        for le in (self.rootPassword_lineEdit,
-                   self.user_lineEdit,
-                   self.password_lineEdit,
-                   self.main_password_lineEdit,
-                   self.repeat_password_lineEdit,
-                   self.host_lineEdit,
-                   self.port_lineEdit):
-            self.connect(le,
-                         QtCore.SIGNAL("returnPressed()"), self.next)
-
-    def advise(self, message, warning=False):
-        '''
-        throws up a message box
-        '''
-        if warning:
-            QtGui.QMessageBox.warning(self, _("Error"), message)
-        else:
-            QtGui.QMessageBox.information(self, _("Advisory"),
-                                          message)
-
-    def next(self):
-        '''
-        time to move on to the next screen
-        assuming all is well
-        '''
-        i = self.stackedWidget.currentIndex()
-
-        if i == 0:  # welcome screen
-            self.stackedWidget.setCurrentIndex(1)
-            self.main_password_lineEdit.setFocus()
-            self.back_pushButton.show()
-
-        elif i == 1:  # system password
-            p1 = self.main_password_lineEdit.text()
-            p2 = self.repeat_password_lineEdit.text()
-            if p1 == "":
-                self.advise(_("Password must not be blank!"))
-            elif p1 != p2:
-                self.advise(_("Passwords don't match!"))
-            else:
-                self.PASSWORD = self.main_password_lineEdit.text()
-                self.stackedWidget.setCurrentIndex(2)
-
-        elif i == 2:  # server_location
-            self.stackedWidget.setCurrentIndex(3)
-
-        elif i == 3:  # choose database
-            if self.createDemo_radioButton.isChecked():
-                self.stackedWidget.setCurrentIndex(4)
-                self.rootPassword_lineEdit.setFocus()
-            else:
-                self.stackedWidget.setCurrentIndex(6)
-                self.go_pushButton.setFocus()
-
-        elif i == 6:
-            self.completed = self.finish()
-            QtGui.QApplication.instance().closeAllWindows()
-
-        elif i == 4:
-            self.snapshot()
-            result = QtGui.QMessageBox.question(self,
-                                                _("Create Database"),
-                                                _("Create Demo Database now with the following settings?") +
-                                                '''<br><ul><li>host - %s </li><li>port - %s</li>
-            <li>database name - %s</li>
-            <li>username - %s</li><li>password - (hidden)</li>''' % (
-                self.HOST, self.PORT, self.DB, self.MysqlUser),
-                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                QtGui.QMessageBox.Yes)
-
-            if result == QtGui.QMessageBox.Yes:
-                self.stackedWidget.setCurrentIndex(5)
-                if self.createDemoDatabase():
-                    self.advise(_("Database Created Sucessfully"))
-                    self.stackedWidget.setCurrentIndex(6)
-                    self.testDB_pushButton.setEnabled(True)
-                    return
-            else:
-                self.stackedWidget.setCurrentIndex(3)
-                return
-
-            self.advise(_("Database NOT Created"))
-            self.stackedWidget.setCurrentIndex(4)
-
-    def back(self):
-        '''
-        time to move on to the next screen
-        assuming all is well
-        '''
-        i = self.stackedWidget.currentIndex()
-
-        if i == 1:
-            self.back_pushButton.hide()
-        elif i == 5:
-            i -= 1
-        self.stackedWidget.setCurrentIndex(i - 1)
-
-    def title_label_update(self, i):
-        '''
-        updates the header label when the stacked widget changes
-        '''
-        message = (
-            _("Welcome to the openMolar settings wizard."),
-            _("Set the application Password"),
-            _("Server Location"),
-            _("Database Settings"),
-            _("Save settings and exit"),
-            _("Create a demo database"),
-            _("Creating Database"))[i]
-
-        self.title_label.setText(message)
-
-    def snapshot(self):
-        '''
-        grab the current settings
-        '''
-        if self.createDemo_radioButton.isChecked():
-            self.DB = "openmolar_demo"
-        else:
-            self.DB = unicode(self.database_lineEdit.text())
-        self.HOST = unicode(self.host_lineEdit.text())
-        self.PORT = int(self.port_lineEdit.text())
-        self.MysqlUser = unicode(self.user_lineEdit.text())
-        self.MysqlPassword = unicode(self.password_lineEdit.text())
-        self.rootpass = unicode(self.rootPassword_lineEdit.text())
-
-    def demo_or_existing(self, checked):
-        '''
-        user is choosing between demo or existing db
-        '''
-
-        self.groupBox.setEnabled(checked)
-
-        if checked:
-            self.database_lineEdit.setFocus()
-            self.database_lineEdit.selectAll()
-
-    def testConnection(self):
-        '''
-        tries to connect to a mysql database with the settings
-        '''
-        self.snapshot()
-        result = False
-        try:
-
-            print "attempting to connect to mysql server on %s port %s..." % (
-                self.HOST, self.PORT)
-            db = MySQLdb.connect(host=self.HOST,
-                                 port=self.PORT, db=self.DB,
-                                 passwd=self.MysqlPassword, user=self.MysqlUser)
-
-            result = db.open
-            db.close()
-
-        except Exception as e:
-            print e
-            self.advise(_("The connection attempt threw an exception")
-                        + "<hr>%s" % e, True)
-            return
-
-        if result:
-            QtGui.QMessageBox.information(None,
-                                          _("Success!"),
-                                          _("The %s database accepted the connection.") % self.DB)
-
-        else:
-            self.advise(_('''The connection attempt failed,
-please recheck your settings'''), True)
-            print "Connection failed!"
-
-    def createDemoDatabase(self):
-        self.progressBar.setValue(0)
-        self.snapshot()
-        PB_LIMIT = 50
-
-        def updatePB():
-            val = self.progressBar.value()
-            if val < PB_LIMIT:
-                self.progressBar.setValue(val + 5)
-                self.progressBar.update()
-
-        self.timer1 = QtCore.QTimer()
-        self.timer1.start(10)  # 1/100thsecond
-        self.connect(self.timer1, QtCore.SIGNAL("timeout()"),
-                     updatePB)
-
-        try:
-            from openmolar import createdemodatabase
-            self.progressBar.setValue(10)
-            if createdemodatabase.create_database(self.HOST, self.PORT,
-                                                  self.MysqlUser, self.MysqlPassword, self.DB, self.rootpass):
-                print 'New database created sucessfully.'
-            else:
-                print "error creating database"
-                raise IOError("error creating database")
-            self.progressBar.setValue(50)
-            PB_LIMIT = 90
-            print 'attempting to loadtables....',
-            if createdemodatabase.loadTables(self.HOST, self.PORT,
-                                             self.MysqlUser, self.MysqlPassword, self.DB):
-                print "successfully loaded tables"
-            else:
-                print "error loading tables"
-                raise IOError("error loading tables")
-            self.progressBar.setValue(100)
-
-            return True
-
-        except Exception as e:
-            print "error in creatDemoDB", e
-            self.advise(_("Error Creating Database") + "<hr>%s" % e, 2)
-
-    def echomode(self, arg):
-        '''
-        toggle the echo mode of the password input boxes
-        '''
-        if arg == 0:
-            self.main_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-            self.repeat_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        else:
-            self.main_password_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
-            self.repeat_password_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
-
-    def rootechomode(self, arg):
-        if arg == 0:
-            self.rootPassword_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        else:
-            self.rootPassword_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
-
-    def dbechomode(self, arg):
-        if arg == 0:
-            self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        else:
-            self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
-
-    def finish(self):
-        self.snapshot()
-        result = False
-        try:
-            dom = minidom.parseString(blankXML)
-            #-- hash the password and save it
-            PSWORD = hashlib.md5(hashlib.sha1(
-                                 str("diqug_ADD_SALT_3i2some" + self.PASSWORD)).hexdigest()
-                                 ).hexdigest()
-
-            dom.getElementsByTagName(
-                "system_password")[0].firstChild.replaceWholeText(PSWORD)
-
-            #-- server settings
-            xmlnode = dom.getElementsByTagName("server")[0]
-            #--save the location
-            xmlnode.getElementsByTagName(
-                "location")[0].firstChild.replaceWholeText(self.HOST)
-
-            #--port
-            xmlnode.getElementsByTagName(
-                "port")[0].firstChild.replaceWholeText(str(self.PORT))
-
-            #-- database settings
-            xmlnode = dom.getElementsByTagName("database")[0]
-
-            #--user
-            xmlnode.getElementsByTagName(
-                "user")[0].firstChild.replaceWholeText(self.MysqlUser)
-
-            xmlnode.getElementsByTagName(
-                "password")[0].firstChild.replaceWholeText(
-                base64.b64encode(self.MysqlPassword))
-
-            xmlnode.getElementsByTagName(
-                "dbname")[0].firstChild.replaceWholeText(self.DB)
-
-            settingsDir = os.path.dirname(localsettings.global_cflocation)
-
-            sucessful_save = False
-
-            try:
-                if not os.path.exists(settingsDir):
-                    print 'putting a global settings file in', settingsDir,
-                    os.mkdir(settingsDir)
-                    print '...ok'
-                print 'writing settings to', localsettings.global_cflocation,
-                f = open(localsettings.global_cflocation, "w")
-                f.write(dom.toxml())
-                f.close()
-                print '...ok'
-                localsettings.cflocation = localsettings.global_cflocation
-                sucessful_save = True
-            except OSError:
-                pass
-            except IOError:
-                pass
-
-            if not sucessful_save:
-                print 'unable to write to %s...' % settingsDir,
-                print ' we need root privileges for that'
-
-                print "will resort to putting settings into a local file",
-                print localsettings.cflocation
-
-                settingsDir = os.path.dirname(localsettings.cflocation)
-
-                if not os.path.exists(settingsDir):
-                    os.mkdir(settingsDir)
-
-                print 'putting a local settings file in', settingsDir,
-
-                f = open(localsettings.cflocation, "w")
-                f.write(dom.toxml())
-                f.close()
-                print '...ok'
-                localsettings.cflocation = localsettings.cflocation
-
-            if self.DB == "openmolar_demo":
-                f = open(localsettings.LOGIN_CONF, "w")
-                f.write("[login]\nPASSWORD=%s\nUSER1=NW" % self.PASSWORD)
-                f.close()
-
-            return True
-
-        except Exception as e:
-            print "error saving settings", e
-            QtGui.QMessageBox.warning(self, _("FAILURE"), str(e))
-
-        return False
-
-
-def run():
-    app = QtGui.QApplication.instance()
-    if not app:
-        app = QtGui.QApplication(sys.argv)
-    mw = NewSetupMainWindow()
-    mw.show()
-    app.exec_()
-    return mw.completed
-
-if __name__ == "__main__":
-    print run()
diff --git a/src/openmolar/html/images/thumbs/Screenshot-Patient Finder.png b/src/openmolar/html/images/thumbs/Screenshot-Patient Finder.png
deleted file mode 100644
index cccc568..0000000
Binary files a/src/openmolar/html/images/thumbs/Screenshot-Patient Finder.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/Screenshot.png b/src/openmolar/html/images/thumbs/Screenshot.png
deleted file mode 100644
index b2ab494..0000000
Binary files a/src/openmolar/html/images/thumbs/Screenshot.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/altered_db.png b/src/openmolar/html/images/thumbs/altered_db.png
deleted file mode 100644
index b984cfb..0000000
Binary files a/src/openmolar/html/images/thumbs/altered_db.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/appointment_diff_dent.png b/src/openmolar/html/images/thumbs/appointment_diff_dent.png
deleted file mode 100644
index acd5604..0000000
Binary files a/src/openmolar/html/images/thumbs/appointment_diff_dent.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/appt_ov.png b/src/openmolar/html/images/thumbs/appt_ov.png
deleted file mode 100644
index ec08794..0000000
Binary files a/src/openmolar/html/images/thumbs/appt_ov.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/appts.png b/src/openmolar/html/images/thumbs/appts.png
deleted file mode 100644
index fe55db6..0000000
Binary files a/src/openmolar/html/images/thumbs/appts.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/complete_tooth_treatment.png b/src/openmolar/html/images/thumbs/complete_tooth_treatment.png
deleted file mode 100644
index a26b63e..0000000
Binary files a/src/openmolar/html/images/thumbs/complete_tooth_treatment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/complete_treatment.png b/src/openmolar/html/images/thumbs/complete_treatment.png
deleted file mode 100644
index 467fd37..0000000
Binary files a/src/openmolar/html/images/thumbs/complete_treatment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/confirm_appt.png b/src/openmolar/html/images/thumbs/confirm_appt.png
deleted file mode 100644
index 5665e5b..0000000
Binary files a/src/openmolar/html/images/thumbs/confirm_appt.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/cpitn.png b/src/openmolar/html/images/thumbs/cpitn.png
deleted file mode 100644
index 84d9593..0000000
Binary files a/src/openmolar/html/images/thumbs/cpitn.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/crown_choice.png b/src/openmolar/html/images/thumbs/crown_choice.png
deleted file mode 100644
index cdcbc79..0000000
Binary files a/src/openmolar/html/images/thumbs/crown_choice.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/dayllis_printing_wiizard.png b/src/openmolar/html/images/thumbs/dayllis_printing_wiizard.png
deleted file mode 100644
index 2b547c2..0000000
Binary files a/src/openmolar/html/images/thumbs/dayllis_printing_wiizard.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/edit_patient_details.png b/src/openmolar/html/images/thumbs/edit_patient_details.png
deleted file mode 100644
index 539fd43..0000000
Binary files a/src/openmolar/html/images/thumbs/edit_patient_details.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/enter_appointment.png b/src/openmolar/html/images/thumbs/enter_appointment.png
deleted file mode 100644
index 6dfd95e..0000000
Binary files a/src/openmolar/html/images/thumbs/enter_appointment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/estimates_plan.png b/src/openmolar/html/images/thumbs/estimates_plan.png
deleted file mode 100644
index 145ba06..0000000
Binary files a/src/openmolar/html/images/thumbs/estimates_plan.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/exam_wizard.png b/src/openmolar/html/images/thumbs/exam_wizard.png
deleted file mode 100644
index 4522752..0000000
Binary files a/src/openmolar/html/images/thumbs/exam_wizard.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/exit_record.png b/src/openmolar/html/images/thumbs/exit_record.png
deleted file mode 100644
index 00d92b3..0000000
Binary files a/src/openmolar/html/images/thumbs/exit_record.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/feescales.png b/src/openmolar/html/images/thumbs/feescales.png
deleted file mode 100644
index 1623890..0000000
Binary files a/src/openmolar/html/images/thumbs/feescales.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/find.png b/src/openmolar/html/images/thumbs/find.png
deleted file mode 100644
index 47807d6..0000000
Binary files a/src/openmolar/html/images/thumbs/find.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/hygenist_wizard.png b/src/openmolar/html/images/thumbs/hygenist_wizard.png
deleted file mode 100644
index cfeb1aa..0000000
Binary files a/src/openmolar/html/images/thumbs/hygenist_wizard.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/letter_review.png b/src/openmolar/html/images/thumbs/letter_review.png
deleted file mode 100644
index 1bee725..0000000
Binary files a/src/openmolar/html/images/thumbs/letter_review.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/letter_text_entry.png b/src/openmolar/html/images/thumbs/letter_text_entry.png
deleted file mode 100644
index 67feecd..0000000
Binary files a/src/openmolar/html/images/thumbs/letter_text_entry.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/make_appointment.png b/src/openmolar/html/images/thumbs/make_appointment.png
deleted file mode 100644
index 52424be..0000000
Binary files a/src/openmolar/html/images/thumbs/make_appointment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/make_appointment_any.png b/src/openmolar/html/images/thumbs/make_appointment_any.png
deleted file mode 100644
index 8a8fb53..0000000
Binary files a/src/openmolar/html/images/thumbs/make_appointment_any.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/newPt.png b/src/openmolar/html/images/thumbs/newPt.png
deleted file mode 100644
index 973fc52..0000000
Binary files a/src/openmolar/html/images/thumbs/newPt.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/newlogo.png b/src/openmolar/html/images/thumbs/newlogo.png
deleted file mode 100644
index b5e599b..0000000
Binary files a/src/openmolar/html/images/thumbs/newlogo.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/notes.png b/src/openmolar/html/images/thumbs/notes.png
deleted file mode 100644
index 866ee4c..0000000
Binary files a/src/openmolar/html/images/thumbs/notes.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/perio_charts.png b/src/openmolar/html/images/thumbs/perio_charts.png
deleted file mode 100644
index 4d06324..0000000
Binary files a/src/openmolar/html/images/thumbs/perio_charts.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/place_appointment.png b/src/openmolar/html/images/thumbs/place_appointment.png
deleted file mode 100644
index e4b31ee..0000000
Binary files a/src/openmolar/html/images/thumbs/place_appointment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/plan_treament.png b/src/openmolar/html/images/thumbs/plan_treament.png
deleted file mode 100644
index 2aad110..0000000
Binary files a/src/openmolar/html/images/thumbs/plan_treament.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/plan_treatment.png b/src/openmolar/html/images/thumbs/plan_treatment.png
deleted file mode 100644
index 5eae4b0..0000000
Binary files a/src/openmolar/html/images/thumbs/plan_treatment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/reception.png b/src/openmolar/html/images/thumbs/reception.png
deleted file mode 100644
index 7f73c2a..0000000
Binary files a/src/openmolar/html/images/thumbs/reception.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/reception_welcome_screen.png b/src/openmolar/html/images/thumbs/reception_welcome_screen.png
deleted file mode 100644
index 481bf29..0000000
Binary files a/src/openmolar/html/images/thumbs/reception_welcome_screen.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/startscreen.png b/src/openmolar/html/images/thumbs/startscreen.png
deleted file mode 100644
index e5aaca8..0000000
Binary files a/src/openmolar/html/images/thumbs/startscreen.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/surgery_welcome.png b/src/openmolar/html/images/thumbs/surgery_welcome.png
deleted file mode 100644
index 9520abf..0000000
Binary files a/src/openmolar/html/images/thumbs/surgery_welcome.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/toothplan_screen.png b/src/openmolar/html/images/thumbs/toothplan_screen.png
deleted file mode 100644
index 617d4d5..0000000
Binary files a/src/openmolar/html/images/thumbs/toothplan_screen.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/treatment_plan_page.png b/src/openmolar/html/images/thumbs/treatment_plan_page.png
deleted file mode 100644
index 2eb97e8..0000000
Binary files a/src/openmolar/html/images/thumbs/treatment_plan_page.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/whats_changed.png b/src/openmolar/html/images/thumbs/whats_changed.png
deleted file mode 100644
index e763bfa..0000000
Binary files a/src/openmolar/html/images/thumbs/whats_changed.png and /dev/null differ
diff --git a/src/openmolar/locale/messages.pot b/src/openmolar/locale/messages.pot
index b132649..4546293 100644
--- a/src/openmolar/locale/messages.pot
+++ b/src/openmolar/locale/messages.pot
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2014-04-22 14:21+BST\n"
+"POT-Creation-Date: 2014-06-25 21:35+BST\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -15,52 +15,155 @@ msgstr ""
 "Generated-By: pygettext.py 1.5\n"
 
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/appointments.py:1040
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:225
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:226
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:227
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/block_wizard.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/backports/advisor.py:264
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:335
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1319
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:199
+msgid "Advisory"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/backports/advisor.py:267
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:488
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/newCourse.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:231
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:338
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:202
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:207
+msgid "Error"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/appointments.py:1015
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:229
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:230
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:231
 msgid "emergency"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:83
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3318
-msgid "Exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:71
+msgid "Past Courses of Treatment"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:87
-msgid "perio"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/estimatesHistory.py:100
+msgid "found"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:88
-msgid "xray"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:101
+msgid "no estimate found for courseno"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:89
-msgid "anaes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:109
+msgid "Warning - No course acceptance date"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:90
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:627
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:641
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:204
-msgid "other"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:115
+msgid "Warning - No course completion date, using today to gather daybook items."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:91
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:628
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:642
-msgid "custom"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybookHistory.py:72
+msgid "Edit Tx"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:155
+msgid "Course is Ongoing"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:145
+msgid "Course closed"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:161
+msgid "days after last treatment"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:165
+msgid "Course dates not found in daybook"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:179
+msgid "Examine these Issues."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:187
+msgid "Merge with following course"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:196
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:235
+msgid "WARNING"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:209
+msgid "ORPHANED ESTIMATE DATA"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:218
+msgid "Errors Found"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:105
-msgid "Denture Work"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:226
+msgid "This shouldn't happen!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:85
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:137
 msgid "Error - unrecognised practioner- sorry"
 msgstr ""
 
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:146
+msgid "Patients of"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:146
+msgid "between"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:146
+msgid "treated by"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:147
+msgid "and"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybookHistory.py:90
+msgid "Ests"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:324
+msgid "Daybook Items during this Period"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:353
+msgid "Filter your results"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:354
+msgid "If this text box is left blank, then results from the daybook are returned dependent on the dates and clinicians entered."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:356
+msgid "You can filter using the following fields."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:366
+msgid "Examples"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/db_settings.py:245
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:86
+msgid "Example Dental Practice"
+msgstr ""
+
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:107
 msgid "No estimate history found for course"
 msgstr ""
@@ -70,8 +173,8 @@ msgid "Current Estimate Version History"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:119
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3359
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3370
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3336
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3347
 msgid "Estimate"
 msgstr ""
 
@@ -90,37 +193,52 @@ msgid "Itemcode"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:128
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:67
 msgid "No."
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:128
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:109
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:177
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:988
 msgid "Description"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:129
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:32
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:31
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:35
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:102
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:565
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3410
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:63
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:70
 msgid "Dentist"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:129
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:92
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:70
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:128
 msgid "Fee"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:129
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:128
 msgid "Charge"
 msgstr ""
 
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/estimatesHistory.py:46
+msgid "Edit this Estimate"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/estimatesHistory.py:98
+msgid "Past Estimates"
+msgstr ""
+
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:29
 msgid "Subject"
 msgstr ""
@@ -137,8 +255,8 @@ msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:30
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:143
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:31
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:30
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:69
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:79
 msgid "Date"
 msgstr ""
@@ -169,89 +287,89 @@ msgid "Deleted?"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:169
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:163
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:283
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:195
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:205
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:212
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:227
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:256
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:262
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:287
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:294
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:300
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:324
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:353
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:364
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:375
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:382
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:389
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:396
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:402
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:426
-msgid "Yes"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:169
 #: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:167
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:284
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:286
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:196
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:206
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:214
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:213
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:228
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:257
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:269
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:263
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:288
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:295
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:307
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:331
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:325
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:354
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:365
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:376
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:383
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:390
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:397
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:409
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:403
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:427
+msgid "Yes"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:287
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:207
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:215
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:235
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:258
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:270
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:289
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:296
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:308
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:332
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:355
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:366
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:377
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:384
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:391
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:398
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:410
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:428
 msgid "No"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/patient_class.py:772
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/patient_class.py:749
 msgid "Student Exemption removed"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:33
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:32
 msgid "Patient"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:34
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:33
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:68
 msgid "Code"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:35
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:34
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:205
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:98
 msgid "Cash"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:35
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:207
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:99
 msgid "Cheque"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:37
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:36
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:100
 msgid "Card"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:37
 msgid "Unknown"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:39
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:72
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:80
 msgid "Amount"
 msgstr ""
@@ -265,19 +383,21 @@ msgid "Serial No"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3207
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3184
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:118
 msgid "Title"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3185
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:120
 msgid "Surname"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3221
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3198
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:174
 msgid "First Name"
 msgstr ""
@@ -287,15 +407,16 @@ msgid "Age"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:34
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:535
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3200
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3177
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:49
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:124
 msgid "Town"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:34
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:111
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:144
 msgid "Address"
 msgstr ""
 
@@ -312,255 +433,245 @@ msgid "Recall Date"
 msgstr ""
 
 #: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:35
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:536
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3179
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:50
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
 msgid "County"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:88
-msgid "If you ever need to run this again, "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:89
-msgid "delete the openmolar.conf file in "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:92
-msgid "If you ever need to run this wizard again, "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:93
-msgid "Eg. if your server location changes, "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:94
-msgid "or you require a new password"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:95
-msgid "type"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:96
-msgid "on the command line, or delete the file"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:161
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:187
+msgid "Telephone"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:98
-msgid "For a more secure setup, you should move this file to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:165
+msgid "home"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:143
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:150
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:125
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/newCourse.py:72
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:217
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:338
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:215
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:202
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:55
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:168
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:207
-msgid "Error"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:165
+msgid "mobile "
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:145
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:115
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:213
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:335
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:212
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1225
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:199
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:52
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:165
-msgid "Advisory"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:165
+msgid "work "
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:164
-msgid "Password must not be blank!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:176
+msgid "D.O.B."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:166
-msgid "Passwords don't match!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:182
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:47
+msgid "Yours Sincerely"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:189
-msgid "Create Database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:420
+msgid "still ongoing"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:190
-msgid "Create Demo Database now with the following settings?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:424
+msgid "day"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:201
-msgid "Database Created Sucessfully"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:425
+msgid "days"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:209
-msgid "Database NOT Created"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:436
+msgid "Edit Course Dates"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:230
-msgid "Welcome to the openMolar settings wizard."
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:437
+msgid "Edit Treatments"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:231
-msgid "Set the application Password"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:444
+msgid "days earlier"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:232
-msgid "Server Location"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:458
+msgid "Course Number"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:233
-msgid "Database Settings"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:459
+msgid "PATIENT FAILED TO RETURN"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:234
-msgid "Save settings and exit"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:461
+msgid "Opened"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:235
-msgid "Create a demo database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:462
+msgid "Closed"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:236
-msgid "Creating Database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:463
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:109
+msgid "Duration"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:284
-msgid "The connection attempt threw an exception"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:474
+msgid "or incomplete"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:290
-msgid "Success!"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:474
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:57
+msgid "Planned"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:291
-msgid "The %s database accepted the connection."
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:477
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3323
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:59
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1171
+msgid "Completed"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:294
-msgid ""
-"The connection attempt failed,\n"
-"please recheck your settings"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:482
+msgid "dated"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:338
-msgid "Error Creating Database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:485
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3295
+msgid "Exam"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:450
-msgid "FAILURE"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:489
+msgid "perio"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:84
-msgid "Update Client"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:490
+msgid "xray"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:85
-msgid ""
-"<p>Sorry, you cannot run this version of the openMolar client\n"
-"because your database schema is more advanced.</p>\n"
-"<p>this client requires schema version %s, but your database is at %s</p>\n"
-"<p>Please Update openMolar now</p>"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:491
+msgid "anaes"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:92
-msgid "Proceed without upgrade?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:492
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:627
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:641
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:204
+msgid "other"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:93
-msgid ""
-"<p>This openMolar client has fallen behind your database\n"
-"schema version<br />this client was written for schema version %s,\n"
-"but your database is now at %s<br />However, the differences are not critical,\n"
-"and you can continue if you wish</p>\n"
-"<p><i>It would still be wise to update this client ASAP</i></p>\n"
-"<hr /><p>Do you wish to continue?</p>"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:493
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:628
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:642
+msgid "custom"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:140
-msgid "This is not the default database - are you sure?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:494
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:60
+msgid "New Denture (upper)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:143
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:418
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:637
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:694
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:708
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:366
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:176
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:178
-msgid "confirm"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:495
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:61
+msgid "New Denture (lower)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:157
-msgid "DEFAULT"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:496
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:62
+msgid "Other Denture (upper)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:159
-msgid "Chosen server"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:497
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:63
+msgid "Other Denture (lower)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:176
-msgid "This appears to be your first running of OpenMolar."
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:75
+msgid "command line options are as follows"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:177
-msgid "We need to generate a settings file."
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:76
+msgid "quiet (minimal logging to console)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:178
-msgid "Are you ready to proceed?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:77
+msgid "verbose logging to console (for debugging)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:181
-msgid "First Run"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:78
+msgid "show this text"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:211
-msgid "Unable to Run OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:79
+msgid "offer the firstrun config and demodatabase generation"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:212
-msgid "Good Bye!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:80
+msgid "proceed even if client and database versions clash (NOT ADVISABLE!)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:301
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:315
-msgid "Login Error"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:81
+msgid "show the versioning and exit"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:303
-msgid "Incorrect"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:82
+msgid "Ignore dev login (advanced)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:304
-msgid "User/password combination!"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:141
+msgid "Course is still active"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:305
-msgid "Please Try Again."
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:147
+msgid "days after last day treatment"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:311
-msgid "UNEXPECTED ERROR"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:149
+msgid "Course doesn't tally with daybook entries"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:312
-msgid "application cannot run"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:152
+msgid "No warnings"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:160
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:164
 msgid "no treatments"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:169
 msgid "Partially"
 msgstr ""
 
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:199
+msgid "Estimates for Course Number"
+msgstr ""
+
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:165
 msgid "Course Activity"
@@ -568,17 +679,17 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:236
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3244
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3250
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3257
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3265
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3221
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3242
 msgid "Edit"
 msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:254
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:556
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:570
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:596
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:610
 msgid "Today"
 msgstr ""
 
@@ -598,274 +709,282 @@ msgid "Todays notes for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:144
-msgid "DO NOT RECALL"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:46
+msgid "TODAY!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:133
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1360
-msgid "Previous Course"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:53
+msgid "year"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:135
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:199
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:202
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:205
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:122
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:529
-msgid "Start"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:53
+msgid "years"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:138
-msgid "End"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:56
+msgid "month"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:144
-msgid "PLAN"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:56
+msgid "months"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:150
-msgid "COMPLETED"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:76
+msgid "!UNKNOWN POSTCODE!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:155
-msgid "No treatment"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:94
+msgid "exemption"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:41
-msgid "Available Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:96
+msgid "NOT EXEMPT"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:42
-msgid "Available Dentists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:107
+msgid "UNKNOWN COURSETYPE"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:43
-msgid "Available Hygenists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:115
+msgid "Please Set a Dentist for this patient!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:44
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:102
-msgid "All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:124
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3178
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:64
+msgid "Memo"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:222
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:223
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:201
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:170
-msgid "Lunch"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:121
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3356
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:91
+msgid "Treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:224
-msgid "staff meeting"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:122
+msgid "IO xrays"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:228
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:169
-msgid "Out of Office"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:123
+msgid "Panoral"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
-msgid "Unscheduled"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:124
+msgid "Scaling"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
-msgid "View Past Appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3376
+msgid "History"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
-msgid "Date & Time"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:148
+msgid "Recall"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
-msgid "Practitioner"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:152
+msgid "(exam booked)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:179
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:146
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:188
-msgid "Length"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:157
+msgid "DO NOT RECALL"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:38
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:124
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3201
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:64
-msgid "Memo"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:159
+msgid "NOT SAVED"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:38
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:91
-msgid "Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:163
+msgid "Account"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:143
-msgid "you need to be in the static chart to change tooth state"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:166
+msgid "in credit"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:253
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3313
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3374
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:116
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:681
-msgid "BPE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:168
+msgid "UNDER TREATMENT"
 msgstr ""
 
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:266
-msgid "NO CHARTS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1454
+msgid "Previous Course"
 msgstr ""
 
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:57
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:55
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:603
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:51
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:197
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:154
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:151
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:225
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:51
-msgid "Form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:122
+msgid "Start"
 msgstr ""
 
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:58
-msgid "CheckBox"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:141
+msgid "End"
 msgstr ""
 
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:71
-msgid "Plan Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:144
+msgid "ONGOING"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:147
+msgid "Patient Failed to Return"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:154
+msgid "PLAN"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:160
+msgid "COMPLETED"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:165
+msgid "No treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:73
-msgid "Add the following Treatment Items to the Current Treatment Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:41
+msgid "Available Clinicians"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:78
-msgid "Select Appointment Length"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:42
+msgid "Available Dentists"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:79
-msgid "Hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:43
+msgid "Available Hygenists"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:80
-msgid "Minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:102
+msgid "All"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:193
-msgid "Open a Day"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:226
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:170
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:39
+msgid "Lunch"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:194
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:121
-msgid "Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:228
+msgid "staff meeting"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:195
-msgid "Date to Open"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:169
+msgid "Out of Office"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:196
-msgid "Day Memo - optional"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
+msgid "Unscheduled"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:197
-msgid "Day Start"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
+msgid "View Past Appointments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:198
-msgid "Morning Emergency Slot"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
+msgid "Date & Time"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:200
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:203
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:206
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:123
-msgid "Finish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
+msgid "Practitioner"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:204
-msgid "Afternoon Emergency Slot "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:179
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:188
+msgid "Length"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:207
-msgid "Day Finish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:145
+msgid "you need to be in the static chart to change tooth state"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:76
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3543
-msgid "Appointment Tools"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:238
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3290
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:116
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:745
+msgid "BPE"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:78
-msgid "Move the end date for making appointments."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:57
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:55
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:603
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:225
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:51
+msgid "Form"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:79
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:84
-msgid "Extend Books"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:58
+msgid "CheckBox"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:80
-msgid "Remove old weeks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:71
+msgid "Plan Treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:82
-msgid "Edit Standard Working Weeks for Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:73
+msgid "Add the following Treatment Items to the Current Treatment Plan"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:83
-msgid "Open A Day"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:78
+msgid "Select Appointment Length"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:84
-msgid "Insert regular blocks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:79
+msgid "Hours"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:85
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3540
-msgid "&Quit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:80
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:99
+msgid "Minutes"
 msgstr ""
 
 #:
@@ -881,15 +1000,12 @@ msgstr ""
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:56
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:605
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3465
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3479
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:52
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:366
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3436
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3450
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:65
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:155
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:157
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:159
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:172
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:52
 msgid "TextLabel"
 msgstr ""
@@ -905,6 +1021,16 @@ msgid "Clinicians - DATE"
 msgstr ""
 
 #:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:121
+msgid "Clinician"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:123
+msgid "Finish"
+msgstr ""
+
+#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:126
 msgid "If you copy this day's setup to the clipboard, you can create a \"clone\" of this day when no data is set. This is useful when extending books."
 msgstr ""
@@ -926,7 +1052,7 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:160
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3513
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3484
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:146
 msgid "Options"
 msgstr ""
@@ -958,6 +1084,7 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:39
 msgid "Emergency"
 msgstr ""
 
@@ -978,7 +1105,7 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:173
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:184
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:176
 msgid "minutes"
 msgstr ""
 
@@ -1014,7 +1141,6 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:183
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:150
 msgid " minutes"
 msgstr ""
 
@@ -1024,126 +1150,6 @@ msgid "Insert a Known Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:140
-msgid "Block Wizard"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:142
-msgid "Insert a block into a book for a range of dates."
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:143
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:137
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3422
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3434
-msgid "Start Date"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:144
-msgid "End Date (inclusive)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:145
-msgid "Time"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:147
-msgid "Text to Apply"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:148
-msgid "Days to Apply"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:149
-msgid "Clinicians"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:131
-msgid "Bridge - Denture Entry"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:132
-msgid "Porcelain / Precious Metal"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:133
-msgid "Lava (or all ceramic)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:134
-msgid "Resin Retained"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:137
-msgid "Bridge"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:138
-msgid "Upper"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:139
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:145
-msgid "Full (acrylic)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:140
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:146
-msgid "Full (co-chrome)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:141
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:147
-msgid "Partial (acrylic)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:142
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:148
-msgid "Partial (co-chrome)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:143
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:149
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3351
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:210
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:160
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:45
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:44
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:40
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:353
-msgid "Other"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:144
-msgid "Lower"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:152
-msgid "Denture"
-msgstr ""
-
-#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:104
 msgid "Bulk Mail Options"
 msgstr ""
@@ -1252,34 +1258,6 @@ msgid "QUIT"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:86
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:119
-msgid "Completion Date"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:87
-msgid "UNNAMED PT - (000000)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:89
-msgid "You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:90
-msgid "Suggested completion Date"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:91
-msgid ""
-"Apply this Date Now?\n"
-"(course can be re-opened later if necessary)"
-msgstr ""
-
-#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:90
 msgid "Custom Item"
 msgstr ""
@@ -1305,9 +1283,19 @@ msgid "Specify Dates and Practitioners for a Daylist Print Run"
 msgstr ""
 
 #:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3392
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3404
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:91
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:106
+msgid "Start Date"
+msgstr ""
+
+#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:138
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3423
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3435
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3393
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3407
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:107
 msgid "End Date"
 msgstr ""
 
@@ -1393,21 +1381,6 @@ msgid "Agenda"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:76
-msgid "Edit Memos"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:77
-msgid "Global Memo"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:78
-msgid "Clinician Memos"
-msgstr ""
-
-#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py:54
 msgid "Letter Text Entry"
 msgstr ""
@@ -1425,7 +1398,7 @@ msgstr ""
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:97
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:121
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:990
 msgid "Type"
 msgstr ""
 
@@ -1537,4539 +1510,5269 @@ msgid "Treating Dentist/Hygienist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:519
-msgid "OpenMolar - database wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3148
+msgid "Open Molar"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:520
-msgid "What do you want to do?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3149
+msgid "Exit the Current Patient Record."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:522
-msgid "Modify an existing openmolar database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3150
+msgid "Esc"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:524
-msgid "Create a New database from scratch"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3152
+msgid "Add a New Patient to the database."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:526
-msgid "Create a New database (from a known template)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3445
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3479
+msgid "Click on this Button to search for in patient in your database."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:530
-msgid "Practice Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3155
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3480
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:194
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:126
+msgid "Find"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:531
-msgid "Used in receipts, appointment cards etc."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3446
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3481
+msgid "Ctrl+F"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:532
-msgid "Address Line 1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3158
+msgid "This cycles back through the history of records loaded today."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:533
-msgid "Address Line 2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3160
+msgid "Reload the patient from the database."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:534
-msgid "Address Line 3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3161
+msgid "Ctrl+R"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:537
-msgid "Postcode / Zip"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3163
+msgid "This cycles forwards through the history of records loaded today."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:538
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:187
-msgid "Telephone"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3165
+msgid "Show patients who live at the same address, or who have a similar name."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:539
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3199
-msgid "Fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3166
+msgid "&Relatives"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:540
-msgid "Website"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3167
+msgid "Ctrl+G"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:541
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:166
-msgid "Email"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3169
+msgid "A drop down box of all patients who have an appointment today."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:544
-msgid "Practice Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3170
+msgid "Details"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:546
-msgid "The Following users can login to the application"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:183
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:163
+msgid "Date of Birth"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:548
-msgid "Id"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3172
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address3"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:550
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:562
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:577
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:585
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:595
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:603
-msgid "Initials"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3173
+msgid "send an sms"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:552
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:561
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:579
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:586
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:597
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:604
-msgid "Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3174
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "sms"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:554
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:563
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:581
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:599
-msgid "User Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3175
+msgid "email2"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:556
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:583
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:601
-msgid "Active?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3176
+msgid "Fax"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:558
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:569
-msgid "DeActivation Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3180
+msgid "email1"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:559
-msgid "Modify Selected User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3181
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3188
+msgid "send an email"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:560
-msgid "New User Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3182
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3189
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "email"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:564
-msgid "Standard User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3183
+msgid "Occupation"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:566
-msgid "Hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3186
+msgid "Tel (mob)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:567
-msgid "Receptionist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3187
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address2"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:568
-msgid "Active User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3190
+msgid "Sex"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:570
-msgid "Add a New User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3191
+msgid "M"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:573
-msgid "Users"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3192
+msgid "F"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:574
-msgid ""
-"The Following dentists have notes in this database\n"
-"(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3193
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
+msgid "Postcode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:584
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:602
-msgid "Add a Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3194
+msgid "Tel (home)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:587
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:605
-msgid "Registration"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3195
+msgid "send a fax"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:588
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:606
-msgid "Active Appointment Book"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3196
+msgid "fax"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:591
-msgid "Dentists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address1"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:592
-msgid ""
-"The Following hygienists have notes in this database\n"
-"(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3199
+msgid "Tel (work)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:609
-msgid "Hygienists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3200
+msgid "Abort New Patient Entry"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:610
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
-msgid "Monday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3202
+msgid "Higlighted Fields are Mandatory for New Patients"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:611
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
-msgid "Tuesday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3203
+msgid "Save New Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:612
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:415
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
-msgid "Wednesday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3204
+msgid "Family Groups"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:613
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
-msgid "Thursday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3206
+msgid "Raise a dialog to edit the patients family grouping"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:614
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:475
-msgid "Friday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3207
+msgid "Edit family group"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:615
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:475
-msgid "Saturday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3102
+msgid "Not a member of a known family"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:616
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:475
-msgid "Sunday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3210
+msgid "Use the Sname and Address details from the previous patient."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:619
-msgid "Practice Hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3211
+msgid "Apply Address of previous record"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:622
-msgid "View XML"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3214
+msgid "Patient Details"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:623
-msgid "File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3215
+msgid "Pt is registered with Dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:624
-msgid "L&oad Template"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:88
+msgid "Course Type"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:625
-msgid "&Save Template"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3217
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:117
+msgid "Status"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3171
-msgid "Open Molar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3218
+msgid "Write Off Bad Debt"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3172
-msgid "Exit the Current Patient Record."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3220
+msgid "This label is for displaying Private contractual stuff"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3173
-msgid "Esc"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3224
+msgid "Private"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3175
-msgid "Add a New Patient to the database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3226
+msgid "This label is for displaying HDP contractual stuff"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3177
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3474
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3508
-msgid "Click on this Button to search for in patient in your database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3230
+msgid "Highland Dental Plan"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3178
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3509
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:194
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:126
-msgid "Find"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3232
+msgid "This label is for displaying NHS contractual stuff"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3179
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3475
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3510
-msgid "Ctrl+F"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3233
+msgid "View Claims History"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3181
-msgid "This cycles back through the history of records loaded today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3235
+msgid "Exemption"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3183
-msgid "Reload the patient from the database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3236
+msgid "Exemption Text"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3184
-msgid "Ctrl+R"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3239
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3278
+msgid "NHS"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3186
-msgid "This cycles forwards through the history of records loaded today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3241
+msgid "No Details of Pt's Registered Dentist Found"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3188
-msgid "Show patients who live at the same address, or who have a similar name."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3245
+msgid "Registered Elsewhere"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3189
-msgid "&Relatives"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3248
+msgid "Contract"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3190
-msgid "Ctrl+G"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3249
+msgid "Letters TO the patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3192
-msgid "A drop down box of all patients who have an appointment today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3251
+msgid " Custom Letter to the patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3193
-msgid "Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3253
+msgid "Print a recall saying the patient is due now."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3194
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:183
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:162
-msgid "Date of Birth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3254
+msgid "Recall for An Examination"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3195
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
-msgid "Address3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3256
+msgid "Print a receipt - useful for duplicates."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3196
-msgid "send an sms"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3257
+msgid "Duplicate Receipt"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3197
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
-msgid "sms"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3258
+msgid "Print An Account Letter"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3198
-msgid "email2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3259
+msgid "Referrals (Letters about the patient)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3203
-msgid "email1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3260
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3373
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3397
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3409
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:53
+msgid "Print"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3204
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3211
-msgid "send an email"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3261
+msgid "Patient \"Notes\""
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3205
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3212
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
-msgid "email"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3263
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3272
+msgid "Print a summary of the patient's notes (for them to take on). Includes No fee details."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3206
-msgid "Occupation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3264
+msgid "Print the patient's notes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3209
-msgid "Tel (mob)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3265
+msgid "Previous Correspondence"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3210
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
-msgid "Address2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3266
+msgid "Generated By OpenMolar"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3213
-msgid "Sex"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3267
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:126
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:132
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:156
+msgid "1"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3214
-msgid "M"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3268
+msgid "Imported into database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3215
-msgid "F"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3269
+msgid "Import A Document"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3216
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:190
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
-msgid "Postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3270
+msgid "Medical History"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3217
-msgid "Tel (home)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3273
+msgid "Print a medical history form"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3218
-msgid "send a fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3276
+msgid "Correspondence"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3219
-msgid "fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3277
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3289
+msgid "Reception"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3220
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
-msgid "Address1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3279
+msgid "Print A GP17"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3222
-msgid "Tel (work)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3280
+msgid "Apply an Exemption"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3223
-msgid "Abort New Patient Entry"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3281
+msgid "Custom Estimate on File"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3225
-msgid "Higlighted Fields are Mandatory for New Patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3282
+msgid "Print &Account"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3226
-msgid "Save New Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3283
+msgid "Take &Payment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3227
-msgid "Family Groups"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3284
+msgid "Print &Estimate"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3229
-msgid "Raise a dialog to edit the patients family grouping"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3285
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3320
+msgid "Notes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3230
-msgid "Edit family group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3286
+msgid "Patient's Diary"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3231
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3163
-msgid "Not a member of a known family"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3292
+msgid "Update the Basic Perio Exam (CPITN) score"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3233
-msgid "Use the Sname and Address details from the previous patient."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3293
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:234
+msgid "New"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3234
-msgid "Apply Address of previous record"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3294
+msgid "perform a clinical exam"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3237
-msgid "Patient Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3297
+msgid "add x-rays to the patient's current course."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3238
-msgid "Pt is registered with Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3298
+msgid "X-ray"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3239
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:88
-msgid "Course Type"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3300
+msgid "perform common perio treatments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3240
-msgid "Status"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3301
+msgid "Hyg"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3241
-msgid "Write Off Bad Debt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3302
+msgid "Close This Course"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3243
-msgid "This label is for displaying Private contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3303
+msgid "ChildSmile"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3247
-msgid "Private"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3305
+msgid "check / update the patients medical history"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3249
-msgid "This label is for displaying HDP contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3306
+msgid "Med Notes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3253
-msgid "Highland Dental Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3309
+msgid "Clinical Summary"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3255
-msgid "This label is for displaying NHS contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3310
+msgid "Include"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3256
-msgid "View Claims History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3311
+msgid "Printing Notes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3258
-msgid "Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3312
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3353
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:203
+msgid "Payments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3259
-msgid "Exemption Text"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3313
+msgid "Timestamps"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3262
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3301
-msgid "NHS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3314
+msgid "Metadata"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3264
-msgid "No Details of Pt's Registered Dentist Found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3316
+msgid "<html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html>"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3268
-msgid "Registered Elsewhere"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3317
+msgid "clinical summary"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3271
-msgid "Contract"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3321
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:55
+msgid "Static"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3272
-msgid "Letters TO the patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3322
+msgid "Plan"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3274
-msgid " Custom Letter to the patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3324
+msgid "Treatment Planning"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3276
-msgid "Print a recall saying the patient is due now."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3325
+msgid "X-Rays"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3277
-msgid "Recall for An Examination"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3326
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:625
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:639
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:57
+msgid "Perio"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3279
-msgid "Print a receipt - useful for duplicates."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3327
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:629
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:643
+msgid "Dentures"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3280
-msgid "Duplicate Receipt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3328
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:45
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:40
+msgid "Other"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3281
-msgid "Print An Account Letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3329
+msgid "Custom"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3282
-msgid "Referrals (Letters about the patient)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3330
+msgid "Advanced Tx Planning"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3283
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3398
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3427
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3440
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:53
-msgid "Print"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3332
+msgid "Patient is not currently under treatment - click here to begin"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3284
-msgid "Patient \"Notes\""
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3335
+msgid "Charts / Planning"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3286
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3295
-msgid "Print a summary of the patient's notes (for them to take on). Includes No fee details."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3337
+msgid "Custom Estimate Letter"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3287
-msgid "Print the patient's notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3338
+msgid ""
+"Use this feature to re-price all items in the \"tooth\" category of treatments. i.e all those which appear on the charts.\n"
+"\n"
+"Note - this will not remove items which are currently there. "
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3288
-msgid "Previous Correspondence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3341
+msgid "ReCalculate Estimate"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3289
-msgid "Generated By OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3342
+msgid "Apply Exemption"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3290
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:126
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:132
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:138
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:144
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:150
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:156
-msgid "1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3343
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:87
+msgid "Course Dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3291
-msgid "Imported into database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3344
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1434
+msgid "Close Course"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3292
-msgid "Import A Document"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3350
+msgid "Perio Charts"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3293
-msgid "Medical History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3352
+msgid "See all payments in the database made by this patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3296
-msgid "Print a medical history form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3355
+msgid "View treatments completed, by date order"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3299
-msgid "Correspondence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3358
+msgid "View all Courses of treatment. This includes treatment that was planned but not completed."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3300
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3312
-msgid "Reception"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3359
+msgid "Courses"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3302
-msgid "Print A GP17"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3361
+msgid "Estimate history for this patient."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3303
-msgid "Apply an Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3362
+msgid "Estimates"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3304
-msgid "Custom Estimate on File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3363
+msgid "Current Estimate"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3305
-msgid "Print &Account"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3364
+msgid "NHS Claims"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3306
-msgid "Take &Payment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3365
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3384
+msgid "Memos"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3307
-msgid "Print &Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3366
+msgid ""
+"Advanced options for developer use. Don't expect this to make much sense!\n"
+"\n"
+"If the \"changes only\" checkbox is checked, only data which has been changed will be displayed."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3308
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3343
-msgid "Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3369
+msgid "debug tools"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3309
-msgid "Patient's Diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3370
+msgid "changes only"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3315
-msgid "Update the Basic Perio Exam (CPITN) score"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3372
+msgid "Print the text displayed on this page."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3316
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3373
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:79
-msgid "New"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3377
+msgid "Today's Notes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3317
-msgid "perform a clinical exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3378
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:106
+msgid "PhraseBook"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3320
-msgid "add x-rays to the patient's current course."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3379
+msgid "Ins"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3321
-msgid "X-ray"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3380
+msgid "Save the changes made to this record."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3323
-msgid "perform common perio treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3381
+msgid "Save Changes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3324
-msgid "Hyg"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3382
+msgid "Ctrl+S"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3325
-msgid "Close This Course"
-msgstr ""
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3383
+msgid "Enter Notes."
+msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3326
-msgid "ChildSmile"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3385
+msgid "Phrases"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3328
-msgid "check / update the patients medical history"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3388
+msgid "Patient Database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3329
-msgid "Med Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3391
+msgid "Appointments / Diary"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3332
-msgid "Clinical Summary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3394
+msgid "Registered Dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3333
-msgid "Include"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3395
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3405
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:241
+msgid "Go"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3334
-msgid "Printing Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3396
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3408
+msgid "Print the Data"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3335
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:203
-msgid "Payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3398
+msgid "All payments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3336
-msgid "Timestamps"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3399
+msgid "Sundries_only"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3337
-msgid "Metadata"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3400
+msgid "Treatment_only"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3339
-msgid "<html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3403
+msgid "Cashbook"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3340
-msgid "clinical summary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3406
+msgid "Treating Clinician"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3344
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:55
-msgid "Static"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3411
+msgid "Extra Filters"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3345
-msgid "Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3414
+msgid "Daybook"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3346
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:67
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:59
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1138
-msgid "Completed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3416
+msgid "Find Patient Records where the patient is in"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3347
-msgid "Treatment Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3417
+msgid "Debt"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3348
-msgid "X-Rays"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3418
+msgid "Credit"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3349
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:625
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:639
-msgid "Perio"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3419
+msgid "By More than"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3350
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:629
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:643
-msgid "Dentures"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3420
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3429
+msgid "Load Table"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3352
-msgid "Custom"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3421
+msgid "Print Table"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3353
-msgid "Advanced Tx Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3423
+msgid "Print Selected Letters"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3355
-msgid "Patient is not currently under treatment - click here to begin"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3425
+msgid "TOTAL OUTSTANDING"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3358
-msgid "Charts / Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3428
+msgid "Accounts"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3360
-msgid "Custom Estimate Letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3430
+msgid "Print Letters"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3361
-msgid ""
-"Use this feature to re-price all items in the \"tooth\" category of treatments. i.e all those which appear on the charts.\n"
-"\n"
-"Note - this will not remove items which are currently there. "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3431
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:78
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:388
+msgid "Expand All"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3364
-msgid "ReCalculate Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3432
+msgid "Letter Options"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3365
-msgid "Apply Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3435
+msgid "Bulk Mailings"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3366
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:87
-msgid "Course Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3437
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:180
+msgid "Fee Scales Available"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3367
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1340
-msgid "Close Course"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3439
+msgid "Use this control to select a feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3371
-msgid "Choose Data"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3440
+msgid "Search  For an Item"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3372
-msgid "Chart Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3442
+msgid "search for the given phrase in description columns"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3377
-msgid "Perio Charts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3443
+msgid "Search Descriptions"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3379
-msgid "See all payments in the database made by this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3448
+msgid "only search for the given phrase in the usercode column"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3380
-msgid "Past Payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3449
+msgid "Search Itemcodes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3382
-msgid "View treatments completed, by date order"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3452
+msgid "Hide Rarely Used Codes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3383
-msgid "Past Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3453
+msgid "Quickly expand all items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3385
-msgid "display a combination of courses and estimates."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3454
+msgid "Expand All Sections"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3386
-msgid "Courses / Estimates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3456
+msgid "Quickly compress all items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3388
-msgid "View all Courses of treatment. This includes treatment that was planned but not completed."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3457
+msgid "Compress All Sections"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3389
-msgid "Courses"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3458
+msgid "Resources"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3391
-msgid "Estimate history for this patient."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3460
+msgid "Open A PDF of the latest NHS Regulations"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3392
-msgid "Estimates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3461
+msgid "Documents"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3393
-msgid "Current Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3462
+msgid "Advanced Options"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3394
-msgid "NHS Claims"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3463
+msgid "FeeScale Editor"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3395
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3414
-msgid "Memos"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3464
+msgid "FeeScale Tester"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3397
-msgid "Print the text displayed on this page."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3465
+msgid "Reload Fee Scales"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3399
-msgid ""
-"Advanced options for developer use. Don't expect this to make much sense!\n"
-"\n"
-"If the \"changes only\" checkbox is checked, only data which has been changed will be displayed."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3468
+msgid "Feescales"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3402
-msgid "debug tools"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3470
+msgid "Reply"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3403
-msgid "changes only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3471
+msgid "Alt+R"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3406
-msgid "History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3472
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:323
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:376
+msgid "Delete"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3407
-msgid "Today's Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3473
+msgid "Del, Backspace"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3408
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:106
-msgid "PhraseBook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3474
+msgid "&set parent"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3409
-msgid "Ins"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3475
+msgid "Alt+S"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3410
-msgid "Save the changes made to this record."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3476
+msgid "New Topic"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3411
-msgid "Save Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3477
+msgid "Search by keyword"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3412
-msgid "Ctrl+S"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3482
+msgid "Show Topics for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3413
-msgid "Enter Notes."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3483
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:59
+msgid "Everyone"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3415
-msgid "Phrases"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3485
+msgid "Include Deleted Posts"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3418
-msgid "Patient Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3486
+msgid "Split Replies"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3421
-msgid "Appointments / Diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3487
+msgid "Group replies"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3424
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3436
-msgid "Registered Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3488
+msgid "&Collapse Replies"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3425
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3438
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:241
-msgid "Go"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3489
+msgid "&Expand Replies"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3426
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3439
-msgid "Print the Data"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3492
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1566
+msgid "FORUM"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3428
-msgid "All payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3495
+msgid "Wiki"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3429
-msgid "Sundries_only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3496
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:153
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:109
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:84
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:57
+msgid "&File"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3430
-msgid "Treatment_only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3497
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:95
+msgid "&Help"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3433
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3534
-msgid "Cashbook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3498
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:157
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:112
+msgid "&Preferences"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3437
-msgid "Treating Dentist / Hygenist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3499
+msgid "&View"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3443
-msgid "Daybook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3500
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3509
+msgid "&Appointments"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3501
+msgid "&Printing"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3502
+msgid "&Forum"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3503
+msgid "&Charts"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3504
+msgid "&Mode (reception or surgery)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3505
+msgid "&Cashbook"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3506
+msgid "&Daybook"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3507
+msgid "&History"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3508
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:111
+msgid "&Tools"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3510
+msgid "&Export Patient to disk"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3511
+msgid "&Import Patient from disk"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3512
+msgid "About &OpenMolar"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3513
+msgid "&About QT"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3514
+msgid "&Quit"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3515
+msgid "Select Interface Language"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3517
+msgid "Full Screen Mode (Ctrl-Alt-F)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3518
+msgid "Ctrl+Alt+F"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3519
+msgid "Font Size"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3521
+msgid "Show Advanced Options"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3523
+msgid "Table View For Charting"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3524
+msgid "NHS Form Settings"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3525
+msgid "Test Print a GP17"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3526
+msgid "Print Daylists"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3527
+msgid "Set Clinician"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3528
+msgid "Set Assistant"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3529
+msgid "Surgery Mode"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3531
+msgid "Advanced Record Management"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3533
+msgid "Fix Locked New Course of Treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3534
+msgid "Allow Full Edit"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3535
+msgid "Set Surgery Number"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3537
+msgid "Set Surgery Number (used so other applications can see which record is loaded)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3538
+msgid "Edit Phrasebooks"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3539
+msgid "Allow &Edit"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3540
+msgid "Enable &Filters"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3541
+msgid "Allow Edit &Courses"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3542
+msgid "Allow Edit &Estimates"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3543
+msgid "Allow Edit &Treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3544
+msgid "Allow &ALL Edits"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3545
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:71
+msgid "Edit Referral Centres"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3546
+msgid "Edit Feescales"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3547
+msgid "Open Document Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3549
+msgid "Reset Supervisor Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3550
+msgid "Add User"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3551
+msgid "Add Clinician"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3552
+msgid "Edit Practice Details"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3554
+msgid "Clear Today's Emergency Slots"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3555
+msgid "Insert Regular Blocks"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:196
+msgid "Medical Notes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:197
+msgid "Doctor's details"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:198
+msgid "Doctor's Name"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:199
+msgid "Address / Tel No"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:200
+msgid "Known Conditions"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:201
+msgid "Current Medication"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:202
+msgid "Past Medication"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:203
+msgid "Allergies"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:204
+msgid "Heart"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:205
+msgid "Lungs"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:206
+msgid "Liver"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:207
+msgid "Bleeding"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:208
+msgid "Kidneys"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:209
+msgid "Anaesthetic / operations"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:211
+msgid "Mark as Checked  Today"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:212
+msgid "Checked"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:213
+msgid "Mark Patient as Med Alert"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:124
+msgid "New CPITN score"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:131
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:155
+msgid "0"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:127
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:157
+msgid "2"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:140
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:152
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:158
+msgid "3"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:147
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:153
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:159
+msgid "4"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:130
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:136
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:160
+msgid "*"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:83
+msgid "New Course"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:85
+msgid "Start a new Course of Treatment with the following Criteria?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:86
+msgid "Contracted Dentist"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:89
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:118
+msgid "Acceptance Date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:214
+msgid "Dental History"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:215
+msgid "Previous Referral Date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:216
+msgid "1st referral"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:217
+msgid "re - referral"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:219
+msgid "I am Willing to carry out simple treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:220
+msgid "Teeth With Poor Prognosis"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:221
+msgid "Relevant Medical History"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:222
+msgid "Reason for Referral"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:223
+msgid "Crowding"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:224
+msgid "Severe"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:225
+msgid "Moderate"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:226
+msgid "Mild"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:593
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:610
+msgid "None"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:228
+msgid "Spaced"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:229
+msgid "Incisal Relationship"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:230
+msgid "Overjet:"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:231
+msgid "mm"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:232
+msgid "Overbite"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:233
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:371
+msgid "Complete"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:234
+msgid "InComplete"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:235
+msgid "Traumatic"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:236
+msgid "%"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:237
+msgid "Patient Motivation"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:238
+msgid "Fixed Appliance"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:239
+msgid "Removable Applicance"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:199
+msgid "<html><head/><body><p>A place to keep a reminder of the patients appointment preferences.</p><p>Eg. "30 minute appointments for examinations" etc. </p></body></html>"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:200
+msgid "Recall Settings"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:202
+msgid "A Wizard to select some common appointment combinations"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:203
+msgid "Appointment Shortcuts"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:205
+msgid "A New Appointment for this patient"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:206
+msgid "&New"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:208
+msgid "delete or cancel the appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:209
+msgid "Clear/Cancel"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:211
+msgid "Make the selected appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:212
+msgid "Schedule"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:214
+msgid "Find the appointment in the the practice appointment list"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:215
+msgid "Find in Book"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:217
+msgid "Print out the next 5 appointments for this patient"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:218
+msgid "Print Card"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:220
+msgid "Allows modifcation of certain criteria for this appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:221
+msgid "Modify"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:163
+msgid "Patient Finder"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3445
-msgid "Find Patient Records where the patient is in"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:165
+msgid "Fill in a few of the following fields to get a list of possible patients"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3446
-msgid "Debt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:166
+msgid "Repeat Last Search"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3447
-msgid "Credit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:167
+msgid "SNO or Surname"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3448
-msgid "By More than"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:168
+msgid ""
+"Enter either the full name or the first few letters of the name.\n"
+"\n"
+"If you are unsure of the spelling, type in the COMPLETE name,\n"
+"and check the adjacent \"sounds like\" box."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3449
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3458
-msgid "Load Table"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:173
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:182
+msgid "check to search for a similar sounding name"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3450
-msgid "Print Table"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:175
+msgid ""
+"Enter either the full name or the first few letters of the name.\n"
+"\n"
+"If you are unsure of the spelling, type in the COMPLETE name,\n"
+"and check the adjacent \"sounds like\" box.\n"
+"Be wary of middle names. \n"
+"eg. \"Neil\" does NOT sound like \"Neil Alexander\"!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3452
-msgid "Print Selected Letters"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:184
+msgid "Address includes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3454
-msgid "TOTAL OUTSTANDING"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:186
+msgid "openMolar will search line1 and line2 of the address for this text"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3457
-msgid "Accounts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:189
+msgid "open molar will search tel1, tel2 and mobile for numbers present here."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3459
-msgid "Print Letters"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:191
+msgid "search for a postcode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3460
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:75
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:388
-msgid "Expand All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:204
+msgid "Payments for treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3461
-msgid "Letter Options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:206
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:212
+msgid "-"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3464
-msgid "Bulk Mailings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:209
+msgid "Debit Card"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3466
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:174
-msgid "Fee Scales Available"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:211
+msgid "Credit Card"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3468
-msgid "Use this control to select a feescale"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:213
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:57
+msgid "Other Payments"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:214
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:92
+msgid "Sundries"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:215
+msgid "Annual HDP"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:655
+msgid "Miscellaneous"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:218
+msgid "Amount which will appear on receipt  (read only)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1409
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:375
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:390
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:40
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:61
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:71
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/gp17/gp17_printer.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:437
+msgid "Question"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:67
+msgid "Print Formatting"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:68
+msgid "Minimal"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:69
+msgid "Full Page"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:585
+msgid "Advanced Record Alteration"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:586
+msgid "NHS current fees (money0)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:587
+msgid "NHS payments (money2)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:588
+msgid "NHS estimated (money4)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:589
+msgid "private estimate (money5)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:591
+msgid "Exempt - nhs gross - completed treatment (money6)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:593
+msgid "Exempt - NHS gross - estimated current (money7)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:594
+msgid "credit (money8)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:595
+msgid "debt (money9)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:596
+msgid "debt2 (money10)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:597
+msgid "money 11 (always 0!)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:598
+msgid "private current fees (money1) "
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:599
+msgid "private payments (money3)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:600
+msgid "ALL AMOUNTS ARE IN PENCE (cents)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:601
+msgid "Outstanding <br />amount"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:602
+msgid "0.00"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:603
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:605
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:623
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:637
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:652
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:123
+msgid "Apply Changes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:604
+msgid "Money"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:606
+msgid "Last CE (pd5)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:607
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:609
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:611
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:613
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:615
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:617
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:619
+msgid "Add Date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:608
+msgid "Last ECE (pd6)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:610
+msgid "Last FCA (pd7)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:612
+msgid "Last OPT (pd8)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:614
+msgid "Last intraoral Xrays (pd9)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:616
+msgid "Last SP (pd10)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3469
-msgid "Search  For an Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:618
+msgid "Last Account sent (billdate)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3471
-msgid "search for the given phrase in description columns"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:622
+msgid "Dates"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3472
-msgid "Search Descriptions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:624
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:638
+msgid "Xray"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3477
-msgid "only search for the given phrase in the usercode column"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:626
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:640
+msgid "anaesthetics"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3478
-msgid "Search Itemcodes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:630
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:644
+msgid "new upper"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3481
-msgid "Hide Rarely Used Codes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:631
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:645
+msgid "new lower"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3482
-msgid "Quickly expand all items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:632
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:646
+msgid "repair upper"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3483
-msgid "Expand All Sections"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:633
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:647
+msgid "repair lower"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3485
-msgid "Quickly compress all items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:636
+msgid "Treatment Plan"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3486
-msgid "Compress All Sections"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:650
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:73
+msgid "Completed Treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3487
-msgid "Resources"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:651
+msgid "Hidden Notes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3489
-msgid "Open A PDF of the latest NHS Regulations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:97
+msgid "Post a memo about this Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3490
-msgid "Documents"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:98
+msgid "Expiry Policy"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3491
-msgid "Advanced Options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:99
+msgid "Do Not Expire"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3492
-msgid "FeeScale Editor"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:100
+msgid "Expire on this date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3493
-msgid "FeeScale Tester"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:101
+msgid "Viewable by"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3494
-msgid "Reload Fee Scales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:103
+msgid "Surgery Machines"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3497
-msgid "Feescales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:104
+msgid "Reception Machines"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3499
-msgid "Reply"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:66
+msgid "Delete this memo when I close this"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3500
-msgid "Alt+R"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:186
+msgid "Enter an appointment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3501
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:323
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:370
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:372
-msgid "Delete"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:187
+msgid "Appointment with"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3502
-msgid "Del, Backspace"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:189
+msgid "5 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3503
-msgid "&set parent"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:190
+msgid "10 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3504
-msgid "Alt+S"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:191
+msgid "15 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3505
-msgid "New Topic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:192
+msgid "20 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3506
-msgid "Search by keyword"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:193
+msgid "30 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3511
-msgid "Show Topics for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:194
+msgid "40 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3512
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:59
-msgid "Everyone"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:195
+msgid "45 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3514
-msgid "Include Deleted Posts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:196
+msgid "1 hour"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3515
-msgid "Split Replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:197
+msgid "1 hour 15 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3516
-msgid "Group replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:198
+msgid "1 hour 20 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3517
-msgid "&Collapse Replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:199
+msgid "1 hour 30 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3518
-msgid "&Expand Replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:200
+msgid "1 hour 45 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3521
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1475
-msgid "FORUM"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:201
+msgid "2 hours"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3524
-msgid "Wiki"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:202
+msgid "2 hours 30 minutes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3525
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:153
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:109
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:84
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:57
-msgid "&File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:203
+msgid "3 hours"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3526
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:95
-msgid "&Help"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:206
+msgid "Combined Appointment With Hygenist?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3527
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:157
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:112
-msgid "&Preferences"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:207
+msgid "Reason 1"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3528
-msgid "View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:208
+msgid "Reason 3"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3529
-msgid "Appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:209
+msgid "Reason 2"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3530
-msgid "Printing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:210
+msgid "Brief Note for Clinician (optional)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3531
-msgid "Forum"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:211
+msgid "Schedule Appointment Now"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3532
-msgid "Charts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:162
+msgid "Summary"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3533
-msgid "Mode (reception or surgery)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:165
+msgid "Messages and Tasks"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3535
-msgid "Tools"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:168
+msgid "My Calendar"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3536
-msgid "&Export Patient to disk"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:171
+msgid "Holiday Planner"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3537
-msgid "&Import Patient from disk"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:74
+msgid "Please set the Surgery Number"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3538
-msgid "About &OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:107
+msgid "Reception Machine"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3539
-msgid "&About QT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:76
+msgid "Surgery One"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3542
-msgid "Clear Today's Emergency Slots"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:77
+msgid "Surgery Two"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3544
-msgid "Select Interface Language"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:78
+msgid "Surgery Three"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3546
-msgid "Full Screen Mode (Ctrl-Alt-F)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:79
+msgid "Surgery Four"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3547
-msgid "Ctrl+Alt+F"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:80
+msgid "Surgery Five"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3548
-msgid "Font Size"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:81
+msgid "Surgery Six"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3550
-msgid "Show Advanced Options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:226
+msgid "delete tooth data"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3552
-msgid "Table View For Charting"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:380
+msgid "ADD COMMENTS"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3553
-msgid "NHS Form Settings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:228
+msgid "!KUO"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3554
-msgid "Test Print a GP17"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:229
+msgid "!Mobile Tooth"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3555
-msgid "Print Daylists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:230
+msgid "!Early Caries"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3556
-msgid "Set Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:231
+msgid "!Filling Missing"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3557
-msgid "Set Assistant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:232
+msgid "!Chipped"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3558
-msgid "Surgery Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:233
+msgid "!Cracked"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3560
-msgid "Advanced Record Management"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:234
+msgid "!Poor Prognosis"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3562
-msgid "Fix Locked New Course of Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:235
+msgid "!Extract Soon"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3563
-msgid "Allow Full Edit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:236
+msgid "!Implant required"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3564
-msgid "Set Surgery Number"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:237
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:382
+msgid "DELETE COMMENTS"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3566
-msgid "Set Surgery Number (used so other applications can see which record is loaded)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:238
+msgid "AM"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3567
-msgid "Edit Phrasebooks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:239
+msgid "CO"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3568
-msgid "Documents Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:240
+msgid "GL"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:196
-msgid "Medical Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:242
+msgid "Po"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:197
-msgid "Doctor's details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:243
+msgid "extract (plan only!)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:198
-msgid "Doctor's Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:244
+msgid "EX"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:199
-msgid "Address / Tel No"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:245
+msgid "root treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:200
-msgid "Known Conditions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:246
+msgid "RT"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:201
-msgid "Current Medication"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:247
+msgid "Apply and move Back a tooth"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:202
-msgid "Past Medication"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:248
+msgid "porcelain veneer"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:203
-msgid "Allergies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:249
+msgid "DR"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:204
-msgid "Heart"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:250
+msgid "Apply & Add Another Item"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:205
-msgid "Lungs"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:251
+msgid "&&"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:206
-msgid "Liver"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:252
+msgid "Apply & Move to Next Tooth"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:207
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:154
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:353
-msgid "Bleeding"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:80
+msgid "Tooth Property Editor"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:208
-msgid "Kidneys"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:81
+msgid "UR8"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:209
-msgid "Anaesthetic / operations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:82
+msgid "Items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:211
-msgid "Mark as Checked  Today"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:83
+msgid "Database Line"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:212
-msgid "Checked"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/contract_gui_module.py:120
+msgid "erroneous exemption category entered"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:213
-msgid "Mark Patient as Med Alert"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:121
+msgid "Out Of Office"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:124
-msgid "New CPITN score"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
+msgid "Made"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:125
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:131
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:137
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:143
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:149
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:155
-msgid "0"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
+msgid "at"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:127
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:133
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:139
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:145
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:151
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:157
-msgid "2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:683
+msgid "Made on"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:128
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:134
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:140
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:146
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:152
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:158
-msgid "3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:734
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:773
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:374
+msgid "Load Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:129
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:135
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:141
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:147
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:153
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:159
-msgid "4"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:737
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:776
+msgid "Add/Edit Memo"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:130
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:136
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:142
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:148
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:154
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:160
-msgid "*"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:740
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:777
+msgid "Cancel Appointment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:83
-msgid "New Course"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:744
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:784
+msgid "Clear Block"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:85
-msgid "Start a new Course of Treatment with the following Criteria?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:748
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:795
+msgid "Block or use this space"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:86
-msgid "Contracted Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:751
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:779
+msgid "Print A Medical Form"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:89
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:118
-msgid "Acceptance Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
+msgid "Bad Time Sequence!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:359
-msgid "OpenMolar - New Setup"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
+msgid "Whoops!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:361
-msgid "Welcome to the OpenMolar settings wizard."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py:89
+msgid "Switch to day view of this date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:362
-msgid ""
-"This first run application will \n"
-" - set your system password\n"
-" - make this client aware of your mysql server settings\n"
-" - install a small (3 patient) demo database if required."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py:93
+msgid "Edit Memos"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:368
-msgid "Please enter a password to prevent unauthorised running of this application."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py:95
+msgid "Edit Clinician Hours"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:369
-msgid "Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:635
+msgid "Edit day memos"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:370
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:382
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:392
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:126
-msgid "show"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:302
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:636
+msgid "Edit Public Holiday information"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:371
-msgid "Repeat Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:349
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Wednesday"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:372
-msgid "Where is your mysql server located?  **"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:389
+msgid "DATE"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:373
-msgid "Host"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:314
+msgid "Toggle Deciduous State"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:374
-msgid "Port"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:328
+msgid "Delete All Restorations"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:375
-msgid ""
-"** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.\n"
-"\n"
-"If you are a debian or ubuntu user, \"sudo apt-get install mysql-server\"\n"
-"and make a note of the root password you create during set up. "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:334
+msgid "Add Comments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:379
-msgid "Database Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:338
+msgid "Show History"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:380
-msgid "(mysql) User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:476
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:249
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/chart_widget.py:220
+msgid "Left"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:381
-msgid "(mysql) Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:479
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:252
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/chart_widget.py:223
+msgid "Right"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:383
-msgid "Database Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
+msgid "Are you Sure"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:384
-msgid "Test this Connection"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:170
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:83
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:117
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:94
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:292
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:361
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:446
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1387
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1444
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:237
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:168
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:532
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:569
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:352
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:478
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:637
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3017
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3037
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:407
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:423
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:409
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:108
+msgid "Confirm"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:385
-msgid "Create A Demo Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:52
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:80
+msgid "Browsing Mode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:386
-msgid "Use with an existing database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:74
+msgid "Scheduling Mode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:387
-msgid "Root mysql password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:76
+msgid "Blocking Mode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:388
-msgid ""
-"To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.\n"
-"OpenMolar does NOT store this password.\n"
-"Please enter the password of the ROOT mysql user.\n"
-"(note - on most mysql setups, root access is disabled unless the server is on localhost)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:78
+msgid "Notes Mode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:393
-msgid "Creating Database.... please wait"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:400
+msgid "completed already"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:394
-msgid "OK.... you are all set to go!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:404
+msgid "There are multiple treatments associated with this estimate item"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:395
-msgid "Back"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:407
+msgid "All must be completed for the full charge to be applied"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:396
-msgid "Proceed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:409
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:120
+msgid "information"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:214
-msgid "Dental History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:428
+msgid "Not Allowed"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:215
-msgid "Previous Referral Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:429
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1070
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1118
+msgid "You have no clinician login. Treatments cannot be completed by you!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:216
-msgid "1st referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:436
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:80
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:645
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:704
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:721
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:733
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:366
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:178
+msgid "confirm"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:217
-msgid "re - referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:437
+msgid "Delete examination from this treatment plan and estimate?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:219
-msgid "I am Willing to carry out simple treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:72
+msgid "CSET"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:220
-msgid "Teeth With Poor Prognosis"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:115
+msgid "Planned Items Total"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:221
-msgid "Relevant Medical History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:116
+msgid "Interim Charges"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:222
-msgid "Reason for Referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:117
+msgid "Completed Items Total"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:223
-msgid "Crowding"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:180
+msgid "TOTAL"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:224
-msgid "Severe"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:101
+msgid "Open the patient's diary"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:225
-msgid "Moderate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:105
+msgid "Launch the Appointment Wizard"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:226
-msgid "Mild"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:109
+msgid "Previous appointment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:227
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:553
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:570
-msgid "None"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:113
+msgid "Next available appointment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:228
-msgid "Spaced"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:319
+msgid "No patient Selected"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:229
-msgid "Incisal Relationship"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:427
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:624
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:108
+msgid "error"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:230
-msgid "Overjet:"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:428
+msgid "No patient selected"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:231
-msgid "mm"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:450
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:122
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:222
+msgid "Close"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:232
-msgid "Overbite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:42
+msgid "Mark the selected tooth as missing"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:233
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:367
-msgid "Complete"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:46
+msgid "Mark the selected tooth as artificial"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:234
-msgid "InComplete"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:50
+msgid "Mark the selected tooth as root present"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:235
-msgid "Traumatic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:54
+msgid "Permanent Tooth Also Present"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:236
-msgid "%"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:58
+msgid "Supernumary Tooth Present"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:237
-msgid "Patient Motivation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:70
+msgid "Mark the selected tooth as partially erupted"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:238
-msgid "Fixed Appliance"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:66
+msgid "Mark the selected tooth as over erupted"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:239
-msgid "Removable Applicance"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:74
+msgid "Toggle selected tooth/teeth as deciduous"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:199
-msgid "<html><head/><body><p>A place to keep a reminder of the patients appointment preferences.</p><p>Eg. "30 minute appointments for examinations" etc. </p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:281
+msgid "Toggle Pin Retention for current Filling"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:200
-msgid "Recall Settings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:299
+msgid "Crowns"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:202
-msgid "A Wizard to select some common appointment combinations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:300
+msgid "Posts"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:203
-msgid "Appointment Shortcuts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:301
+msgid "Bridges"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:205
-msgid "A New Appointment for this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:302
+msgid "Implants"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:206
-msgid "&New"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:303
+msgid "Fissure Sealants"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:208
-msgid "delete or cancel the appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:304
+msgid "Endodontics"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:209
-msgid "Clear/Cancel"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:305
+msgid "Surgical Tx"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:211
-msgid "Make the selected appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:37
+msgid "Account Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:212
-msgid "Schedule"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:38
+msgid "Please Choose the tone of this letter"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:214
-msgid "Find the appointment in the the practice appointment list"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:41
+msgid "Normal Account - Very Polite"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:215
-msgid "Find in Book"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:42
+msgid "Mildly assertive request"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:217
-msgid "Print out the next 5 appointments for this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:44
+msgid "Threaten with Debt Collector"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:218
-msgid "Print Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:51
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:44
+msgid "Add User Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:220
-msgid "Allows modifcation of certain criteria for this appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:53
+msgid "Add a new clinician to the system?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:221
-msgid "Modify"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:56
+msgid "Add New Login"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:163
-msgid "Patient Finder"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:64
+msgid "Hygienist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:165
-msgid "Fill in a few of the following fields to get a list of possible patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:65
+msgid "Therapist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:166
-msgid "Repeat Last Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:72
+msgid "Create a new diary for this clinician (uncheck to map to an existing diary)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:167
-msgid "SNO or Surname"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:84
+msgid "Initials/Nickname (must be an existing Login)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:168
-msgid ""
-"Enter either the full name or the first few letters of the name.\n"
-"\n"
-"If you are unsure of the spelling, type in the COMPLETE name,\n"
-"and check the adjacent \"sounds like\" box."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:86
+msgid "Name eg. Fred Smith"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:173
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:182
-msgid "check to search for a similar sounding name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:87
+msgid "Formal Name eg. Dr.F. Smith"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:175
-msgid ""
-"Enter either the full name or the first few letters of the name.\n"
-"\n"
-"If you are unsure of the spelling, type in the COMPLETE name,\n"
-"and check the adjacent \"sounds like\" box.\n"
-"Be wary of middle names. \n"
-"eg. \"Neil\" does NOT sound like \"Neil Alexander\"!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:88
+msgid "Qualifications"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:184
-msgid "Address includes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:89
+msgid "Speciality"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:186
-msgid "openMolar will search line1 and line2 of the address for this text"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:90
+msgid "Clinician Type"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:189
-msgid "open molar will search tel1, tel2 and mobile for numbers present here."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:92
+msgid "Additional Data"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:191
-msgid "search for a postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:104
+msgid "view existing dentists"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:204
-msgid "Payments for treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:75
+msgid "Complete Treatments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:206
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:208
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:210
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:212
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:167
-msgid "-"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:76
+msgid "What treatment has been performed?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:209
-msgid "Debit Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:47
+msgid "Add a new user to the system?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:211
-msgid "Credit Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:48
+msgid "This is done using initials or a short nickname."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:213
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:57
-msgid "Other Payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:49
+msgid "Must be unique and Maximum allowed in 5 characters"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:214
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:92
-msgid "Sundries"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:55
+msgid "User Initials or nickname"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:215
-msgid "Annual HDP"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:66
+msgid "view existing users"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:216
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:655
-msgid "Miscellaneous"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:73
+msgid "Initials/nickname mut be unique"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:218
-msgid "Amount which will appear on receipt  (read only)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:119
+msgid "Forename"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py:56
-msgid "Raise Permissions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "dob"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py:57
-msgid ""
-"Supervisor Rights required to Perform This Action.\n"
-"Please enter password."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:125
+msgid "POSTCODE"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:66
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:73
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1406
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:375
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:390
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:40
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:60
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:68
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/gp17/gp17_printer.py:53
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:434
-msgid "Question"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:48
+msgid "Address Matches"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:67
-msgid "Print Formatting"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:81
+msgid "Top 12 address matches for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:68
-msgid "Minimal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:100
+msgid "Advanced Treatment Planning"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:69
-msgid "Full Page"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:108
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:132
+msgid "Planned Text"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:585
-msgid "Advanced Record Alteration"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:111
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:135
+msgid "Completed Text"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:586
-msgid "NHS current fees (money0)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:117
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:141
+msgid "Field"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:587
-msgid "NHS payments (money2)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:170
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:195
+msgid "Show Chart Items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:588
-msgid "NHS estimated (money4)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:193
+msgid "Hide Chart Items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:589
-msgid "private estimate (money5)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:150
+msgid "Clinician Times"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:591
-msgid "Exempt - nhs gross - completed treatment (money6)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:170
+msgid "values from"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:593
-msgid "Exempt - NHS gross - estimated current (money7)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:46
+msgid "Alter Cashbook Entry"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:594
-msgid "credit (money8)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:67
+msgid "Patient Number"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:595
-msgid "debt (money9)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:68
+msgid "Patient Name"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:596
-msgid "debt2 (money10)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:71
+msgid "Payment Type"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:597
-msgid "money 11 (always 0!)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:85
+msgid "Enable Full Edit"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:598
-msgid "private current fees (money1) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:52
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:55
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:55
+msgid "Choose from the following options"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:599
-msgid "private payments (money3)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:76
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:79
+msgid "You haven't completed this option"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:600
-msgid "ALL AMOUNTS ARE IN PENCE (cents)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:94
+msgid "What are you Modifying?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:601
-msgid "Outstanding <br />amount"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:97
+msgid "An existing Upper Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:602
-msgid "0.00"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:99
+msgid "An existing Lower Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:603
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:605
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:623
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:637
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:652
-msgid "Apply Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:174
+msgid "What best describes the denture type?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:604
-msgid "Money"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:176
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:190
+msgid "Acrylic Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:606
-msgid "Last CE (pd5)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:177
+msgid "Metal Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:607
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:609
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:611
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:613
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:615
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:617
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:619
-msgid "Add Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:206
+msgid "Please select teeth to be added to this denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:608
-msgid "Last ECE (pd6)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:254
+msgid "How Many Clasps?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:610
-msgid "Last FCA (pd7)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:284
+msgid "Does this work require the taking of an impression?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:612
-msgid "Last OPT (pd8)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:317
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:230
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:293
+msgid "You have completed your input."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:614
-msgid "Last intraoral Xrays (pd9)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:318
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:231
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:294
+msgid "Please click on Apply"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:616
-msgid "Last SP (pd10)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:328
+msgid "Alterations to an existing Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:618
-msgid "Last Account sent (billdate)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:362
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:336
+msgid "Upper Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:622
-msgid "Dates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:363
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:337
+msgid "Lower Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:624
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:638
-msgid "Xray"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:368
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:577
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:608
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:270
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:342
+msgid "Next"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:626
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:640
-msgid "anaesthetics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:388
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:103
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:288
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:362
+msgid "Whoops"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:630
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:644
-msgid "new upper"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:443
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:454
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:244
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:421
+msgid "Warning"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:631
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:645
-msgid "new lower"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:444
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:422
+msgid "Your upper denture input is invalid"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:632
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:646
-msgid "repair upper"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:455
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:434
+msgid "Your lower denture input is invalid"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:633
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:647
-msgid "repair lower"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_todays_notes.py:56
+msgid "Open Phrasebook"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:636
-msgid "Treatment Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:43
+msgid "Appointment Card for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:650
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:73
-msgid "Completed Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:49
+msgid "Include Today's appointments?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:651
-msgid "Hidden Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:106
+msgid "No appointments to print!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:97
-msgid "Post a memo about this Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:39
+msgid "Staff Meeting"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:98
-msgid "Expiry Policy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:50
+msgid "Insert a number of blocks to various books"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:99
-msgid "Do Not Expire"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:52
+msgid "Clinicians"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:100
-msgid "Expire on this date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:64
+msgid "Days to Apply"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:101
-msgid "Viewable by"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:108
+msgid "What time does this recurr?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:103
-msgid "Surgery Machines"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:110
+msgid "What is this block for?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:104
-msgid "Reception Machines"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:138
+msgid "reason"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py:54
-msgid "Make a Selection"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:139
+msgid "Please enter the text to use for this block"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:66
-msgid "Delete this memo when I close this"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:181
+msgid "End Date is greater than Start Date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:186
-msgid "Enter an appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:184
+msgid "Block has zero duration"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:187
-msgid "Appointment with"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:187
+msgid "You have no days selected"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:189
-msgid "5 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:190
+msgid "You have no clinicians (ie.books) selected"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:190
-msgid "10 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:214
+msgid "applying changes for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:191
-msgid "15 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:228
+msgid "Appointment(s) inserted"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:192
-msgid "20 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:231
+msgid "Some were rejected by the database as they clashed with existing appointments or blocks"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:193
-msgid "30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:332
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:339
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:60
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/feescale_tester.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:252
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:454
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:264
+msgid "Information"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:194
-msgid "40 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:243
+msgid "Bad Input"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:195
-msgid "45 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:45
+msgid "Edit Memos for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:196
-msgid "1 hour"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:61
+msgid "Global Memo"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:197
-msgid "1 hour 15 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:77
+msgid "Clinician Memos"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:198
-msgid "1 hour 20 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:84
+msgid "Public Holiday Text"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:199
-msgid "1 hour 30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:86
+msgid "Edit Public Holiday Text"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:200
-msgid "1 hour 45 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:47
+msgid "User choice"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:201
-msgid "2 hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:49
+msgid "Set the Appointment Viewing Mode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:202
-msgid "2 hours 30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:53
+msgid "Browsing"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:203
-msgid "3 hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:58
+msgid "Scheduling"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:206
-msgid "Combined Appointment With Hygenist?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:59
+msgid "make appointments for a patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:207
-msgid "Reason 1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:63
+msgid "Blocking"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:208
-msgid "Reason 3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:64
+msgid "block time periods. eg. lunch times etc."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:209
-msgid "Reason 2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:68
+msgid "Note Checking"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:210
-msgid "Brief Note for Clinician (optional)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:69
+msgid "check notes for today's patients"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:211
-msgid "Schedule Appointment Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:63
+msgid "Appointment Preferences for Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:156
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:162
-msgid "Summary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:68
+msgid "Recall Patient Periodically"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:165
-msgid "Messages and Tasks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:72
+msgid "Dentist Recall"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:168
-msgid "My Calendar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:87
+msgid "dentist recall period (months)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:171
-msgid "Holiday Planner"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:89
+msgid "Next Recall Date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:166
-msgid "openMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:90
+msgid "Shortcuts (months from today)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:167
-msgid "System Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:94
+msgid "Hygienist Recall"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:168
-msgid "User 1(required)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:107
+msgid "hygienist recall period (months)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:169
-msgid "User 2 (optional)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:109
+msgid "Next Recall"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:170
-msgid "Surgery Machine"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "Post"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:171
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:75
-msgid "Reception Machine"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:125
+msgid "Recall method"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:173
-msgid "change"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:34
+msgid "Select an Assitant"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:74
-msgid "Please set the Surgery Number"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:43
+msgid "No Assistant"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:76
-msgid "Surgery One"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:38
+msgid "Apply Saved Address"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:77
-msgid "Surgery Two"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:46
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:48
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
+msgid "Address 1"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:78
-msgid "Surgery Three"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:47
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
+msgid "Address 2"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:79
-msgid "Surgery Four"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:51
+msgid "Post Code"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:80
-msgid "Surgery Five"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:52
+msgid "Home Telephone"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:81
-msgid "Surgery Six"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:78
+msgid "Existing"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:152
-msgid "ToothId"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:151
+msgid "No previous address details found"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:153
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:352
-msgid "Pocketing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:99
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:188
+msgid "Abandon Changes?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:155
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:352
-msgid "Plaque"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:46
+msgid "Begin Make Appointment Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:156
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:352
-msgid "Recession"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:49
+msgid "Please set criteria for making this appointment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:157
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:354
-msgid "Furcation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:57
+msgid "When to Look"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:158
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:353
-msgid "Suppuration"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:63
+msgid "Find First Available Appointment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:159
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:355
-msgid "Mobility"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:67
+msgid "7 Days Hence"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:161
-msgid "Copy &All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:69
+msgid "After Patient's last appointment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:162
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:164
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:226
-msgid "delete tooth data"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:77
+msgid "Day or Week Graphical View"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:163
-msgid "Cp"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:92
+msgid "Clinician selection policy"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:165
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:247
-msgid "Apply and move Back a tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:97
+msgid "Specified Clinician"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:166
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:252
-msgid "Apply & Move to Next Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:99
+msgid "Any Dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:168
-msgid "I"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:100
+msgid "Any Hygienist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:169
-msgid "II"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:102
+msgid "Any Clinician"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:170
-msgid "III"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:113
+msgid "Emergency time management"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:227
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:371
-msgid "ADD COMMENTS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:115
+msgid "Ignore Emergency Spaces"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:228
-msgid "!KUO"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:124
+msgid "Look for appointments on these days"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:229
-msgid "!Mobile Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:132
+msgid "Look for Joint Appointments with the hygienist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:230
-msgid "!Early Caries"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:142
+msgid "Search Now"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:231
-msgid "!Filling Missing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:195
+msgid "begin making appointment for patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:232
-msgid "!Chipped"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:58
+msgid "No patient chosen!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:233
-msgid "!Cracked"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:101
+msgid "Start is outwith slot bounds (too early)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:234
-msgid "!Poor Prognosis"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:104
+msgid "Start is outwith slot bounds (too late)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:235
-msgid "!Extract Soon"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:107
+msgid "Finish is outwith slot bounds (too late"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:236
-msgid "!Implant required"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:110
+msgid "Finish is outwith slot bounds (too early"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:237
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:373
-msgid "DELETE COMMENTS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:112
+msgid "length of appointment is too short"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:238
-msgid "AM"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:115
+msgid "no reason for the block given"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:239
-msgid "CO"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1779
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:96
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:119
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:211
+msgid "no patient selected"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:240
-msgid "GL"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:124
+msgid "Unable to commit because"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:242
-msgid "Po"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:142
+msgid "patient not found"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:243
-msgid "extract (plan only!)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:152
+msgid "Chosen Patient is"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:244
-msgid "EX"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:154
+msgid "no patient chosen"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:245
-msgid "root treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:43
+msgid "Bridge Treatment Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:246
-msgid "RT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:51
+msgid "Plan a New Bridge"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:248
-msgid "porcelain veneer"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:53
+msgid "Recement/Repairs"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:249
-msgid "DR"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:36
+msgid "Fissure Sealant"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:250
-msgid "Apply & Add Another Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:37
+msgid "PRR restoration with composite"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:251
-msgid "&&"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:41
+msgid "Pulp Extirpation - 1 canal"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:80
-msgid "Tooth Property Editor"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:42
+msgid "Pulp Extirpation - multiple canals"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:81
-msgid "UR8"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:43
+msgid "Root Canal"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:82
-msgid "Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:44
+msgid "Incomplete Endodontics"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:83
-msgid "Database Line"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:48
+msgid "Extraction"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/contract_gui_module.py:120
-msgid "erroneous exemption category entered"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:49
+msgid "Surgical Extraction"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:121
-msgid "Out Of Office"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:50
+msgid "Apicectomy"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
-msgid "Made"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:61
+msgid "Chart Treatment Choice Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
-msgid "at"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:78
+msgid "Show Treatments from all feescales"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:683
-msgid "Made on"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:106
+msgid "No Matching items to show. Perhaps this is due to the feescale for this patient?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:734
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:773
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:373
-msgid "Load Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:126
+msgid "No items of this type have found in any feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:737
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:776
-msgid "Add/Edit Memo"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:85
+msgid "ToothBrushing Instruction Given"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:740
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:777
-msgid "Cancel Appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:88
+msgid "Dietary Advice Given"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:744
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:784
-msgid "Clear Block"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:91
+msgid "Fluoride Varnish Applied"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:748
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:795
-msgid "Block or use this space"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:93
+msgid "Fee claimable for patients betwen 2 and 5"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:751
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:779
-msgid "Print A Medical Form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:126
+msgid "Please enter a valid postcode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
-msgid "Bad Time Sequence!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:138
+msgid "KNOWN SIMD"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
-msgid "Whoops!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:145
+msgid "Polling website with Postcode"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:148
-msgid "Public Holidays"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:161
+msgid "Error polling website"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:149
-msgid "Enter the information for "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:164
+msgid "Timeout polling website"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:455
-msgid "DATE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:168
+msgid "RESULT"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:722
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:729
-msgid "Edit day memos"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:186
+msgid "Manual Input Required"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:723
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:731
-msgid "Edit Public Holiday information"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:188
+msgid "Online lookup has failed, please enter the SIMD manually"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:314
-msgid "Toggle Deciduous State"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:34
+msgid "Select a Clinician"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:328
-msgid "Delete All Restorations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:43
+msgid "NONE"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:334
-msgid "Add Comments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:84
+msgid "Set assistant as"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:338
-msgid "Show History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:38
+msgid "Close Course Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:476
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:249
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/chart_widget.py:220
-msgid "Left"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:47
+msgid "You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:479
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:252
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/chart_widget.py:223
-msgid "Right"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:58
+msgid "Suggested Completion Date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
-msgid "Are you Sure"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:62
+msgid "Close this course now?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:133
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:162
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:83
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:117
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:290
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:360
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:73
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1386
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:187
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:139
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:164
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:528
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:565
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:352
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:470
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:629
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3100
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:216
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:404
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:420
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:76
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:409
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:108
-msgid "Confirm"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:65
+msgid "Pt failed to return"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:52
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:80
-msgid "Browsing Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:45
+msgid "Complete Multiple Treatments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:74
-msgid "Scheduling Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:48
+msgid "You have selected multiple treatments."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:76
-msgid "Blocking Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:49
+msgid "Please complete, reverse or delete then apply changes."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:78
-msgid "Notes Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:110
+msgid "Complete All"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:393
-msgid "completed already"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:113
+msgid "Reverse All"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:397
-msgid "There are multiple treatments associated with this estimate item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:42
+msgid "Course Daybook Estimate Checker"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:400
-msgid "All must be completed for the full charge to be applied"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:45
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:51
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:50
+msgid "Polling Database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:402
-msgid "information"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:56
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:70
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:78
+msgid "No advanced options available"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:419
-msgid "Delete examination from this treatment plan and estimate?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:59
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:70
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:77
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:88
+msgid "message"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:69
-msgid "CSET"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:41
+msgid "Edit Treatment Course"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:113
-msgid "Planned Items Total"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:96
+msgid "acceptance date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:114
-msgid "Interim Charges"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:99
+msgid "completion date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:115
-msgid "Completed Items Total"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:102
+msgid "Set completion date to match Acceptance date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:116
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:196
-msgid "TOTAL"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:106
+msgid "Add Completion Date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:373
-msgid "from treatment plan and estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:111
+msgid "exam date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:101
-msgid "Open the patient's diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:113
+msgid "No Exam Date on this course"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:105
-msgid "Launch the Appointment Wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:128
+msgid "Bad Date Sequence"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:109
-msgid "Previous appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:40
+msgid "Options Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:113
-msgid "Next available appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:41
+msgid "What do you wish to show?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:202
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:305
-msgid "No patient Selected"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:44
+msgid "Include Estimates"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:427
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:133
-msgid "error"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:48
+msgid "Include Daybook"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:428
-msgid "No patient selected"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:52
+msgid "Leave both unchecked for courses only"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:450
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:222
-msgid "Close"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:46
+msgid "Merge Treatment Courses"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:42
-msgid "Mark the selected tooth as missing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:52
+msgid "Preview Merged Course"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:46
-msgid "Mark the selected tooth as artificial"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:84
+msgid "Courses can't be merged, both have examinations"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:50
-msgid "Mark the selected tooth as root present"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:86
+msgid "Merged Course Preview"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:54
-msgid "Permanent Tooth Also Present"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:36
+msgid "Porcelain Jacket"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:58
-msgid "Supernumary Tooth Present"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:37
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:37
+msgid "Gold"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:62
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:70
-msgid "Mark the selected tooth as partially erupted"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:38
+msgid "Porcelain/Metal"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:66
-msgid "Mark the selected tooth as over erupted"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:39
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:39
+msgid "Lava"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:74
-msgid "Toggle selected tooth/teeth as deciduous"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:40
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:40
+msgid "Opalite"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:272
-msgid "Toggle Pin Retention for current Filling"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:41
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:41
+msgid "Emax"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:290
-msgid "Crowns"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:42
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:42
+msgid "Everest"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:291
-msgid "Posts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:43
+msgid "Stainless"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:292
-msgid "Bridges"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:43
+msgid "Resin"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:293
-msgid "Implants"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:59
+msgid "Crown Choice Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:294
-msgid "Fissure Sealants"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:77
+msgid "Show Crowns types from all feescales"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:295
-msgid "Endodontics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:82
+msgid "Inspecting daybook row"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:296
-msgid "Surgical Tx"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:56
+msgid "Diagnosis"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:37
-msgid "Account Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:58
+msgid "Anaesthetics"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:38
-msgid "Please Choose the tone of this letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:59
+msgid "Misc"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:41
-msgid "Normal Account - Very Polite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:64
+msgid "Other Treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:42
-msgid "Mildly assertive request"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:65
+msgid "Chart Treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:44
-msgid "Threaten with Debt Collector"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:47
+msgid "Update the daybook row with these new Totals"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:75
-msgid "Complete Treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:49
+msgid "Update the daybook row with Fee Total Only"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:76
-msgid "What treatment has been performed?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:51
+msgid "Update the daybook row with Charge Total Only"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
-msgid "Forename"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:53
+msgid "Delete this row from the daybook"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
-msgid "dob"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:90
+msgid "Ok"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:38
-msgid "POSTCODE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:123
+msgid "No Information found in estimates for this daybook item"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:48
-msgid "Address Matches"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:148
+msgid "Fee Differs"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:81
-msgid "Top 12 address matches for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:150
+msgid "Charge Differs"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:100
-msgid "Advanced Treatment Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:157
+msgid "Successfully applied changes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:108
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:132
-msgid "Planned Text"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:177
+msgid "No changes made"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:111
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:135
-msgid "Completed Text"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:163
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:169
+msgid "Successfully applied change"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:117
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:141
-msgid "Field"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:175
+msgid "Successfully deleted row"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:170
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:195
-msgid "Show Chart Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:43
+msgid "Denture Treatment Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:193
-msgid "Hide Chart Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:51
+msgid "Plan New Denture(s)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:150
-msgid "Clinician Times"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:53
+msgid "Alter an Existing Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:170
-msgid "values from"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:91
+msgid "Openmolar Documents Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:49
-msgid "Alter Cashbook Entry"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:95
+msgid "Please choose a document to open"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:70
-msgid "Patient Number"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:101
+msgid "For help configuring this feature, see"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:71
-msgid "Patient Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:112
+msgid "You have no documents stored in"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:74
-msgid "Payment Type"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:136
+msgid "docs.xml is not parseable"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:88
-msgid "Enable Full Edit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:170
+msgid "Error opening PDF file"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:52
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:55
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:54
-msgid "Choose from the following options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:51
+msgid "Duplicate receipts for Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:76
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:79
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:78
-msgid "You haven't completed this option"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:56
+msgid "No previous receipts found!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:94
-msgid "What are you Modifying?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:59
+msgid "Reprint an existing receipt"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:97
-msgid "An existing Upper Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:66
+msgid "Generate a Duplicate receipt"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:99
-msgid "An existing Lower Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:126
+msgid "show"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:174
-msgid "What best describes the denture type?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:972
+msgid "error reviewing PDF file"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:176
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:160
-msgid "Acrylic Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:178
+msgid "Professional Services"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:177
-msgid "Metal Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:184
+msgid "duplicate receipt for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:205
-msgid "Please select teeth to be added to this denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:42
+msgid "Edit Practice Address Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:251
-msgid "How Many Clasps?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:45
+msgid "Edit the Practice Name and/or address."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:281
-msgid "Does this work require the taking of an impression?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:46
+msgid "This information is used on receipts and appointment slips."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:314
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:230
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:257
-msgid "You have completed your input."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:54
+msgid "Practice Name"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:315
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:231
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:258
-msgid "Please click on Apply"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:60
+msgid "Address Line"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:325
-msgid "Alterations to an existing Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:86
+msgid "Delete the currently selected Centre"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:359
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:133
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:299
-msgid "Upper Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:91
+msgid "Add a New Centre"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:360
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:134
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:300
-msgid "Lower Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:110
+msgid "Greeting"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:365
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:270
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:305
-msgid "Next"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:228
+msgid "Example Referral Centre"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:385
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:69
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:103
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:288
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:325
-msgid "Whoops"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:229
+msgid "Dear Sir/Madam"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:440
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:451
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:377
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:387
-msgid "Warning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:229
+msgid "My Local Hospital"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:441
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:378
-msgid "Your upper denture input is invalid"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:230
+msgid "Main Street"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:452
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:388
-msgid "Your lower denture input is invalid"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:230
+msgid "My Town"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_todays_notes.py:56
-msgid "Open Phrasebook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:245
+msgid "You should have at least one referral centre in the database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:43
-msgid "Appointment Card for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:39
+msgid "Edit Treatment Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:49
-msgid "Include Today's appointments?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:44
+msgid "Option"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:106
-msgid "No appointments to print!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:46
+msgid "Edit Completed items?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:47
-msgid "User choice"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:47
+msgid "Choosing 'NO' will offer edit of planned items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:49
-msgid "Set the Appointment Viewing Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:54
+msgid "Planned Items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:53
-msgid "Browsing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:57
+msgid "Completed Items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:58
-msgid "Scheduling"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:89
+msgid "No Advanced Options"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:59
-msgid "make appointments for a patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:70
+msgid "Inspecting estimate for Course Number"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:63
-msgid "Blocking"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:117
+msgid "Apply Changes?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:64
-msgid "block time periods. eg. lunch times etc."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:68
+msgid "Please enter the examining Dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:68
-msgid "Note Checking"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:87
+msgid "is now both the registered and course dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:69
-msgid "check notes for today's patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:88
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:105
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:542
+msgid "Is this correct?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:63
-msgid "Appointment Preferences for Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:89
+msgid "confirming this will remove reference to"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:68
-msgid "Recall Patient Periodically"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:104
+msgid "performed this exam"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:72
-msgid "Dentist Recall"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:109
+msgid "confirming this will change the course dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:87
-msgid "dentist recall period (months)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:110
+msgid "but not the registered dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:89
-msgid "Next Recall Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:114
+msgid "consider making"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:90
-msgid "Shortcuts (months from today)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:116
+msgid "the registered dentist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:94
-msgid "Hygienist Recall"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:142
+msgid "You already have a completed exam on this course of treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:107
-msgid "hygienist recall period (months)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:144
+msgid "Unable to perform exam"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:109
-msgid "Next Recall"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:152
+msgid "Examination not applied"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
-msgid "Post"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:188
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:145
+msgid "performed by"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:125
-msgid "Recall method"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:197
+msgid "Not updating recall due to patient's recall settings"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:34
-msgid "Select an Assitant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
+msgid "Address 3"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:43
-msgid "No Assistant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
+msgid "TOWN"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:38
-msgid "Apply Saved Address"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:104
+msgid "Add Record"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:46
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:48
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
-msgid "Address 1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:105
+msgid "to this family group?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:47
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
-msgid "Address 2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:125
+msgid "Which address should be used?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:51
-msgid "Post Code"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:167
+msgid "Synchronise Addresses"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:52
-msgid "Home Telephone"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:171
+msgid "Standard Search"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:78
-msgid "Existing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:174
+msgid "Address Search"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:151
-msgid "No previous address details found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:178
+msgid "Delete this group"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:133
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:185
-msgid "Abandon Changes?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:183
+msgid "Add members"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:46
-msgid "Begin Make Appointment Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:188
+msgid "Manage Group"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:49
-msgid "Please set criteria for making this appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:204
+msgid "Manage Family Group"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:57
-msgid "When to Look"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
+msgid "from group"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:63
-msgid "Find First Available Appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:257
+msgid "Unlink"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:67
-msgid "7 Days Hence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:272
+msgid "This patient does not belong to any family group."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:69
-msgid "After Patient's last appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:274
+msgid "Create a New Family Group"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:77
-msgid "Day or Week Graphical View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:277
+msgid "Show similar addresses"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:92
-msgid "Clinician selection policy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:293
+msgid "Remove"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:97
-msgid "Specified Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:294
+msgid "from this family group?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:99
-msgid "Any Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:333
+msgid "Addresses are all identical - nothing to do!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:100
-msgid "Any Hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:340
+msgid "Address(es) updated"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:102
-msgid "Any Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:362
+msgid "Delete this family group?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:113
-msgid "Emergency time management"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:61
+msgid "warning"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:115
-msgid "Ignore Emergency Spaces"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:62
+msgid "You have no patients in your database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:124
-msgid "Look for appointments on these days"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:89
+msgid "no match found"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:132
-msgid "Look for Joint Appointments with the hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:116
+msgid "Serialno"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:142
-msgid "Search Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:121
+msgid "Birth Date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:195
-msgid "begin making appointment for patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:122
+msgid "Address Line 1"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/block_wizard.py:111
-msgid "applying changes for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:123
+msgid "Address Line 2"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:58
-msgid "No patient chosen!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:126
+msgid "Tel1"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:109
-msgid "Start is outwith slot bounds (too early)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:127
+msgid "Tel2"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:112
-msgid "Start is outwith slot bounds (too late)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:166
+msgid "Mobile"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:115
-msgid "Finish is outwith slot bounds (too late"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:154
+msgid "Load the Selected Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:118
-msgid "Finish is outwith slot bounds (too early"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:103
+msgid "This Dialog will help you"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:120
-msgid "length of appointment is too short"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:104
+msgid "secure openmolar with a password"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:123
-msgid "no reason for the block given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:105
+msgid "note the location of your mysql/mariadb server"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:126
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:113
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1686
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:112
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:135
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:206
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:227
-msgid "no patient selected"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:106
+msgid "install a blank database schema if required."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:132
-msgid "Unable to commit because"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:107
+msgid "save a settings file so you do not have to endure this again!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:150
-msgid "patient not found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:111
+msgid "Click Next to continue, or Quit to leave OpenMolar now."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:160
-msgid "Chosen Patient is"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:119
+msgid "This appears to be your first running of OpenMolar."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:162
-msgid "no patient chosen"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:120
+msgid "We need to save a few settings to continue."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:43
-msgid "Bridge Treatment Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:129
+msgid "You may wish to enter a password which will hereafter be required to login to the OpenMolar application"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:51
-msgid "Plan a New Bridge"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:131
+msgid "This password will help prevent an unauthorised person accessing any sensitive data."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:53
-msgid "Recement/Repairs"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:133
+msgid "If your data is simply demonstration data, this can be left blank"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:36
-msgid "Fissure Sealant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:141
+msgid "Show Passwords"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:37
-msgid "PRR restoration with composite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:142
+msgid "Password"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:41
-msgid "Pulp Extirpation - 1 canal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:143
+msgid "Confirm Password"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:42
-msgid "Pulp Extirpation - multiple canals"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:152
+msgid "Step 1 - Set a password for OpenMolar"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:43
-msgid "Root Canal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:171
+msgid "Passwords don't match!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:44
-msgid "Incomplete Endodontics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:179
+msgid "OpenMolar is simply a database client."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:48
-msgid "Extraction"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:180
+msgid "It requires a database server such as MySQL or MariaDB."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:49
-msgid "Surgical Extraction"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:181
+msgid "Please enter the hostname and port number where your server can be reached."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:50
-msgid "Apicectomy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:186
+msgid "If you do not have a mysql/mariadb server on your computer or local network, please quit this setup, and install one now!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:61
-msgid "Chart Treatment Choice Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:189
+msgid "Make a note of the root password you create during this set up."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:78
-msgid "Show Treatments from all feescales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:201
+msgid "Host"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:106
-msgid "No Matching items to show. Perhaps this is due to the feescale for this patient?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:202
+msgid "Port"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:126
-msgid "No items of this type have found in any feescale"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:212
+msgid "Step 2 - Where is your database server?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:85
-msgid "ToothBrushing Instruction Given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:330
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:394
+msgid "The Following errors were found"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:88
-msgid "Dietary Advice Given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:236
+msgid "Host Field is Blank"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:91
-msgid "Fluoride Varnish Applied"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:238
+msgid "Port Field is Blank"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:93
-msgid "Fee claimable for patients betwen 2 and 5"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:240
+msgid "Port Field must be a number. Default is 3306"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:126
-msgid "Please enter a valid postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:252
+msgid "Do you already have an openmolar database on this server?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:138
-msgid "KNOWN SIMD"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:253
+msgid "If not, you should lay out one now."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:145
-msgid "Polling website with Postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:259
+msgid "Create a database user and install a blank (demo) Database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:161
-msgid "Error polling website"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:261
+msgid "Use an existing database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:164
-msgid "Timeout polling website"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:269
+msgid "Step 3 - select a database option"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:168
-msgid "RESULT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:284
+msgid "Please enter connection criteria for the database."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:186
-msgid "Manual Input Required"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:285
+msgid "If the user and/or database does not exist, you will be given an opportunity to create them "
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:188
-msgid "Online lookup has failed, please enter the SIMD manually"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:298
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:364
+msgid "Show Password"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:34
-msgid "Select a Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:300
+msgid "Database Name"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:43
-msgid "NONE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:301
+msgid "(mysql) user"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:84
-msgid "Set assistant as"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:302
+msgid "(mysql) password"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:47
-msgid "Complete Multiple Treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:310
+msgid "Step 5(a) - Your Database Details"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:50
-msgid "You have selected multiple treatments."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:332
+msgid "Database Name Field is Blank"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:51
-msgid "Please complete, reverse or delete then apply changes."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:334
+msgid "User Field is Blank"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:67
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:57
-msgid "Planned"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:336
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:398
+msgid "Password Field is Blank"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:112
-msgid "Complete All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:346
+msgid "To create a database, and set the privileges for user, OpenMolar must log into mysql as a privileged mysql user."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:115
-msgid "Reverse All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:348
+msgid "OpenMolar does NOT store this username or password."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:36
-msgid "Porcelain Jacket"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:352
+msgid "Please enter the username and password of a privileged mysql user."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:37
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:37
-msgid "Gold"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:354
+msgid "(note - on most mysql setups, login by 'root' is only allowed on localhost)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:38
-msgid "Porcelain/Metal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:366
+msgid "Privileged user"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:39
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:39
-msgid "Lava"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:367
+msgid "Password for this user"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:40
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:40
-msgid "Opalite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:375
+msgid "Step 5b - Create an authenticated user and database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:41
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:41
-msgid "Emax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:396
+msgid "Privileged User Field is Blank"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:42
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:42
-msgid "Everest"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:408
+msgid "Creating Database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:43
-msgid "Stainless"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:417
+msgid "Step 6 - Create Database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:44
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:43
-msgid "Resin"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:447
+msgid "A database named"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:59
-msgid "Crown Choice Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:449
+msgid "exists already"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:77
-msgid "Show Crowns types from all feescales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:450
+msgid "Overwrite this database?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:43
-msgid "Denture Treatment Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:480
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:524
+msgid "Success!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:51
-msgid "Plan a New Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:481
+msgid "Database created successfully!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:53
-msgid "Alter an Existing Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:487
+msgid "Error Creating Database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:91
-msgid "Openmolar Documents Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:496
+msgid "Testing connection"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:95
-msgid "Please choose a document to open"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:503
+msgid "Final Step - Test Connection & Write Config File"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:101
-msgid "For help configuring this feature, see"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:525
+msgid "The Database accepted the connection"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:112
-msgid "You have no documents stored in"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:534
+msgid "Warning!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:136
-msgid "docs.xml is not parseable"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:535
+msgid "The Database refused the connection"
 msgstr ""
 
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:170
-msgid "Error opening PDF file"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:546
+msgid "First Run Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:51
-msgid "Duplicate receipts for Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:579
+msgid "Back"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:56
-msgid "No previous receipts found!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:584
+msgid "Quit OpenMolar"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:59
-msgid "Reprint an existing receipt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:604
+msgid "Create Database Now!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:66
-msgid "Generate a Duplicate receipt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:606
+msgid "Write Config File and Proceed"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:165
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:899
-msgid "error reviewing PDF file"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:38
+msgid "Form options"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:178
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:98
-msgid "Professional Services"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:48
+msgid "use test mode (print boxes)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:184
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:102
-msgid "duplicate receipt for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:50
+msgid "use a background image for the form (if available)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:68
-msgid "Please enter the examining Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:74
+msgid "Prior Approval"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:87
-msgid "is now both the registered and course dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:96
+msgid "GP17 Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:88
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:103
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:528
-msgid "Is this correct?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:98
+msgid "Print a GP17 Form"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:89
-msgid "confirming this will remove reference to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:110
+msgid "Use this dentists stamp?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:102
-msgid "performed this exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:115
+msgid "Chart"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:107
-msgid "confirming this will change the course dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:119
+msgid "Completion Date"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:108
-msgid "but not the registered dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:589
+msgid "Treatments"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:112
-msgid "consider making"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:122
+msgid "Include Chart Details"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:114
-msgid "the registered dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:129
+msgid "Include Course Details"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:135
-msgid "You already have a completed exam on this course of treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:51
+msgid "WARNING - THE FOLLOWING TREATMENTS ARE ALREADY PLANNED."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:137
-msgid "Unable to perform exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:102
+msgid "Please enter a dentist / hygienist"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:144
-msgid "Examination not applied"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:36
+msgid "Titanium Implant"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:180
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:145
-msgid "performed by"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:37
+msgid "Implant Abutment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:188
-msgid "WARNING - Not updating recall due to patients recall settings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:38
+msgid "Implant Crown"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
-msgid "Address 3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:39
+msgid "Implant Bridge Retainer"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
-msgid "TOWN"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:40
+msgid "Implant Bridge Pontic"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:104
-msgid "Add Record"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:54
+msgid "Implant Choice Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:105
-msgid "to this family group?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:42
+msgid "Initial Check Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:125
-msgid "Which address should be used?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:45
+msgid "OpenMolar has found the following issues with your database."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:167
-msgid "Synchronise Addresses"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:50
+msgid "No Advanced options"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:171
-msgid "Standard Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:56
+msgid "Proceed"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:174
-msgid "Address Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:76
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:82
+msgid "How do I Fix This?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:178
-msgid "Delete this group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:78
+msgid "Your database contains no dentists"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:183
-msgid "Add members"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:85
+msgid "Your practice name is"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:188
-msgid "Manage Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:94
+msgid "Why is this?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:204
-msgid "Manage Family Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:96
+msgid "You have no appointment space in your diary!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
-msgid "from group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:105
+msgid "The cbcodes table in your database is inadequate."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:255
-msgid "Unlink"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:106
+msgid "This will create problems when accepting payments."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:270
-msgid "This patient does not belong to any family group."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:112
+msgid "patients"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:272
-msgid "Create a New Family Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:112
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:118
+msgid "you have"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:275
-msgid "Show similar addresses"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:115
+msgid "active dentists"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:291
-msgid "Remove"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:118
+msgid "active hygienists"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:292
-msgid "from this family group?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:121
+msgid "appointment search final date is"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:330
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:337
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/feescale_tester.py:169
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:252
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:446
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:264
-msgid "Information"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:126
+msgid "Once the application is open, click on Tools - > Menu - > Add Clinician"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:331
-msgid "Addresses are all identical - nothing to do!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:130
+msgid "Once the application is open, click on Tools - > Menu - > Edit Practice Details"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:338
-msgid "Address(es) updated"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:134
+msgid "This could be for a variety of reasons"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:361
-msgid "Delete this family group?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:135
+msgid "You need to have at least one clinician with an appointment book"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:83
-msgid "no match found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:137
+msgid "No Clinicians have any days contracted to work in the practice?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:38
-msgid "Form options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:139
+msgid "Perhaps all future clinical time is already booked?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:48
-msgid "use test mode (print boxes)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:140
+msgid "The BOOKEND value (last day to search for appointments) may simply need adjusting"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:50
-msgid "use a background image for the form (if available)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:52
+msgid "Default"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:74
-msgid "Prior Approval"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:67
+msgid "You have selected to connect to"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:96
-msgid "GP17 Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:69
+msgid "This is not the default database - are you sure you wish to use this database?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:98
-msgid "Print a GP17 Form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:96
+msgid "Login Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:110
-msgid "Use this dentists stamp?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:98
+msgid "Login Required"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:115
-msgid "Chart"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:108
+msgid "Surgery Machine"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:120
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:585
-msgid "Treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:114
+msgid "System Password"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:122
-msgid "Include Chart Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:116
+msgid "User 1 (Required)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:129
-msgid "Include Course Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:117
+msgid "User 2 (Optional)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:51
-msgid "WARNING - THE FOLLOWING TREATMENTS ARE ALREADY PLANNED."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:141
+msgid "Database choice"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:102
-msgid "Please enter a dentist / hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:162
+msgid "Are you sure you wish to cancel the login process?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:36
-msgid "Titanium Implant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:181
+msgid "Unable to Run OpenMolar"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:37
-msgid "Implant Abutment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:182
+msgid "Good Bye!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:38
-msgid "Implant Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:293
+msgid "Login Error"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:39
-msgid "Implant Bridge Retainer"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:295
+msgid "Incorrect"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:40
-msgid "Implant Bridge Pontic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:296
+msgid "User/password combination!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:54
-msgid "Implant Choice Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:297
+msgid "Please Try Again."
 msgstr ""
 
 #:
@@ -6128,47 +6831,62 @@ msgid "Chart/Plan a Bridge"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:98
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:99
 msgid "Complete Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:100
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:101
 msgid "Partial Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:161
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:138
+msgid "New UPPER Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:140
+msgid "New LOWER Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:143
+msgid "Complete Upper AND Lower Acrylic Dentures"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:191
 msgid "Chrome Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:162
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:192
 msgid "Flexible Denture"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:184
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:221
 msgid "Please select teeth which this denture is to replace"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:226
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:263
 msgid "You may wish to add the following optional items"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:229
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:265
 msgid "Special Tray"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:230
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:266
 msgid "Soft Lining"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:268
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:304
 msgid "Add A New Denture To The Treatment Plan"
 msgstr ""
 
@@ -6218,6 +6936,62 @@ msgid "unusual payments"
 msgstr ""
 
 #:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:48
+msgid "Raise Permissions Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:50
+msgid "Supervisor privileges required to perform this action"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:51
+msgid "Please enter the supervisor password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:58
+msgid "Supervisor Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:786
+msgid "whoops"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:80
+msgid "incorrect supervisor password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:96
+msgid "New Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:97
+msgid "Confirm New Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:109
+msgid "new passwords didn't match"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:117
+msgid "password changed successfully"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:119
+msgid "Password unchanged"
+msgstr ""
+
+#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:38
 msgid "Cast Precious Metal"
 msgstr ""
@@ -6258,22 +7032,53 @@ msgid "Dentist choice (leave unchecked for all)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:42
-msgid "What's changed?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:42
+msgid "Recall Prompt Dialog"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:53
-msgid "Discard All Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:48
+msgid "There is a problem with the recall date of this patient."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:49
+msgid "Would you like to fix this now?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:53
+msgid "Fix"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:57
+msgid "Ignore Recall Date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:58
+msgid "Ignore this for now."
 msgstr ""
 
 #:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:60
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:55
 msgid "Cancel and Continue Editing"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:74
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:43
+msgid "What's changed?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:53
+msgid "Discard All Changes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:76
 msgid "Are you sure you want to discard these changes?"
 msgstr ""
 
@@ -6397,148 +7202,171 @@ msgstr ""
 msgid "click to promote Item - "
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:205
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:219
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:329
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:206
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:193
 msgid "advisory"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:387
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:401
 msgid "Please select an appointment to schedule"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:391
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:405
 msgid "appointment already scheduled for"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:461
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:475
 msgid "Reached"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:463
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:477
 msgid "which is specified as the book end point"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:512
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:526
 msgid "Please select an appointment to place here"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:516
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:530
 msgid "Please choose another appointment - this one is made already!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:526
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:540
 msgid "You have chosen an appointment with"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:555
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:569
 msgid "Confirm Make appointment for"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:602
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:616
 msgid "Error putting appointment back into patient diary"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:610
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:624
 msgid "more appointments to schedule"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:617
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:631
 msgid "Error making appointment - sorry!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:618
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:632
 msgid "It is most likely that another user utilised this space."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:620
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:634
 msgid "Please try again."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:819
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:817
 msgid "This date is beyond the diary limit."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:820
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:818
 msgid "If the appointment wizard has brought you here"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:822
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:820
 msgid "you should search again with different criteria."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:824
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:822
 msgid "for instance..."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:825
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:823
 msgid "no excluded days"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:826
-msgid "ignore emergencies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:824
+msgid "ignore emergencies"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:825
+msgid "add or view more clinicians."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:829
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:973
+msgid "You can't schedule an appointment in the past"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:835
+msgid "No matching appointments found"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1234
+msgid "No books to show!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:827
-msgid "add or view more clinicians."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1351
+msgid "multiple appointments selected, unable to edit memo"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:831
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:975
-msgid "You can't schedule an appointment in the past"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1358
+msgid "unable to locate appointment memo, sorry"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:837
-msgid "No matching appointments found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1362
+msgid "New Memo"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1236
-msgid "No books to show!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1363
+msgid "Please enter Memo for this appointment"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1382
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:414
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1383
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:417
 msgid "Confirm Delete appointment at"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1384
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:418
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1385
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:421
 msgid "with"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1407
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:435
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1410
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:438
 msgid "Removed from appointment book - keep for rescheduling?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1413
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:393
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:441
-msgid "Sucessfully removed appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:396
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:444
+msgid "Successfully removed appointment"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1416
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:443
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1419
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:446
 msgid "Error removing from patient diary"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1421
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1424
 msgid "Error Removing from Appointment Book"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1434
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1437
 msgid "Do you want to unblock the selected slot?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1463
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1469
 msgid "unable to block - has the book been altered elsewhere?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1481
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1488
 msgid "unable to make appointment - has the book been altered elsewhere?"
 msgstr ""
 
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1642
+msgid "Public Holidays"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1643
+msgid "Enter the information for "
+msgstr ""
+
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/cashbook_module.py:73
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:137
@@ -6546,72 +7374,88 @@ msgid "bad date sequence"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:56
 msgid "Please save the old course changes before continuing"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:65
 msgid "It looks as if another user is starting a course of treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:67
 msgid "Please allow this other user to commit their changes then reload this record before continuing."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:69
 msgid "If you are seeing this message and are sure no other user is using this record, use menu->tools->Fix Locked New Course of Treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:79
 msgid "unable to plan or perform treatment if the patient does not have an active course"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:139
-msgid "Sucessfully started new course of treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:144
+msgid "Successfully started new course of treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:140
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:145
 msgid "Using Feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:188
-msgid "are you sure you wish to close this course of treatment?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:176
+msgid "Appointment Preferences Applied"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:219
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:238
 msgid "Resume the previous course of treatment?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:240
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:258
 msgid "no zombied course found"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:243
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:261
 msgid "a situation COULD arise where a new course was started but the client lost connectivity crashed (without cleaning up the temporary row in the currtrtmt2 table)"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:246
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:265
 msgid "Do you wish to recover this row now?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:247
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:278
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:269
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:282
 msgid "question"
 msgstr ""
 
 #:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:143
+msgid "polling database..."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:151
+msgid "Bad Query"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:154
+msgid "Unknown Error"
+msgstr ""
+
+#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:175
 msgid "Usercode"
 msgstr ""
@@ -6632,57 +7476,57 @@ msgid "Charge to Patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:151
 msgid "error applying payment.... sorry!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:152
 msgid "This shouldn't happen - please report as an urgent bug"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:238
 msgid "Add to tx plan"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:240
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:246
 msgid "Add to tx plan of patient"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:279
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:285
 msgid "Items containing"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:285
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:291
 msgid "phrase not found in feetable"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:287
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:293
 msgid "itemcodes"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:289
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:295
 msgid "usercodes or descriptions"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:303
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:309
 msgid "IN CURRENT USE"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:316
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:322
 msgid "fee table error"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:352
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:358
 msgid "changed patients status to BAD DEBT"
 msgstr ""
 
@@ -6702,185 +7546,180 @@ msgid "as a complex code for the following attributes."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:142
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:171
 msgid "was not found in the patient's default feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:144
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:173
 msgid "It is matched in another feescale -"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:147
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:172
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:176
 msgid "Shall we add this item from this feescale?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:231
-msgid "WARNING"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:236
 msgid "treatment"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:238
 msgid "has not been succesfully priced"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:235
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:239
 msgid "Please edit the estimate manually"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:279
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:283
 msgid "Were these xrays taken today?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:377
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:424
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:381
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:428
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:93
 msgid "Cancel"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:419
 msgid "Reverse and Delete"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:420
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:424
 msgid "Reverse"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:505
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:509
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:358
 msgid "Choose"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:506
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:510
 msgid "OK to add"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:506
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:510
 msgid "to patient attribute"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:507
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:511
 msgid "Recommended"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:508
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:512
 msgid "to overide this behaviour"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:508
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:568
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:512
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:572
 msgid "Use Feescale Method"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:509
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:513
 msgid "Cancel to abandon this addition entirely"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:511
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:515
 #: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:149
 msgid "Help"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:523
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:527
 msgid "Confirm you wish to use feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:525
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:529
 msgid "for this item"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:526
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:530
 msgid "The patient's default table is"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:559
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:563
 msgid "You appear to be adding a relatively straightforward code to the patient's treatment plan using their default feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:561
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:565
 msgid "It is normally advisable to add this code conventionally."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:562
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:566
 msgid "Would you like to do this now?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:586
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:590
 msgid "were added conventionally"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:594
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:598
 msgid "Exam items can never be added this way"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:597
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:602
 msgid "This item can not be added to the treatment plan using the feescale method, sorry"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:640
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:645
 msgid "added to estimate"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:640
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:645
 msgid "from feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:868
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:883
 msgid "Couldn't find"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:870
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:885
 msgid "in the patient's estimate"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:871
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:886
 msgid "This Shouldn't Happen!"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:933
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:951
 msgid "couldn't pass on delete message for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:999
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1019
 msgid "Estimate recalculated"
 msgstr ""
 
@@ -6925,6 +7764,7 @@ msgstr ""
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:77
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:219
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:199
 #: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:103
 msgid "Quit"
 msgstr ""
@@ -6973,12 +7813,6 @@ msgid "&Database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:156
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:111
-msgid "&Tools"
-msgstr ""
-
-#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:158
 msgid "Diffs"
 msgstr ""
@@ -7159,7 +7993,7 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:380
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:687
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:697
 msgid "File Saved"
 msgstr ""
 
@@ -7179,153 +8013,162 @@ msgid "Do you want to reload now?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:417
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:425
 msgid "unable to parse file"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:447
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:455
 msgid "You appear to have no feescales installed in your database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:465
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:473
 msgid "Local Feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:466
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:474
 msgid "differs from the database version"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:467
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:475
 msgid "Do you wish to overwrite it with the stored data?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:473
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:481
 msgid "Show Diff"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:475
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:487
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:483
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:495
 msgid "Keep Local File Unchanged"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:477
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:486
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:485
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:494
 msgid "Overwrite Local File"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:528
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:536
 msgid "feescale is well formed"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:532
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:540
 msgid "feescale is not well formed"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:539
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:547
 msgid "feescale is valid"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:587
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:595
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:338
 msgid "Find Text"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:588
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:596
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:339
 msgid "Please enter the text you wish to search for"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:596
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:604
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:347
 msgid "not found"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:630
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:638
 msgid "Zero all patient charges in the current feescale?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:638
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:646
 msgid "Save all files?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:654
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:662
 msgid "Files saved"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:669
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:678
 msgid "save as"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:670
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:679
 msgid "xml_files"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:679
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:689
 msgid "Copy saved to"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:681
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:691
 msgid "Reload files to edit the new feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:690
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:700
 msgid "File not saved"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:696
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:706
 msgid "Warning - you have unsaved changes, if you refresh now, these will be lost"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:698
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:708
 msgid "Refresh anyway?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:709
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:367
-msgid "commit all local files to database?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:719
+msgid "Please save local files before pushing to database"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:745
-msgid "whoops"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:722
+msgid "update all existing feescales with data from the local files?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:734
+msgid "Insert new Feescale"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:744
+msgid "your local files will now be moved to comply with the database indexes they have been given"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:746
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:787
 msgid "you have no other files available for comparison"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:750
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:791
 msgid "Which feescale would you like to compare with the current feescale"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:754
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:795
 msgid "Please make a choice"
 msgstr ""
 
@@ -7455,303 +8298,411 @@ msgstr ""
 msgid "Click on the Parent Item"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:188
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:187
+msgid "OFFLINE"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:205
 msgid "connected to"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:407
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:209
+msgid "CRITICAL MESSAGE"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:248
+msgid "Login Cancelled- Closing Application"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:252
+msgid "Login by"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:262
+msgid "Warning - ignoring schema check!"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:266
+msgid "database schema is up to date"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:270
+msgid "database schema is incompatible"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:283
+msgid "Sorry, you cannot run this version of the openMolar client because your database schema is more advanced."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:285
+msgid "this client requires schema version "
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:287
+msgid "but your database is at"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:289
+msgid "Please Update openMolar now"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:294
+msgid "This openMolar client has fallen behind your database schema version"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:296
+msgid "This client was written for schema version"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:298
+msgid "and your database is now at"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:300
+msgid "However, the differences are not critical, and you can continue if you wish"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:302
+msgid "It would still be wise to update this client ASAP"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:303
+msgid "Do you wish to continue?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:307
+msgid "Proceed without upgrade?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:480
 msgid "changed clinician to"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:414
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:487
 msgid "changed assistant to"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:541
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:607
 msgid "You have unsaved changes to the record of"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:797
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:814
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:857
+msgid "You have no dentists in your database."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:867
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:887
 msgid "is no longer an active dentist in this practice"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:801
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:870
 msgid "unknown contract dentist - please correct this"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:819
-msgid "unknown course dentist - please correct this"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:885
+msgid "Course dentist"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:872
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:884
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:946
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:945
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:958
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1026
 msgid "Re-open"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:873
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:885
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:946
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:959
 msgid "Do you want to review and/or reprint this item?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:904
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:977
 msgid "No information available about this document, sorry"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:913
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:987
 msgid "Date imported"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:989
 msgid "Size"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:931
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:991
+msgid "Index"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1009
 msgid "opening"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:935
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1013
 msgid "error importing file"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:937
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1519
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1015
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1610
 msgid "no file chosen"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:947
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1027
 msgid "Do you want to open a copy of this document?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:963
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1042
 msgid "error opening document"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:974
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1053
 msgid "Today's Patients"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:977
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1056
 msgid "Today's Patients (ALL)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1032
-msgid "Reached end of the List"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1112
+msgid "Reached End of Record History"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1046
-msgid "Reached Start of the List"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1126
+msgid "Reached Start Record History"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1119
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1186
 msgid "Patient already loaded"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1122
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1375
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1504
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1468
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1595
 msgid "Not loading patient"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1131
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1200
 msgid "Error populating interface"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1206
 msgid "error getting serialno"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1207
 msgid "please check this number is correct?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1235
 msgid "Reloading record"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1224
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1286
+msgid "Setting"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1288
+msgid "as patient's dentist"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1318
 msgid "Please set a Valid Course Type for this patient"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1258
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1352
 msgid "Message from"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1260
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1354
 msgid "Dated"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1352
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1446
 msgid "Active Course"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1353
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1361
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1447
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1455
 msgid "started"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1363
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1457
 msgid "completed"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1367
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1461
 msgid "Resume Existing Course"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1391
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1485
 msgid "NO CLINICIAN SET"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1393
-msgid "you are in surgery mode without a clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1487
+msgid "You are in surgery mode without a clinician"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1398
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1491
 msgid "CLINICIAN"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1402
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1495
 msgid "team"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1403
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1496
 msgid "using"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1404
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1497
 msgid "mode"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
 msgid "Miss"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
 msgid "Mr"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
 msgid "Mrs"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
 msgid "Ms"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1509
 msgid "Dr"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1509
 msgid "Master"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1509
 msgid "Professor"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1469
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1560
 msgid "NEW FORUM POSTS"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1599
 msgid "opening patient file"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1661
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1751
 msgid "POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1814
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1753
+msgid "AND"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1920
 msgid "no record selected"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1824
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1932
 msgid "FontSize"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1825
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1933
 msgid "Enter your preferred font size for appointment book"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:2416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:2121
+msgid "Moving existing treatment from plan to completed."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:2519
 msgid "use the checkboxes on the notes tab to control what is printed."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3078
-msgid "Recalculate Estimate is for active courses only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3012
+msgid "Recalculate Estimate is not normally used on closed courses"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3082
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3019
 msgid "Scrap the estimate and re-price everything?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3084
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3020
 msgid "Custom items and items added using feescale method will be unaffected"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3101
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3038
 msgid "apply an exemption to the NHS items on this estimate?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3107
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3044
 msgid "input needed"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3108
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3045
 msgid "maximum charge for the patient"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3108
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3046
 msgid "please enter the amount in pence, or leave as 0 for full exemption"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3089
 msgid "Relatives"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3153
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3092
 msgid "Family ID"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3095
 msgid "Member(s)"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3161
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3100
 msgid "No Patient Loaded"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3185
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3124
 msgid "error loading feetable"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3198
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3137
 msgid "Reloading feescales from database"
 msgstr ""
 
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3342
+msgid "New user added to login table"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3347
+msgid "Please exit any record before taking this action"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3356
+msgid "Practice Name and/or Address modified."
+msgstr ""
+
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:41
 msgid "Use details from the previous record?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:61
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:62
 msgid "Start a new family group?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:72
 msgid "Add the new patient to this family group?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:141
 msgid "Error saving new patient, sorry!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:148
 msgid "insufficient data to create a new record.please fill in all highlighted fields"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:184
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:187
 msgid "New Patient not saved."
 msgstr ""
 
@@ -7822,6 +8773,11 @@ msgid "A phrasebook for which clinician?"
 msgstr ""
 
 #:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:367
+msgid "commit all local files to database?"
+msgstr ""
+
+#:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:378
 msgid "Phrasebook"
 msgstr ""
@@ -7899,7 +8855,6 @@ msgstr ""
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:176
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:55
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:106
 msgid "Yours sincerely,"
 msgstr ""
 
@@ -7921,13 +8876,13 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:45
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:93
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:39
 msgid "We are writing to inform you that your dental examination is now due."
 msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:46
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:98
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:42
 msgid "Please contact the surgery to arrange an appointment. *"
 msgstr ""
 
@@ -7975,13 +8930,13 @@ msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/estimatePrint.py:103
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:247
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:231
 msgid "NHS items"
 msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/estimatePrint.py:104
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:248
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:232
 msgid "Private items"
 msgstr ""
 
@@ -7991,179 +8946,184 @@ msgid "Print an NHS form now?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:139
-msgid "PLEASE CHECK/COMPLETE THESE DETAILS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:122
+msgid "Confidential Medical History Questionaire"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:163
-msgid "Home tel"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:140
+msgid "PLEASE CHECK/COMPLETE THESE DETAILS"
 msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:164
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:170
-msgid "Work tel"
+msgid "Home tel"
 msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:165
-msgid "Mobile"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:171
+msgid "Work tel"
 msgstr ""
 
 #:
 #: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:167
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:170
+msgid "Email"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:168
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:171
 msgid "Alternate Email"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:186
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:187
 msgid "Please Circle"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:188
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:189
 msgid "Give Details"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:191
 msgid "ARE YOU CURRENTLY?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:194
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:195
 msgid "Taking any prescribed medicines?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:203
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:204
 msgid "Carrying a Medical Warning Card?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:211
 msgid "Pregnant or Breast Feeding?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:222
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:223
 msgid "DO YOU SUFFER FROM?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:241
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:242
 msgid "Allergies to Any Medicines or Substances?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:246
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:247
 msgid "eg. Penicillin, aspirin or latex."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:251
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:252
 msgid "Bronchitis, Asthma, other Chest Conditions?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:276
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:277
 msgid "Heart Problems, Angina, Blood pressure"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:281
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:282
 msgid "problems, or a stroke?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:285
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:286
 msgid "Diabetes?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:292
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:293
 msgid "Arthritis?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:315
 msgid "Bruising or persistant bleeding after"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:319
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:320
 msgid "surgery or tooth extraction?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:337
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:338
 msgid "Any Infectious Diseases"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:339
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:340
 msgid "(including HIV and Hepatitis)?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:344
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:345
 msgid "DID YOU, AS A CHILD OR SINCE HAVE"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:351
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:352
 msgid "Bacterial Endocarditis?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:359
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:360
 msgid "Liver Disease (eg. Jaundice or Hepatitis)?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:370
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:371
 msgid "A bad reaction to a Local or General Anaesthetic?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:380
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:381
 msgid "A joint replacement or other implant?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:387
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:388
 msgid "Heart Surgery?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:394
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:395
 msgid "Brain Surgery?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:416
 msgid "Treatment that required you to be"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:417
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:418
 msgid "in Hospital?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:421
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:422
 msgid "A close relative with Creutzfeldt Jacob Disease?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:434
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:435
 msgid "PLEASE GIVE ANY OTHER DETAILS WHICH YOU THINK MAY BE RELEVANT TO YOUR DENTIST"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:438
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:439
 msgid "Patient's Signature"
 msgstr ""
 
@@ -8178,12 +9138,12 @@ msgid "Error saving PDF copy %s"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:151
 msgid "Nothing to print - have you loaded the table?"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:155
 msgid ""
 "<tr><th>Dent</th><th>SerialNo</th><th>Cset</th>\n"
 "<th>FName</th><th>Sname</th><th>DOB</th><th>Memo</th><th>Last Appt</th>\n"
@@ -8192,32 +9152,37 @@ msgid ""
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:216
 msgid "Estimate for your current course of treatment."
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:269
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:253
 msgid ""
 "<tr><td></td><td><b>TOTAL</b></td>\n"
 "<td align=\"right\"><b>%s</b></td></tr>"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:273
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:257
 msgid ""
 "<p><i>Please note, this estimate may be subject\n"
 "to change if clinical circumstances dictate.</i></p>"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:89
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:45
+msgid "We look forward to seeing you in the near future."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:107
 msgid "Dear %s %s,"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:103
-msgid "We look forward to seeing you in the near future."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:134
+msgid "* If you already have a future appointment with us - please accept our apologies and ignore this letter."
 msgstr ""
 
 #:
@@ -8225,150 +9190,101 @@ msgstr ""
 msgid "Thankyou for your custom."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:304
 msgid "Please specify a clinician"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:395
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:398
 msgid "Error removing proposed appointment"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:400
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:493
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:403
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:496
 msgid "No appointment selected"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:405
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:408
 msgid "Delete Unscheduled Appointment?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:577
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:580
 msgid "Error putting into dentist's book"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:40
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:43
 msgid "Update required"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:41
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:44
 msgid "Your Openmolar database schema is out of date for this version of the client."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:45
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:48
 msgid "Would you like to Upgrade Now?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:46
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:49
 msgid "WARNING - PLEASE ENSURE ALL OTHER STATIONS ARE LOGGED OFF"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:49
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:52
 msgid "Sorry, you cannot run this version of the openmolar client without updating your database schema."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:56
 msgid "Sorry, we seem unable to update your schema at this point, Perhaps you have grabbed a development version of the program?"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:56
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:59
 msgid "If this is not the case, something odd has happened, please let the developers of openmolar know ASAP."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:117
-msgid "upgrading to schema version"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:129
-msgid "Conversion to %s failed"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:148
-msgid "OpenMolar"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:71
-msgid "Books Currently end on"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:74
-msgid "extend the books now?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:75
+msgid "Updating Database"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:84
-msgid "How many months?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:86
+msgid "Continue"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:104
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:111
-msgid "not yet implemented"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:103
+msgid "Schema Update Required"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:91
-msgid "Please enter initials for this user"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:112
+msgid "Operation Cancelled."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:93
-msgid "Please set a name for this user"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:150
+msgid "Converting Database Schema from version"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:178
-msgid "this action will overwrite any current data stored"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:152
+msgid "to"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:180
-msgid "proceed?"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:191
-msgid "save template file"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:193
-msgid "openmolar template files "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:200
-msgid "Template Saved"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:202
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:225
-msgid "operation cancelled"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:204
-msgid "Template not saved"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:213
-msgid "load an existing template file"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:215
-msgid "openmolar template files"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:158
+msgid "upgrading to schema version"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:220
-msgid "template loaded sucessfully"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:171
+msgid "Conversion to %s failed"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:223
-msgid "error parsing template file"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:174
+msgid "Schema Upgrade Halted"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:320
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:330
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:367
-msgid "Modify Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:180
+msgid "Unexpected Error updating the schema please file a bug at http:www.openmolar.com"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:320
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:351
-msgid "Apply Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:194
+msgid "All updates successully applied!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:341
-msgid "Add New User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:197
+msgid "continuing to openmolar"
 msgstr ""
 
 #:
@@ -8397,182 +9313,181 @@ msgid "updated hidden notes list"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:144
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:114
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:370
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:167
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:236
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:399
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:195
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:152
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:158
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:295
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:232
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:162
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:143
-msgid "updating stored schema version"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:146
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:116
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:372
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:169
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:238
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:401
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:197
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:154
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:160
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:297
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:234
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:164
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:145
-msgid "ALL DONE - sucessfully moved db to"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:105
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:352
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_0to1_1.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:321
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:81
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:104
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:63
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:138
 msgid "creating new tables"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:107
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:365
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:162
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:231
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:394
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:190
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:147
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:153
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:290
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:227
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:157
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:138
-msgid "updating settings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_0to1_1.py:177
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:340
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:95
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:122
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:100
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:252
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:241
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:136
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:81
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:154
+msgid "Successfully moved db to"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:111
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:71
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:338
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:93
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:312
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:98
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:250
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:239
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:77
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:152
+msgid "updating stored schema version"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:120
-msgid "couldn't create tables, rolled back to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:334
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:89
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:310
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:95
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:245
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:236
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:74
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:147
+msgid "updating settings"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:357
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:326
 msgid "copying data across from old feetable"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:377
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:174
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:243
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:406
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:202
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:159
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:165
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:302
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:239
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:169
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:150
-msgid "rolled back to"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:150
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:212
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:382
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:180
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:137
-msgid "executing statements"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:154
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:216
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:332
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:283
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:312
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:214
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:85
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:229
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:182
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:211
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:113
 msgid "transfering data"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:223
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:386
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:182
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:136
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:308
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:142
 msgid "inserting values"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:402
-msgid "you may now remove old feetables"
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:305
+msgid "executing statements"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:134
 msgid "converting note"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:147
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:140
+msgid "creating new tables and indexes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:89
 msgid "creating new appt_prefs table"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:91
 msgid "copying data"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:93
 msgid "statements executed"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:281
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:236
 msgid "creating currtrtmt2 table"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:283
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:238
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:107
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:141
 msgid "transferring data"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:287
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:242
 msgid "deleting void courses"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:218
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:230
 msgid "creating tables"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:221
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:232
 msgid "populating est_link table"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:224
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:234
 msgid "populating feescales"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:148
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:68
 msgid "creating est_link2 table"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:123
 msgid "populating est_link2 table"
 msgstr ""
 
 #:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:154
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:126
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:71
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:110
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:144
 msgid "executing cleanup statements"
 msgstr ""
 
@@ -8592,164 +9507,184 @@ msgstr ""
 msgid "No reason given by feescale author."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:57
-msgid "translation tools are installed sucessfully"
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:67
+msgid "translation tools are installed successfully"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:82
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:87
 msgid "Please try and give at least 24 hours notice"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:83
-msgid "if you need to change an appointment."
-msgstr ""
-
 #: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:88
-msgid "Confidential Medical History Questionaire"
+msgid "if you need to change an appointment."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:300
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:325
 msgid "EXAM"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:326
 msgid "BITE"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:302
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:327
 msgid "BT"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:303
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:328
 msgid "FAMILY"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:304
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:329
 msgid "FILL"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:305
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:330
 msgid "FIT"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:306
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:331
 msgid "HYG"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:307
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:332
 msgid "IMPS"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:308
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:333
 msgid "LF"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:309
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:334
 msgid "ORTHO"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:310
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:335
 msgid "PAIN"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:311
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:336
 msgid "PREP"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:312
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:337
 msgid "RCT"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:313
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:338
 msgid "RECEMENT"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:339
 msgid "REVIEW"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:315
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:340
 msgid "SP"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:316
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:341
 msgid "TRY"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:317
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:342
 msgid "XLA"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:510
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Monday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Thursday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Tuesday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+msgid "Friday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+msgid "Saturday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+msgid "Sunday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:550
 msgid "January"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:511
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:551
 msgid "February"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:512
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:552
 msgid "March"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:513
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:553
 msgid "April"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:554
 msgid "May"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:555
 msgid "June"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:516
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:556
 msgid "July"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:517
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:557
 msgid "August"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:518
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:558
 msgid "September"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:519
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:559
 msgid "October"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:520
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:560
 msgid "November"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:521
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:561
 msgid "December"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:558
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:598
 msgid "Tomorrow"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:560
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:570
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:600
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:610
 msgid "Yesterday"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:925
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:901
 msgid "Welcome to OpenMolar!"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:926
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:902
 msgid "Version"
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:929
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:904
 msgid "Your Data is Accessible, and the server reports no issues."
 msgstr ""
 
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:930
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:906
 msgid "Have a great day!"
 msgstr ""
 
diff --git a/src/openmolar/main.py b/src/openmolar/main.py
index 9b0bbaa..77f9cc4 100755
--- a/src/openmolar/main.py
+++ b/src/openmolar/main.py
@@ -29,303 +29,41 @@ and starts the gui
 
 import getopt
 import logging
-import sys
 import os
-import hashlib
-from PyQt4 import QtGui, QtCore
-from xml.dom import minidom
+import subprocess
+import sys
 
-# a variable to force the first run and database update tools
-FIRST_RUN_TESTING = False
-IGNORE_SCHEMA_CHECK = False
+from openmolar.settings import localsettings
 
-SHORTARGS = "v"
-LONGARGS = ["help", "version", "setup", "firstrun", "user=", "db=", "port=",
-            "ignore-schema-check"]
+SHORTARGS = "vq"
+LONGARGS = [
+    "help",
+    "version",
+    "firstrun",
+    "ignore-schema-check",
+    "no-dev-login"
+]
 
 LOGGER = logging.getLogger("openmolar")
 
+USAGE = '''%s
+-q                   \t : %s
+-v                   \t : %s
 
-class LoginError(Exception):
-
-    '''
-    a custom exception thrown when the user gets password or username incorrect
-    '''
-    pass
-
-
-def proceed():
-    '''
-    check db schema, and proceed if all is well
-    '''
-    # this import will set up gettext and logging
-    from openmolar.dbtools import schema_version
-
-    LOGGER.debug("checking schema version...")
-
-    sv = schema_version.getVersion()
-
-    run_main = False
-
-    if IGNORE_SCHEMA_CHECK or localsettings.CLIENT_SCHEMA_VERSION == sv:
-        run_main = True
-
-    elif localsettings.CLIENT_SCHEMA_VERSION > sv:
-        print "schema is out of date"
-        from openmolar.qt4gui import schema_updater
-        sys.exit(schema_updater.main())
-
-    elif localsettings.CLIENT_SCHEMA_VERSION < sv:
-        print "client is out of date....."
-        compatible = schema_version.clientCompatibility(
-            localsettings.CLIENT_SCHEMA_VERSION)
-
-        if not compatible:
-            QtGui.QMessageBox.warning(None, _("Update Client"),
-                                      _('''<p>Sorry, you cannot run this version of the openMolar client
-because your database schema is more advanced.</p>
-<p>this client requires schema version %s, but your database is at %s</p>
-<p>Please Update openMolar now</p>''') % (
-                                      localsettings.CLIENT_SCHEMA_VERSION, sv))
-        else:
-            result = QtGui.QMessageBox.question(None,
-                                                _("Proceed without upgrade?"),
-                                                _('''<p>This openMolar client has fallen behind your database
-schema version<br />this client was written for schema version %s,
-but your database is now at %s<br />However, the differences are not critical,
-and you can continue if you wish</p>
-<p><i>It would still be wise to update this client ASAP</i></p>
-<hr /><p>Do you wish to continue?</p>''') % (
-                                                localsettings.CLIENT_SCHEMA_VERSION, sv),
-                                                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                                QtGui.QMessageBox.Yes)
-
-            if result == QtGui.QMessageBox.Yes:
-                run_main = True
-
-    if run_main:
-        from openmolar.qt4gui import maingui
-        maingui.main(my_app)
-    else:
-        sys.exit()
+--help               \t : %s
+--firstrun           \t : %s
+--ignore-schema-check\t : %s
+--version            \t : %s
+--no-dev-login       \t : %s
+'''
 
 
 def main():
     '''
     main function
     '''
-    global localsettings, my_app
-    my_app = QtGui.QApplication(sys.argv)
-
-    from openmolar.settings import localsettings
-    from openmolar.qt4gui.compiled_uis import Ui_startscreen
-    localsettings.showVersion()
-
-    uninitiated = True
-
-    def autoreception(arg):  # arg is a QString
-        '''
-        check to see if the user is special user "rec"
-        which implies a reception machine
-        '''
-        if arg.toLower() == "rec":
-            dl.reception_radioButton.setChecked(True)
-
-    def chosenServer(chosenAction):
-        '''
-        the advanced qmenu has been triggered
-        '''
-        i = actions.index(chosenAction)
-
-        message = localsettings.server_names[i] + "<br />" + _(
-            "This is not the default database - are you sure?")
-        if i != 0:
-            if QtGui.QMessageBox.question(my_dialog, _("confirm"), message,
-                                          QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                          QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
-                i = 0
-
-        dl.chosenServer = i
-        for action in actions:
-            action.setChecked(False)
-        chosenAction.setChecked(True)
-        labelServer(i)
-
-    def labelServer(i):
-        def_string = ""
-        if i == 0:
-            def_string = " (" + _("DEFAULT") + ")"
-
-        dl.chosenServer_label.setText(_("Chosen server") + " - " +
-                                      localsettings.server_names[i] + def_string)
-
-    if not FIRST_RUN_TESTING:
-        cf_Found = True
-        if os.path.exists(localsettings.global_cflocation):
-            localsettings.cflocation = localsettings.global_cflocation
-            pass
-        elif os.path.exists(localsettings.cflocation):
-            pass
-        else:
-            cf_Found = False
-    else:
-        cf_Found = False
-
-    if not cf_Found:
-        message = "<center>%s<br />%s<hr /><em>%s</em></center>" % (
-            _("This appears to be your first running of OpenMolar."),
-            _("We need to generate a settings file."),
-            _("Are you ready to proceed?")
-        )
-
-        result = QtGui.QMessageBox.question(None, _("First Run"),
-                                            message,
-                                            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                            QtGui.QMessageBox.Yes)
-
-        if result == QtGui.QMessageBox.Yes:
-            import firstRun
-            if not firstRun.run():
-                my_app.closeAllWindows()
-                sys.exit()
-        else:
-            my_app.closeAllWindows()
-            sys.exit()
-
-    try:
-        dom = minidom.parse(localsettings.cflocation)
-        sys_password = dom.getElementsByTagName(
-            "system_password")[0].firstChild.data
-
-        servernames = dom.getElementsByTagName("connection")
-
-        for i, server in enumerate(servernames):
-            nameDict = server.attributes
-            try:
-                localsettings.server_names.append(nameDict["name"].value)
-            except KeyError:
-                localsettings.server_names.append("%d" % i + 1)
-
-    except IOError as e:
-        LOGGER.warning("still no settings file. quitting politely")
-        QtGui.QMessageBox.information(None, _("Unable to Run OpenMolar"),
-                                      _("Good Bye!"))
-
-        QtGui.QApplication.instance().closeAllWindows()
-        sys.exit("unable to run - openMolar couldn't find a settings file")
-
-    my_dialog = QtGui.QDialog()
-    dl = Ui_startscreen.Ui_Dialog()
-    dl.setupUi(my_dialog)
-
-    PASSWORD, USER1, USER2 = localsettings.autologin()
-    dl.password_lineEdit.setText(PASSWORD)
-    dl.user1_lineEdit.setText(USER1)
-    dl.user2_lineEdit.setText(USER2)
-    autoreception(QtCore.QString(USER1))
-    autoreception(QtCore.QString(USER2))
-
-    servermenu = QtGui.QMenu()
-    dl.chosenServer = 0
-    labelServer(0)
-    actions = []
-    if len(localsettings.server_names) > 1:
-        for name in localsettings.server_names:
-            action = QtGui.QAction(name, servermenu)
-            servermenu.addAction(action)
-            dl.advanced_toolButton.setMenu(servermenu)
-            actions.append(action)
-    else:
-        dl.advanced_frame.hide()
-
-    servermenu.connect(servermenu,
-                       QtCore.SIGNAL("triggered (QAction *)"), chosenServer)
-
-    QtCore.QObject.connect(dl.user1_lineEdit,
-                           QtCore.SIGNAL("textEdited (const QString&)"), autoreception)
-
-    while True:
-        if (PASSWORD != "" and USER1 != "") or my_dialog.exec_():
-            PASSWORD = ""
-
-            changedServer = localsettings.chosenserver != dl.chosenServer
-
-            localsettings.setChosenServer(dl.chosenServer)
-
-            try:
-                #--"salt" the password
-                pword = "diqug_ADD_SALT_3i2some" + str(
-                    dl.password_lineEdit.text())
-                #-- hash the salted password (twice!) and compare to the value
-                #-- stored in /etc/openmolar/openmolar.conf (linux)
-                stored_password = hashlib.md5(
-                    hashlib.sha1(pword).hexdigest()).hexdigest()
-
-                if stored_password != sys_password:
-                    #-- end password check
-                    raise LoginError
-
-                if uninitiated or changedServer:
-                    #- user has entered the correct password
-                    #- so now we connect to the mysql database
-                    #- for the 1st time
-                    #- I do it this way so that anyone sniffing the network
-                    #- won't see the mysql password until this point
-                    #- this could and should possibly still be improved upon
-                    #- maybe by using an ssl connection to the server.
-                    localsettings.initiateUsers(changedServer)
-                    uninitiated = False
-
-                u1_qstring = dl.user1_lineEdit.text().toAscii().toUpper()
-                u2_qstring = dl.user2_lineEdit.text().toAscii().toUpper()
-
-                #-- localsettings module now has user variables.
-                #-- allowed_logins in a list of practice staff.
-                if not u1_qstring in localsettings.allowed_logins:
-                    raise LoginError
-                if (u2_qstring != "" and
-                   not u2_qstring in localsettings.allowed_logins):
-                    raise LoginError
-
-                #-- set a variable to allow the main program to run
-                localsettings.successful_login = True
-                if dl.reception_radioButton.isChecked():
-                    localsettings.station = "reception"
-
-                localsettings.setOperator(str(u1_qstring), str(u2_qstring))
-
-                proceed()
-
-            except LoginError:
-                QtGui.QMessageBox.warning(my_dialog,
-                                          _("Login Error"),
-                                          u'<h2>%s %s</h2><em>%s</em>' % (
-                                              _('Incorrect'),
-                                              _("User/password combination!"),
-                                              _('Please Try Again.')
-                                          )
-                                          )
-            except Exception as exc:
-                LOGGER.exception("UNEXPECTED ERROR")
-                message = u'<p>%s</p><p>%s</p><hr /><pre>%s</pre>' % (
-                    _("UNEXPECTED ERROR"),
-                    _("application cannot run"),
-                    exc)
-
-                QtGui.QMessageBox.warning(my_dialog, _("Login Error"), message)
-                break
-        else:
-            break
-    QtGui.QApplication.instance().closeAllWindows()
-
-
-def setup(argv):
-    '''
-    run the setup gui, which allows customisation of the app
-    '''
-    print "running setup"
-    from openmolar.qt4gui.tools import new_setup
-    new_setup.main(argv)
+    from openmolar.qt4gui import maingui
+    maingui.main()
 
 
 def usage():
@@ -333,21 +71,22 @@ def usage():
     called by --help, bad arguments, or no arguments
     simply importing the localsettings will display some system info
     '''
-    print '''
-command line options are as follows
---help               \t : show this text
---firstrun           \t : offer the firstrun config and demodatabase generation
---ignore-schema-check\t : proceed even if client and database versions clash (NOT ADVISABLE!)
---setup              \t : takes you to the admin page
---version            \t : show the versioning and exit
-'''
+    print USAGE % (
+        _("command line options are as follows"),
+        _("quiet (minimal logging to console)"),
+        _("verbose logging to console (for debugging)"),
+        _("show this text"),
+        _("offer the firstrun config and demodatabase generation"),
+        _("proceed even if client and database versions clash (NOT ADVISABLE!)"),
+        _("show the versioning and exit"),
+        _("Ignore dev login (advanced)")
+    )
 
 
 def version():
     '''
     show the version on the command line
     '''
-    from openmolar.settings import localsettings
     localsettings.showVersion()
 
 
@@ -355,50 +94,41 @@ def run():
     '''
     the real entry point for the app
     '''
-    global FIRST_RUN_TESTING, IGNORE_SCHEMA_CHECK
 
     try:
         opts, args = getopt.gnu_getopt(sys.argv[1:], SHORTARGS, LONGARGS)
     except getopt.GetoptError as exc:
-        print
-        print exc
-        print
+        # LOGGER.exception ("Unable to parse command line arguments")
+        print "\n%s\n" % exc.msg
         opts = (("--help", ""),)
 
     # some backward compatibility stuff here...
-    if "setup" in sys.argv:
-        opts.append(("--setup", ""))
     if "firstrun" in sys.argv:
         opts.append(("--firstrun", ""))
 
+    chosen_func = main
     for option, arg in opts:
         if option == "--help":
-            usage()
-            sys.exit()
+            chosen_func = usage
+            break
         if option == "--version":
-            version()
-            sys.exit()
-        if option == "--setup":
-            print "setup found"
-            setup(sys.argv)
-            sys.exit()
-
+            chosen_func = version
+            break
         if option == "--firstrun":
-            FIRST_RUN_TESTING = True
-
+            localsettings.FORCE_FIRST_RUN = True
         if option == "--ignore-schema-check":
-            IGNORE_SCHEMA_CHECK = True
-            print "ignoring schema check"
-
-    main()
+            localsettings.IGNORE_SCHEMA_CHECK = True
+            LOGGER.warning("command line args demand no schema check")
+    chosen_func()
 
 if __name__ == "__main__":
     #-- put "openmolar" on the pyth path and go....
-    LOGGER.info("starting openMolar.... using main.py as __main__")
+    LOGGER.debug("starting openMolar.... using main.py as __main__")
 
     def determine_path():
         """Borrowed from wxglade.py"""
         try:
+            # could use localsettings.__file__ for non-standard install?
             root = __file__
             if os.path.islink(root):
                 root = os.path.realpath(root)
diff --git a/src/openmolar/ptModules/course_checker.py b/src/openmolar/ptModules/course_checker.py
new file mode 100644
index 0000000..de97920
--- /dev/null
+++ b/src/openmolar/ptModules/course_checker.py
@@ -0,0 +1,194 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import datetime
+import logging
+import re
+
+from openmolar.dbtools.treatment_course import TreatmentCourse
+from openmolar.dbtools import estimatesHistory
+from openmolar.dbtools import daybook
+
+LOGGER = logging.getLogger("openmolar")
+
+class CourseChecker(object):
+    '''
+    look to see if there is consistency accross three tables
+    currtrtmt2, daybook and newestimates
+    '''
+    def __init__(self, course, estimates, daybook_entries):
+        self.course = course
+        self.estimates = estimates
+        self.daybook_entries = daybook_entries
+        self._daybook_course = None
+        self._courses_match = None
+
+    @property
+    def serialno(self):
+        return self.course.serialno
+
+    @property
+    def courseno(self):
+        return self.course.courseno
+
+    @property
+    def is_ongoing(self):
+        return self.course.cmpd is None
+
+    @property
+    def days_at_course_end(self):
+        if self.is_ongoing:
+            return 0
+        dead_space = 0
+        for daybook_entry in self.daybook_entries:
+            days = (self.course.cmpd - daybook_entry.date).days
+            if dead_space > days:
+                dead_space = days
+        return dead_space
+
+    @property
+    def daybook_course(self):
+        '''
+        This is the daybook entries converted to a Treatment Course
+        '''
+        if self._daybook_course is None:
+            self._daybook_course = TreatmentCourse(self.serialno, 0)
+            self._daybook_course.courseno = self.courseno
+            accd, cmpd = None, None
+            for daybook_entry in self.daybook_entries:
+                #LOGGER.debug(daybook_entry)
+                if not accd or daybook_entry.date < accd:
+                    accd = daybook_entry.date
+                if not cmpd or daybook_entry.date > cmpd:
+                    cmpd = daybook_entry.date
+                #diagn
+                m = re.search("(E?CE) ", daybook_entry.diagn)
+                if m:
+                    self._daybook_course.examt += m.groups()[0]
+                    self._daybook_course.examd = daybook_entry.date
+                #xray
+                for xray in re.findall("\d?[S|M|P] ", daybook_entry.diagn):
+                    self._daybook_course.xraycmp += xray
+                #perio
+                if daybook_entry.perio.strip(" "):
+                    self._daybook_course.periocmp += daybook_entry.perio.strip(" ") + " "
+                #anaes
+                if daybook_entry.anaes.strip(" "):
+                    self._daybook_course.anaescmp += daybook_entry.anaes.strip(" ") + " "
+                #misc
+                if daybook_entry.misc.strip(" "):
+                    self._daybook_course.customcmp += daybook_entry.misc.strip(" ") + " "
+                #ndu
+                if daybook_entry.ndu.strip(" "):
+                    self._daybook_course.nducmp += daybook_entry.ndu.strip(" ") + " "
+                #ndl
+                if daybook_entry.ndl.strip(" "):
+                    self._daybook_course.ndlcmp += daybook_entry.ndl.strip(" ") + " "
+                #odu
+                if daybook_entry.odu.strip(" "):
+                    self._daybook_course.oducmp += daybook_entry.odu.strip(" ") + " "
+                #odl
+                if daybook_entry.odl.strip(" "):
+                    self._daybook_course.odlcmp += daybook_entry.odl.strip(" ") + " "
+                #other
+                if daybook_entry.other.strip(" "):
+                    self._daybook_course.othercmp += daybook_entry.other.strip(" ") + " "
+                #chart
+                for chart_entry in daybook_entry.chart.split("  "):
+                    m = re.match("([UL][LR][1-8]) (.*)", chart_entry)
+                    if m:
+                        att = "%scmp" % m.groups()[0].lower()
+                        tx = m.groups()[1] + " "
+                        self._daybook_course.__dict__[att]+=tx
+
+            if accd is None or (self.course.accd and self.course.accd < accd):
+                self._daybook_course.accd = self.course.accd
+            else:
+                self._daybook_course.accd = accd
+            self._daybook_course.cmpd = cmpd
+
+        return self._daybook_course
+
+    def completed_txs_match_daybook(self):
+        for hash_, att, tx in self.course.completed_tx_hash_tups:
+            print "checking '%s' '%s'" % (att, tx)
+
+    @property
+    def results(self):
+        message = "<ul>"
+        if self.is_ongoing:
+            message += "<li>%s</li>" % _("Course is still active")
+        dead_days = self.days_at_course_end
+        if dead_days:
+            message += "<li>%s %d %s.</li>" % (
+                _("Course closed"),
+                dead_days,
+                _("days after last day treatment"))
+        if not self.courses_match:
+            message += "<li>%s</li>" % _(
+                "Course doesn't tally with daybook entries")
+        message += "</ul>"
+        return message if message != "<ul></ul>" else _("No warnings")
+
+    @property
+    def courses_match(self):
+        if self._courses_match is None:
+            html = self.daybook_course.to_html()
+            html1c = self.course.to_html(completed_only = True)
+            self._courses_match =  html == html1c
+        return self._courses_match
+
+    @property
+    def has_errors(self):
+        '''
+        currently this looks for consistency betwwen the daybook
+        and treatment plan only
+        '''
+        return (self.days_at_course_end > 0
+                or self.is_ongoing
+                or not self.courses_match)
+
+def get_course_checker(serialno, courseno):
+    course = TreatmentCourse(serialno, courseno)
+    ests = estimatesHistory.getEsts(serialno, courseno)
+    daybook_list = []
+    accd = datetime.date.today() if course.accd is None else course.accd
+    cmpd = datetime.date.today() if course.cmpd is None else course.cmpd
+    for daybook_entry in daybook.all_data(serialno):
+        if accd <= daybook_entry.date <= cmpd:
+            daybook_list.append(daybook_entry)
+
+    return  CourseChecker(course, ests, daybook_list)
+
+
+if __name__ == "__main__":
+    serialno = 11956
+    courseno = 29749
+
+    course_check = get_course_checker(serialno, courseno)
+    print course_check.results()
+
+    course_check.completed_txs_match_daybook()
+
+    print course_check.daybook_course.to_html()
\ No newline at end of file
diff --git a/src/openmolar/ptModules/debug_html.py b/src/openmolar/ptModules/debug_html.py
index b6fac66..15d941d 100644
--- a/src/openmolar/ptModules/debug_html.py
+++ b/src/openmolar/ptModules/debug_html.py
@@ -49,8 +49,6 @@ def toHtml(pt, tableCalled=None, changesOnly=False):
         attributesDict["HDP"] = ("plandata",)
     elif tableCalled == "Estimates":
         attributesDict["Estimates"] = ("estimates", )
-    elif tableCalled == "Perio":
-        attributesDict["Perio Data"] = ("perioData",)
     else:
         attributesDict["all attributes"] = pt.dbstate.__dict__.keys()
 
diff --git a/src/openmolar/ptModules/estimates.py b/src/openmolar/ptModules/estimates.py
index 7af3684..3a13273 100644
--- a/src/openmolar/ptModules/estimates.py
+++ b/src/openmolar/ptModules/estimates.py
@@ -131,11 +131,12 @@ class Estimate(object):
             self.fee,
             self.ptfee,
             self.dent,
-            self.tx_hashes,
             self.itemcode,
             self.description,
             self.csetype,
-            self.feescale)
+            self.feescale,
+            self.tx_hashes
+        )
 
     @property
     def log_text(self):
@@ -150,6 +151,9 @@ class Estimate(object):
     def __eq__(self, other):
         return str(self) == str(other)
 
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
     def toHtmlRow(self):
         hash_string = ""
         for tx_hash in self.tx_hashes:
@@ -191,10 +195,25 @@ class Estimate(object):
             hash_string)
 
     def htmlHeader(self):
-        return '''<tr><th>Dentist</th><th>number</th><th>code</th>
-        <th>Description</th><th>fee</th>
-        <th>pt fee</th><th>feescale</th><th>cset</th><th>completed</th>
-        <th>Hashes</th></tr>'''
+        color_string = ' bgcolor="#ffff99"'
+        sub_values = (color_string, _("Estimates for Course Number"),
+                      self.courseno) + (color_string,) * 10
+        return '''
+        <tr>
+        <th%s colspan="10">%s %s <!--editlink--></th>
+        </tr>
+        <tr>
+        <th%s>Dentist</th>
+        <th%s>number</th>
+        <th%s>code</th>
+        <th%s>Description</th>
+        <th%s>fee</th>
+        <th%s>pt fee</th>
+        <th%s>feescale</th>
+        <th%s>cset</th>
+        <th%s>completed</th>
+        <th%s>Hashes</th>
+        </tr>''' % sub_values
 
     def filteredDescription(self):
         '''
diff --git a/src/openmolar/ptModules/hidden_notes.py b/src/openmolar/ptModules/hidden_notes.py
index edf7874..fbd2164 100644
--- a/src/openmolar/ptModules/hidden_notes.py
+++ b/src/openmolar/ptModules/hidden_notes.py
@@ -45,7 +45,8 @@ if __name__ == "__main__":
         serialno = 1
     pt = patient_class.patient(serialno)
 
-    pt.addHiddenNote("exam", "CE")
-    pt.addHiddenNote("perio_treatment", "SP")
+    pt.addHiddenNote("exam", "CE ")
+    pt.addHiddenNote("perio_treatment", "SP ")
     pt.addHiddenNote("printed", "appt card")
+    print pt.HIDDENNOTES
     print toHtml(pt)
diff --git a/src/openmolar/ptModules/patientDetails.py b/src/openmolar/ptModules/patientDetails.py
index 2502e1c..8de51e5 100644
--- a/src/openmolar/ptModules/patientDetails.py
+++ b/src/openmolar/ptModules/patientDetails.py
@@ -43,123 +43,131 @@ def getAge(pt):
     '''
     ageYears, months, isToday = pt.getAge()
     if isToday:
-        return "<h5> %s TODAY!</h5>" % ageYears
+        return "<h5> %s %s</h5>" % (ageYears, _("TODAY!"))
     if ageYears > 18:
-        return "(%syo)<hr />" % ageYears
+        return "(%syo)" % ageYears
     else:
-        retarg = "<br />%s years" % ageYears
-        if ageYears == 1:
-            retarg = retarg.strip("s")
-        retarg += " %s months" % months
-        if months == 1:
-            retarg = retarg.strip("s")
-        return retarg + "<hr />"
+
+        html = "<br />%s %s" % (
+            ageYears,
+            _("years") if ageYears == 1 else _("year"))
+        html += " %s %s" % (
+            months,
+            _("months") if months == 1 else _("month"))
+        return html
 
 
 def header(pt):
-    retarg = '''<html>
-<head><link rel="stylesheet" href="%s" type="text/css"></head>
-<body><div align = "center">
-<h4>Patient %d</h4>
-<h3>%s %s %s</h3>
+    html = '''
+    <html>
+    <head><link rel="stylesheet" href="%s" type="text/css"></head>
+    <body><div align = "center">
+    <h4>Patient %d</h4>
+    <h3>%s %s %s</h3>
+    %s %s<hr />
         ''' % (
         localsettings.stylesheet, pt.serialno, pt.title.title(),
-        pt.fname.title(), pt.sname.title())
+        pt.fname.title(), pt.sname.title(),
+        localsettings.formatDate(pt.dob), getAge(pt))
 
-    retarg += '%s %s' % (localsettings.formatDate(pt.dob), getAge(pt))
-    for line in (pt.addr1, pt.addr2, pt.addr3, pt.town, pt.county):
-        if str(line) != '':
-            retarg += "%s <br />" % line
+    address = (pt.addr1, pt.addr2, pt.addr3, pt.town, pt.county, pt.pcde)
+    html += "<br />".join([l for l in address if l != ""])
     if pt.pcde == "":
-        retarg += "<b>!UNKNOWN POSTCODE!</b>"
-    else:
-        retarg += "%s" % pt.pcde
+        html += "<b>%s</b>" % _("!UNKNOWN POSTCODE!")
 
     if not pt.status in ("Active", "", None):
-        retarg += "<hr /><h1>%s</h1>" % pt.status
+        html += "<hr /><h1>%s</h1>" % pt.status
 
-    return retarg
+    return html
 
 
 def details(pt, Saved=True):
     '''returns an html set showing pt name etc...'''
 
     try:
-        retarg = header(pt) + '<hr />'
+        html = header(pt) + '<hr />'
         if "N" in pt.cset:
-            retarg += '''<img src="%s/nhs_scot.png" alt="NHS" />
+            html += '''<img src="%s/nhs_scot.png" alt="NHS" />
             <br />''' % localsettings.resources_path
 
             if pt.exemption != "":
-                retarg += " exemption=%s" % str(pt.exemption)
+                html += "%s=%s" % (_("exemption"), pt.exemption)
             else:
-                retarg += "NOT EXEMPT"
-            retarg += "<br />"
+                html += _("NOT EXEMPT")
+            html += "<br />"
         elif "I" in pt.cset:
-            retarg += '''<img src="%s/hdp_small.png" alt="HDP" />
+            html += '''<img src="%s/hdp_small.png" alt="HDP" />
             <br />''' % localsettings.resources_path
 
         elif "P" in pt.cset:
-            retarg += '''<img src="%s/private.png" alt="PRIVATE" />
+            html += '''<img src="%s/private.png" alt="PRIVATE" />
             <br />''' % localsettings.resources_path
 
         else:
-            retarg += 'UNKNOWN COURSETYPE = %s <br />' % str(pt.cset)
+            html += '%s = %s <br />' % (_("UNKNOWN COURSETYPE"), pt.cset)
 
-        retarg += "%s<br />" % pt.fee_table.briefName
+        html += "%s<br />" % pt.fee_table.briefName
         try:
-            retarg += 'dentist      = %s' % localsettings.ops[pt.dnt1]
+            html += 'dentist      = %s' % localsettings.ops[pt.dnt1]
             if pt.dnt2 != 0 and pt.dnt1 != pt.dnt2:
-                retarg += '/%s' % localsettings.ops[pt.dnt2]
+                html += '/%s' % localsettings.ops[pt.dnt2]
         except KeyError as e:
-            retarg += '<h4>Please Set a Dentist for this patient!</h4><hr />'
+            html += '<h4>%s</h4><hr />' % _(
+                "Please Set a Dentist for this patient!")
         if pt.memo != '':
-            retarg += '<h4>Memo</h4>%s<hr />' % pt.memo
-
-        retarg += '''<table border="1">'
-        <tr><td>Last IO Xrays</td><td>%s</td></tr>
-        <tr><td>Last OPG</td><td>%s</td></tr>
-        <tr><td>Last Sp</td><td>%s</td></tr>
-        ''' % (localsettings.formatDate(pt.pd9),
-               localsettings.formatDate(pt.pd8), localsettings.formatDate(pt.pd10))
-
-        letype = ""
-        lastexam = datetime.date(1, 1, 1)
-        i = 0
-        for date in (pt.pd5, pt.pd6, pt.pd7):
-            if date and date > lastexam:
-                lastexam = date
+            html += '<h4>%s</h4>%s<hr />' % (_("Memo"), pt.memo)
+
+        tx_dates = [
+            (_("Treatment"), pt.last_treatment_date),
+            (_("IO xrays"), pt.pd9),
+            (_("Panoral"), pt.pd8),
+            (_("Scaling"), pt.pd10)
+        ]
+
+        letype, le_date = "", datetime.date(1, 1, 1)
+        for i, date_ in enumerate((pt.pd5, pt.pd6, pt.pd7)):
+            if date_ and date_ > le_date:
+                le_date = date_
                 letype = ("(CE)", "(ECE)", "(FCA)")[i]
-            i += 1
-        if lastexam == datetime.date(1, 1, 1):
-            lastexam = None
+        if le_date == datetime.date(1, 1, 1):
+            le_date = None
         if letype != "":
-            retarg += '<tr><td>Last Exam %s</td><td>%s</td></tr>' % (
-                letype, localsettings.formatDate(lastexam))
+            tx_dates.append(('%s %s' % (_("Exam"), letype), le_date))
+
+        html += '<h4>%s</h4><table width="100%%" border="1">' % _("History")
+        for i, (att, val) in enumerate(tx_dates):
 
+            html += '''<tr><td align="center">%s</td>
+            <td align="center">%s%s%s</td></tr>''' % (
+                att,
+                "<b>" if i in (0, 4) else "",
+                localsettings.formatDate(val),
+                "</b>" if i in (0, 4) else "")
+
+        html += "</table>"
+        html += "<h4>%s</h4>" % _("Recall")
         if pt.recall_active:
-            retarg += '''<tr><td>Recall Date</td><td>%s</td></tr>
-            </table>''' % localsettings.formatDate(pt.recd)
+            if pt.recd > localsettings.currentDay() or pt.has_exam_booked:
+                html += "%s " % localsettings.formatDate(pt.recd)
+                html += _("(exam booked)") if pt.has_exam_booked else ""
+            else:
+                html += '<div style="color:red;">%s</div>' % (
+                    localsettings.formatDate(pt.recd))
         else:
-            retarg += '<tr><td colspan="2">%s</td></tr></table>' % _(
-                "DO NOT RECALL")
+            html += '<div style="color:red;">%s</div>' % _("DO NOT RECALL")
 
-        if not Saved:
-            alert = "<br />NOT SAVED"
-        else:
-            alert = ""
+        alert = _("NOT SAVED") if not Saved else ""
         if pt.fees > 0:
             amount = localsettings.formatMoney(pt.fees)
-            retarg += '<hr /><h3 class="debt">Account = %s %s</h3>' % (
-                amount, alert)
+            html += '<hr /><h3 class="debt">%s = %s %s</h3>' % (
+                _("Account"), amount, alert)
         if pt.fees < 0:
             amount = localsettings.formatMoney(-pt.fees)
-            retarg += '<hr /><h3>%s in credit %s</h3>' % (amount, alert)
-
+            html += '<hr /><h3>%s %s %s</h3>' % (amount, _("in credit"), alert)
         if pt.underTreatment:
-            retarg += '<hr /><h2 class="ut_label">UNDER TREATMENT</h2><hr />'
-
-        return '''%s\n</div></body></html>''' % retarg
+            html += '<hr /><h2 class="ut_label">%s</h2><hr />' % _(
+                "UNDER TREATMENT")
+        return '''%s\n</div></body></html>''' % html
     except Exception as exc:
         LOGGER.exception("error in patientDetails.details")
         return "error displaying details, sorry <br />%s" % exc
@@ -171,8 +179,4 @@ if __name__ == '__main__':
         serialno = int(sys.argv[len(sys.argv) - 1])
     except:
         serialno = 4792
-    if '-v' in sys.argv:
-        verbose = True
-    else:
-        verbose = False
     print details(patient_class.patient(serialno))
diff --git a/src/openmolar/ptModules/perio.py b/src/openmolar/ptModules/perio.py
deleted file mode 100755
index 24c0366..0000000
--- a/src/openmolar/ptModules/perio.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''gets and decodes the perio charts'''
-
-import sys
-from openmolar.settings import localsettings
-from openmolar.connect import connect
-
-import struct
-
-
-def get_perioData(data):
-    perioData = {}
-
-    i = 0
-    for tooth in (
-        'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1', 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
-            'lr8', 'lr7', 'lr6', 'lr5', 'lr4', 'lr3', 'lr2', 'lr1', 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'):
-        d = struct.unpack_from('b' * 45, data, i)
-        recession = (d[0], d[1], d[2], d[3], d[4], d[5])
-        pocketing = (d[6], d[7], d[8], d[9], d[10], d[11])
-        plaque = (d[12], d[13], d[14], d[15], d[16], d[17])
-        bleeding = (d[18], d[19], d[20], d[21], d[22], d[23])
-        other = (d[24], d[25], d[26], d[27], d[28], d[29])
-        mobility = d[34]
-        furcation = (d[30], d[31], d[32], d[33])
-        suppuration = (d[35], d[36], d[37], d[38], d[39], d[40])
-        perioData[tooth] = (
-            recession,
-            pocketing,
-            plaque,
-            bleeding,
-            other,
-            suppuration,
-            furcation,
-            mobility)
-        i += 45
-
-    return perioData
-
-if __name__ == "__main__":
-    try:
-        serialno = int(sys.argv[len(sys.argv) - 1])
-    except:
-        serialno = 707  # 29833
-    db = connect()
-    cursor = db.cursor()
-    cursor.execute('select chartdata from perio where serialno=%d' % serialno)
-    chartdata = cursor.fetchall()
-    cursor.close()
-    # db.close()
-    perioData = get_perioData(chartdata[0][0])
-    newdict = {}
-    for key in perioData.keys():
-    #    print key,perioData[key]
-        newdict[key] = perioData[key][1]
-    print newdict
diff --git a/src/openmolar/ptModules/plan.py b/src/openmolar/ptModules/plan.py
index 5f8e5d6..9f9f8b6 100644
--- a/src/openmolar/ptModules/plan.py
+++ b/src/openmolar/ptModules/plan.py
@@ -123,20 +123,30 @@ def summary(pt):
     returns html set showing a summary of planned or completed treatment
     '''
 
-    if pt.treatment_course is None:
+    if pt.treatment_course is None or pt.treatment_course.accd is None:
         return ""
 
-    retarg = '''<html><body><head>
+    retarg = '''<html><head>
     <link rel="stylesheet" href="%s" type="text/css">
-    </head>\n''' % localsettings.stylesheet
+    </head>\n<body>''' % localsettings.stylesheet
+
     if not pt.underTreatment:
         retarg += "<H4>%s</H4>" % _("Previous Course")
     if pt.treatment_course.accd is not None:
-        retarg += '%s %s<br />' % (_("Start"),
-                                   localsettings.formatDate(pt.treatment_course.accd))
-    if pt.treatment_course.cmpd is not None:
-        retarg += '%s %s<br />' % (_('End'),
-                                   localsettings.formatDate(pt.treatment_course.cmpd))
+        retarg += '%s %s<br />' % (
+            _("Start"),
+            localsettings.formatDate(pt.treatment_course.accd))
+        if pt.treatment_course.cmpd is not None:
+            retarg += '%s %s<br />' % (
+                _('End'),
+                localsettings.formatDate(pt.treatment_course.cmpd))
+        else:
+            retarg += '<b>%s</b><br />' % _("ONGOING")
+
+    if pt.treatment_course.ftr:
+        retarg += '<font color="red">%s</font><br />' % _(
+            "Patient Failed to Return")
+
     plan = ""
     for item in plannedItems(pt):
         plan += '%s - %s<br />' % (item)
@@ -163,25 +173,46 @@ def completedFillsToStatic(pt):
     '''
     take completed items, and update the static chart
     '''
-    try:
-        items = completedItems(pt, teethOnly=True)
-        for tooth, prop in items:
-            tooth = tooth.lower()
-            if re.match("EX", prop):
-                pt.treatment_course.__dict__["%sst" % tooth] = "TM "
-            else:
-                existing = pt.__dict__.get("%sst" % tooth)
-                new = "%s %s " % (existing, prop)
-                # add the space just to be on the safe side.
-                new = new.replace("  ", " ")
-                # 34 characters is a database limit.
-                while len(new) > 34:
-                    new = new[new.index(" ") + 1:]
-                pt.__dict__["%sst" % tooth] = new
-
-    except Exception as e:
-        # shouldn't happen, but safety first.
-        LOGGER.exception("FAILED TO TRANSFER FILLS TO STATIC")
+    items = completedItems(pt, teethOnly=True)
+    for tooth, prop in items:
+        tooth = tooth.lower()
+        if re.match("EX", prop):
+            pt.__dict__["%sst" % tooth] = "TM "
+        elif len(prop) > 33:
+            pass
+        else:
+            existing = pt.__dict__.get("%sst" % tooth).split(" ")
+            existing.append(prop.strip(" "))
+            i = 0
+            correct = False
+            while not correct:
+                new = " ".join([s for s in existing[i:] if s != ""]) + " "
+                correct = len(new) < 34
+                i += 1
+            pt.__dict__["%sst" % tooth] = new
+
+
+def reverse_completedFillsToStatic(pt):
+    '''
+    undo above procedure if a course is "resumed"
+    take completed items, and update the static chart
+    '''
+    items = completedItems(pt, teethOnly=True)
+    for tooth, prop in items:
+        tooth = tooth.lower()
+        existing = pt.__dict__["%sst" % tooth].split(" ")
+        if re.match("EX", prop):
+            removal = "TM"
+        else:
+            removal = prop.strip(" ")
+        existing.reverse()
+        try:
+            existing.remove(removal)
+        except ValueError:
+            pass  # property not found
+        existing.reverse()
+        new = " ".join([s for s in existing if s != ""]) + " "
+        pt.__dict__["%sst" % tooth] = new
 
 
 if __name__ == "__main__":
diff --git a/src/openmolar/ptModules/reception_summary.py b/src/openmolar/ptModules/reception_summary.py
index f126155..cc7e3ce 100644
--- a/src/openmolar/ptModules/reception_summary.py
+++ b/src/openmolar/ptModules/reception_summary.py
@@ -59,7 +59,7 @@ def header_html(pt):
 
 def treatment_html(pt):
     return u"<h4>Treatments (courseno %s)</h4>%s" % (
-        pt.courseno0, estimate_synopsis.html(pt.courseno0))
+        pt.courseno0, estimate_synopsis.html(pt.serialno, pt.courseno0))
 
 
 def payments_html(pt):
diff --git a/src/openmolar/ptModules/referral.py b/src/openmolar/ptModules/referral.py
deleted file mode 100644
index c3a869a..0000000
--- a/src/openmolar/ptModules/referral.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from xml.dom import minidom
-import time
-import datetime
-from openmolar.settings import localsettings
-
-
-def getDescriptions():
-    try:
-        d = minidom.parse(localsettings.referralfile)
-        descriptions = d.getElementsByTagName("description")
-        desclist = []
-        for description in descriptions:
-            desclist.append(description.firstChild.data)
-        return desclist
-    except:
-        return ["error getting settings", localsettings.referralfile]
-
-
-def getHtml(desc, pt):
-    try:
-        d = minidom.parse(localsettings.referralfile)
-        descriptions = d.getElementsByTagName("description")
-        desclist = []
-        found = False
-        for description in descriptions:
-            if description.firstChild.data == desc:
-                found = True
-                break
-        if found:
-            '''this means we have a node with the required address fields etc...'''
-            refnode = description.parentNode
-            surgeon_postal = refnode.getElementsByTagName(
-                "surgeon_postal")[0].firstChild.data
-            addressNode = refnode.getElementsByTagName("address")
-            lines = addressNode[0].getElementsByTagName("line")
-            address = []
-            for line in lines:
-                address.append(line.firstChild.data)
-            greeting = refnode.getElementsByTagName(
-                "surgeon_greeting")[0].firstChild.data
-            retarg = "<html><body>"
-            retarg += "<br />" * 6
-            retarg += "<b>%s<br />" % surgeon_postal
-            for line in address:
-                retarg += "%s<br />" % line
-            retarg += "</b>" + "<br />" * 2
-            today = time.localtime()[:3]
-            d = datetime.date(today[0], today[1], today[2])
-            retarg += "%s, " % (
-                "Monday",
-                "Tuesday",
-                "Wednesday",
-                "Thursday",
-                "Friday",
-                "Saturday",
-                "Sunday")[d.weekday()]
-            retarg += "%s " % d.day
-            retarg += "%s, " % (
-                "January",
-                "February",
-                "March",
-                "April",
-                "May",
-                "June",
-                "July",
-                "August",
-                "September",
-                "October",
-                "November",
-                "December")[d.month - 1]
-            retarg += '%s <br /><br />' % d.year
-            retarg += "Dear %s,<br />" % greeting
-            retarg += '<div align="center"><b>Re. %s %s %s - ' % (
-                pt.title.title(), pt.fname.title(), pt.sname.title())
-            retarg += 'DOB %s</b><br />' % localsettings.formatDate(pt.dob)
-            for val in (pt.addr1, pt.addr2, pt.addr3, pt.town, pt.county):
-                if val != "":
-                    retarg += val + ","
-            if pt.pcde != "":
-                retarg += pt.pcde + "."
-            retarg += "<br />Tel - "
-            i = 0
-            for val in (pt.tel1, pt.tel2, pt.mobile):
-                if val != "":
-                    retarg += ("home ", "work ", "mobile ")[i] + val + " "
-                i += 1
-            retarg += "</div>"
-            retarg += "<br />" * (12)
-            retarg += "Yours Sincerely," + "<br />" * 4
-            retarg += "</body></html>"
-            return retarg
-        else:
-            return ("<html><body>SORRY - we couldn't find letter data for % </body></html>" % desc)
-
-    except Exception as e:
-        print e
-        return False
-
-if __name__ == "__main__":
-    localsettings.initiate()
-    from openmolar.dbtools import patient_class
-    pt = patient_class.patient(4)
-    d = getDescriptions()
-    print d
-    print getHtml(d[0], pt)
diff --git a/src/openmolar/qt-designer/activeDentStartFinish.ui b/src/openmolar/qt-designer/activeDentStartFinish.ui
deleted file mode 100644
index ad0b9d2..0000000
--- a/src/openmolar/qt-designer/activeDentStartFinish.ui
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>562</width>
-    <height>25</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
-   <property name="topMargin">
-    <number>1</number>
-   </property>
-   <property name="bottomMargin">
-    <number>1</number>
-   </property>
-   <item>
-    <widget class="QCheckBox" name="checkBox">
-     <property name="minimumSize">
-      <size>
-       <width>92</width>
-       <height>23</height>
-      </size>
-     </property>
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>CheckBox</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer name="horizontalSpacer">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>40</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QWidget" name="widget" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>80</width>
-       <height>0</height>
-      </size>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QWidget" name="widget_2" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>80</width>
-       <height>0</height>
-      </size>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLineEdit" name="lineEdit">
-     <property name="minimumSize">
-      <size>
-       <width>160</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maxLength">
-      <number>30</number>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/addTreatment.ui b/src/openmolar/qt-designer/addTreatment.ui
deleted file mode 100644
index ed54cfd..0000000
--- a/src/openmolar/qt-designer/addTreatment.ui
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>459</width>
-    <height>245</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Plan Treatment</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Add the following Treatment Items to the Current Treatment Plan</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QScrollArea" name="scrollArea">
-     <property name="widgetResizable">
-      <bool>true</bool>
-     </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>439</width>
-        <height>173</height>
-       </rect>
-      </property>
-      <layout class="QHBoxLayout" name="horizontalLayout">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="margin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QFrame" name="frame">
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/appointment_length.ui b/src/openmolar/qt-designer/appointment_length.ui
deleted file mode 100644
index 8728ae8..0000000
--- a/src/openmolar/qt-designer/appointment_length.ui
+++ /dev/null
@@ -1,137 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="windowModality" >
-   <enum>Qt::NonModal</enum>
-  </property>
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>256</width>
-    <height>134</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Select Appointment Length</string>
-  </property>
-  <property name="windowIcon" >
-   <iconset resource="../resources/resources.qrc" >
-    <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
-  </property>
-  <layout class="QGridLayout" name="gridLayout" >
-   <item row="0" column="0" >
-    <widget class="QLabel" name="label" >
-     <property name="text" >
-      <string>Hours</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1" >
-    <widget class="QLabel" name="label_2" >
-     <property name="text" >
-      <string>Minutes</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" >
-    <widget class="QSpinBox" name="hours_spinBox" >
-     <property name="maximumSize" >
-      <size>
-       <width>70</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="maximum" >
-      <number>8</number>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1" >
-    <widget class="QSpinBox" name="mins_spinBox" >
-     <property name="maximumSize" >
-      <size>
-       <width>70</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="maximum" >
-      <number>55</number>
-     </property>
-     <property name="singleStep" >
-      <number>5</number>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" colspan="2" >
-    <spacer name="verticalSpacer" >
-     <property name="orientation" >
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0" >
-      <size>
-       <width>20</width>
-       <height>29</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="3" column="0" colspan="2" >
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc" />
- </resources>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>Dialog</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>127</x>
-     <y>66</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/apptOpenDay.ui b/src/openmolar/qt-designer/apptOpenDay.ui
deleted file mode 100644
index cd01a57..0000000
--- a/src/openmolar/qt-designer/apptOpenDay.ui
+++ /dev/null
@@ -1,307 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>540</width>
-    <height>377</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Open a Day</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_2">
-   <item row="0" column="1">
-    <widget class="QLabel" name="label_2">
-     <property name="text">
-      <string>Clinician</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="2">
-    <widget class="QComboBox" name="comboBox"/>
-   </item>
-   <item row="0" column="3">
-    <spacer name="horizontalSpacer">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>141</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="1" column="1">
-    <widget class="QLabel" name="label_3">
-     <property name="text">
-      <string>Date to Open</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="2">
-    <widget class="QDateEdit" name="dateEdit">
-     <property name="minimumSize">
-      <size>
-       <width>140</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="calendarPopup">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" colspan="2">
-    <widget class="QLabel" name="label">
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>Day Memo - optional</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="2" colspan="2">
-    <widget class="QLineEdit" name="memo_lineEdit">
-     <property name="maxLength">
-      <number>30</number>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0" colspan="4">
-    <widget class="QFrame" name="frame">
-     <property name="minimumSize">
-      <size>
-       <width>522</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="1">
-       <widget class="QLabel" name="label_10">
-        <property name="text">
-         <string>Day Start</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="2">
-       <widget class="QTimeEdit" name="dayStart_timeEdit"/>
-      </item>
-      <item row="1" column="0">
-       <widget class="QCheckBox" name="es1_checkBox">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string>Morning Emergency Slot</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLabel" name="label_4">
-        <property name="text">
-         <string>Start</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="2">
-       <widget class="QTimeEdit" name="es1Start_timeEdit"/>
-      </item>
-      <item row="1" column="3">
-       <widget class="QLabel" name="label_7">
-        <property name="text">
-         <string>Finish</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="4">
-       <widget class="QTimeEdit" name="es1Finish_timeEdit"/>
-      </item>
-      <item row="2" column="0">
-       <widget class="QCheckBox" name="lunch_checkBox">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string>Lunch</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QLabel" name="label_5">
-        <property name="text">
-         <string>Start</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="2">
-       <widget class="QTimeEdit" name="lunchStart_timeEdit"/>
-      </item>
-      <item row="2" column="3">
-       <widget class="QLabel" name="label_8">
-        <property name="text">
-         <string>Finish</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="4">
-       <widget class="QTimeEdit" name="lunchFinish_timeEdit"/>
-      </item>
-      <item row="3" column="0">
-       <widget class="QCheckBox" name="es2_checkBox">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string>Afternoon Emergency Slot </string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="QLabel" name="label_6">
-        <property name="text">
-         <string>Start</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="2">
-       <widget class="QTimeEdit" name="es2Start_timeEdit"/>
-      </item>
-      <item row="3" column="3">
-       <widget class="QLabel" name="label_9">
-        <property name="text">
-         <string>Finish</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="4">
-       <widget class="QTimeEdit" name="es2Finish_timeEdit"/>
-      </item>
-      <item row="4" column="3">
-       <widget class="QLabel" name="label_11">
-        <property name="text">
-         <string>Day Finish</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="4">
-       <widget class="QTimeEdit" name="dayFinish_timeEdit"/>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="4" column="0">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="5" column="0" colspan="4">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <tabstops>
-  <tabstop>buttonBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/apptTools.ui b/src/openmolar/qt-designer/apptTools.ui
deleted file mode 100644
index 1389a8a..0000000
--- a/src/openmolar/qt-designer/apptTools.ui
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>599</width>
-    <height>255</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Appointment Tools</string>
-  </property>
-  <property name="windowIcon">
-   <iconset resource="../resources/resources.qrc">
-    <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
-  </property>
-  <widget class="QWidget" name="centralwidget">
-   <layout class="QGridLayout" name="gridLayout">
-    <item row="0" column="0" rowspan="5">
-     <widget class="QLabel" name="label">
-      <property name="frameShape">
-       <enum>QFrame::NoFrame</enum>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap resource="../resources/resources.qrc">:/appt_ov.png</pixmap>
-      </property>
-      <property name="scaledContents">
-       <bool>true</bool>
-      </property>
-     </widget>
-    </item>
-    <item row="0" column="1">
-     <widget class="QPushButton" name="extendBook_pushButton">
-      <property name="toolTip">
-       <string>Move the end date for making appointments.</string>
-      </property>
-      <property name="text">
-       <string>Extend Books</string>
-      </property>
-     </widget>
-    </item>
-    <item row="2" column="1">
-     <widget class="QPushButton" name="removeOld_pushButton">
-      <property name="text">
-       <string>Remove old weeks</string>
-      </property>
-     </widget>
-    </item>
-    <item row="3" column="1">
-     <widget class="QPushButton" name="editWeeks_pushButton">
-      <property name="text">
-       <string>Edit Standard Working Weeks for Clinicians</string>
-      </property>
-     </widget>
-    </item>
-    <item row="4" column="1">
-     <widget class="QPushButton" name="openDay_pushButton">
-      <property name="text">
-       <string>Open A Day</string>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="1">
-     <widget class="QPushButton" name="blocks_pushButton">
-      <property name="text">
-       <string>Insert regular blocks</string>
-      </property>
-     </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QMenuBar" name="menubar">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>599</width>
-     <height>22</height>
-    </rect>
-   </property>
-   <widget class="QMenu" name="menu_Quit">
-    <property name="title">
-     <string>&Quit</string>
-    </property>
-   </widget>
-   <addaction name="menu_Quit"/>
-  </widget>
-  <widget class="QStatusBar" name="statusbar"/>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/apptWizard.ui b/src/openmolar/qt-designer/apptWizard.ui
deleted file mode 100644
index 3a99a3e..0000000
--- a/src/openmolar/qt-designer/apptWizard.ui
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>721</width>
-    <height>442</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Appointment Wizard</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Add a combination of proposed appointments to the patients diary.</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QScrollArea" name="scrollArea">
-     <property name="widgetResizable">
-      <bool>true</bool>
-     </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>699</width>
-        <height>360</height>
-       </rect>
-      </property>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <widget class="QFrame" name="frame">
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/apptWizardItem.ui b/src/openmolar/qt-designer/apptWizardItem.ui
deleted file mode 100644
index 550b6f1..0000000
--- a/src/openmolar/qt-designer/apptWizardItem.ui
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>697</width>
-    <height>34</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
-   <property name="spacing">
-    <number>4</number>
-   </property>
-   <property name="topMargin">
-    <number>3</number>
-   </property>
-   <property name="bottomMargin">
-    <number>3</number>
-   </property>
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="text">
-      <string>TextLabel</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QComboBox" name="comboBox">
-     <property name="minimumSize">
-      <size>
-       <width>300</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>300</width>
-       <height>16777215</height>
-      </size>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QPushButton" name="pushButton">
-     <property name="text">
-      <string>Add</string>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/aslotEdit.ui b/src/openmolar/qt-designer/aslotEdit.ui
deleted file mode 100644
index 10f814d..0000000
--- a/src/openmolar/qt-designer/aslotEdit.ui
+++ /dev/null
@@ -1,245 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>602</width>
-    <height>457</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Clinicians - DATE</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0" colspan="4">
-    <widget class="QFrame" name="frame">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QHBoxLayout" name="horizontalLayout">
-      <property name="leftMargin">
-       <number>40</number>
-      </property>
-      <property name="topMargin">
-       <number>0</number>
-      </property>
-      <property name="rightMargin">
-       <number>40</number>
-      </property>
-      <property name="bottomMargin">
-       <number>0</number>
-      </property>
-      <item>
-       <widget class="QLabel" name="label">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="minimumSize">
-         <size>
-          <width>92</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>Clinician</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer name="horizontalSpacer">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item>
-       <widget class="QLabel" name="label_3">
-        <property name="minimumSize">
-         <size>
-          <width>80</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>Start</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="label_4">
-        <property name="minimumSize">
-         <size>
-          <width>80</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>Finish</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="label_2">
-        <property name="minimumSize">
-         <size>
-          <width>160</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>Memo</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="4">
-    <widget class="QScrollArea" name="scrollArea">
-     <property name="minimumSize">
-      <size>
-       <width>346</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="widgetResizable">
-      <bool>true</bool>
-     </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>584</width>
-        <height>380</height>
-       </rect>
-      </property>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <widget class="QFrame" name="frame_2">
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QPushButton" name="copy_pushButton">
-     <property name="toolTip">
-      <string>If you copy this day's setup to the clipboard, you can create a "clone" of this day when no data is set. This is useful when extending books.</string>
-     </property>
-     <property name="text">
-      <string>Copy To Clipboard</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="2">
-    <spacer name="horizontalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>188</width>
-       <height>24</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="2" column="3">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="QPushButton" name="paste_pushButton">
-     <property name="toolTip">
-      <string>Paste the saved values.</string>
-     </property>
-     <property name="text">
-      <string>Paste</string>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/blockSlot.ui b/src/openmolar/qt-designer/blockSlot.ui
deleted file mode 100644
index 69cf78c..0000000
--- a/src/openmolar/qt-designer/blockSlot.ui
+++ /dev/null
@@ -1,342 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>345</width>
-    <height>361</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Options</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QTabWidget" name="tabWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tab">
-      <attribute name="title">
-       <string>Insert a Block</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout">
-       <item row="0" column="0" colspan="3">
-        <widget class="QLabel" name="label">
-         <property name="text">
-          <string>Would you like to Block (or partially Block) this Slot?</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="0">
-        <widget class="QLabel" name="label_3">
-         <property name="text">
-          <string>Block Start</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="0">
-        <widget class="QLabel" name="label_4">
-         <property name="text">
-          <string>Bock End</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="0" rowspan="2">
-        <widget class="QLabel" name="label_2">
-         <property name="text">
-          <string>Text to apply</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="1" colspan="2">
-        <widget class="QComboBox" name="comboBox">
-         <property name="editable">
-          <bool>true</bool>
-         </property>
-         <item>
-          <property name="text">
-           <string>//Blocked//</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Emergency</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Reserved Clinical Time</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Out of Office</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Lunch</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Catch up time</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Phone Call</string>
-          </property>
-         </item>
-        </widget>
-       </item>
-       <item row="5" column="0" colspan="2">
-        <spacer name="verticalSpacer">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>34</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="1" column="1">
-        <widget class="QFrame" name="blockStart_frame">
-         <property name="minimumSize">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="1">
-        <widget class="QFrame" name="blockEnd_frame">
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="2" rowspan="2">
-        <widget class="QLabel" name="length_label">
-         <property name="text">
-          <string>minutes</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_2">
-      <attribute name="title">
-       <string>Insert a Known Patient</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_2">
-       <item row="0" column="0" colspan="4">
-        <widget class="QLabel" name="label_7">
-         <property name="text">
-          <string>Insert A Patient into this slot?</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="0" colspan="3">
-        <widget class="QLabel" name="label_5">
-         <property name="minimumSize">
-          <size>
-           <width>100</width>
-           <height>0</height>
-          </size>
-         </property>
-         <property name="text">
-          <string>Start Time</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="0" colspan="3">
-        <widget class="QLabel" name="label_6">
-         <property name="minimumSize">
-          <size>
-           <width>100</width>
-           <height>0</height>
-          </size>
-         </property>
-         <property name="text">
-          <string>Length</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="0" colspan="3">
-        <widget class="QLabel" name="pt_label">
-         <property name="minimumSize">
-          <size>
-           <width>0</width>
-           <height>50</height>
-          </size>
-         </property>
-         <property name="text">
-          <string>Chosen Patient is<br /></string>
-         </property>
-         <property name="textFormat">
-          <enum>Qt::AutoText</enum>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="3">
-        <widget class="QPushButton" name="changePt_pushButton">
-         <property name="text">
-          <string>Change</string>
-         </property>
-        </widget>
-       </item>
-       <item row="4" column="0" colspan="3">
-        <widget class="QLabel" name="label_9">
-         <property name="text">
-          <string>Reason for appointment is</string>
-         </property>
-         <property name="textFormat">
-          <enum>Qt::AutoText</enum>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="4" column="3">
-        <widget class="QComboBox" name="reason_comboBox"/>
-       </item>
-       <item row="5" column="2">
-        <spacer name="verticalSpacer_2">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>99</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="2" column="3">
-        <widget class="QSpinBox" name="length_spinBox">
-         <property name="suffix">
-          <string> minutes</string>
-         </property>
-         <property name="minimum">
-          <number>-600</number>
-         </property>
-         <property name="maximum">
-          <number>600</number>
-         </property>
-         <property name="singleStep">
-          <number>5</number>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="3">
-        <widget class="QFrame" name="startTime_frame">
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/block_wizard.ui b/src/openmolar/qt-designer/block_wizard.ui
deleted file mode 100644
index 6993c2d..0000000
--- a/src/openmolar/qt-designer/block_wizard.ui
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>403</width>
-    <height>437</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Block Wizard</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_2">
-   <item row="0" column="0" colspan="4">
-    <widget class="QLabel" name="label_7">
-     <property name="text">
-      <string>Insert a block into a book for a range of dates.</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QLabel" name="label_2">
-     <property name="text">
-      <string>Start Date</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="QDateEdit" name="start_dateEdit">
-     <property name="minimumSize">
-      <size>
-       <width>120</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="calendarPopup">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="3">
-    <spacer name="horizontalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>202</width>
-       <height>21</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="label_3">
-     <property name="text">
-      <string>End Date (inclusive)</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1">
-    <widget class="QDateEdit" name="end_dateEdit">
-     <property name="minimumSize">
-      <size>
-       <width>120</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="calendarPopup">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="3">
-    <spacer name="horizontalSpacer_3">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>202</width>
-       <height>21</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="4" column="0">
-    <widget class="QLabel" name="label_4">
-     <property name="text">
-      <string>Time</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="3">
-    <spacer name="horizontalSpacer_4">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>202</width>
-       <height>21</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="5" column="0">
-    <widget class="QLabel" name="label_5">
-     <property name="text">
-      <string>Length</string>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="3">
-    <spacer name="horizontalSpacer_5">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>202</width>
-       <height>22</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="6" column="0">
-    <widget class="QLabel" name="label_6">
-     <property name="text">
-      <string>Text to Apply</string>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="1" colspan="3">
-    <widget class="QLineEdit" name="lineEdit"/>
-   </item>
-   <item row="7" column="0" colspan="4">
-    <widget class="QGroupBox" name="day_groupBox">
-     <property name="title">
-      <string>Days to Apply</string>
-     </property>
-    </widget>
-   </item>
-   <item row="12" column="0" colspan="4">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="8" column="0">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="4" column="1">
-    <widget class="QFrame" name="time_frame">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="4">
-    <widget class="QGroupBox" name="clinicians_groupBox">
-     <property name="title">
-      <string>Clinicians</string>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="1">
-    <widget class="QSpinBox" name="spinBox">
-     <property name="suffix">
-      <string> minutes</string>
-     </property>
-     <property name="maximum">
-      <number>300</number>
-     </property>
-     <property name="singleStep">
-      <number>5</number>
-     </property>
-    </widget>
-   </item>
-   <item row="11" column="0">
-    <spacer name="verticalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="9" column="0" colspan="4">
-    <widget class="QLabel" name="progress_label">
-     <property name="text">
-      <string/>
-     </property>
-    </widget>
-   </item>
-   <item row="10" column="0" colspan="4">
-    <widget class="QProgressBar" name="progressBar">
-     <property name="value">
-      <number>0</number>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/bridge_denture.ui b/src/openmolar/qt-designer/bridge_denture.ui
deleted file mode 100644
index f69cb80..0000000
--- a/src/openmolar/qt-designer/bridge_denture.ui
+++ /dev/null
@@ -1,242 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>632</width>
-    <height>480</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Bridge - Denture Entry</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout" >
-   <item rowspan="2" row="0" column="0" >
-    <widget class="QFrame" name="frame" >
-     <property name="minimumSize" >
-      <size>
-       <width>331</width>
-       <height>451</height>
-      </size>
-     </property>
-     <property name="frameShape" >
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow" >
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1" >
-    <widget class="QTabWidget" name="tabWidget" >
-     <property name="currentIndex" >
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tab" >
-      <attribute name="title" >
-       <string>Bridge</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_4" >
-       <item>
-        <widget class="QRadioButton" name="radioButton" >
-         <property name="text" >
-          <string>Porcelain / Precious Metal</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QRadioButton" name="radioButton_2" >
-         <property name="text" >
-          <string>Lava (or all ceramic)</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QRadioButton" name="radioButton_3" >
-         <property name="text" >
-          <string>Resin Retained</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <spacer name="verticalSpacer" >
-         <property name="orientation" >
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0" >
-          <size>
-           <width>20</width>
-           <height>295</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_2" >
-      <attribute name="title" >
-       <string>Denture</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_3" >
-       <item>
-        <widget class="QFrame" name="frame_2" >
-         <property name="frameShape" >
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow" >
-          <enum>QFrame::Raised</enum>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout" >
-          <item>
-           <widget class="QLabel" name="label_2" >
-            <property name="text" >
-             <string>Upper</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_4" >
-            <property name="text" >
-             <string>Full (acrylic)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_8" >
-            <property name="text" >
-             <string>Full (co-chrome)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_5" >
-            <property name="text" >
-             <string>Partial (acrylic)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_6" >
-            <property name="text" >
-             <string>Partial (co-chrome)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_7" >
-            <property name="text" >
-             <string>Other</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QFrame" name="frame_3" >
-         <property name="frameShape" >
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow" >
-          <enum>QFrame::Raised</enum>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_2" >
-          <item>
-           <widget class="QLabel" name="label" >
-            <property name="text" >
-             <string>Lower</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_9" >
-            <property name="text" >
-             <string>Full (acrylic)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_13" >
-            <property name="text" >
-             <string>Full (co-chrome)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_10" >
-            <property name="text" >
-             <string>Partial (acrylic)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_11" >
-            <property name="text" >
-             <string>Partial (co-chrome)</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="radioButton_12" >
-            <property name="text" >
-             <string>Other</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item row="1" column="1" >
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/bulkmail_options.ui b/src/openmolar/qt-designer/bulkmail_options.ui
deleted file mode 100644
index b0b0c45..0000000
--- a/src/openmolar/qt-designer/bulkmail_options.ui
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>410</width>
-    <height>367</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Bulk Mail Options</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QFrame" name="frame">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_2">
-      <item row="0" column="0" rowspan="2">
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Date Format for the letters</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QRadioButton" name="fullDate_radioButton">
-        <property name="text">
-         <string>Full, Day, month and Year</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QRadioButton" name="abbrvDate_radioButton">
-        <property name="text">
-         <string>Month and Year Only</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="Line" name="line">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QFrame" name="frame_2">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="0">
-       <widget class="QLabel" name="label_2">
-        <property name="text">
-         <string>Date to use</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QRadioButton" name="today_radioButton">
-        <property name="text">
-         <string>Today's Date</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QRadioButton" name="recd_radioButton">
-        <property name="text">
-         <string>The actual recall date for the patient</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QRadioButton" name="custDate_radioButton">
-        <property name="text">
-         <string>This Date</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="QDateEdit" name="dateEdit">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="calendarPopup">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/choose_clinicians.ui b/src/openmolar/qt-designer/choose_clinicians.ui
deleted file mode 100644
index b459f38..0000000
--- a/src/openmolar/qt-designer/choose_clinicians.ui
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>342</width>
-    <height>385</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Choose Clinicians</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QFrame" name="frame">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/choose_language.ui b/src/openmolar/qt-designer/choose_language.ui
deleted file mode 100644
index 8b2925f..0000000
--- a/src/openmolar/qt-designer/choose_language.ui
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>426</width>
-    <height>602</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Language Selector</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>60</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Choose from the following available languages.
-Please Note that some of these translations are not complete.</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QScrollArea" name="scrollArea">
-     <property name="widgetResizable">
-      <bool>true</bool>
-     </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>406</width>
-        <height>351</height>
-       </rect>
-      </property>
-      <layout class="QHBoxLayout" name="horizontalLayout">
-       <item>
-        <widget class="QFrame" name="frame">
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label_2">
-     <property name="minimumSize">
-      <size>
-       <width>408</width>
-       <height>40</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Note - if your preferred language is not available (or incomplete), please visit https://launchpad.net/openmolar and add a translation of your own!</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label_3">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>80</height>
-      </size>
-     </property>
-     <property name="font">
-      <font>
-       <italic>true</italic>
-      </font>
-     </property>
-     <property name="text">
-      <string>Many thanks to all who have helped internationalise openMolar, and  to the folks behind the GNU tools and launchpad rosetta team who make this possible.</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>27</height>
-      </size>
-     </property>
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/choose_tooth.ui b/src/openmolar/qt-designer/choose_tooth.ui
deleted file mode 100644
index c601a0e..0000000
--- a/src/openmolar/qt-designer/choose_tooth.ui
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>736</width>
-    <height>300</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Choose A Tooth</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Please Select the tooth to which this treatment is planned</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QFrame" name="frame">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>200</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/codeChecker.ui b/src/openmolar/qt-designer/codeChecker.ui
deleted file mode 100644
index db43822..0000000
--- a/src/openmolar/qt-designer/codeChecker.ui
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>907</width>
-    <height>686</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Dialog</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout_3">
-   <item>
-    <widget class="QSplitter" name="splitter">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <widget class="QFrame" name="frame_3">
-      <property name="frameShape">
-       <enum>QFrame::StyledPanel</enum>
-      </property>
-      <property name="frameShadow">
-       <enum>QFrame::Raised</enum>
-      </property>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <widget class="QFrame" name="frame">
-         <property name="minimumSize">
-          <size>
-           <width>0</width>
-           <height>200</height>
-          </size>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QLabel" name="label">
-         <property name="text">
-          <string>Deciduous Teeth</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QTableView" name="dec_tableView">
-         <attribute name="verticalHeaderVisible">
-          <bool>false</bool>
-         </attribute>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QFrame" name="frame_2">
-      <property name="frameShape">
-       <enum>QFrame::StyledPanel</enum>
-      </property>
-      <property name="frameShadow">
-       <enum>QFrame::Raised</enum>
-      </property>
-      <layout class="QVBoxLayout" name="verticalLayout">
-       <item>
-        <widget class="QLabel" name="label_2">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="text">
-          <string>Adult Teeth</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QTableView" name="adult_tableView">
-         <attribute name="horizontalHeaderVisible">
-          <bool>false</bool>
-         </attribute>
-         <attribute name="verticalHeaderVisible">
-          <bool>false</bool>
-         </attribute>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QComboBox" name="comboBox"/>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="bottom_layout">
-     <item>
-      <widget class="QLabel" name="instruction_label">
-       <property name="text">
-        <string>Enter a Restoration Code (eg. MOD) to see how a feescale interprets the shortcut</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="pushButton">
-       <property name="maximumSize">
-        <size>
-         <width>40</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="text">
-        <string>GO</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="quit_pushButton">
-       <property name="text">
-        <string>QUIT</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/completionDate.ui b/src/openmolar/qt-designer/completionDate.ui
deleted file mode 100644
index 7f2c6e2..0000000
--- a/src/openmolar/qt-designer/completionDate.ui
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>340</width>
-    <height>227</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Completion Date</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="pt_label">
-     <property name="text">
-      <string>UNNAMED PT - (000000)</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="autoComplete_label">
-     <property name="text">
-      <string>You have no further treatment proposed for this patient, yet they are deemed to be "under treatment".</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer name="verticalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QLabel" name="label_4">
-       <property name="layoutDirection">
-        <enum>Qt::RightToLeft</enum>
-       </property>
-       <property name="text">
-        <string>Suggested completion Date</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QDateEdit" name="dateEdit">
-       <property name="focusPolicy">
-        <enum>Qt::TabFocus</enum>
-       </property>
-       <property name="calendarPopup">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Apply this Date Now?
-(course can be re-opened later if necessary)</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>14</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="focusPolicy">
-      <enum>Qt::StrongFocus</enum>
-     </property>
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::No|QDialogButtonBox::Yes</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/customTreatment.ui b/src/openmolar/qt-designer/customTreatment.ui
deleted file mode 100644
index d40fb95..0000000
--- a/src/openmolar/qt-designer/customTreatment.ui
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>346</width>
-    <height>192</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Custom Item</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="2" column="0" colspan="3">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Number of Items</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-     <property name="buddy">
-      <cstring>number_spinBox</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="3">
-    <widget class="QSpinBox" name="number_spinBox">
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-     <property name="minimum">
-      <number>1</number>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="3">
-    <widget class="QLabel" name="label_3">
-     <property name="text">
-      <string>Fee</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-     <property name="buddy">
-      <cstring>fee_doubleSpinBox</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="3">
-    <widget class="QDoubleSpinBox" name="fee_doubleSpinBox">
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-     <property name="maximum">
-      <double>3000.000000000000000</double>
-     </property>
-     <property name="singleStep">
-      <double>1.000000000000000</double>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="2">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>50</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="6" column="1" colspan="3">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="4">
-    <widget class="QLineEdit" name="description_lineEdit">
-     <property name="maxLength">
-      <number>50</number>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="0">
-    <widget class="QLabel" name="label_2">
-     <property name="text">
-      <string>Treatment Description</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-     <property name="buddy">
-      <cstring>description_lineEdit</cstring>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <tabstops>
-  <tabstop>number_spinBox</tabstop>
-  <tabstop>fee_doubleSpinBox</tabstop>
-  <tabstop>buttonBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/daylist_print.ui b/src/openmolar/qt-designer/daylist_print.ui
deleted file mode 100644
index 856f19b..0000000
--- a/src/openmolar/qt-designer/daylist_print.ui
+++ /dev/null
@@ -1,203 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>376</width>
-    <height>486</height>
-   </rect>
-  </property>
-  <property name="font" >
-   <font>
-    <weight>50</weight>
-    <bold>false</bold>
-   </font>
-  </property>
-  <property name="windowTitle" >
-   <string>Daylist Printing Wizard</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout" >
-   <item>
-    <widget class="QLabel" name="label_2" >
-     <property name="sizePolicy" >
-      <sizepolicy vsizetype="Minimum" hsizetype="Preferred" >
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="maximumSize" >
-      <size>
-       <width>16777215</width>
-       <height>100</height>
-      </size>
-     </property>
-     <property name="font" >
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text" >
-      <string>Specify Dates and Practitioners for a Daylist Print Run</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <layout class="QGridLayout" name="gridLayout" >
-     <item row="0" column="0" >
-      <widget class="QLabel" name="label_3" >
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Minimum" hsizetype="Preferred" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text" >
-        <string>Start Date</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="1" >
-      <widget class="QLabel" name="label_4" >
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Minimum" hsizetype="Preferred" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text" >
-        <string>End Date</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="0" >
-      <widget class="QDateEdit" name="start_dateEdit" >
-       <property name="calendarPopup" >
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1" >
-      <widget class="QDateEdit" name="end_dateEdit" >
-       <property name="calendarPopup" >
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="QScrollArea" name="scrollArea" >
-     <property name="sizePolicy" >
-      <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize" >
-      <size>
-       <width>0</width>
-       <height>200</height>
-      </size>
-     </property>
-     <property name="widgetResizable" >
-      <bool>true</bool>
-     </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents" >
-      <property name="geometry" >
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>354</width>
-        <height>196</height>
-       </rect>
-      </property>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QRadioButton" name="allOnePage_radioButton" >
-     <property name="text" >
-      <string>All Practioners on One Page</string>
-     </property>
-     <property name="checked" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QRadioButton" name="onePageMin_radioButton" >
-     <property name="text" >
-      <string>One Practitioner Per Page - Minimal</string>
-     </property>
-     <property name="checked" >
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QRadioButton" name="onePageFull_radioButton" >
-     <property name="text" >
-      <string>One Practioner Per Page - Fill Page</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/diary_widget.ui b/src/openmolar/qt-designer/diary_widget.ui
deleted file mode 100644
index f7de684..0000000
--- a/src/openmolar/qt-designer/diary_widget.ui
+++ /dev/null
@@ -1,953 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>732</width>
-    <height>551</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
-   <item>
-    <widget class="QTabWidget" name="diary_tabWidget">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tab_dayview">
-      <attribute name="title">
-       <string>Day View</string>
-      </attribute>
-      <layout class="QHBoxLayout" name="horizontalLayout_4">
-       <property name="spacing">
-        <number>6</number>
-       </property>
-       <property name="margin">
-        <number>3</number>
-       </property>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_3">
-         <property name="spacing">
-          <number>6</number>
-         </property>
-         <item>
-          <widget class="QFrame" name="frame_18">
-           <property name="minimumSize">
-            <size>
-             <width>220</width>
-             <height>0</height>
-            </size>
-           </property>
-           <property name="maximumSize">
-            <size>
-             <width>220</width>
-             <height>16777215</height>
-            </size>
-           </property>
-           <property name="frameShape">
-            <enum>QFrame::StyledPanel</enum>
-           </property>
-           <property name="frameShadow">
-            <enum>QFrame::Raised</enum>
-           </property>
-           <layout class="QVBoxLayout" name="verticalLayout_19">
-            <property name="margin">
-             <number>3</number>
-            </property>
-            <item>
-             <widget class="QWidget" name="dayCalendar_frame" native="true">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="minimumSize">
-               <size>
-                <width>200</width>
-                <height>180</height>
-               </size>
-              </property>
-              <property name="maximumSize">
-               <size>
-                <width>16777215</width>
-                <height>200</height>
-               </size>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QPushButton" name="goTodayPushButton">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="maximumSize">
-               <size>
-                <width>16777215</width>
-                <height>24</height>
-               </size>
-              </property>
-              <property name="text">
-               <string>Go To Today</string>
-              </property>
-              <property name="icon">
-               <iconset resource="../resources/resources.qrc">
-                <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QFrame" name="day_view_control_frame">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="frameShape">
-               <enum>QFrame::NoFrame</enum>
-              </property>
-              <property name="frameShadow">
-               <enum>QFrame::Plain</enum>
-              </property>
-              <property name="lineWidth">
-               <number>0</number>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-         </item>
-         <item>
-          <layout class="QGridLayout" name="gridLayout_2">
-           <item row="1" column="0">
-            <widget class="QSplitter" name="dayView_splitter">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>300</height>
-              </size>
-             </property>
-             <property name="orientation">
-              <enum>Qt::Horizontal</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="1">
-            <widget class="QScrollBar" name="emergency_dayview_scroll_bar">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="0" colspan="2">
-            <widget class="QWebView" name="appt_notes_webView">
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>150</height>
-              </size>
-             </property>
-             <property name="maximumSize">
-              <size>
-               <width>16777215</width>
-               <height>200</height>
-              </size>
-             </property>
-             <property name="url">
-              <url>
-               <string>about:blank</string>
-              </url>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="0" colspan="2">
-            <widget class="QLabel" name="daymemo_label">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="font">
-              <font>
-               <pointsize>12</pointsize>
-               <weight>75</weight>
-               <bold>true</bold>
-              </font>
-             </property>
-             <property name="text">
-              <string>TextLabel</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignCenter</set>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_weekview">
-      <attribute name="title">
-       <string>Week View</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_11">
-       <property name="margin">
-        <number>3</number>
-       </property>
-       <property name="spacing">
-        <number>3</number>
-       </property>
-       <item row="0" column="0" rowspan="2">
-        <widget class="QFrame" name="frame_8">
-         <property name="minimumSize">
-          <size>
-           <width>220</width>
-           <height>0</height>
-          </size>
-         </property>
-         <property name="maximumSize">
-          <size>
-           <width>220</width>
-           <height>16777215</height>
-          </size>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_3">
-          <property name="margin">
-           <number>3</number>
-          </property>
-          <item>
-           <widget class="QWidget" name="weekCalendar_frame" native="true">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>30</width>
-              <height>180</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>16777215</width>
-              <height>200</height>
-             </size>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QPushButton" name="goto_current_week_PushButton">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>16777215</width>
-              <height>24</height>
-             </size>
-            </property>
-            <property name="text">
-             <string>View Current Week</string>
-            </property>
-            <property name="icon">
-             <iconset resource="../resources/resources.qrc">
-              <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QFrame" name="week_view_control_frame">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="frameShape">
-             <enum>QFrame::NoFrame</enum>
-            </property>
-            <property name="frameShadow">
-             <enum>QFrame::Plain</enum>
-            </property>
-            <property name="lineWidth">
-             <number>0</number>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item row="0" column="1">
-        <widget class="QSplitter" name="weekView_splitter">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <widget class="QWidget" name="layoutWidget">
-          <layout class="QGridLayout" name="gridLayout">
-           <item row="0" column="0">
-            <widget class="QFrame" name="day1_frame">
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>60</height>
-              </size>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="1">
-            <widget class="QFrame" name="day2_frame">
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>40</height>
-              </size>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="2">
-            <widget class="QFrame" name="day3_frame">
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>40</height>
-              </size>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="3">
-            <widget class="QFrame" name="day4_frame">
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>40</height>
-              </size>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="4">
-            <widget class="QFrame" name="day5_frame">
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>40</height>
-              </size>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="0">
-            <widget class="QFrame" name="appt_OV_Frame1">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Sunken</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="1">
-            <widget class="QFrame" name="appt_OV_Frame2">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Sunken</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="2">
-            <widget class="QFrame" name="appt_OV_Frame3">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Sunken</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="3">
-            <widget class="QFrame" name="appt_OV_Frame4">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Sunken</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="4">
-            <widget class="QFrame" name="appt_OV_Frame5">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Sunken</enum>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-         <widget class="QWidget" name="layoutWidget_2">
-          <layout class="QVBoxLayout" name="verticalLayout_23">
-           <item>
-            <widget class="QFrame" name="day6_frame">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>40</height>
-              </size>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QFrame" name="appt_OV_Frame6">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Sunken</enum>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QFrame" name="day7_frame">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>40</height>
-              </size>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QFrame" name="appt_OV_Frame7">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Sunken</enum>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_monthview">
-      <attribute name="title">
-       <string>Month View</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_5">
-       <property name="margin">
-        <number>3</number>
-       </property>
-       <item row="0" column="0" colspan="4">
-        <widget class="QScrollArea" name="monthView_scrollArea">
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="scrollAreaWidgetContents_14">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>702</width>
-            <height>456</height>
-           </rect>
-          </property>
-         </widget>
-        </widget>
-       </item>
-       <item row="1" column="2">
-        <layout class="QHBoxLayout" name="horizontalLayout_22">
-         <item>
-          <spacer name="horizontalSpacer_13">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QPushButton" name="aptOVprevmonth">
-           <property name="maximumSize">
-            <size>
-             <width>28</width>
-             <height>20</height>
-            </size>
-           </property>
-           <property name="text">
-            <string/>
-           </property>
-           <property name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/back.png</normaloff>:/back.png</iconset>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QLabel" name="label_65">
-           <property name="maximumSize">
-            <size>
-             <width>16777215</width>
-             <height>20</height>
-            </size>
-           </property>
-           <property name="text">
-            <string>Month</string>
-           </property>
-           <property name="alignment">
-            <set>Qt::AlignCenter</set>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="aptOVnextmonth">
-           <property name="maximumSize">
-            <size>
-             <width>28</width>
-             <height>20</height>
-            </size>
-           </property>
-           <property name="text">
-            <string/>
-           </property>
-           <property name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer name="horizontalSpacer_14">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-       <item row="1" column="3">
-        <widget class="QPushButton" name="printMonth_pushButton">
-         <property name="text">
-          <string>Print Month View</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../resources/resources.qrc">
-           <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="0">
-        <widget class="QCheckBox" name="monthClinicians_checkBox">
-         <property name="text">
-          <string>All Clinicians</string>
-         </property>
-         <property name="checked">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="1">
-        <widget class="QPushButton" name="monthView_clinicians_pushButton">
-         <property name="text">
-          <string>Select Clinicians</string>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_yearview">
-      <attribute name="title">
-       <string>Year View</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_22">
-       <property name="margin">
-        <number>3</number>
-       </property>
-       <item row="0" column="0" colspan="3">
-        <widget class="QTextBrowser" name="year_textBrowser">
-         <property name="maximumSize">
-          <size>
-           <width>16777215</width>
-           <height>200</height>
-          </size>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="0" colspan="3">
-        <widget class="QFrame" name="yearView_frame">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="0">
-        <widget class="QCheckBox" name="yearClinicians_checkBox">
-         <property name="text">
-          <string>All Clinicians</string>
-         </property>
-         <property name="checked">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="1">
-        <widget class="QPushButton" name="yearView_clinicians_pushButton">
-         <property name="text">
-          <string>Select Clinicians</string>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="2">
-        <layout class="QHBoxLayout" name="horizontalLayout_2">
-         <item>
-          <spacer name="horizontalSpacer_10">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QPushButton" name="aptOVprevyear">
-           <property name="maximumSize">
-            <size>
-             <width>28</width>
-             <height>20</height>
-            </size>
-           </property>
-           <property name="text">
-            <string/>
-           </property>
-           <property name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/back.png</normaloff>:/back.png</iconset>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QLabel" name="label_64">
-           <property name="maximumSize">
-            <size>
-             <width>16777215</width>
-             <height>20</height>
-            </size>
-           </property>
-           <property name="text">
-            <string>Year</string>
-           </property>
-           <property name="alignment">
-            <set>Qt::AlignCenter</set>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="aptOVnextyear">
-           <property name="maximumSize">
-            <size>
-             <width>28</width>
-             <height>20</height>
-            </size>
-           </property>
-           <property name="text">
-            <string/>
-           </property>
-           <property name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer name="horizontalSpacer_6">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_agenda">
-      <attribute name="title">
-       <string>Agenda</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_agenda">
-       <property name="margin">
-        <number>3</number>
-       </property>
-       <property name="spacing">
-        <number>3</number>
-       </property>
-       <item row="0" column="0">
-        <widget class="QWidget" name="agenda_calendar_frame" native="true">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="minimumSize">
-          <size>
-           <width>220</width>
-           <height>180</height>
-          </size>
-         </property>
-         <property name="maximumSize">
-          <size>
-           <width>220</width>
-           <height>200</height>
-          </size>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="1" rowspan="3">
-        <widget class="QFrame" name="agenda_frame">
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="0">
-        <widget class="QPushButton" name="agenda_goTodayPushButton">
-         <property name="enabled">
-          <bool>false</bool>
-         </property>
-         <property name="minimumSize">
-          <size>
-           <width>220</width>
-           <height>0</height>
-          </size>
-         </property>
-         <property name="maximumSize">
-          <size>
-           <width>220</width>
-           <height>24</height>
-          </size>
-         </property>
-         <property name="text">
-          <string>Go To Today</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../resources/resources.qrc">
-           <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="0">
-        <widget class="QFrame" name="agenda_control_frame">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="minimumSize">
-          <size>
-           <width>220</width>
-           <height>0</height>
-          </size>
-         </property>
-         <property name="maximumSize">
-          <size>
-           <width>220</width>
-           <height>16777215</height>
-          </size>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Plain</enum>
-         </property>
-         <property name="lineWidth">
-          <number>0</number>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>QWebView</class>
-   <extends>QWidget</extends>
-   <header>QtWebKit/QWebView</header>
-  </customwidget>
- </customwidgets>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/editmemos.ui b/src/openmolar/qt-designer/editmemos.ui
deleted file mode 100644
index 06acbcb..0000000
--- a/src/openmolar/qt-designer/editmemos.ui
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>417</width>
-    <height>395</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Edit Memos</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0" colspan="3">
-    <widget class="QLabel" name="label">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string/>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QLabel" name="label_2">
-     <property name="text">
-      <string>Global Memo</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1" colspan="2">
-    <widget class="QLineEdit" name="lineEdit"/>
-   </item>
-   <item row="2" column="0" colspan="2">
-    <widget class="QLabel" name="label_3">
-     <property name="text">
-      <string>Clinician Memos</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0" colspan="3">
-    <widget class="QScrollArea" name="scrollArea">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="widgetResizable">
-      <bool>true</bool>
-     </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>399</width>
-        <height>238</height>
-       </rect>
-      </property>
-     </widget>
-    </widget>
-   </item>
-   <item row="4" column="2">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/enter_letter_text.ui b/src/openmolar/qt-designer/enter_letter_text.ui
deleted file mode 100644
index 4897b37..0000000
--- a/src/openmolar/qt-designer/enter_letter_text.ui
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="windowModality">
-   <enum>Qt::NonModal</enum>
-  </property>
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>644</width>
-    <height>641</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Letter Text Entry</string>
-  </property>
-  <property name="sizeGripEnabled">
-   <bool>true</bool>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string><b>Please enter the body text for your letter here.</b></string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QTextEdit" name="textEdit"/>
-   </item>
-   <item row="2" column="0">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/exam_wizard.ui b/src/openmolar/qt-designer/exam_wizard.ui
deleted file mode 100644
index 81df24c..0000000
--- a/src/openmolar/qt-designer/exam_wizard.ui
+++ /dev/null
@@ -1,171 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>333</width>
-    <height>272</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Exam Wizard</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>Type</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="QRadioButton" name="examA_radioButton">
-     <property name="text">
-      <string>Standard</string>
-     </property>
-     <property name="checked">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="QRadioButton" name="examB_radioButton">
-     <property name="text">
-      <string>Extensive</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="QRadioButton" name="examC_radioButton">
-     <property name="text">
-      <string>Full Case Assessment</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="label_3">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>Exam Date</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1">
-    <widget class="QDateEdit" name="dateEdit">
-     <property name="minimumSize">
-      <size>
-       <width>100</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="calendarPopup">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0">
-    <widget class="QLabel" name="label_2">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>Dentist</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="1">
-    <widget class="QComboBox" name="dents_comboBox"/>
-   </item>
-   <item row="5" column="1">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="6" column="0" colspan="2">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/finalise_appt_time.ui b/src/openmolar/qt-designer/finalise_appt_time.ui
deleted file mode 100644
index c50d0fa..0000000
--- a/src/openmolar/qt-designer/finalise_appt_time.ui
+++ /dev/null
@@ -1,148 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>321</width>
-    <height>159</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Appointment Time</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout" >
-   <item row="0" column="0" >
-    <widget class="QLabel" name="label" >
-     <property name="text" >
-      <string>Space Before Appointment</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1" >
-    <widget class="QLabel" name="minutesB4label" >
-     <property name="text" >
-      <string>0 mins</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item rowspan="3" row="0" column="2" >
-    <widget class="QSlider" name="verticalSlider" >
-     <property name="mouseTracking" >
-      <bool>true</bool>
-     </property>
-     <property name="value" >
-      <number>0</number>
-     </property>
-     <property name="tracking" >
-      <bool>true</bool>
-     </property>
-     <property name="orientation" >
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="invertedAppearance" >
-      <bool>true</bool>
-     </property>
-     <property name="invertedControls" >
-      <bool>false</bool>
-     </property>
-     <property name="tickPosition" >
-      <enum>QSlider::NoTicks</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" >
-    <widget class="QLabel" name="label_3" >
-     <property name="text" >
-      <string>Appointment Time</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1" >
-    <widget class="QLabel" name="apptTimelabel" >
-     <property name="text" >
-      <string>00:00 - 00:00</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" >
-    <widget class="QLabel" name="label_2" >
-     <property name="text" >
-      <string>Space After Appointment</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1" >
-    <widget class="QLabel" name="minutesL8Rlabel" >
-     <property name="text" >
-      <string>0 mins</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0" colspan="3" >
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/forumPost.ui b/src/openmolar/qt-designer/forumPost.ui
deleted file mode 100644
index ffa7f22..0000000
--- a/src/openmolar/qt-designer/forumPost.ui
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>502</width>
-    <height>253</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Forum Input</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label_3">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>Topic</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1" colspan="3">
-    <widget class="QLineEdit" name="topic_lineEdit"/>
-   </item>
-   <item row="1" column="2">
-    <widget class="QLabel" name="label_4">
-     <property name="text">
-      <string>To</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="3">
-    <widget class="QComboBox" name="to_comboBox">
-     <property name="maxVisibleItems">
-      <number>20</number>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QLabel" name="label">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>Comment</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1" rowspan="2" colspan="3">
-    <widget class="QTextEdit" name="comment_textEdit">
-     <property name="acceptRichText">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="4">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="count_label">
-     <property name="text">
-      <string>(0 Characters)</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QLabel" name="label_2">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>From</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="QComboBox" name="from_comboBox">
-     <property name="maxVisibleItems">
-      <number>20</number>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/hygenist_wizard.ui b/src/openmolar/qt-designer/hygenist_wizard.ui
deleted file mode 100644
index 407595b..0000000
--- a/src/openmolar/qt-designer/hygenist_wizard.ui
+++ /dev/null
@@ -1,233 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>339</width>
-    <height>350</height>
-   </rect>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>0</width>
-    <height>0</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Hygienist Wizard</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout_3">
-   <item>
-    <widget class="QGroupBox" name="planned_groupbox">
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>200</height>
-      </size>
-     </property>
-     <property name="title">
-      <string>Planned Treatments</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_2">
-      <item>
-       <widget class="QLabel" name="label">
-        <property name="styleSheet">
-         <string notr="true">color:red;</string>
-        </property>
-        <property name="text">
-         <string>label</string>
-        </property>
-        <property name="wordWrap">
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="pushButton">
-        <property name="text">
-         <string>Ok - I'll be careful!</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox">
-     <property name="title">
-      <string>Type</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout">
-      <item>
-       <widget class="QRadioButton" name="db_radioButton">
-        <property name="text">
-         <string>Debridement</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="sp_radioButton">
-        <property name="text">
-         <string>Scale and Polish</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="extsp_radioButton">
-        <property name="text">
-         <string>Extensive Scaling</string>
-        </property>
-        <property name="checked">
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer name="verticalSpacer_2">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>40</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="clinicianGroupBox">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="title">
-      <string>Treating Dentist/Hygienist</string>
-     </property>
-     <layout class="QHBoxLayout" name="horizontalLayout">
-      <item>
-       <spacer name="horizontalSpacer">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>89</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item>
-       <widget class="QComboBox" name="dents_comboBox">
-        <property name="minimumSize">
-         <size>
-          <width>100</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>16777215</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="font">
-         <font>
-          <weight>75</weight>
-          <bold>true</bold>
-         </font>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer name="horizontalSpacer_2">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>88</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>29</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/initialise.ui b/src/openmolar/qt-designer/initialise.ui
deleted file mode 100644
index ce1f087..0000000
--- a/src/openmolar/qt-designer/initialise.ui
+++ /dev/null
@@ -1,890 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>800</width>
-    <height>507</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>OpenMolar - database wizard</string>
-  </property>
-  <widget class="QWidget" name="centralwidget">
-   <layout class="QVBoxLayout" name="verticalLayout">
-    <item>
-     <widget class="QTabWidget" name="tabWidget">
-      <property name="currentIndex">
-       <number>0</number>
-      </property>
-      <widget class="QWidget" name="tab_8">
-       <attribute name="title">
-        <string>Start</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout_3">
-        <item row="0" column="0" colspan="2">
-         <widget class="QLabel" name="label_17">
-          <property name="text">
-           <string>What do you want to do?</string>
-          </property>
-         </widget>
-        </item>
-        <item row="4" column="0">
-         <widget class="QRadioButton" name="modifydb_radioButton">
-          <property name="enabled">
-           <bool>false</bool>
-          </property>
-          <property name="text">
-           <string>Modify an existing openmolar database</string>
-          </property>
-         </widget>
-        </item>
-        <item row="4" column="1">
-         <widget class="QComboBox" name="comboBox">
-          <property name="enabled">
-           <bool>false</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="5" column="0" colspan="3">
-         <widget class="Line" name="line">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-         </widget>
-        </item>
-        <item row="6" column="1">
-         <spacer name="verticalSpacer">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>407</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item row="2" column="0">
-         <widget class="QRadioButton" name="blankdb_radioButton">
-          <property name="text">
-           <string>Create a New database from scratch</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="3" column="0">
-         <widget class="QRadioButton" name="newdb_template_radioButton">
-          <property name="text">
-           <string>Create a New database (from a known template)</string>
-          </property>
-          <property name="checked">
-           <bool>false</bool>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tab">
-       <attribute name="title">
-        <string>Practice Details</string>
-       </attribute>
-       <layout class="QVBoxLayout" name="verticalLayout_3">
-        <item>
-         <widget class="QFrame" name="practice_frame">
-          <property name="frameShape">
-           <enum>QFrame::StyledPanel</enum>
-          </property>
-          <property name="frameShadow">
-           <enum>QFrame::Raised</enum>
-          </property>
-          <layout class="QGridLayout" name="gridLayout">
-           <item row="0" column="0">
-            <widget class="QLabel" name="label">
-             <property name="text">
-              <string>Practice Name</string>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="1">
-            <widget class="QLineEdit" name="lineEdit"/>
-           </item>
-           <item row="0" column="2">
-            <widget class="QLabel" name="label_18">
-             <property name="text">
-              <string>Used in receipts, appointment cards etc.</string>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="0">
-            <widget class="QLabel" name="label_2">
-             <property name="text">
-              <string>Address Line 1</string>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="1">
-            <widget class="QLineEdit" name="lineEdit_2"/>
-           </item>
-           <item row="1" column="2">
-            <widget class="QLabel" name="label_22">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="0">
-            <widget class="QLabel" name="label_3">
-             <property name="text">
-              <string>Address Line 2</string>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="1">
-            <widget class="QLineEdit" name="lineEdit_3"/>
-           </item>
-           <item row="2" column="2">
-            <widget class="QLabel" name="label_23">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="0">
-            <widget class="QLabel" name="label_4">
-             <property name="text">
-              <string>Address Line 3</string>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="1">
-            <widget class="QLineEdit" name="lineEdit_4"/>
-           </item>
-           <item row="3" column="2">
-            <widget class="QLabel" name="label_27">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="0">
-            <widget class="QLabel" name="label_5">
-             <property name="text">
-              <string>Town</string>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="1">
-            <widget class="QLineEdit" name="lineEdit_5"/>
-           </item>
-           <item row="4" column="2">
-            <widget class="QLabel" name="label_19">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="5" column="0">
-            <widget class="QLabel" name="label_6">
-             <property name="text">
-              <string>County</string>
-             </property>
-            </widget>
-           </item>
-           <item row="5" column="1">
-            <widget class="QLineEdit" name="lineEdit_6"/>
-           </item>
-           <item row="5" column="2">
-            <widget class="QLabel" name="label_28">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="6" column="0">
-            <widget class="QLabel" name="label_7">
-             <property name="text">
-              <string>Postcode / Zip</string>
-             </property>
-            </widget>
-           </item>
-           <item row="6" column="1">
-            <widget class="QLineEdit" name="lineEdit_7"/>
-           </item>
-           <item row="6" column="2">
-            <widget class="QLabel" name="label_25">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="7" column="0">
-            <widget class="QLabel" name="label_8">
-             <property name="text">
-              <string>Telephone</string>
-             </property>
-            </widget>
-           </item>
-           <item row="7" column="1">
-            <widget class="QLineEdit" name="lineEdit_8"/>
-           </item>
-           <item row="7" column="2">
-            <widget class="QLabel" name="label_26">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="8" column="0">
-            <widget class="QLabel" name="label_9">
-             <property name="text">
-              <string>Fax</string>
-             </property>
-            </widget>
-           </item>
-           <item row="8" column="1">
-            <widget class="QLineEdit" name="lineEdit_9"/>
-           </item>
-           <item row="8" column="2">
-            <widget class="QLabel" name="label_24">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="9" column="0">
-            <widget class="QLabel" name="label_10">
-             <property name="text">
-              <string>Website</string>
-             </property>
-            </widget>
-           </item>
-           <item row="9" column="1">
-            <widget class="QLineEdit" name="lineEdit_10"/>
-           </item>
-           <item row="9" column="2">
-            <widget class="QLabel" name="label_21">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="10" column="0">
-            <widget class="QLabel" name="label_11">
-             <property name="text">
-              <string>Email</string>
-             </property>
-            </widget>
-           </item>
-           <item row="10" column="1">
-            <widget class="QLineEdit" name="lineEdit_11"/>
-           </item>
-           <item row="10" column="2">
-            <widget class="QLabel" name="label_20">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </item>
-        <item>
-         <spacer name="verticalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tab_2">
-       <attribute name="title">
-        <string>Users</string>
-       </attribute>
-       <layout class="QVBoxLayout" name="verticalLayout_2">
-        <item>
-         <widget class="QLabel" name="label_12">
-          <property name="text">
-           <string>The Following users can login to the application</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QTableWidget" name="users_tableWidget">
-          <property name="alternatingRowColors">
-           <bool>true</bool>
-          </property>
-          <property name="selectionMode">
-           <enum>QAbstractItemView::SingleSelection</enum>
-          </property>
-          <property name="selectionBehavior">
-           <enum>QAbstractItemView::SelectRows</enum>
-          </property>
-          <column>
-           <property name="text">
-            <string>Id</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>Initials</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>Name</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>User Group</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>Active?</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>DeActivation Date</string>
-           </property>
-          </column>
-         </widget>
-        </item>
-        <item>
-         <widget class="QFrame" name="frame_2">
-          <property name="frameShape">
-           <enum>QFrame::StyledPanel</enum>
-          </property>
-          <property name="frameShadow">
-           <enum>QFrame::Raised</enum>
-          </property>
-          <layout class="QHBoxLayout" name="horizontalLayout">
-           <item>
-            <layout class="QVBoxLayout" name="verticalLayout_11">
-             <item>
-              <widget class="QPushButton" name="modifyUser_pushButton">
-               <property name="text">
-                <string>Modify Selected User</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item>
-            <widget class="QGroupBox" name="user_groupBox">
-             <property name="title">
-              <string>New User Details</string>
-             </property>
-             <layout class="QGridLayout" name="gridLayout_8">
-              <item row="0" column="0">
-               <widget class="QLabel" name="label_14">
-                <property name="text">
-                 <string>Name</string>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="1">
-               <widget class="QLineEdit" name="userName_lineEdit"/>
-              </item>
-              <item row="1" column="0">
-               <widget class="QLabel" name="label_13">
-                <property name="text">
-                 <string>Initials</string>
-                </property>
-               </widget>
-              </item>
-              <item row="1" column="1">
-               <widget class="QLineEdit" name="userInits_lineEdit"/>
-              </item>
-              <item row="2" column="0">
-               <widget class="QLabel" name="label_15">
-                <property name="text">
-                 <string>User Group</string>
-                </property>
-               </widget>
-              </item>
-              <item row="2" column="1">
-               <widget class="QComboBox" name="userGroup_comboBox">
-                <item>
-                 <property name="text">
-                  <string>Standard User</string>
-                 </property>
-                </item>
-                <item>
-                 <property name="text">
-                  <string>Dentist</string>
-                 </property>
-                </item>
-                <item>
-                 <property name="text">
-                  <string>Hygienist</string>
-                 </property>
-                </item>
-                <item>
-                 <property name="text">
-                  <string>Receptionist</string>
-                 </property>
-                </item>
-               </widget>
-              </item>
-              <item row="2" column="2">
-               <widget class="QCheckBox" name="userActive_checkBox">
-                <property name="layoutDirection">
-                 <enum>Qt::RightToLeft</enum>
-                </property>
-                <property name="text">
-                 <string>Active User</string>
-                </property>
-                <property name="checked">
-                 <bool>true</bool>
-                </property>
-               </widget>
-              </item>
-              <item row="3" column="0">
-               <widget class="QLabel" name="user_date_label">
-                <property name="text">
-                 <string>DeActivation Date</string>
-                </property>
-               </widget>
-              </item>
-              <item row="3" column="1">
-               <widget class="QDateEdit" name="user_dateEdit">
-                <property name="calendarPopup">
-                 <bool>true</bool>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QPushButton" name="newUser_pushButton">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="text">
-              <string>Add a New User</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tab_3">
-       <attribute name="title">
-        <string>Dentists</string>
-       </attribute>
-       <layout class="QVBoxLayout" name="verticalLayout_5">
-        <item>
-         <widget class="QLabel" name="label_33">
-          <property name="text">
-           <string>The Following dentists have notes in this database
-(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) </string>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QTableWidget" name="tableWidget_2">
-          <column>
-           <property name="text">
-            <string>Initials</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>Name</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>User Group</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>Active?</string>
-           </property>
-          </column>
-         </widget>
-        </item>
-        <item>
-         <widget class="QFrame" name="frame_3">
-          <property name="minimumSize">
-           <size>
-            <width>0</width>
-            <height>200</height>
-           </size>
-          </property>
-          <property name="frameShape">
-           <enum>QFrame::StyledPanel</enum>
-          </property>
-          <property name="frameShadow">
-           <enum>QFrame::Raised</enum>
-          </property>
-          <layout class="QVBoxLayout" name="verticalLayout_7">
-           <item>
-            <widget class="QLabel" name="label_29">
-             <property name="text">
-              <string>Add a Dentist</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <layout class="QGridLayout" name="gridLayout_4">
-             <item row="0" column="0">
-              <widget class="QLabel" name="label_30">
-               <property name="text">
-                <string>Initials</string>
-               </property>
-              </widget>
-             </item>
-             <item row="0" column="1">
-              <widget class="QLineEdit" name="lineEdit_14"/>
-             </item>
-             <item row="1" column="0">
-              <widget class="QLabel" name="label_31">
-               <property name="text">
-                <string>Name</string>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="1">
-              <widget class="QLineEdit" name="lineEdit_15"/>
-             </item>
-             <item row="2" column="0">
-              <widget class="QLabel" name="label_45">
-               <property name="text">
-                <string>Registration</string>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="1">
-              <widget class="QLineEdit" name="lineEdit_21">
-               <property name="text">
-                <string/>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item>
-            <widget class="QCheckBox" name="checkBox_2">
-             <property name="layoutDirection">
-              <enum>Qt::RightToLeft</enum>
-             </property>
-             <property name="text">
-              <string>Active Appointment Book</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tab_4">
-       <attribute name="title">
-        <string>Hygienists</string>
-       </attribute>
-       <layout class="QVBoxLayout" name="verticalLayout_4">
-        <item>
-         <widget class="QLabel" name="label_38">
-          <property name="text">
-           <string>The Following hygienists have notes in this database
-(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) </string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QTableWidget" name="tableWidget_3">
-          <column>
-           <property name="text">
-            <string>Initials</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>Name</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>User Group</string>
-           </property>
-          </column>
-          <column>
-           <property name="text">
-            <string>Active?</string>
-           </property>
-          </column>
-         </widget>
-        </item>
-        <item>
-         <widget class="QFrame" name="frame_4">
-          <property name="minimumSize">
-           <size>
-            <width>0</width>
-            <height>200</height>
-           </size>
-          </property>
-          <property name="frameShape">
-           <enum>QFrame::StyledPanel</enum>
-          </property>
-          <property name="frameShadow">
-           <enum>QFrame::Raised</enum>
-          </property>
-          <layout class="QVBoxLayout" name="verticalLayout_8">
-           <item>
-            <widget class="QLabel" name="label_32">
-             <property name="text">
-              <string>Add a Dentist</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <layout class="QGridLayout" name="gridLayout_5">
-             <item row="0" column="0">
-              <widget class="QLabel" name="label_34">
-               <property name="text">
-                <string>Initials</string>
-               </property>
-              </widget>
-             </item>
-             <item row="0" column="1">
-              <widget class="QLineEdit" name="lineEdit_16"/>
-             </item>
-             <item row="1" column="0">
-              <widget class="QLabel" name="label_35">
-               <property name="text">
-                <string>Name</string>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="1">
-              <widget class="QLineEdit" name="lineEdit_17"/>
-             </item>
-             <item row="2" column="0">
-              <widget class="QLabel" name="label_46">
-               <property name="text">
-                <string>Registration</string>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="1">
-              <widget class="QLineEdit" name="lineEdit_22">
-               <property name="text">
-                <string/>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item>
-            <widget class="QCheckBox" name="checkBox_3">
-             <property name="layoutDirection">
-              <enum>Qt::RightToLeft</enum>
-             </property>
-             <property name="text">
-              <string>Active Appointment Book</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tab_5">
-       <attribute name="title">
-        <string>Practice Hours</string>
-       </attribute>
-       <layout class="QHBoxLayout" name="horizontalLayout_2">
-        <item>
-         <widget class="QFrame" name="frame_6">
-          <property name="frameShape">
-           <enum>QFrame::StyledPanel</enum>
-          </property>
-          <property name="frameShadow">
-           <enum>QFrame::Raised</enum>
-          </property>
-          <layout class="QGridLayout" name="gridLayout_7">
-           <item row="0" column="0">
-            <widget class="QCheckBox" name="checkBox_7">
-             <property name="text">
-              <string>Monday</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="1">
-            <widget class="QTimeEdit" name="timeEdit"/>
-           </item>
-           <item row="0" column="2">
-            <widget class="QTimeEdit" name="timeEdit_2"/>
-           </item>
-           <item row="1" column="0">
-            <widget class="QCheckBox" name="checkBox_8">
-             <property name="text">
-              <string>Tuesday</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="1">
-            <widget class="QTimeEdit" name="timeEdit_3"/>
-           </item>
-           <item row="1" column="2">
-            <widget class="QTimeEdit" name="timeEdit_4"/>
-           </item>
-           <item row="2" column="0">
-            <widget class="QCheckBox" name="checkBox_9">
-             <property name="text">
-              <string>Wednesday</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="1">
-            <widget class="QTimeEdit" name="timeEdit_5"/>
-           </item>
-           <item row="2" column="2">
-            <widget class="QTimeEdit" name="timeEdit_6"/>
-           </item>
-           <item row="3" column="0">
-            <widget class="QCheckBox" name="checkBox_10">
-             <property name="text">
-              <string>Thursday</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="1">
-            <widget class="QTimeEdit" name="timeEdit_7"/>
-           </item>
-           <item row="3" column="2">
-            <widget class="QTimeEdit" name="timeEdit_8"/>
-           </item>
-           <item row="4" column="0">
-            <widget class="QCheckBox" name="checkBox_11">
-             <property name="text">
-              <string>Friday</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="1">
-            <widget class="QTimeEdit" name="timeEdit_10"/>
-           </item>
-           <item row="4" column="2">
-            <widget class="QTimeEdit" name="timeEdit_11"/>
-           </item>
-           <item row="5" column="0">
-            <widget class="QCheckBox" name="checkBox_12">
-             <property name="text">
-              <string>Saturday</string>
-             </property>
-            </widget>
-           </item>
-           <item row="5" column="1">
-            <widget class="QTimeEdit" name="timeEdit_12"/>
-           </item>
-           <item row="5" column="2">
-            <widget class="QTimeEdit" name="timeEdit_9"/>
-           </item>
-           <item row="6" column="0">
-            <widget class="QCheckBox" name="checkBox_13">
-             <property name="text">
-              <string>Sunday</string>
-             </property>
-            </widget>
-           </item>
-           <item row="6" column="1">
-            <widget class="QTimeEdit" name="timeEdit_13"/>
-           </item>
-           <item row="6" column="2">
-            <widget class="QTimeEdit" name="timeEdit_14"/>
-           </item>
-          </layout>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tab_7">
-       <attribute name="title">
-        <string>View XML</string>
-       </attribute>
-       <layout class="QVBoxLayout" name="verticalLayout_10"/>
-      </widget>
-     </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QMenuBar" name="menubar">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>800</width>
-     <height>22</height>
-    </rect>
-   </property>
-   <widget class="QMenu" name="menuFile">
-    <property name="title">
-     <string>File</string>
-    </property>
-    <addaction name="actionLoad_Template"/>
-    <addaction name="action_Save_Template"/>
-   </widget>
-   <addaction name="menuFile"/>
-  </widget>
-  <widget class="QStatusBar" name="statusbar"/>
-  <action name="actionLoad_Template">
-   <property name="text">
-    <string>L&oad Template</string>
-   </property>
-  </action>
-  <action name="action_Save_Template">
-   <property name="text">
-    <string>&Save Template</string>
-   </property>
-  </action>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/main.ui b/src/openmolar/qt-designer/main.ui
deleted file mode 100644
index c2ec465..0000000
--- a/src/openmolar/qt-designer/main.ui
+++ /dev/null
@@ -1,5491 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>964</width>
-    <height>631</height>
-   </rect>
-  </property>
-  <property name="sizePolicy">
-   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-    <horstretch>0</horstretch>
-    <verstretch>0</verstretch>
-   </sizepolicy>
-  </property>
-  <property name="maximumSize">
-   <size>
-    <width>16777215</width>
-    <height>16777215</height>
-   </size>
-  </property>
-  <property name="font">
-   <font/>
-  </property>
-  <property name="windowTitle">
-   <string>Open Molar</string>
-  </property>
-  <property name="windowIcon">
-   <iconset resource="../resources/resources.qrc">
-    <normaloff>:/openmolar.svg</normaloff>:/openmolar.svg</iconset>
-  </property>
-  <property name="styleSheet">
-   <string notr="true"/>
-  </property>
-  <property name="dockNestingEnabled">
-   <bool>false</bool>
-  </property>
-  <property name="unifiedTitleAndToolBarOnMac">
-   <bool>false</bool>
-  </property>
-  <widget class="QWidget" name="centralwidget">
-   <layout class="QVBoxLayout" name="verticalLayout_18">
-    <property name="spacing">
-     <number>0</number>
-    </property>
-    <property name="margin">
-     <number>0</number>
-    </property>
-    <item>
-     <widget class="QScrollArea" name="scrollArea_main">
-      <property name="frameShape">
-       <enum>QFrame::NoFrame</enum>
-      </property>
-      <property name="widgetResizable">
-       <bool>true</bool>
-      </property>
-      <widget class="QWidget" name="scrollAreaWidgetContents_12">
-       <property name="geometry">
-        <rect>
-         <x>0</x>
-         <y>0</y>
-         <width>964</width>
-         <height>592</height>
-        </rect>
-       </property>
-       <layout class="QHBoxLayout" name="horizontalLayout_7">
-        <property name="spacing">
-         <number>0</number>
-        </property>
-        <property name="margin">
-         <number>0</number>
-        </property>
-        <item>
-         <widget class="QTabWidget" name="main_tabWidget">
-          <property name="tabPosition">
-           <enum>QTabWidget::North</enum>
-          </property>
-          <property name="tabShape">
-           <enum>QTabWidget::Rounded</enum>
-          </property>
-          <property name="currentIndex">
-           <number>0</number>
-          </property>
-          <property name="documentMode">
-           <bool>false</bool>
-          </property>
-          <widget class="QWidget" name="tab_patient">
-           <attribute name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/kfm.png</normaloff>:/kfm.png</iconset>
-           </attribute>
-           <attribute name="title">
-            <string>Patient Database</string>
-           </attribute>
-           <layout class="QHBoxLayout" name="horizontalLayout_24">
-            <property name="margin">
-             <number>6</number>
-            </property>
-            <item>
-             <widget class="QFrame" name="details_frame">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="minimumSize">
-               <size>
-                <width>180</width>
-                <height>16</height>
-               </size>
-              </property>
-              <property name="maximumSize">
-               <size>
-                <width>200</width>
-                <height>16777215</height>
-               </size>
-              </property>
-              <property name="frameShape">
-               <enum>QFrame::NoFrame</enum>
-              </property>
-              <property name="frameShadow">
-               <enum>QFrame::Plain</enum>
-              </property>
-              <layout class="QVBoxLayout" name="verticalLayout">
-               <property name="spacing">
-                <number>0</number>
-               </property>
-               <property name="margin">
-                <number>0</number>
-               </property>
-               <item>
-                <widget class="QFrame" name="frame_15">
-                 <property name="frameShape">
-                  <enum>QFrame::NoFrame</enum>
-                 </property>
-                 <property name="frameShadow">
-                  <enum>QFrame::Raised</enum>
-                 </property>
-                 <layout class="QHBoxLayout" name="horizontalLayout_3">
-                  <property name="spacing">
-                   <number>3</number>
-                  </property>
-                  <property name="margin">
-                   <number>0</number>
-                  </property>
-                  <item>
-                   <widget class="QPushButton" name="home_pushButton">
-                    <property name="minimumSize">
-                     <size>
-                      <width>32</width>
-                      <height>0</height>
-                     </size>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>32</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>Exit the Current Patient Record.</string>
-                    </property>
-                    <property name="text">
-                     <string/>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/kfm_home.png</normaloff>:/kfm_home.png</iconset>
-                    </property>
-                    <property name="iconSize">
-                     <size>
-                      <width>32</width>
-                      <height>24</height>
-                     </size>
-                    </property>
-                    <property name="shortcut">
-                     <string>Esc</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="newPatientPushButton">
-                    <property name="sizePolicy">
-                     <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-                      <horstretch>0</horstretch>
-                      <verstretch>0</verstretch>
-                     </sizepolicy>
-                    </property>
-                    <property name="minimumSize">
-                     <size>
-                      <width>32</width>
-                      <height>0</height>
-                     </size>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>32</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>Add a New Patient to the database.</string>
-                    </property>
-                    <property name="text">
-                     <string/>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/add_user.png</normaloff>:/add_user.png</iconset>
-                    </property>
-                    <property name="iconSize">
-                     <size>
-                      <width>32</width>
-                      <height>16</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="findButton">
-                    <property name="sizePolicy">
-                     <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                      <horstretch>0</horstretch>
-                      <verstretch>0</verstretch>
-                     </sizepolicy>
-                    </property>
-                    <property name="minimumSize">
-                     <size>
-                      <width>80</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>16777215</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>Click on this Button to search for in patient in your database.</string>
-                    </property>
-                    <property name="text">
-                     <string>Find</string>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/search.png</normaloff>:/search.png</iconset>
-                    </property>
-                    <property name="iconSize">
-                     <size>
-                      <width>24</width>
-                      <height>24</height>
-                     </size>
-                    </property>
-                    <property name="shortcut">
-                     <string>Ctrl+F</string>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
-               </item>
-               <item>
-                <widget class="QFrame" name="frame_16">
-                 <property name="frameShape">
-                  <enum>QFrame::NoFrame</enum>
-                 </property>
-                 <property name="frameShadow">
-                  <enum>QFrame::Raised</enum>
-                 </property>
-                 <layout class="QHBoxLayout" name="horizontalLayout">
-                  <property name="spacing">
-                   <number>2</number>
-                  </property>
-                  <property name="margin">
-                   <number>0</number>
-                  </property>
-                  <item>
-                   <widget class="QPushButton" name="backButton">
-                    <property name="sizePolicy">
-                     <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-                      <horstretch>0</horstretch>
-                      <verstretch>0</verstretch>
-                     </sizepolicy>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>24</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>This cycles back through the history of records loaded today.</string>
-                    </property>
-                    <property name="text">
-                     <string/>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/back.png</normaloff>:/back.png</iconset>
-                    </property>
-                    <property name="iconSize">
-                     <size>
-                      <width>32</width>
-                      <height>16</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="reloadButton">
-                    <property name="sizePolicy">
-                     <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-                      <horstretch>0</horstretch>
-                      <verstretch>0</verstretch>
-                     </sizepolicy>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>24</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>Reload the patient from the database.</string>
-                    </property>
-                    <property name="text">
-                     <string/>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
-                    </property>
-                    <property name="shortcut">
-                     <string>Ctrl+R</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="nextButton">
-                    <property name="sizePolicy">
-                     <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-                      <horstretch>0</horstretch>
-                      <verstretch>0</verstretch>
-                     </sizepolicy>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>24</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>This cycles forwards through the history of records loaded today.</string>
-                    </property>
-                    <property name="text">
-                     <string/>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
-                    </property>
-                    <property name="iconSize">
-                     <size>
-                      <width>32</width>
-                      <height>16</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="relatedpts_pushButton">
-                    <property name="minimumSize">
-                     <size>
-                      <width>60</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>Show patients who live at the same address, or who have a similar name.</string>
-                    </property>
-                    <property name="text">
-                     <string>&Relatives</string>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/agt_family.png</normaloff>:/agt_family.png</iconset>
-                    </property>
-                    <property name="shortcut">
-                     <string>Ctrl+G</string>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
-               </item>
-               <item>
-                <widget class="QComboBox" name="dayList_comboBox">
-                 <property name="sizePolicy">
-                  <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                   <horstretch>0</horstretch>
-                   <verstretch>0</verstretch>
-                  </sizepolicy>
-                 </property>
-                 <property name="toolTip">
-                  <string>A drop down box of all patients who have an appointment today.</string>
-                 </property>
-                 <property name="maxVisibleItems">
-                  <number>40</number>
-                 </property>
-                 <property name="sizeAdjustPolicy">
-                  <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QTextBrowser" name="detailsBrowser">
-                 <property name="sizePolicy">
-                  <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
-                   <horstretch>0</horstretch>
-                   <verstretch>0</verstretch>
-                  </sizepolicy>
-                 </property>
-                </widget>
-               </item>
-              </layout>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSplitter" name="splitter_patient">
-              <property name="orientation">
-               <enum>Qt::Vertical</enum>
-              </property>
-              <property name="childrenCollapsible">
-               <bool>false</bool>
-              </property>
-              <widget class="QTabWidget" name="tabWidget">
-               <property name="currentIndex">
-                <number>4</number>
-               </property>
-               <widget class="QWidget" name="tab_patient_details">
-                <attribute name="title">
-                 <string>Patient Details</string>
-                </attribute>
-                <layout class="QHBoxLayout" name="horizontalLayout_2">
-                 <property name="spacing">
-                  <number>0</number>
-                 </property>
-                 <property name="margin">
-                  <number>0</number>
-                 </property>
-                 <item>
-                  <widget class="QScrollArea" name="scrollArea_4">
-                   <property name="widgetResizable">
-                    <bool>true</bool>
-                   </property>
-                   <widget class="QWidget" name="scrollAreaWidgetContents_7">
-                    <property name="geometry">
-                     <rect>
-                      <x>0</x>
-                      <y>0</y>
-                      <width>469</width>
-                      <height>644</height>
-                     </rect>
-                    </property>
-                    <layout class="QVBoxLayout" name="verticalLayout_6">
-                     <item>
-                      <widget class="QGroupBox" name="patientEdit_groupBox">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="title">
-                        <string>Details</string>
-                       </property>
-                       <layout class="QGridLayout" name="gridLayout_2">
-                        <property name="verticalSpacing">
-                         <number>3</number>
-                        </property>
-                        <property name="margin">
-                         <number>6</number>
-                        </property>
-                        <item row="3" column="0">
-                         <widget class="QLabel" name="label_18">
-                          <property name="text">
-                           <string>Date of Birth</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="6" column="0">
-                         <widget class="QLabel" name="label_9">
-                          <property name="text">
-                           <string>Address3</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>addr3Edit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="2" column="7">
-                         <widget class="QPushButton" name="pushButton_6">
-                          <property name="enabled">
-                           <bool>false</bool>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>60</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string>send an sms</string>
-                          </property>
-                          <property name="text">
-                           <string>sms</string>
-                          </property>
-                          <property name="icon">
-                           <iconset resource="../resources/resources.qrc">
-                            <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-                          </property>
-                          <property name="iconSize">
-                           <size>
-                            <width>8</width>
-                            <height>8</height>
-                           </size>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="5" column="4">
-                         <widget class="QLabel" name="label_23">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>email2</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>email2Edit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="3" column="1" colspan="3">
-                         <widget class="QDateEdit" name="dobEdit">
-                          <property name="calendarPopup">
-                           <bool>true</bool>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="3" column="4">
-                         <widget class="QLabel" name="label_15">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Fax</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>faxEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="7" column="0">
-                         <widget class="QLabel" name="label_10">
-                          <property name="text">
-                           <string>Town</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>townEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="7" column="1" colspan="3">
-                         <widget class="QLineEdit" name="townEdit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="7" column="4" rowspan="3">
-                         <widget class="QLabel" name="label_55">
-                          <property name="text">
-                           <string>Memo</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>memoEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="7" column="5" rowspan="3" colspan="3">
-                         <widget class="QTextEdit" name="memoEdit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="acceptRichText">
-                           <bool>false</bool>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="8" column="0">
-                         <widget class="QLabel" name="label_19">
-                          <property name="text">
-                           <string>County</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>countyEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="4" column="4">
-                         <widget class="QLabel" name="label_16">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>email1</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>email1Edit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="4" column="5" colspan="2">
-                         <widget class="QLineEdit" name="email1Edit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="minimumSize">
-                           <size>
-                            <width>150</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>50</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="4" column="7">
-                         <widget class="QPushButton" name="email1_button">
-                          <property name="enabled">
-                           <bool>true</bool>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>60</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string>send an email</string>
-                          </property>
-                          <property name="text">
-                           <string>email</string>
-                          </property>
-                          <property name="icon">
-                           <iconset resource="../resources/resources.qrc">
-                            <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-                          </property>
-                          <property name="iconSize">
-                           <size>
-                            <width>8</width>
-                            <height>8</height>
-                           </size>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="6" column="1" colspan="3">
-                         <widget class="QLineEdit" name="addr3Edit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="6" column="4">
-                         <widget class="QLabel" name="label_25">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Occupation</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>occupationEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="6" column="5" colspan="3">
-                         <widget class="QLineEdit" name="occupationEdit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="0" column="0">
-                         <widget class="QLabel" name="label">
-                          <property name="text">
-                           <string>Title</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>titleEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="2" column="0">
-                         <widget class="QLabel" name="label_3">
-                          <property name="text">
-                           <string>Surname</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>snameEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="2" column="1" colspan="3">
-                         <widget class="QLineEdit" name="snameEdit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="autoFillBackground">
-                           <bool>false</bool>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="2" column="4">
-                         <widget class="QLabel" name="label_14">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Tel (mob)</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>mobileEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="5" column="0">
-                         <widget class="QLabel" name="label_5">
-                          <property name="text">
-                           <string>Address2</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>addr2Edit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="5" column="1" colspan="3">
-                         <widget class="QLineEdit" name="addr2Edit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="5" column="5" colspan="2">
-                         <widget class="QLineEdit" name="email2Edit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="minimumSize">
-                           <size>
-                            <width>150</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>50</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="5" column="7">
-                         <widget class="QPushButton" name="email2_button">
-                          <property name="enabled">
-                           <bool>true</bool>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>60</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string>send an email</string>
-                          </property>
-                          <property name="text">
-                           <string>email</string>
-                          </property>
-                          <property name="icon">
-                           <iconset resource="../resources/resources.qrc">
-                            <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-                          </property>
-                          <property name="iconSize">
-                           <size>
-                            <width>8</width>
-                            <height>8</height>
-                           </size>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="0" column="1">
-                         <widget class="QLineEdit" name="titleEdit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>101</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="0" column="2">
-                         <widget class="QLabel" name="label_17">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Sex</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>sexEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="0" column="3">
-                         <widget class="QComboBox" name="sexEdit">
-                          <property name="minimumSize">
-                           <size>
-                            <width>50</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <item>
-                           <property name="text">
-                            <string>M</string>
-                           </property>
-                          </item>
-                          <item>
-                           <property name="text">
-                            <string>F</string>
-                           </property>
-                          </item>
-                         </widget>
-                        </item>
-                        <item row="8" column="1" colspan="3">
-                         <widget class="QLineEdit" name="countyEdit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="9" column="0">
-                         <widget class="QLabel" name="label_6">
-                          <property name="text">
-                           <string>Postcode</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>pcdeEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="0" column="4">
-                         <widget class="QLabel" name="label_12">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>25</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Tel (home)</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>tel1Edit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="3" column="7">
-                         <widget class="QPushButton" name="pushButton">
-                          <property name="enabled">
-                           <bool>false</bool>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>60</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string>send a fax</string>
-                          </property>
-                          <property name="text">
-                           <string>fax</string>
-                          </property>
-                          <property name="icon">
-                           <iconset resource="../resources/resources.qrc">
-                            <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-                          </property>
-                          <property name="iconSize">
-                           <size>
-                            <width>8</width>
-                            <height>8</height>
-                           </size>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="4" column="0">
-                         <widget class="QLabel" name="label_4">
-                          <property name="text">
-                           <string>Address1</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>addr1Edit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="4" column="1" colspan="3">
-                         <widget class="QLineEdit" name="addr1Edit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="9" column="1" colspan="3">
-                         <widget class="QLineEdit" name="pcdeEdit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="1" column="0">
-                         <widget class="QLabel" name="label_2">
-                          <property name="text">
-                           <string>First Name</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>fnameEdit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="1" column="1" colspan="3">
-                         <widget class="QLineEdit" name="fnameEdit">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="autoFillBackground">
-                           <bool>false</bool>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="1" column="4">
-                         <widget class="QLabel" name="label_13">
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Tel (work)</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                          </property>
-                          <property name="buddy">
-                           <cstring>tel2Edit</cstring>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="0" column="5" colspan="2">
-                         <widget class="QLineEdit" name="tel1Edit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="3" column="5" colspan="2">
-                         <widget class="QLineEdit" name="faxEdit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="2" column="5" colspan="2">
-                         <widget class="QLineEdit" name="mobileEdit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="1" column="5" colspan="2">
-                         <widget class="QLineEdit" name="tel2Edit">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="maxLength">
-                           <number>30</number>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QFrame" name="new_patient_frame">
-                       <property name="frameShape">
-                        <enum>QFrame::NoFrame</enum>
-                       </property>
-                       <property name="frameShadow">
-                        <enum>QFrame::Raised</enum>
-                       </property>
-                       <layout class="QGridLayout" name="gridLayout_12">
-                        <item row="2" column="0">
-                         <widget class="QPushButton" name="abort_new_patient_pushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="minimumSize">
-                           <size>
-                            <width>0</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Abort New Patient Entry</string>
-                          </property>
-                          <property name="icon">
-                           <iconset theme="window-close">
-                            <normaloff/>
-                           </iconset>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="0" column="0" colspan="3">
-                         <widget class="QLabel" name="highlighted_fields_label">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="text">
-                           <string>Higlighted Fields are Mandatory for New Patients</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignCenter</set>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="2" column="2">
-                         <widget class="QPushButton" name="save_new_patient_pushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="minimumSize">
-                           <size>
-                            <width>0</width>
-                            <height>100</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string extracomment="Save the new patient to the database"/>
-                          </property>
-                          <property name="text">
-                           <string>Save New Patient</string>
-                          </property>
-                          <property name="icon">
-                           <iconset resource="../resources/resources.qrc">
-                            <normaloff>:/save_all.png</normaloff>:/save_all.png</iconset>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="1" column="0">
-                         <spacer name="verticalSpacer_13">
-                          <property name="orientation">
-                           <enum>Qt::Vertical</enum>
-                          </property>
-                          <property name="sizeHint" stdset="0">
-                           <size>
-                            <width>20</width>
-                            <height>40</height>
-                           </size>
-                          </property>
-                         </spacer>
-                        </item>
-                        <item row="3" column="0" colspan="3">
-                         <spacer name="verticalSpacer_15">
-                          <property name="orientation">
-                           <enum>Qt::Vertical</enum>
-                          </property>
-                          <property name="sizeHint" stdset="0">
-                           <size>
-                            <width>20</width>
-                            <height>40</height>
-                           </size>
-                          </property>
-                         </spacer>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QGroupBox" name="family_groupBox">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="title">
-                        <string>Family Groups</string>
-                       </property>
-                       <layout class="QGridLayout" name="gridLayout_11">
-                        <property name="margin">
-                         <number>6</number>
-                        </property>
-                        <property name="spacing">
-                         <number>3</number>
-                        </property>
-                        <item row="1" column="1">
-                         <widget class="QPushButton" name="family_button">
-                          <property name="enabled">
-                           <bool>true</bool>
-                          </property>
-                          <property name="toolTip">
-                           <string>Raise a dialog to edit the patients family grouping</string>
-                          </property>
-                          <property name="text">
-                           <string>Edit family group</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="1" column="0">
-                         <widget class="QLabel" name="family_group_label">
-                          <property name="text">
-                           <string>Not a member of a known family</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignCenter</set>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="2" column="0" colspan="2">
-                         <widget class="QPushButton" name="auto_address_button">
-                          <property name="toolTip">
-                           <string>Use the Sname and Address details from the previous patient.</string>
-                          </property>
-                          <property name="text">
-                           <string>Apply Address of previous record</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item row="3" column="0">
-                         <spacer name="verticalSpacer_16">
-                          <property name="orientation">
-                           <enum>Qt::Vertical</enum>
-                          </property>
-                          <property name="sizeHint" stdset="0">
-                           <size>
-                            <width>20</width>
-                            <height>40</height>
-                           </size>
-                          </property>
-                         </spacer>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_contract">
-                <attribute name="title">
-                 <string>Contract</string>
-                </attribute>
-                <layout class="QGridLayout" name="gridLayout_13">
-                 <item row="0" column="0" colspan="2">
-                  <widget class="QLabel" name="label_21">
-                   <property name="text">
-                    <string>Pt is registered with Dentist</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="2">
-                  <widget class="QComboBox" name="dnt1comboBox">
-                   <property name="maximumSize">
-                    <size>
-                     <width>50</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="3">
-                  <widget class="QLabel" name="contractType_label">
-                   <property name="text">
-                    <string>Course Type</string>
-                   </property>
-                   <property name="alignment">
-                    <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="4">
-                  <widget class="QComboBox" name="cseType_comboBox">
-                   <property name="maximumSize">
-                    <size>
-                     <width>50</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="5">
-                  <spacer name="horizontalSpacer_5">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>368</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                 <item row="1" column="0">
-                  <widget class="QFrame" name="frame_19">
-                   <property name="frameShape">
-                    <enum>QFrame::StyledPanel</enum>
-                   </property>
-                   <property name="frameShadow">
-                    <enum>QFrame::Raised</enum>
-                   </property>
-                   <layout class="QVBoxLayout" name="verticalLayout_17">
-                    <item>
-                     <widget class="QLabel" name="label_40">
-                      <property name="text">
-                       <string>Status</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QComboBox" name="status_comboBox"/>
-                    </item>
-                    <item>
-                     <spacer name="verticalSpacer_12">
-                      <property name="orientation">
-                       <enum>Qt::Vertical</enum>
-                      </property>
-                      <property name="sizeHint" stdset="0">
-                       <size>
-                        <width>20</width>
-                        <height>242</height>
-                       </size>
-                      </property>
-                     </spacer>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="badDebt_pushButton">
-                      <property name="enabled">
-                       <bool>false</bool>
-                      </property>
-                      <property name="text">
-                       <string>Write Off Bad Debt</string>
-                      </property>
-                     </widget>
-                    </item>
-                   </layout>
-                  </widget>
-                 </item>
-                 <item row="1" column="1" colspan="5">
-                  <widget class="QTabWidget" name="contract_tabWidget">
-                   <property name="currentIndex">
-                    <number>2</number>
-                   </property>
-                   <widget class="QWidget" name="tab_18">
-                    <attribute name="title">
-                     <string>Private</string>
-                    </attribute>
-                    <layout class="QGridLayout" name="gridLayout_26">
-                     <item row="0" column="0" rowspan="2">
-                      <widget class="QLabel" name="contractHDP_label_2">
-                       <property name="text">
-                        <string>This label is for displaying Private contractual stuff</string>
-                       </property>
-                       <property name="alignment">
-                        <set>Qt::AlignCenter</set>
-                       </property>
-                       <property name="wordWrap">
-                        <bool>true</bool>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="1">
-                      <widget class="QLabel" name="label_38">
-                       <property name="text">
-                        <string/>
-                       </property>
-                       <property name="pixmap">
-                        <pixmap resource="../resources/resources.qrc">:/private.png</pixmap>
-                       </property>
-                       <property name="alignment">
-                        <set>Qt::AlignCenter</set>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="1">
-                      <spacer name="verticalSpacer_6">
-                       <property name="orientation">
-                        <enum>Qt::Vertical</enum>
-                       </property>
-                       <property name="sizeHint" stdset="0">
-                        <size>
-                         <width>147</width>
-                         <height>281</height>
-                        </size>
-                       </property>
-                      </spacer>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QPushButton" name="editPriv_pushButton">
-                       <property name="maximumSize">
-                        <size>
-                         <width>150</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                       <property name="text">
-                        <string>Edit</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                   <widget class="QWidget" name="tab_19">
-                    <attribute name="title">
-                     <string>Highland Dental Plan</string>
-                    </attribute>
-                    <layout class="QGridLayout" name="gridLayout_25">
-                     <item row="0" column="0" rowspan="2">
-                      <widget class="QLabel" name="contractHDP_label">
-                       <property name="text">
-                        <string>This label is for displaying HDP contractual stuff</string>
-                       </property>
-                       <property name="alignment">
-                        <set>Qt::AlignCenter</set>
-                       </property>
-                       <property name="wordWrap">
-                        <bool>true</bool>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="1">
-                      <spacer name="verticalSpacer_5">
-                       <property name="orientation">
-                        <enum>Qt::Vertical</enum>
-                       </property>
-                       <property name="sizeHint" stdset="0">
-                        <size>
-                         <width>108</width>
-                         <height>162</height>
-                        </size>
-                       </property>
-                      </spacer>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QPushButton" name="editHDP_pushButton">
-                       <property name="maximumSize">
-                        <size>
-                         <width>150</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                       <property name="text">
-                        <string>Edit</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="1">
-                      <widget class="QLabel" name="label_20">
-                       <property name="maximumSize">
-                        <size>
-                         <width>150</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                       <property name="text">
-                        <string/>
-                       </property>
-                       <property name="pixmap">
-                        <pixmap resource="../resources/resources.qrc">:/hdp.png</pixmap>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                    <zorder>contractHDP_label</zorder>
-                    <zorder>verticalSpacer_5</zorder>
-                    <zorder>editHDP_pushButton</zorder>
-                    <zorder>label_20</zorder>
-                   </widget>
-                   <widget class="QWidget" name="tab_20">
-                    <attribute name="title">
-                     <string>NHS</string>
-                    </attribute>
-                    <layout class="QGridLayout" name="gridLayout_24">
-                     <item row="0" column="0">
-                      <widget class="QLabel" name="contractNHS_label">
-                       <property name="text">
-                        <string>This label is for displaying NHS contractual stuff</string>
-                       </property>
-                       <property name="alignment">
-                        <set>Qt::AlignCenter</set>
-                       </property>
-                       <property name="wordWrap">
-                        <bool>true</bool>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="1" rowspan="2">
-                      <layout class="QVBoxLayout" name="verticalLayout_26">
-                       <item>
-                        <widget class="QLabel" name="label_8">
-                         <property name="maximumSize">
-                          <size>
-                           <width>16777215</width>
-                           <height>16777215</height>
-                          </size>
-                         </property>
-                         <property name="text">
-                          <string/>
-                         </property>
-                         <property name="pixmap">
-                          <pixmap resource="../resources/resources.qrc">:/nhs_scot.png</pixmap>
-                         </property>
-                         <property name="scaledContents">
-                          <bool>true</bool>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QPushButton" name="nhsclaims_pushButton">
-                         <property name="text">
-                          <string>View Claims History</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <spacer name="verticalSpacer_4">
-                         <property name="orientation">
-                          <enum>Qt::Vertical</enum>
-                         </property>
-                         <property name="sizeHint" stdset="0">
-                          <size>
-                           <width>20</width>
-                           <height>40</height>
-                          </size>
-                         </property>
-                        </spacer>
-                       </item>
-                       <item>
-                        <widget class="QPushButton" name="editNHS_pushButton">
-                         <property name="maximumSize">
-                          <size>
-                           <width>150</width>
-                           <height>16777215</height>
-                          </size>
-                         </property>
-                         <property name="text">
-                          <string>Edit</string>
-                         </property>
-                        </widget>
-                       </item>
-                      </layout>
-                     </item>
-                     <item row="1" column="0">
-                      <layout class="QGridLayout" name="gridLayout_23">
-                       <item row="0" column="0">
-                        <widget class="QLabel" name="label_46">
-                         <property name="text">
-                          <string>Exemption</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item row="0" column="1">
-                        <widget class="QLineEdit" name="exemption_lineEdit">
-                         <property name="maxLength">
-                          <number>10</number>
-                         </property>
-                        </widget>
-                       </item>
-                       <item row="1" column="0">
-                        <widget class="QLabel" name="label_48">
-                         <property name="text">
-                          <string>Exemption Text</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item row="1" column="1">
-                        <widget class="QLineEdit" name="exempttext_lineEdit">
-                         <property name="maxLength">
-                          <number>50</number>
-                         </property>
-                        </widget>
-                       </item>
-                      </layout>
-                     </item>
-                    </layout>
-                   </widget>
-                   <widget class="QWidget" name="tab_21">
-                    <attribute name="title">
-                     <string>Registered Elsewhere</string>
-                    </attribute>
-                    <layout class="QGridLayout" name="gridLayout_27">
-                     <item row="0" column="0" rowspan="2">
-                      <widget class="QLabel" name="contractHDP_label_3">
-                       <property name="text">
-                        <string>No Details of Pt's Registered Dentist Found</string>
-                       </property>
-                       <property name="alignment">
-                        <set>Qt::AlignCenter</set>
-                       </property>
-                       <property name="wordWrap">
-                        <bool>true</bool>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="1">
-                      <spacer name="verticalSpacer_7">
-                       <property name="orientation">
-                        <enum>Qt::Vertical</enum>
-                       </property>
-                       <property name="sizeHint" stdset="0">
-                        <size>
-                         <width>147</width>
-                         <height>281</height>
-                        </size>
-                       </property>
-                      </spacer>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QPushButton" name="editRegDent_pushButton">
-                       <property name="maximumSize">
-                        <size>
-                         <width>150</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                       <property name="text">
-                        <string>Edit</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_correspondence">
-                <attribute name="title">
-                 <string>Correspondence</string>
-                </attribute>
-                <layout class="QHBoxLayout" name="horizontalLayout_11">
-                 <item>
-                  <widget class="QScrollArea" name="scrollArea_5">
-                   <property name="widgetResizable">
-                    <bool>true</bool>
-                   </property>
-                   <widget class="QWidget" name="scrollAreaWidgetContents_8">
-                    <property name="geometry">
-                     <rect>
-                      <x>0</x>
-                      <y>0</y>
-                      <width>423</width>
-                      <height>421</height>
-                     </rect>
-                    </property>
-                    <layout class="QGridLayout" name="gridLayout">
-                     <item row="0" column="0" colspan="2">
-                      <widget class="QGroupBox" name="groupBox_6">
-                       <property name="title">
-                        <string>Letters TO the patient</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_3">
-                        <item>
-                         <widget class="QPushButton" name="standardLetterPushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="text">
-                           <string> Custom Letter to the patient</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="printRecall_pushButton">
-                          <property name="toolTip">
-                           <string>Print a recall saying the patient is due now.</string>
-                          </property>
-                          <property name="text">
-                           <string>Recall for An Examination</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="receiptPrintButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>32</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string>Print a receipt - useful for duplicates.</string>
-                          </property>
-                          <property name="text">
-                           <string>Duplicate Receipt</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="account2_pushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="text">
-                           <string>Print An Account Letter</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item row="1" column="0" colspan="2">
-                      <widget class="QGroupBox" name="groupBox_7">
-                       <property name="title">
-                        <string>Referrals (Letters about the patient)</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_4">
-                        <item>
-                         <widget class="QComboBox" name="referralLettersComboBox">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="minimumSize">
-                           <size>
-                            <width>240</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="referralLettersPrintButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Print</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item row="5" column="0" colspan="2">
-                      <widget class="QGroupBox" name="groupBox_8">
-                       <property name="title">
-                        <string>Patient "Notes"</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_7">
-                        <item>
-                         <widget class="QPushButton" name="notesPrintButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string>Print a summary of the patient's notes (for them to take on). Includes No fee details.</string>
-                          </property>
-                          <property name="text">
-                           <string>Print the patient's notes</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item row="0" column="2" rowspan="6">
-                      <widget class="QGroupBox" name="groupBox_3">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="title">
-                        <string>Previous Correspondence</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_21">
-                        <item>
-                         <widget class="QLabel" name="label_44">
-                          <property name="text">
-                           <string>Generated By OpenMolar</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QTreeWidget" name="prevCorres_treeWidget">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="alternatingRowColors">
-                           <bool>true</bool>
-                          </property>
-                          <property name="animated">
-                           <bool>true</bool>
-                          </property>
-                          <column>
-                           <property name="text">
-                            <string>1</string>
-                           </property>
-                          </column>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QLabel" name="label_45">
-                          <property name="text">
-                           <string>Imported into database</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QTreeWidget" name="importDoc_treeWidget">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <column>
-                           <property name="text">
-                            <string notr="true">1</string>
-                           </property>
-                          </column>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="importDoc_pushButton">
-                          <property name="text">
-                           <string>Import A Document</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item row="3" column="0" rowspan="2" colspan="2">
-                      <spacer name="verticalSpacer_11">
-                       <property name="orientation">
-                        <enum>Qt::Vertical</enum>
-                       </property>
-                       <property name="sizeHint" stdset="0">
-                        <size>
-                         <width>20</width>
-                         <height>40</height>
-                        </size>
-                       </property>
-                      </spacer>
-                     </item>
-                     <item row="2" column="0" colspan="2">
-                      <widget class="QGroupBox" name="groupBox_9">
-                       <property name="title">
-                        <string>Medical History</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_19">
-                        <item>
-                         <widget class="QPushButton" name="medicalPrintButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="toolTip">
-                           <string>Print a summary of the patient's notes (for them to take on). Includes No fee details.</string>
-                          </property>
-                          <property name="text">
-                           <string>Print a medical history form</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_reception">
-                <attribute name="title">
-                 <string>Reception</string>
-                </attribute>
-                <layout class="QVBoxLayout" name="verticalLayout_24">
-                 <property name="spacing">
-                  <number>0</number>
-                 </property>
-                 <property name="margin">
-                  <number>0</number>
-                 </property>
-                 <item>
-                  <widget class="QScrollArea" name="scrollArea_2">
-                   <property name="frameShape">
-                    <enum>QFrame::NoFrame</enum>
-                   </property>
-                   <property name="widgetResizable">
-                    <bool>true</bool>
-                   </property>
-                   <widget class="QWidget" name="scrollAreaWidgetContents_5">
-                    <property name="geometry">
-                     <rect>
-                      <x>0</x>
-                      <y>0</y>
-                      <width>283</width>
-                      <height>470</height>
-                     </rect>
-                    </property>
-                    <layout class="QHBoxLayout" name="horizontalLayout_26">
-                     <property name="spacing">
-                      <number>3</number>
-                     </property>
-                     <property name="margin">
-                      <number>0</number>
-                     </property>
-                     <item>
-                      <layout class="QVBoxLayout" name="verticalLayout_32">
-                       <property name="spacing">
-                        <number>3</number>
-                       </property>
-                       <item>
-                        <widget class="QSplitter" name="splitter_2">
-                         <property name="orientation">
-                          <enum>Qt::Horizontal</enum>
-                         </property>
-                         <widget class="QGroupBox" name="reception_groupBox">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="minimumSize">
-                           <size>
-                            <width>0</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="title">
-                           <string>Reception</string>
-                          </property>
-                          <layout class="QHBoxLayout" name="horizontalLayout_32">
-                           <property name="spacing">
-                            <number>3</number>
-                           </property>
-                           <property name="margin">
-                            <number>3</number>
-                           </property>
-                           <item>
-                            <layout class="QGridLayout" name="gridLayout_3">
-                             <item row="1" column="1">
-                              <widget class="QGroupBox" name="NHSadmin_groupBox">
-                               <property name="title">
-                                <string>NHS</string>
-                               </property>
-                               <layout class="QVBoxLayout" name="verticalLayout_27">
-                                <property name="spacing">
-                                 <number>3</number>
-                                </property>
-                                <property name="margin">
-                                 <number>3</number>
-                                </property>
-                                <item>
-                                 <widget class="QPushButton" name="printGP17_pushButton">
-                                  <property name="text">
-                                   <string>Print A GP17</string>
-                                  </property>
-                                 </widget>
-                                </item>
-                                <item>
-                                 <widget class="QPushButton" name="rec_apply_exemption_pushButton">
-                                  <property name="text">
-                                   <string>Apply an Exemption</string>
-                                  </property>
-                                 </widget>
-                                </item>
-                               </layout>
-                              </widget>
-                             </item>
-                             <item row="3" column="1">
-                              <widget class="QCheckBox" name="customEst_checkBox">
-                               <property name="text">
-                                <string>Custom Estimate on File</string>
-                               </property>
-                              </widget>
-                             </item>
-                             <item row="5" column="1">
-                              <widget class="QPushButton" name="printAccount_pushButton">
-                               <property name="maximumSize">
-                                <size>
-                                 <width>16777215</width>
-                                 <height>16777215</height>
-                                </size>
-                               </property>
-                               <property name="text">
-                                <string>Print &Account</string>
-                               </property>
-                               <property name="icon">
-                                <iconset resource="../resources/resources.qrc">
-                                 <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-                               </property>
-                              </widget>
-                             </item>
-                             <item row="6" column="1">
-                              <widget class="QPushButton" name="takePayment_pushButton">
-                               <property name="maximumSize">
-                                <size>
-                                 <width>16777215</width>
-                                 <height>16777215</height>
-                                </size>
-                               </property>
-                               <property name="text">
-                                <string>Take &Payment</string>
-                               </property>
-                               <property name="icon">
-                                <iconset resource="../resources/resources.qrc">
-                                 <normaloff>:/vcard.png</normaloff>:/vcard.png</iconset>
-                               </property>
-                              </widget>
-                             </item>
-                             <item row="0" column="0" rowspan="7">
-                              <widget class="QTextBrowser" name="reception_textBrowser">
-                               <property name="sizePolicy">
-                                <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                                 <horstretch>0</horstretch>
-                                 <verstretch>0</verstretch>
-                                </sizepolicy>
-                               </property>
-                               <property name="minimumSize">
-                                <size>
-                                 <width>0</width>
-                                 <height>0</height>
-                                </size>
-                               </property>
-                               <property name="maximumSize">
-                                <size>
-                                 <width>16777215</width>
-                                 <height>16777215</height>
-                                </size>
-                               </property>
-                              </widget>
-                             </item>
-                             <item row="4" column="1">
-                              <widget class="QPushButton" name="printEst_pushButton">
-                               <property name="maximumSize">
-                                <size>
-                                 <width>16777215</width>
-                                 <height>16777215</height>
-                                </size>
-                               </property>
-                               <property name="text">
-                                <string>Print &Estimate</string>
-                               </property>
-                               <property name="icon">
-                                <iconset resource="../resources/resources.qrc">
-                                 <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-                               </property>
-                              </widget>
-                             </item>
-                             <item row="2" column="1">
-                              <spacer name="verticalSpacer">
-                               <property name="orientation">
-                                <enum>Qt::Vertical</enum>
-                               </property>
-                               <property name="sizeHint" stdset="0">
-                                <size>
-                                 <width>20</width>
-                                 <height>40</height>
-                                </size>
-                               </property>
-                              </spacer>
-                             </item>
-                            </layout>
-                           </item>
-                          </layout>
-                         </widget>
-                         <widget class="QGroupBox" name="groupBox_recnotes">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>300</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="title">
-                           <string>Notes</string>
-                          </property>
-                          <layout class="QHBoxLayout" name="horizontalLayout_30">
-                           <property name="spacing">
-                            <number>3</number>
-                           </property>
-                           <property name="margin">
-                            <number>3</number>
-                           </property>
-                           <item>
-                            <widget class="QWebView" name="recNotes_webView">
-                             <property name="sizePolicy">
-                              <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
-                               <horstretch>0</horstretch>
-                               <verstretch>0</verstretch>
-                              </sizepolicy>
-                             </property>
-                             <property name="maximumSize">
-                              <size>
-                               <width>16777215</width>
-                               <height>16777215</height>
-                              </size>
-                             </property>
-                             <property name="url">
-                              <url>
-                               <string>about:blank</string>
-                              </url>
-                             </property>
-                            </widget>
-                           </item>
-                          </layout>
-                         </widget>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QGroupBox" name="pt_diary_groupBox">
-                         <property name="sizePolicy">
-                          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                           <horstretch>0</horstretch>
-                           <verstretch>0</verstretch>
-                          </sizepolicy>
-                         </property>
-                         <property name="minimumSize">
-                          <size>
-                           <width>0</width>
-                           <height>200</height>
-                          </size>
-                         </property>
-                         <property name="maximumSize">
-                          <size>
-                           <width>16777215</width>
-                           <height>200</height>
-                          </size>
-                         </property>
-                         <property name="title">
-                          <string>Patient's Diary</string>
-                         </property>
-                         <layout class="QHBoxLayout" name="horizontalLayout_34">
-                          <property name="spacing">
-                           <number>0</number>
-                          </property>
-                          <property name="margin">
-                           <number>0</number>
-                          </property>
-                         </layout>
-                        </widget>
-                       </item>
-                      </layout>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_summary">
-                <attribute name="title">
-                 <string>Clinical Summary</string>
-                </attribute>
-                <layout class="QHBoxLayout" name="horizontalLayout_12">
-                 <property name="spacing">
-                  <number>3</number>
-                 </property>
-                 <property name="margin">
-                  <number>3</number>
-                 </property>
-                 <item>
-                  <widget class="QScrollArea" name="scrollArea_6">
-                   <property name="frameShape">
-                    <enum>QFrame::NoFrame</enum>
-                   </property>
-                   <property name="widgetResizable">
-                    <bool>true</bool>
-                   </property>
-                   <widget class="QWidget" name="scrollAreaWidgetContents_9">
-                    <property name="geometry">
-                     <rect>
-                      <x>0</x>
-                      <y>0</y>
-                      <width>739</width>
-                      <height>456</height>
-                     </rect>
-                    </property>
-                    <layout class="QGridLayout" name="gridLayout_4">
-                     <property name="margin">
-                      <number>0</number>
-                     </property>
-                     <property name="spacing">
-                      <number>6</number>
-                     </property>
-                     <item row="0" column="0" colspan="2">
-                      <widget class="QFrame" name="staticSummaryPanel">
-                       <property name="minimumSize">
-                        <size>
-                         <width>0</width>
-                         <height>180</height>
-                        </size>
-                       </property>
-                       <property name="maximumSize">
-                        <size>
-                         <width>16777215</width>
-                         <height>180</height>
-                        </size>
-                       </property>
-                       <property name="font">
-                        <font>
-                         <pointsize>10</pointsize>
-                        </font>
-                       </property>
-                       <property name="autoFillBackground">
-                        <bool>false</bool>
-                       </property>
-                       <property name="frameShape">
-                        <enum>QFrame::StyledPanel</enum>
-                       </property>
-                       <property name="frameShadow">
-                        <enum>QFrame::Raised</enum>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="0" colspan="2">
-                      <widget class="QLineEdit" name="synopsis_lineEdit">
-                       <property name="font">
-                        <font>
-                         <pointsize>10</pointsize>
-                         <weight>75</weight>
-                         <italic>true</italic>
-                         <bold>true</bold>
-                        </font>
-                       </property>
-                       <property name="whatsThis">
-                        <string/>
-                       </property>
-                       <property name="styleSheet">
-                        <string notr="true">color:red</string>
-                       </property>
-                       <property name="maxLength">
-                        <number>140</number>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="0" rowspan="2">
-                      <widget class="QWebView" name="notesSummary_webView">
-                       <property name="url">
-                        <url>
-                         <string>about:blank</string>
-                        </url>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QGroupBox" name="bpe_groupBox">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="maximumSize">
-                        <size>
-                         <width>145</width>
-                         <height>135</height>
-                        </size>
-                       </property>
-                       <property name="title">
-                        <string>BPE</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_8">
-                        <property name="leftMargin">
-                         <number>3</number>
-                        </property>
-                        <property name="topMargin">
-                         <number>3</number>
-                        </property>
-                        <property name="rightMargin">
-                         <number>9</number>
-                        </property>
-                        <property name="bottomMargin">
-                         <number>3</number>
-                        </property>
-                        <item>
-                         <widget class="QTextBrowser" name="bpe_textBrowser">
-                          <property name="minimumSize">
-                           <size>
-                            <width>0</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>65</height>
-                           </size>
-                          </property>
-                          <property name="verticalScrollBarPolicy">
-                           <enum>Qt::ScrollBarAlwaysOff</enum>
-                          </property>
-                          <property name="horizontalScrollBarPolicy">
-                           <enum>Qt::ScrollBarAlwaysOff</enum>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="newBPE_pushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="toolTip">
-                           <string>Update the Basic Perio Exam (CPITN) score</string>
-                          </property>
-                          <property name="text">
-                           <string>New</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item row="3" column="1">
-                      <widget class="QTextBrowser" name="planSummary_textBrowser">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="maximumSize">
-                        <size>
-                         <width>150</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="4" column="0" colspan="2">
-                      <layout class="QHBoxLayout" name="horizontalLayout_13">
-                       <item>
-                        <widget class="QPushButton" name="exampushButton">
-                         <property name="maximumSize">
-                          <size>
-                           <width>16777215</width>
-                           <height>28</height>
-                          </size>
-                         </property>
-                         <property name="toolTip">
-                          <string>perform a clinical exam</string>
-                         </property>
-                         <property name="text">
-                          <string>Exam</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QPushButton" name="xray_pushButton">
-                         <property name="toolTip">
-                          <string>add x-rays to the patient's current course.</string>
-                         </property>
-                         <property name="text">
-                          <string>X-ray</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QPushButton" name="hygWizard_pushButton">
-                         <property name="toolTip">
-                          <string>perform common perio treatments</string>
-                         </property>
-                         <property name="text">
-                          <string>Hyg</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="Line" name="line_4">
-                         <property name="orientation">
-                          <enum>Qt::Vertical</enum>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QPushButton" name="closeCourse_pushButton">
-                         <property name="text">
-                          <string>Close This Course</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <spacer name="horizontalSpacer_3">
-                         <property name="orientation">
-                          <enum>Qt::Horizontal</enum>
-                         </property>
-                         <property name="sizeHint" stdset="0">
-                          <size>
-                           <width>28</width>
-                           <height>17</height>
-                          </size>
-                         </property>
-                        </spacer>
-                       </item>
-                       <item>
-                        <widget class="QPushButton" name="childsmile_button">
-                         <property name="text">
-                          <string>ChildSmile</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <spacer name="horizontalSpacer_2">
-                         <property name="orientation">
-                          <enum>Qt::Horizontal</enum>
-                         </property>
-                         <property name="sizeHint" stdset="0">
-                          <size>
-                           <width>40</width>
-                           <height>20</height>
-                          </size>
-                         </property>
-                        </spacer>
-                       </item>
-                       <item>
-                        <widget class="QPushButton" name="medNotes_pushButton">
-                         <property name="minimumSize">
-                          <size>
-                           <width>200</width>
-                           <height>0</height>
-                          </size>
-                         </property>
-                         <property name="toolTip">
-                          <string>check / update the patients medical history</string>
-                         </property>
-                         <property name="text">
-                          <string>Med Notes</string>
-                         </property>
-                        </widget>
-                       </item>
-                      </layout>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_notes">
-                <attribute name="title">
-                 <string>Notes</string>
-                </attribute>
-                <layout class="QGridLayout" name="gridLayout_6">
-                 <item row="0" column="0" colspan="3">
-                  <widget class="QWebView" name="notes_webView">
-                   <property name="url">
-                    <url>
-                     <string>about:blank</string>
-                    </url>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="3" column="0">
-                  <layout class="QHBoxLayout" name="horizontalLayout_35">
-                   <item>
-                    <widget class="QLabel" name="label_35">
-                     <property name="text">
-                      <string>Include</string>
-                     </property>
-                    </widget>
-                   </item>
-                   <item>
-                    <widget class="QCheckBox" name="notes_includePrinting_checkBox">
-                     <property name="text">
-                      <string>Printing Notes</string>
-                     </property>
-                     <property name="checked">
-                      <bool>true</bool>
-                     </property>
-                    </widget>
-                   </item>
-                   <item>
-                    <widget class="QCheckBox" name="notes_includePayments_checkBox">
-                     <property name="text">
-                      <string>Payments</string>
-                     </property>
-                     <property name="checked">
-                      <bool>true</bool>
-                     </property>
-                    </widget>
-                   </item>
-                   <item>
-                    <widget class="QCheckBox" name="notes_includeTimestamps_checkBox">
-                     <property name="text">
-                      <string>Timestamps</string>
-                     </property>
-                    </widget>
-                   </item>
-                   <item>
-                    <widget class="QCheckBox" name="notes_includeMetadata_checkBox">
-                     <property name="text">
-                      <string>Metadata</string>
-                     </property>
-                    </widget>
-                   </item>
-                  </layout>
-                 </item>
-                 <item row="3" column="1">
-                  <spacer name="horizontalSpacer_9">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>40</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                 <item row="3" column="2">
-                  <widget class="QCheckBox" name="summary_notes_checkBox">
-                   <property name="toolTip">
-                    <string><html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html></string>
-                   </property>
-                   <property name="text">
-                    <string>clinical summary</string>
-                   </property>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_charts">
-                <attribute name="title">
-                 <string>Charts / Planning</string>
-                </attribute>
-                <layout class="QGridLayout" name="gridLayout_8">
-                 <item row="0" column="0">
-                  <widget class="QStackedWidget" name="stackedWidget">
-                   <property name="currentIndex">
-                    <number>1</number>
-                   </property>
-                   <widget class="QWidget" name="table">
-                    <layout class="QHBoxLayout" name="horizontalLayout_4">
-                     <item>
-                      <widget class="QTableWidget" name="chartsTableWidget">
-                       <property name="maximumSize">
-                        <size>
-                         <width>16777215</width>
-                         <height>500</height>
-                        </size>
-                       </property>
-                       <property name="alternatingRowColors">
-                        <bool>true</bool>
-                       </property>
-                       <property name="selectionBehavior">
-                        <enum>QAbstractItemView::SelectItems</enum>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                   <widget class="QWidget" name="charts">
-                    <layout class="QGridLayout" name="gridLayout_14">
-                     <property name="margin">
-                      <number>3</number>
-                     </property>
-                     <item row="3" column="1">
-                      <widget class="QListView" name="completed_listView">
-                       <property name="maximumSize">
-                        <size>
-                         <width>120</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QListView" name="plan_listView">
-                       <property name="maximumSize">
-                        <size>
-                         <width>120</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="0">
-                      <widget class="QGroupBox" name="static_groupBox">
-                       <property name="font">
-                        <font>
-                         <kerning>true</kerning>
-                        </font>
-                       </property>
-                       <property name="focusPolicy">
-                        <enum>Qt::ClickFocus</enum>
-                       </property>
-                       <property name="title">
-                        <string>Static</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="0">
-                      <widget class="QGroupBox" name="plan_groupBox">
-                       <property name="autoFillBackground">
-                        <bool>false</bool>
-                       </property>
-                       <property name="title">
-                        <string>Plan</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="1">
-                      <widget class="QFrame" name="static_frame">
-                       <property name="minimumSize">
-                        <size>
-                         <width>0</width>
-                         <height>120</height>
-                        </size>
-                       </property>
-                       <property name="maximumSize">
-                        <size>
-                         <width>120</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                       <property name="frameShape">
-                        <enum>QFrame::StyledPanel</enum>
-                       </property>
-                       <property name="frameShadow">
-                        <enum>QFrame::Raised</enum>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="3" column="0">
-                      <widget class="QGroupBox" name="completed_groupBox">
-                       <property name="title">
-                        <string>Completed</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                 <item row="0" column="1" rowspan="2">
-                  <widget class="QFrame" name="toothProps_frame">
-                   <property name="minimumSize">
-                    <size>
-                     <width>160</width>
-                     <height>0</height>
-                    </size>
-                   </property>
-                   <property name="maximumSize">
-                    <size>
-                     <width>200</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="frameShape">
-                    <enum>QFrame::NoFrame</enum>
-                   </property>
-                   <property name="frameShadow">
-                    <enum>QFrame::Raised</enum>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="1" column="0">
-                  <widget class="QGroupBox" name="groupBox_4">
-                   <property name="sizePolicy">
-                    <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
-                     <horstretch>0</horstretch>
-                     <verstretch>0</verstretch>
-                    </sizepolicy>
-                   </property>
-                   <property name="minimumSize">
-                    <size>
-                     <width>0</width>
-                     <height>0</height>
-                    </size>
-                   </property>
-                   <property name="maximumSize">
-                    <size>
-                     <width>16777215</width>
-                     <height>50</height>
-                    </size>
-                   </property>
-                   <property name="title">
-                    <string>Treatment Planning</string>
-                   </property>
-                   <layout class="QVBoxLayout" name="verticalLayout_2">
-                    <property name="spacing">
-                     <number>0</number>
-                    </property>
-                    <property name="margin">
-                     <number>0</number>
-                    </property>
-                    <item>
-                     <widget class="QStackedWidget" name="plan_buttons_stacked_widget">
-                      <property name="currentIndex">
-                       <number>0</number>
-                      </property>
-                      <widget class="QWidget" name="plan_buttons_page1">
-                       <layout class="QHBoxLayout" name="horizontalLayout_9">
-                        <property name="margin">
-                         <number>0</number>
-                        </property>
-                        <item>
-                         <widget class="QPushButton" name="xrayTxpushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>X-Rays</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="perioTxpushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Perio</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="dentureTxpushButton">
-                          <property name="text">
-                           <string>Dentures</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="otherTxpushButton">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>16777215</height>
-                           </size>
-                          </property>
-                          <property name="text">
-                           <string>Other</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="customTx_pushButton">
-                          <property name="text">
-                           <string>Custom</string>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="advanced_tx_planning_button">
-                          <property name="text">
-                           <string>Advanced Tx Planning</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                      <widget class="QWidget" name="plan_buttons_page2">
-                       <layout class="QHBoxLayout" name="horizontalLayout_10">
-                        <property name="spacing">
-                         <number>12</number>
-                        </property>
-                        <property name="margin">
-                         <number>0</number>
-                        </property>
-                        <item>
-                         <widget class="QPushButton" name="plan_course_manage_button">
-                          <property name="text">
-                           <string>Patient is not currently under treatment - click here to begin</string>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </widget>
-                    </item>
-                   </layout>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_estimate">
-                <attribute name="title">
-                 <string>Estimate</string>
-                </attribute>
-                <layout class="QHBoxLayout" name="horizontalLayout_5">
-                 <item>
-                  <widget class="QScrollArea" name="estimate_scrollArea">
-                   <property name="minimumSize">
-                    <size>
-                     <width>0</width>
-                     <height>202</height>
-                    </size>
-                   </property>
-                   <property name="widgetResizable">
-                    <bool>true</bool>
-                   </property>
-                   <widget class="QWidget" name="scrollAreaWidgetContents_11">
-                    <property name="geometry">
-                     <rect>
-                      <x>0</x>
-                      <y>0</y>
-                      <width>98</width>
-                      <height>200</height>
-                     </rect>
-                    </property>
-                    <layout class="QHBoxLayout" name="horizontalLayout_19"/>
-                   </widget>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QScrollArea" name="scrollArea">
-                   <property name="sizePolicy">
-                    <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-                     <horstretch>0</horstretch>
-                     <verstretch>0</verstretch>
-                    </sizepolicy>
-                   </property>
-                   <property name="minimumSize">
-                    <size>
-                     <width>200</width>
-                     <height>0</height>
-                    </size>
-                   </property>
-                   <property name="widgetResizable">
-                    <bool>true</bool>
-                   </property>
-                   <widget class="QWidget" name="scrollAreaWidgetContents_4">
-                    <property name="geometry">
-                     <rect>
-                      <x>0</x>
-                      <y>0</y>
-                      <width>139</width>
-                      <height>212</height>
-                     </rect>
-                    </property>
-                    <layout class="QVBoxLayout" name="verticalLayout_9">
-                     <item>
-                      <widget class="QLabel" name="estimate_label">
-                       <property name="text">
-                        <string>Estimate</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QPushButton" name="estLetter_pushButton">
-                       <property name="text">
-                        <string>Custom Estimate Letter</string>
-                       </property>
-                       <property name="checkable">
-                        <bool>false</bool>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QPushButton" name="recalcEst_pushButton">
-                       <property name="toolTip">
-                        <string>Use this feature to re-price all items in the "tooth" category of treatments. i.e all those which appear on the charts.
-
-Note - this will not remove items which are currently there. </string>
-                       </property>
-                       <property name="text">
-                        <string>ReCalculate Estimate</string>
-                       </property>
-                       <property name="checkable">
-                        <bool>false</bool>
-                       </property>
-                       <property name="checked">
-                        <bool>false</bool>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QPushButton" name="apply_exemption_pushButton">
-                       <property name="text">
-                        <string>Apply Exemption</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <spacer name="verticalSpacer_10">
-                       <property name="orientation">
-                        <enum>Qt::Vertical</enum>
-                       </property>
-                       <property name="sizeHint" stdset="0">
-                        <size>
-                         <width>20</width>
-                         <height>40</height>
-                        </size>
-                       </property>
-                      </spacer>
-                     </item>
-                     <item>
-                      <widget class="QLabel" name="label_22">
-                       <property name="layoutDirection">
-                        <enum>Qt::LeftToRight</enum>
-                       </property>
-                       <property name="text">
-                        <string>Course Dentist</string>
-                       </property>
-                       <property name="alignment">
-                        <set>Qt::AlignCenter</set>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QComboBox" name="dnt2comboBox">
-                       <property name="maximumSize">
-                        <size>
-                         <width>16777215</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QPushButton" name="closeTx_pushButton">
-                       <property name="enabled">
-                        <bool>true</bool>
-                       </property>
-                       <property name="text">
-                        <string>Close Course</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_perio">
-                <attribute name="title">
-                 <string>Perio Charts</string>
-                </attribute>
-                <layout class="QHBoxLayout" name="horizontalLayout_8">
-                 <item>
-                  <widget class="QScrollArea" name="perioCharts_scrollArea">
-                   <property name="frameShape">
-                    <enum>QFrame::NoFrame</enum>
-                   </property>
-                   <property name="widgetResizable">
-                    <bool>true</bool>
-                   </property>
-                   <widget class="QWidget" name="scrollAreaWidgetContents_6">
-                    <property name="geometry">
-                     <rect>
-                      <x>0</x>
-                      <y>0</y>
-                      <width>252</width>
-                      <height>374</height>
-                     </rect>
-                    </property>
-                    <layout class="QGridLayout" name="gridLayout_15">
-                     <item row="0" column="0" colspan="3">
-                      <widget class="QFrame" name="perioChart_frame">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="minimumSize">
-                        <size>
-                         <width>0</width>
-                         <height>140</height>
-                        </size>
-                       </property>
-                       <property name="maximumSize">
-                        <size>
-                         <width>16777215</width>
-                         <height>140</height>
-                        </size>
-                       </property>
-                       <property name="frameShape">
-                        <enum>QFrame::StyledPanel</enum>
-                       </property>
-                       <property name="frameShadow">
-                        <enum>QFrame::Raised</enum>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="0" colspan="3">
-                      <widget class="QScrollArea" name="perioChartData_scrollArea">
-                       <property name="minimumSize">
-                        <size>
-                         <width>0</width>
-                         <height>0</height>
-                        </size>
-                       </property>
-                       <property name="widgetResizable">
-                        <bool>true</bool>
-                       </property>
-                       <widget class="QWidget" name="scrollAreaWidgetContents_10">
-                        <property name="geometry">
-                         <rect>
-                          <x>0</x>
-                          <y>0</y>
-                          <width>918</width>
-                          <height>1218</height>
-                         </rect>
-                        </property>
-                        <layout class="QHBoxLayout" name="horizontalLayout_15">
-                         <item>
-                          <widget class="QFrame" name="perioChartData_frame">
-                           <property name="minimumSize">
-                            <size>
-                             <width>900</width>
-                             <height>1200</height>
-                            </size>
-                           </property>
-                           <property name="frameShape">
-                            <enum>QFrame::StyledPanel</enum>
-                           </property>
-                           <property name="frameShadow">
-                            <enum>QFrame::Raised</enum>
-                           </property>
-                          </widget>
-                         </item>
-                        </layout>
-                       </widget>
-                      </widget>
-                     </item>
-                     <item row="2" column="0">
-                      <widget class="QGroupBox" name="groupBox_11">
-                       <property name="title">
-                        <string>Choose Data</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_16">
-                        <item>
-                         <widget class="QLabel" name="label_41">
-                          <property name="font">
-                           <font>
-                            <pointsize>12</pointsize>
-                           </font>
-                          </property>
-                          <property name="text">
-                           <string>Chart Date</string>
-                          </property>
-                          <property name="alignment">
-                           <set>Qt::AlignCenter</set>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QComboBox" name="perioChartDateComboBox"/>
-                        </item>
-                        <item>
-                         <widget class="QPushButton" name="newPerioChartPushButton">
-                          <property name="text">
-                           <string>New</string>
-                          </property>
-                          <property name="autoDefault">
-                           <bool>false</bool>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QFrame" name="perioToothProps_frame">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="minimumSize">
-                        <size>
-                         <width>0</width>
-                         <height>0</height>
-                        </size>
-                       </property>
-                       <property name="maximumSize">
-                        <size>
-                         <width>16777215</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                       <property name="frameShape">
-                        <enum>QFrame::StyledPanel</enum>
-                       </property>
-                       <property name="frameShadow">
-                        <enum>QFrame::Raised</enum>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="2">
-                      <widget class="QGroupBox" name="groupBox_12">
-                       <property name="maximumSize">
-                        <size>
-                         <width>120</width>
-                         <height>16777215</height>
-                        </size>
-                       </property>
-                       <property name="title">
-                        <string>BPE</string>
-                       </property>
-                       <layout class="QVBoxLayout" name="verticalLayout_15">
-                        <item>
-                         <widget class="QTextBrowser" name="bpe_textBrowser_2">
-                          <property name="minimumSize">
-                           <size>
-                            <width>0</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                          <property name="maximumSize">
-                           <size>
-                            <width>16777215</width>
-                            <height>65</height>
-                           </size>
-                          </property>
-                          <property name="verticalScrollBarPolicy">
-                           <enum>Qt::ScrollBarAlwaysOff</enum>
-                          </property>
-                          <property name="horizontalScrollBarPolicy">
-                           <enum>Qt::ScrollBarAlwaysOff</enum>
-                          </property>
-                         </widget>
-                        </item>
-                        <item>
-                         <widget class="QComboBox" name="bpeDateComboBox">
-                          <property name="sizePolicy">
-                           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                            <horstretch>0</horstretch>
-                            <verstretch>0</verstretch>
-                           </sizepolicy>
-                          </property>
-                          <property name="minimumSize">
-                           <size>
-                            <width>0</width>
-                            <height>0</height>
-                           </size>
-                          </property>
-                          <property name="sizeAdjustPolicy">
-                           <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
-                          </property>
-                         </widget>
-                        </item>
-                       </layout>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-               <widget class="QWidget" name="tab_patient_history">
-                <attribute name="title">
-                 <string>History</string>
-                </attribute>
-                <layout class="QHBoxLayout" name="horizontalLayout_29">
-                 <property name="spacing">
-                  <number>3</number>
-                 </property>
-                 <property name="margin">
-                  <number>3</number>
-                 </property>
-                 <item>
-                  <widget class="QTextBrowser" name="debugBrowser"/>
-                 </item>
-                 <item>
-                  <widget class="QFrame" name="frame_3">
-                   <property name="minimumSize">
-                    <size>
-                     <width>100</width>
-                     <height>0</height>
-                    </size>
-                   </property>
-                   <property name="frameShape">
-                    <enum>QFrame::StyledPanel</enum>
-                   </property>
-                   <property name="frameShadow">
-                    <enum>QFrame::Raised</enum>
-                   </property>
-                   <layout class="QVBoxLayout" name="verticalLayout_25">
-                    <property name="spacing">
-                     <number>3</number>
-                    </property>
-                    <property name="margin">
-                     <number>3</number>
-                    </property>
-                    <item>
-                     <widget class="QPushButton" name="pastPayments_pushButton">
-                      <property name="toolTip">
-                       <string>See all payments in the database made by this patient</string>
-                      </property>
-                      <property name="text">
-                       <string>Past Payments</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="pastTreatment_pushButton">
-                      <property name="toolTip">
-                       <string>View treatments completed, by date order</string>
-                      </property>
-                      <property name="text">
-                       <string>Past Treatment</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="past_course_estimates_pushButton">
-                      <property name="toolTip">
-                       <string>display a combination of courses and estimates.</string>
-                      </property>
-                      <property name="text">
-                       <string>Courses / Estimates</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="pastCourses_pushButton">
-                      <property name="toolTip">
-                       <string>View all Courses of treatment. This includes treatment that was planned but not completed.</string>
-                      </property>
-                      <property name="text">
-                       <string>Courses</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="pastEstimates_pushButton">
-                      <property name="toolTip">
-                       <string>Estimate history for this patient.</string>
-                      </property>
-                      <property name="text">
-                       <string>Estimates</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="current_est_versioning_pushButton">
-                      <property name="text">
-                       <string>Current Estimate</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="NHSClaims_pushButton">
-                      <property name="text">
-                       <string>NHS Claims</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="memo_history_pushButton">
-                      <property name="text">
-                       <string>Memos</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="historyPrint_pushButton">
-                      <property name="sizePolicy">
-                       <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                        <horstretch>0</horstretch>
-                        <verstretch>0</verstretch>
-                       </sizepolicy>
-                      </property>
-                      <property name="toolTip">
-                       <string>Print the text displayed on this page.</string>
-                      </property>
-                      <property name="text">
-                       <string>Print</string>
-                      </property>
-                      <property name="icon">
-                       <iconset resource="../resources/resources.qrc">
-                        <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <spacer name="verticalSpacer_14">
-                      <property name="orientation">
-                       <enum>Qt::Vertical</enum>
-                      </property>
-                      <property name="sizeHint" stdset="0">
-                       <size>
-                        <width>20</width>
-                        <height>123</height>
-                       </size>
-                      </property>
-                     </spacer>
-                    </item>
-                    <item>
-                     <widget class="Line" name="line_3">
-                      <property name="orientation">
-                       <enum>Qt::Horizontal</enum>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QToolButton" name="debug_toolButton">
-                      <property name="sizePolicy">
-                       <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                        <horstretch>0</horstretch>
-                        <verstretch>0</verstretch>
-                       </sizepolicy>
-                      </property>
-                      <property name="toolTip">
-                       <string>Advanced options for developer use. Don't expect this to make much sense!
-
-If the "changes only" checkbox is checked, only data which has been changed will be displayed.</string>
-                      </property>
-                      <property name="text">
-                       <string>debug tools</string>
-                      </property>
-                      <property name="checkable">
-                       <bool>false</bool>
-                      </property>
-                      <property name="checked">
-                       <bool>false</bool>
-                      </property>
-                      <property name="popupMode">
-                       <enum>QToolButton::InstantPopup</enum>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QCheckBox" name="ptAtts_checkBox">
-                      <property name="text">
-                       <string>changes only</string>
-                      </property>
-                     </widget>
-                    </item>
-                   </layout>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-              </widget>
-              <widget class="QFrame" name="new_notes_frame">
-               <property name="minimumSize">
-                <size>
-                 <width>0</width>
-                 <height>80</height>
-                </size>
-               </property>
-               <property name="frameShape">
-                <enum>QFrame::NoFrame</enum>
-               </property>
-               <property name="frameShadow">
-                <enum>QFrame::Raised</enum>
-               </property>
-               <layout class="QGridLayout" name="gridLayout_7">
-                <property name="margin">
-                 <number>0</number>
-                </property>
-                <property name="spacing">
-                 <number>3</number>
-                </property>
-                <item row="0" column="1" rowspan="3">
-                 <widget class="Line" name="line">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="orientation">
-                   <enum>Qt::Vertical</enum>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="2" rowspan="3">
-                 <widget class="QScrollArea" name="scrollArea_8">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="maximumSize">
-                   <size>
-                    <width>120</width>
-                    <height>1200</height>
-                   </size>
-                  </property>
-                  <property name="horizontalScrollBarPolicy">
-                   <enum>Qt::ScrollBarAlwaysOff</enum>
-                  </property>
-                  <property name="widgetResizable">
-                   <bool>true</bool>
-                  </property>
-                  <widget class="QWidget" name="scrollAreaWidgetContents_13">
-                   <property name="geometry">
-                    <rect>
-                     <x>0</x>
-                     <y>0</y>
-                     <width>118</width>
-                     <height>118</height>
-                    </rect>
-                   </property>
-                   <layout class="QVBoxLayout" name="verticalLayout_20">
-                    <property name="spacing">
-                     <number>0</number>
-                    </property>
-                    <property name="margin">
-                     <number>0</number>
-                    </property>
-                    <item>
-                     <widget class="QLabel" name="hiddenNotes_label">
-                      <property name="sizePolicy">
-                       <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                        <horstretch>0</horstretch>
-                        <verstretch>0</verstretch>
-                       </sizepolicy>
-                      </property>
-                      <property name="minimumSize">
-                       <size>
-                        <width>70</width>
-                        <height>0</height>
-                       </size>
-                      </property>
-                      <property name="text">
-                       <string/>
-                      </property>
-                      <property name="alignment">
-                       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-                      </property>
-                      <property name="wordWrap">
-                       <bool>true</bool>
-                      </property>
-                     </widget>
-                    </item>
-                   </layout>
-                  </widget>
-                 </widget>
-                </item>
-                <item row="0" column="4">
-                 <widget class="QLabel" name="label_39">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="text">
-                   <string>Today's Notes</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="5" rowspan="3">
-                 <widget class="Line" name="line_2">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="orientation">
-                   <enum>Qt::Vertical</enum>
-                  </property>
-                 </widget>
-                </item>
-                <item row="2" column="4">
-                 <widget class="QPushButton" name="phraseBook_pushButton">
-                  <property name="text">
-                   <string>PhraseBook</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="../resources/resources.qrc">
-                    <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
-                  </property>
-                  <property name="shortcut">
-                   <string>Ins</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="6" rowspan="3">
-                 <widget class="QPushButton" name="saveButton">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="maximumSize">
-                   <size>
-                    <width>16777215</width>
-                    <height>16777215</height>
-                   </size>
-                  </property>
-                  <property name="toolTip">
-                   <string>Save the changes made to this record.</string>
-                  </property>
-                  <property name="text">
-                   <string>Save Changes</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="../resources/resources.qrc">
-                    <normaloff>:/save_all.png</normaloff>:/save_all.png</iconset>
-                  </property>
-                  <property name="shortcut">
-                   <string>Ctrl+S</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="3" rowspan="3">
-                 <widget class="QTextEdit" name="notesEnter_textEdit">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="maximumSize">
-                   <size>
-                    <width>16777215</width>
-                    <height>16777215</height>
-                   </size>
-                  </property>
-                  <property name="toolTip">
-                   <string>Enter Notes.</string>
-                  </property>
-                  <property name="frameShape">
-                   <enum>QFrame::NoFrame</enum>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="0" rowspan="3">
-                 <widget class="QPushButton" name="memos_pushButton">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="text">
-                   <string>Memos</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="../resources/resources.qrc">
-                    <normaloff>:/icons/memos.png</normaloff>:/icons/memos.png</iconset>
-                  </property>
-                 </widget>
-                </item>
-                <item row="1" column="4">
-                 <widget class="QPushButton" name="clinician_phrasebook_pushButton">
-                  <property name="text">
-                   <string>Phrases</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="../resources/resources.qrc">
-                    <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
-                  </property>
-                 </widget>
-                </item>
-               </layout>
-              </widget>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_appointments">
-           <attribute name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/vcalendar.png</normaloff>:/vcalendar.png</iconset>
-           </attribute>
-           <attribute name="title">
-            <string>Appointments / Diary</string>
-           </attribute>
-           <layout class="QHBoxLayout" name="horizontalLayout_21">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <property name="margin">
-             <number>0</number>
-            </property>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_cashbook">
-           <attribute name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/vcard.png</normaloff>:/vcard.png</iconset>
-           </attribute>
-           <attribute name="title">
-            <string>Cashbook</string>
-           </attribute>
-           <layout class="QGridLayout" name="gridLayout_5">
-            <item row="0" column="0">
-             <widget class="QLabel" name="label_34">
-              <property name="text">
-               <string>Start Date</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="1">
-             <widget class="QLabel" name="label_33">
-              <property name="text">
-               <string>End Date</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="2">
-             <widget class="QLabel" name="label_32">
-              <property name="text">
-               <string>Registered Dentist</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="3" rowspan="2">
-             <widget class="QPushButton" name="cashbookGoPushButton">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="text">
-               <string>Go</string>
-              </property>
-              <property name="icon">
-               <iconset resource="../resources/resources.qrc">
-                <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-              </property>
-              <property name="iconSize">
-               <size>
-                <width>24</width>
-                <height>24</height>
-               </size>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="4" rowspan="2">
-             <widget class="QPushButton" name="cashbookPrintButton">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="maximumSize">
-               <size>
-                <width>16777215</width>
-                <height>16777215</height>
-               </size>
-              </property>
-              <property name="toolTip">
-               <string>Print the Data</string>
-              </property>
-              <property name="text">
-               <string>Print</string>
-              </property>
-              <property name="icon">
-               <iconset resource="../resources/resources.qrc">
-                <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-              </property>
-              <property name="iconSize">
-               <size>
-                <width>32</width>
-                <height>24</height>
-               </size>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="0">
-             <widget class="QDateEdit" name="cashbookStartDateEdit">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="minimumSize">
-               <size>
-                <width>100</width>
-                <height>0</height>
-               </size>
-              </property>
-              <property name="calendarPopup">
-               <bool>true</bool>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="1">
-             <widget class="QDateEdit" name="cashbookEndDateEdit">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="minimumSize">
-               <size>
-                <width>100</width>
-                <height>0</height>
-               </size>
-              </property>
-              <property name="calendarPopup">
-               <bool>true</bool>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="2">
-             <widget class="QComboBox" name="cashbookDentComboBox"/>
-            </item>
-            <item row="1" column="5">
-             <spacer>
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>389</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-            <item row="1" column="6">
-             <widget class="QRadioButton" name="all_payments_radioButton">
-              <property name="text">
-               <string>All payments</string>
-              </property>
-              <property name="checked">
-               <bool>true</bool>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="7">
-             <widget class="QRadioButton" name="sundries_only_radioButton">
-              <property name="text">
-               <string>Sundries_only</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="8">
-             <widget class="QRadioButton" name="treatment_only_radioButton">
-              <property name="text">
-               <string>Treatment_only</string>
-              </property>
-             </widget>
-            </item>
-            <item row="2" column="0" colspan="9">
-             <widget class="QWidget" name="cashbook_placeholder_widget" native="true">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_daybook">
-           <attribute name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
-           </attribute>
-           <attribute name="title">
-            <string>Daybook</string>
-           </attribute>
-           <layout class="QVBoxLayout" name="verticalLayout_5">
-            <property name="margin">
-             <number>3</number>
-            </property>
-            <item>
-             <layout class="QGridLayout" name="gridLayout_17">
-              <property name="verticalSpacing">
-               <number>0</number>
-              </property>
-              <item row="1" column="1">
-               <widget class="QDateEdit" name="daybookEndDateEdit">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
-                <property name="minimumSize">
-                 <size>
-                  <width>0</width>
-                  <height>0</height>
-                 </size>
-                </property>
-                <property name="calendarPopup">
-                 <bool>true</bool>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="0">
-               <widget class="QLabel" name="label_29">
-                <property name="text">
-                 <string>Start Date</string>
-                </property>
-               </widget>
-              </item>
-              <item row="1" column="2">
-               <widget class="QComboBox" name="daybookDent1ComboBox">
-                <property name="maximumSize">
-                 <size>
-                  <width>100</width>
-                  <height>16777215</height>
-                 </size>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="5" rowspan="2">
-               <widget class="QPushButton" name="daybookGoPushButton">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
-                <property name="maximumSize">
-                 <size>
-                  <width>100</width>
-                  <height>16777215</height>
-                 </size>
-                </property>
-                <property name="text">
-                 <string>Go</string>
-                </property>
-                <property name="icon">
-                 <iconset resource="../resources/resources.qrc">
-                  <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-                </property>
-                <property name="iconSize">
-                 <size>
-                  <width>24</width>
-                  <height>24</height>
-                 </size>
-                </property>
-               </widget>
-              </item>
-              <item row="1" column="3">
-               <widget class="QComboBox" name="daybookDent2ComboBox">
-                <property name="maximumSize">
-                 <size>
-                  <width>100</width>
-                  <height>16777215</height>
-                 </size>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="3">
-               <widget class="QLabel" name="label_31">
-                <property name="text">
-                 <string>Treating Clinician</string>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="1">
-               <widget class="QLabel" name="label_30">
-                <property name="text">
-                 <string>End Date</string>
-                </property>
-               </widget>
-              </item>
-              <item row="1" column="0">
-               <widget class="QDateEdit" name="daybookStartDateEdit">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
-                <property name="minimumSize">
-                 <size>
-                  <width>0</width>
-                  <height>0</height>
-                 </size>
-                </property>
-                <property name="calendarPopup">
-                 <bool>true</bool>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="6" rowspan="2">
-               <widget class="QPushButton" name="daybookPrintButton">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
-                <property name="maximumSize">
-                 <size>
-                  <width>100</width>
-                  <height>16777215</height>
-                 </size>
-                </property>
-                <property name="toolTip">
-                 <string>Print the Data</string>
-                </property>
-                <property name="text">
-                 <string>Print</string>
-                </property>
-                <property name="icon">
-                 <iconset resource="../resources/resources.qrc">
-                  <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-                </property>
-                <property name="iconSize">
-                 <size>
-                  <width>32</width>
-                  <height>32</height>
-                 </size>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="2">
-               <widget class="QLabel" name="label_28">
-                <property name="text">
-                 <string>Dentist</string>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="4" rowspan="2">
-               <widget class="QFrame" name="daybook_filters_frame">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
-                <property name="frameShape">
-                 <enum>QFrame::NoFrame</enum>
-                </property>
-                <property name="frameShadow">
-                 <enum>QFrame::Raised</enum>
-                </property>
-                <layout class="QGridLayout" name="gridLayout_18">
-                 <property name="margin">
-                  <number>0</number>
-                 </property>
-                 <property name="spacing">
-                  <number>0</number>
-                 </property>
-                 <item row="0" column="0">
-                  <widget class="QLabel" name="label_7">
-                   <property name="text">
-                    <string>Extra Filters</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="1">
-                  <widget class="QPushButton" name="daybook_filters_pushButton">
-                   <property name="maximumSize">
-                    <size>
-                     <width>40</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="text">
-                    <string/>
-                   </property>
-                   <property name="icon">
-                    <iconset theme="help">
-                     <normaloff/>
-                    </iconset>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="1" column="0" colspan="2">
-                  <widget class="QLineEdit" name="daybook_filters_lineEdit"/>
-                 </item>
-                </layout>
-               </widget>
-              </item>
-             </layout>
-            </item>
-            <item>
-             <widget class="QTextBrowser" name="daybookTextBrowser"/>
-            </item>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_accounts">
-           <attribute name="title">
-            <string>Accounts</string>
-           </attribute>
-           <layout class="QGridLayout" name="gridLayout_9">
-            <item row="0" column="0">
-             <layout class="QHBoxLayout" name="horizontalLayout_28">
-              <item>
-               <widget class="QLabel" name="label_54">
-                <property name="text">
-                 <string>Find Patient Records where the patient is in</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QComboBox" name="accounts_debt_comboBox">
-                <property name="minimumSize">
-                 <size>
-                  <width>100</width>
-                  <height>0</height>
-                 </size>
-                </property>
-                <item>
-                 <property name="text">
-                  <string>Debt</string>
-                 </property>
-                </item>
-                <item>
-                 <property name="text">
-                  <string>Credit</string>
-                 </property>
-                </item>
-               </widget>
-              </item>
-              <item>
-               <widget class="QLabel" name="label_24">
-                <property name="text">
-                 <string>By More than</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QDoubleSpinBox" name="accounts_min_doubleSpinBox">
-                <property name="alignment">
-                 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-                </property>
-                <property name="prefix">
-                 <string/>
-                </property>
-                <property name="maximum">
-                 <double>1000.000000000000000</double>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QPushButton" name="loadAccountsTable_pushButton">
-                <property name="text">
-                 <string>Load Table</string>
-                </property>
-                <property name="icon">
-                 <iconset resource="../resources/resources.qrc">
-                  <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </item>
-            <item row="0" column="1">
-             <spacer name="horizontalSpacer_12">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>206</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-            <item row="0" column="2" colspan="2">
-             <widget class="QPushButton" name="printAccountsTable_pushButton">
-              <property name="text">
-               <string>Print Table</string>
-              </property>
-              <property name="icon">
-               <iconset resource="../resources/resources.qrc">
-                <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="4">
-             <widget class="QPushButton" name="printSelectedAccounts_pushButton">
-              <property name="text">
-               <string>Print Selected Letters</string>
-              </property>
-              <property name="icon">
-               <iconset resource="../resources/resources.qrc">
-                <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="0" colspan="5">
-             <widget class="QTableWidget" name="accounts_tableWidget">
-              <property name="font">
-               <font>
-                <pointsize>9</pointsize>
-               </font>
-              </property>
-              <property name="alternatingRowColors">
-               <bool>true</bool>
-              </property>
-              <property name="selectionBehavior">
-               <enum>QAbstractItemView::SelectRows</enum>
-              </property>
-              <property name="sortingEnabled">
-               <bool>false</bool>
-              </property>
-             </widget>
-            </item>
-            <item row="2" column="0" colspan="2">
-             <spacer name="horizontalSpacer_4">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>746</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-            <item row="2" column="2">
-             <widget class="QLabel" name="label_43">
-              <property name="text">
-               <string>TOTAL OUTSTANDING</string>
-              </property>
-             </widget>
-            </item>
-            <item row="2" column="3" colspan="2">
-             <widget class="QDoubleSpinBox" name="accountsTotal_doubleSpinBox">
-              <property name="enabled">
-               <bool>true</bool>
-              </property>
-              <property name="minimumSize">
-               <size>
-                <width>150</width>
-                <height>0</height>
-               </size>
-              </property>
-              <property name="font">
-               <font>
-                <pointsize>12</pointsize>
-                <weight>75</weight>
-                <bold>true</bold>
-               </font>
-              </property>
-              <property name="alignment">
-               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-              </property>
-              <property name="readOnly">
-               <bool>true</bool>
-              </property>
-              <property name="prefix">
-               <string/>
-              </property>
-              <property name="maximum">
-               <double>1000000.000000000000000</double>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_bulk_mail">
-           <attribute name="title">
-            <string>Bulk Mailings</string>
-           </attribute>
-           <layout class="QGridLayout" name="gridLayout_10">
-            <item row="1" column="0">
-             <layout class="QHBoxLayout" name="horizontalLayout_18">
-              <item>
-               <widget class="QPushButton" name="recallLoad_pushButton">
-                <property name="text">
-                 <string>Load Table</string>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </item>
-            <item row="1" column="5">
-             <widget class="QPushButton" name="bulkMailPrint_pushButton">
-              <property name="text">
-               <string>Print Letters</string>
-              </property>
-              <property name="icon">
-               <iconset resource="../resources/resources.qrc">
-                <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-              </property>
-              <property name="iconSize">
-               <size>
-                <width>24</width>
-                <height>24</height>
-               </size>
-              </property>
-             </widget>
-            </item>
-            <item row="2" column="0" colspan="6">
-             <widget class="QTreeView" name="bulk_mailings_treeView"/>
-            </item>
-            <item row="1" column="2">
-             <widget class="QPushButton" name="bulk_mail_expand_pushButton">
-              <property name="text">
-               <string>Expand All</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="4">
-             <widget class="QPushButton" name="bulkMail_options_pushButton">
-              <property name="text">
-               <string>Letter Options</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="1">
-             <spacer name="horizontalSpacer">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_feescales">
-           <attribute name="title">
-            <string>Feescales</string>
-           </attribute>
-           <layout class="QHBoxLayout" name="horizontalLayout_16">
-            <property name="margin">
-             <number>3</number>
-            </property>
-            <item>
-             <layout class="QVBoxLayout" name="verticalLayout_29">
-              <item>
-               <widget class="QLabel" name="feeScale_label">
-                <property name="text">
-                 <string>TextLabel</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QTreeView" name="feeScales_treeView">
-                <property name="alternatingRowColors">
-                 <bool>true</bool>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </item>
-            <item>
-             <widget class="QFrame" name="frame_5">
-              <property name="minimumSize">
-               <size>
-                <width>180</width>
-                <height>0</height>
-               </size>
-              </property>
-              <property name="maximumSize">
-               <size>
-                <width>200</width>
-                <height>16777215</height>
-               </size>
-              </property>
-              <property name="frameShape">
-               <enum>QFrame::StyledPanel</enum>
-              </property>
-              <property name="frameShadow">
-               <enum>QFrame::Raised</enum>
-              </property>
-              <layout class="QVBoxLayout" name="verticalLayout_10">
-               <property name="spacing">
-                <number>3</number>
-               </property>
-               <property name="margin">
-                <number>3</number>
-               </property>
-               <item>
-                <widget class="QLabel" name="feescales_available_label">
-                 <property name="text">
-                  <string>Fee Scales Available</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QComboBox" name="chooseFeescale_comboBox">
-                 <property name="enabled">
-                  <bool>true</bool>
-                 </property>
-                 <property name="toolTip">
-                  <string>Use this control to select a feescale</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <spacer name="verticalSpacer_9">
-                 <property name="orientation">
-                  <enum>Qt::Vertical</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>20</width>
-                   <height>40</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-               <item>
-                <widget class="QFrame" name="frame_6">
-                 <property name="enabled">
-                  <bool>true</bool>
-                 </property>
-                 <property name="frameShape">
-                  <enum>QFrame::StyledPanel</enum>
-                 </property>
-                 <property name="frameShadow">
-                  <enum>QFrame::Raised</enum>
-                 </property>
-                 <layout class="QGridLayout" name="gridLayout_16">
-                  <item row="0" column="0">
-                   <widget class="QLabel" name="label_26">
-                    <property name="text">
-                     <string>Search  For an Item</string>
-                    </property>
-                    <property name="alignment">
-                     <set>Qt::AlignCenter</set>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="2" column="0" colspan="2">
-                   <widget class="QRadioButton" name="search_descriptions_radioButton">
-                    <property name="toolTip">
-                     <string>search for the given phrase in description columns</string>
-                    </property>
-                    <property name="text">
-                     <string>Search Descriptions</string>
-                    </property>
-                    <property name="checked">
-                     <bool>true</bool>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="0" column="1">
-                   <widget class="QPushButton" name="feeSearch_pushButton">
-                    <property name="sizePolicy">
-                     <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                      <horstretch>0</horstretch>
-                      <verstretch>0</verstretch>
-                     </sizepolicy>
-                    </property>
-                    <property name="minimumSize">
-                     <size>
-                      <width>0</width>
-                      <height>0</height>
-                     </size>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>70</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="toolTip">
-                     <string>Click on this Button to search for in patient in your database.</string>
-                    </property>
-                    <property name="text">
-                     <string/>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/search.png</normaloff>:/search.png</iconset>
-                    </property>
-                    <property name="iconSize">
-                     <size>
-                      <width>24</width>
-                      <height>24</height>
-                     </size>
-                    </property>
-                    <property name="shortcut">
-                     <string>Ctrl+F</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="0" colspan="2">
-                   <widget class="QLineEdit" name="feeSearch_lineEdit"/>
-                  </item>
-                  <item row="3" column="0" colspan="2">
-                   <widget class="QRadioButton" name="search_itemcodes_radioButton">
-                    <property name="toolTip">
-                     <string>only search for the given phrase in the usercode column</string>
-                    </property>
-                    <property name="text">
-                     <string>Search Itemcodes</string>
-                    </property>
-                    <property name="checked">
-                     <bool>false</bool>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="4" column="0" colspan="2">
-                   <widget class="QLabel" name="feesearch_results_label">
-                    <property name="text">
-                     <string>TextLabel</string>
-                    </property>
-                    <property name="alignment">
-                     <set>Qt::AlignCenter</set>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
-               </item>
-               <item>
-                <spacer name="verticalSpacer_8">
-                 <property name="orientation">
-                  <enum>Qt::Vertical</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>20</width>
-                   <height>40</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-               <item>
-                <widget class="QCheckBox" name="hide_rare_feescale_codes_checkBox">
-                 <property name="text">
-                  <string>Hide Rarely Used Codes</string>
-                 </property>
-                 <property name="checked">
-                  <bool>true</bool>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QRadioButton" name="feeExpand_radioButton">
-                 <property name="enabled">
-                  <bool>true</bool>
-                 </property>
-                 <property name="toolTip">
-                  <string>Quickly expand all items</string>
-                 </property>
-                 <property name="text">
-                  <string>Expand All Sections</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QRadioButton" name="feeCompress_radioButton">
-                 <property name="enabled">
-                  <bool>true</bool>
-                 </property>
-                 <property name="toolTip">
-                  <string>Quickly compress all items</string>
-                 </property>
-                 <property name="text">
-                  <string>Compress All Sections</string>
-                 </property>
-                 <property name="checked">
-                  <bool>true</bool>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <spacer name="verticalSpacer_3">
-                 <property name="orientation">
-                  <enum>Qt::Vertical</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>20</width>
-                   <height>40</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-               <item>
-                <widget class="QGroupBox" name="groupBox">
-                 <property name="title">
-                  <string>Resources</string>
-                 </property>
-                 <layout class="QVBoxLayout" name="verticalLayout_13">
-                  <property name="spacing">
-                   <number>3</number>
-                  </property>
-                  <property name="margin">
-                   <number>3</number>
-                  </property>
-                  <item>
-                   <widget class="QPushButton" name="documents_pushButton">
-                    <property name="toolTip">
-                     <string>Open A PDF of the latest NHS Regulations</string>
-                    </property>
-                    <property name="text">
-                     <string>Documents</string>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
-               </item>
-               <item>
-                <spacer name="verticalSpacer_2">
-                 <property name="orientation">
-                  <enum>Qt::Vertical</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>20</width>
-                   <height>40</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-               <item>
-                <widget class="QGroupBox" name="feeadjuster_groupBox">
-                 <property name="enabled">
-                  <bool>true</bool>
-                 </property>
-                 <property name="toolTip">
-                  <string/>
-                 </property>
-                 <property name="title">
-                  <string>Advanced Options</string>
-                 </property>
-                 <property name="checkable">
-                  <bool>false</bool>
-                 </property>
-                 <property name="checked">
-                  <bool>false</bool>
-                 </property>
-                 <layout class="QVBoxLayout" name="verticalLayout_35">
-                  <property name="leftMargin">
-                   <number>2</number>
-                  </property>
-                  <property name="topMargin">
-                   <number>6</number>
-                  </property>
-                  <property name="rightMargin">
-                   <number>2</number>
-                  </property>
-                  <property name="bottomMargin">
-                   <number>6</number>
-                  </property>
-                  <item>
-                   <widget class="QPushButton" name="feetable_xml_pushButton">
-                    <property name="text">
-                     <string>FeeScale Editor</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="feescale_tester_pushButton">
-                    <property name="text">
-                     <string>FeeScale Tester</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="reload_feescales_pushButton">
-                    <property name="text">
-                     <string>Reload Fee Scales</string>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
-               </item>
-              </layout>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_forum">
-           <attribute name="title">
-            <string>FORUM</string>
-           </attribute>
-           <layout class="QHBoxLayout" name="horizontalLayout_20">
-            <property name="margin">
-             <number>3</number>
-            </property>
-            <item>
-             <widget class="QSplitter" name="splitter_3">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <widget class="QSplitter" name="splitter">
-               <property name="orientation">
-                <enum>Qt::Vertical</enum>
-               </property>
-               <widget class="QTreeWidget" name="forum_treeWidget">
-                <property name="alternatingRowColors">
-                 <bool>true</bool>
-                </property>
-                <property name="selectionMode">
-                 <enum>QAbstractItemView::ExtendedSelection</enum>
-                </property>
-                <property name="sortingEnabled">
-                 <bool>true</bool>
-                </property>
-                <property name="animated">
-                 <bool>true</bool>
-                </property>
-                <attribute name="headerShowSortIndicator" stdset="0">
-                 <bool>true</bool>
-                </attribute>
-                <column>
-                 <property name="text">
-                  <string notr="true">1</string>
-                 </property>
-                </column>
-               </widget>
-              </widget>
-              <widget class="QFrame" name="frame_20">
-               <property name="maximumSize">
-                <size>
-                 <width>301</width>
-                 <height>16777215</height>
-                </size>
-               </property>
-               <property name="frameShape">
-                <enum>QFrame::StyledPanel</enum>
-               </property>
-               <property name="frameShadow">
-                <enum>QFrame::Raised</enum>
-               </property>
-               <layout class="QVBoxLayout" name="verticalLayout_11">
-                <item>
-                 <widget class="QLabel" name="forum_label">
-                  <property name="minimumSize">
-                   <size>
-                    <width>0</width>
-                    <height>50</height>
-                   </size>
-                  </property>
-                  <property name="text">
-                   <string/>
-                  </property>
-                  <property name="wordWrap">
-                   <bool>true</bool>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QTextBrowser" name="forum_textBrowser">
-                  <property name="font">
-                   <font>
-                    <pointsize>12</pointsize>
-                   </font>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <layout class="QHBoxLayout" name="horizontalLayout_6">
-                  <item>
-                   <widget class="QPushButton" name="forumReply_pushButton">
-                    <property name="enabled">
-                     <bool>false</bool>
-                    </property>
-                    <property name="text">
-                     <string>Reply</string>
-                    </property>
-                    <property name="shortcut">
-                     <string>Alt+R</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="forumDelete_pushButton">
-                    <property name="enabled">
-                     <bool>false</bool>
-                    </property>
-                    <property name="text">
-                     <string>Delete</string>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="../resources/resources.qrc">
-                      <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
-                    </property>
-                    <property name="shortcut">
-                     <string>Del, Backspace</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="forumParent_pushButton">
-                    <property name="enabled">
-                     <bool>false</bool>
-                    </property>
-                    <property name="text">
-                     <string>&set parent</string>
-                    </property>
-                    <property name="shortcut">
-                     <string>Alt+S</string>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </item>
-                <item>
-                 <widget class="QPushButton" name="forumNewTopic_pushButton">
-                  <property name="text">
-                   <string>New Topic</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="../resources/resources.qrc">
-                    <normaloff>:/icons/mail_new.png</normaloff>:/icons/mail_new.png</iconset>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QFrame" name="frame_9">
-                  <property name="enabled">
-                   <bool>false</bool>
-                  </property>
-                  <property name="frameShape">
-                   <enum>QFrame::StyledPanel</enum>
-                  </property>
-                  <property name="frameShadow">
-                   <enum>QFrame::Raised</enum>
-                  </property>
-                  <layout class="QGridLayout" name="gridLayout_30">
-                   <item row="0" column="0" colspan="2">
-                    <widget class="QLabel" name="label_36">
-                     <property name="text">
-                      <string>Search by keyword</string>
-                     </property>
-                     <property name="alignment">
-                      <set>Qt::AlignCenter</set>
-                     </property>
-                    </widget>
-                   </item>
-                   <item row="1" column="0" colspan="2">
-                    <widget class="QLineEdit" name="feeSearch_lineEdit_2"/>
-                   </item>
-                   <item row="2" column="0">
-                    <spacer name="horizontalSpacer_11">
-                     <property name="orientation">
-                      <enum>Qt::Horizontal</enum>
-                     </property>
-                     <property name="sizeHint" stdset="0">
-                      <size>
-                       <width>67</width>
-                       <height>20</height>
-                      </size>
-                     </property>
-                    </spacer>
-                   </item>
-                   <item row="2" column="1">
-                    <widget class="QPushButton" name="feeSearch_pushButton_2">
-                     <property name="enabled">
-                      <bool>false</bool>
-                     </property>
-                     <property name="sizePolicy">
-                      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-                       <horstretch>0</horstretch>
-                       <verstretch>0</verstretch>
-                      </sizepolicy>
-                     </property>
-                     <property name="minimumSize">
-                      <size>
-                       <width>80</width>
-                       <height>28</height>
-                      </size>
-                     </property>
-                     <property name="maximumSize">
-                      <size>
-                       <width>70</width>
-                       <height>28</height>
-                      </size>
-                     </property>
-                     <property name="toolTip">
-                      <string>Click on this Button to search for in patient in your database.</string>
-                     </property>
-                     <property name="text">
-                      <string>Find</string>
-                     </property>
-                     <property name="icon">
-                      <iconset resource="../resources/resources.qrc">
-                       <normaloff>:/search.png</normaloff>:/search.png</iconset>
-                     </property>
-                     <property name="iconSize">
-                      <size>
-                       <width>24</width>
-                       <height>24</height>
-                      </size>
-                     </property>
-                     <property name="shortcut">
-                      <string>Ctrl+F</string>
-                     </property>
-                    </widget>
-                   </item>
-                  </layout>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QFrame" name="frame_10">
-                  <property name="frameShape">
-                   <enum>QFrame::StyledPanel</enum>
-                  </property>
-                  <property name="frameShadow">
-                   <enum>QFrame::Raised</enum>
-                  </property>
-                  <layout class="QHBoxLayout" name="horizontalLayout_25">
-                   <item>
-                    <widget class="QLabel" name="label_37">
-                     <property name="text">
-                      <string>Show Topics for</string>
-                     </property>
-                     <property name="alignment">
-                      <set>Qt::AlignCenter</set>
-                     </property>
-                    </widget>
-                   </item>
-                   <item>
-                    <widget class="QComboBox" name="forumViewFilter_comboBox">
-                     <item>
-                      <property name="text">
-                       <string>Everyone</string>
-                      </property>
-                     </item>
-                    </widget>
-                   </item>
-                  </layout>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QGroupBox" name="groupBox_10">
-                  <property name="title">
-                   <string>Options</string>
-                  </property>
-                  <layout class="QGridLayout" name="gridLayout_32">
-                   <item row="0" column="0" colspan="2">
-                    <widget class="QCheckBox" name="forum_deletedposts_checkBox">
-                     <property name="text">
-                      <string>Include Deleted Posts</string>
-                     </property>
-                    </widget>
-                   </item>
-                   <item row="1" column="0">
-                    <widget class="QRadioButton" name="split_replies_radioButton">
-                     <property name="text">
-                      <string>Split Replies</string>
-                     </property>
-                     <property name="checked">
-                      <bool>false</bool>
-                     </property>
-                    </widget>
-                   </item>
-                   <item row="1" column="1">
-                    <widget class="QRadioButton" name="group_replies_radioButton">
-                     <property name="text">
-                      <string>Group replies</string>
-                     </property>
-                     <property name="checked">
-                      <bool>true</bool>
-                     </property>
-                    </widget>
-                   </item>
-                   <item row="2" column="0">
-                    <widget class="QPushButton" name="forumCollapse_pushButton">
-                     <property name="text">
-                      <string>&Collapse Replies</string>
-                     </property>
-                    </widget>
-                   </item>
-                   <item row="2" column="1">
-                    <widget class="QPushButton" name="forumExpand_pushButton">
-                     <property name="text">
-                      <string>&Expand Replies</string>
-                     </property>
-                    </widget>
-                   </item>
-                  </layout>
-                 </widget>
-                </item>
-               </layout>
-              </widget>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-          <widget class="QWidget" name="tab_wiki">
-           <attribute name="icon">
-            <iconset resource="../resources/resources.qrc">
-             <normaloff>:/icons/wikipedia.png</normaloff>:/icons/wikipedia.png</iconset>
-           </attribute>
-           <attribute name="title">
-            <string>Wiki</string>
-           </attribute>
-           <layout class="QHBoxLayout" name="horizontalLayout_33">
-            <property name="margin">
-             <number>3</number>
-            </property>
-            <item>
-             <widget class="QWebView" name="wiki_webView">
-              <property name="url">
-               <url>
-                <string>about:blank</string>
-               </url>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-     </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QMenuBar" name="menubar">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>964</width>
-     <height>17</height>
-    </rect>
-   </property>
-   <widget class="QMenu" name="menuMenu">
-    <property name="title">
-     <string>&File</string>
-    </property>
-    <addaction name="action_Open_Patient"/>
-    <addaction name="separator"/>
-    <addaction name="action_save_patient"/>
-    <addaction name="actionPrint_Daylists"/>
-    <addaction name="separator"/>
-    <addaction name="action_Quit"/>
-   </widget>
-   <widget class="QMenu" name="menu_Help">
-    <property name="title">
-     <string>&Help</string>
-    </property>
-    <addaction name="action_About"/>
-    <addaction name="action_About_QT"/>
-   </widget>
-   <widget class="QMenu" name="menu_Prefences">
-    <property name="title">
-     <string>&Preferences</string>
-    </property>
-    <widget class="QMenu" name="menuView">
-     <property name="title">
-      <string>&View</string>
-     </property>
-     <addaction name="actionFull_Screen_Mode_Ctrl_Alt_F"/>
-     <addaction name="separator"/>
-    </widget>
-    <widget class="QMenu" name="menuAppointments">
-     <property name="title">
-      <string>&Appointments</string>
-     </property>
-     <addaction name="actionSet_Font_Size"/>
-    </widget>
-    <widget class="QMenu" name="menuPrinting">
-     <property name="title">
-      <string>&Printing</string>
-     </property>
-     <addaction name="actionNHS_Form_Settings"/>
-     <addaction name="actionTest_Print_a_GP17"/>
-    </widget>
-    <widget class="QMenu" name="menuForum">
-     <property name="title">
-      <string>&Forum</string>
-     </property>
-     <addaction name="action_forum_show_advanced_options"/>
-    </widget>
-    <widget class="QMenu" name="menuCharts">
-     <property name="title">
-      <string>&Charts</string>
-     </property>
-     <addaction name="actionTable_View_For_Charting"/>
-    </widget>
-    <widget class="QMenu" name="menuMode">
-     <property name="title">
-      <string>&Mode (reception or surgery)</string>
-     </property>
-     <addaction name="actionSurgery_Mode"/>
-    </widget>
-    <widget class="QMenu" name="menuCashbook">
-     <property name="title">
-      <string>&Cashbook</string>
-     </property>
-     <addaction name="actionAllow_Full_Edit"/>
-    </widget>
-    <widget class="QMenu" name="menuDaybook">
-     <property name="title">
-      <string>&Daybook</string>
-     </property>
-     <addaction name="separator"/>
-     <addaction name="actionAllow_Edit"/>
-     <addaction name="actionEnable_Filters"/>
-    </widget>
-    <addaction name="actionChange_Language"/>
-    <addaction name="separator"/>
-    <addaction name="menuView"/>
-    <addaction name="menuCharts"/>
-    <addaction name="menuAppointments"/>
-    <addaction name="menuForum"/>
-    <addaction name="menuCashbook"/>
-    <addaction name="menuDaybook"/>
-    <addaction name="menuPrinting"/>
-    <addaction name="separator"/>
-    <addaction name="menuMode"/>
-   </widget>
-   <widget class="QMenu" name="menuTools">
-    <property name="title">
-     <string>&Tools</string>
-    </property>
-    <addaction name="actionClear_Today_s_Emergency_Slots"/>
-    <addaction name="actionAppointment_Tools"/>
-    <addaction name="actionAdvanced_Record_Management"/>
-    <addaction name="actionFix_Locked_New_Course_of_Treatment"/>
-    <addaction name="separator"/>
-    <addaction name="actionSet_Clinician"/>
-    <addaction name="actionSet_Assistant"/>
-    <addaction name="actionSet_Surgery_Number"/>
-    <addaction name="separator"/>
-    <addaction name="actionDocuments_Dialog"/>
-    <addaction name="separator"/>
-    <addaction name="actionEdit_Phrasebooks"/>
-   </widget>
-   <addaction name="menuMenu"/>
-   <addaction name="menu_Prefences"/>
-   <addaction name="menuTools"/>
-   <addaction name="menu_Help"/>
-  </widget>
-  <widget class="QStatusBar" name="statusbar"/>
-  <action name="action_save_patient">
-   <property name="text">
-    <string>&Export Patient to disk</string>
-   </property>
-  </action>
-  <action name="action_Open_Patient">
-   <property name="text">
-    <string>&Import Patient from disk</string>
-   </property>
-  </action>
-  <action name="action_About">
-   <property name="text">
-    <string>About &OpenMolar</string>
-   </property>
-  </action>
-  <action name="action_About_QT">
-   <property name="text">
-    <string>&About QT</string>
-   </property>
-  </action>
-  <action name="action_Quit">
-   <property name="icon">
-    <iconset resource="../resources/resources.qrc">
-     <normaloff>:/exit.png</normaloff>:/exit.png</iconset>
-   </property>
-   <property name="text">
-    <string>&Quit</string>
-   </property>
-  </action>
-  <action name="actionClear_Today_s_Emergency_Slots">
-   <property name="text">
-    <string>Clear Today's Emergency Slots</string>
-   </property>
-  </action>
-  <action name="actionAppointment_Tools">
-   <property name="text">
-    <string>Appointment Tools</string>
-   </property>
-  </action>
-  <action name="actionChange_Language">
-   <property name="text">
-    <string>Select Interface Language</string>
-   </property>
-  </action>
-  <action name="actionFull_Screen_Mode_Ctrl_Alt_F">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Full Screen Mode (Ctrl-Alt-F)</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+Alt+F</string>
-   </property>
-  </action>
-  <action name="actionSet_Font_Size">
-   <property name="text">
-    <string>Font Size</string>
-   </property>
-  </action>
-  <action name="action_forum_show_advanced_options">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Show Advanced Options</string>
-   </property>
-  </action>
-  <action name="actionTable_View_For_Charting">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Table View For Charting</string>
-   </property>
-  </action>
-  <action name="actionNHS_Form_Settings">
-   <property name="text">
-    <string>NHS Form Settings</string>
-   </property>
-  </action>
-  <action name="actionTest_Print_a_GP17">
-   <property name="text">
-    <string>Test Print a GP17</string>
-   </property>
-  </action>
-  <action name="actionPrint_Daylists">
-   <property name="text">
-    <string>Print Daylists</string>
-   </property>
-  </action>
-  <action name="actionSet_Clinician">
-   <property name="text">
-    <string>Set Clinician</string>
-   </property>
-  </action>
-  <action name="actionSet_Assistant">
-   <property name="text">
-    <string>Set Assistant</string>
-   </property>
-  </action>
-  <action name="actionSurgery_Mode">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Surgery Mode</string>
-   </property>
-  </action>
-  <action name="actionAdvanced_Record_Management">
-   <property name="text">
-    <string>Advanced Record Management</string>
-   </property>
-  </action>
-  <action name="actionFix_Locked_New_Course_of_Treatment">
-   <property name="text">
-    <string>Fix Locked New Course of Treatment</string>
-   </property>
-  </action>
-  <action name="actionAllow_Full_Edit">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Allow Full Edit</string>
-   </property>
-  </action>
-  <action name="actionSet_Surgery_Number">
-   <property name="text">
-    <string>Set Surgery Number</string>
-   </property>
-   <property name="toolTip">
-    <string>Set Surgery Number (used so other applications can see which record is loaded)</string>
-   </property>
-  </action>
-  <action name="actionEdit_Phrasebooks">
-   <property name="text">
-    <string>Edit Phrasebooks</string>
-   </property>
-  </action>
-  <action name="actionDocuments_Dialog">
-   <property name="text">
-    <string>Documents Dialog</string>
-   </property>
-  </action>
-  <action name="actionAllow_Edit">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Allow &Edit</string>
-   </property>
-  </action>
-  <action name="actionEnable_Filters">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Enable &Filters</string>
-   </property>
-  </action>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>QWebView</class>
-   <extends>QWidget</extends>
-   <header>QtWebKit/QWebView</header>
-  </customwidget>
- </customwidgets>
- <tabstops>
-  <tabstop>debugBrowser</tabstop>
-  <tabstop>dayList_comboBox</tabstop>
-  <tabstop>detailsBrowser</tabstop>
-  <tabstop>cashbookGoPushButton</tabstop>
-  <tabstop>cashbookPrintButton</tabstop>
-  <tabstop>cashbookStartDateEdit</tabstop>
-  <tabstop>cashbookEndDateEdit</tabstop>
-  <tabstop>cashbookDentComboBox</tabstop>
-  <tabstop>daybookPrintButton</tabstop>
-  <tabstop>daybookStartDateEdit</tabstop>
-  <tabstop>daybookEndDateEdit</tabstop>
-  <tabstop>daybookDent1ComboBox</tabstop>
-  <tabstop>daybookDent2ComboBox</tabstop>
-  <tabstop>daybookTextBrowser</tabstop>
-  <tabstop>reception_textBrowser</tabstop>
-  <tabstop>printAccount_pushButton</tabstop>
-  <tabstop>takePayment_pushButton</tabstop>
-  <tabstop>perioChartDateComboBox</tabstop>
-  <tabstop>dnt1comboBox</tabstop>
-  <tabstop>scrollArea</tabstop>
-  <tabstop>accounts_tableWidget</tabstop>
-  <tabstop>printSelectedAccounts_pushButton</tabstop>
-  <tabstop>titleEdit</tabstop>
-  <tabstop>fnameEdit</tabstop>
-  <tabstop>snameEdit</tabstop>
-  <tabstop>dobEdit</tabstop>
-  <tabstop>addr1Edit</tabstop>
-  <tabstop>addr2Edit</tabstop>
-  <tabstop>addr3Edit</tabstop>
-  <tabstop>townEdit</tabstop>
-  <tabstop>countyEdit</tabstop>
-  <tabstop>pcdeEdit</tabstop>
-  <tabstop>sexEdit</tabstop>
-  <tabstop>tel1Edit</tabstop>
-  <tabstop>tel2Edit</tabstop>
-  <tabstop>mobileEdit</tabstop>
-  <tabstop>faxEdit</tabstop>
-  <tabstop>email1Edit</tabstop>
-  <tabstop>email2Edit</tabstop>
-  <tabstop>occupationEdit</tabstop>
-  <tabstop>memoEdit</tabstop>
-  <tabstop>email2_button</tabstop>
-  <tabstop>pushButton</tabstop>
-  <tabstop>email1_button</tabstop>
-  <tabstop>pushButton_6</tabstop>
-  <tabstop>printEst_pushButton</tabstop>
-  <tabstop>bpe_textBrowser</tabstop>
-  <tabstop>newBPE_pushButton</tabstop>
-  <tabstop>planSummary_textBrowser</tabstop>
-  <tabstop>exampushButton</tabstop>
-  <tabstop>medNotes_pushButton</tabstop>
-  <tabstop>perioCharts_scrollArea</tabstop>
-  <tabstop>newPerioChartPushButton</tabstop>
-  <tabstop>bpeDateComboBox</tabstop>
-  <tabstop>perioChartData_scrollArea</tabstop>
-  <tabstop>contract_tabWidget</tabstop>
-  <tabstop>notesPrintButton</tabstop>
-  <tabstop>loadAccountsTable_pushButton</tabstop>
- </tabstops>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/medhist.ui b/src/openmolar/qt-designer/medhist.ui
deleted file mode 100644
index b169802..0000000
--- a/src/openmolar/qt-designer/medhist.ui
+++ /dev/null
@@ -1,362 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>790</width>
-    <height>559</height>
-   </rect>
-  </property>
-  <property name="maximumSize">
-   <size>
-    <width>16777215</width>
-    <height>16777215</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Medical Notes</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_2">
-   <item row="0" column="0" colspan="7">
-    <widget class="QGroupBox" name="groupBox_2">
-     <property name="title">
-      <string>Doctor's details</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_3">
-      <item row="0" column="0">
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Doctor's Name</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QLineEdit" name="doctor_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_2">
-        <property name="text">
-         <string>Address / Tel No</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="doctorAddy_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="7">
-    <widget class="QGroupBox" name="groupBox">
-     <property name="title">
-      <string>Known Conditions</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="1">
-       <widget class="QLabel" name="label_3">
-        <property name="text">
-         <string>Current Medication</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="2">
-       <widget class="QLineEdit" name="curMeds_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLabel" name="label_4">
-        <property name="text">
-         <string>Past Medication</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="2">
-       <widget class="QLineEdit" name="pastMeds_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QLabel" name="label_5">
-        <property name="text">
-         <string>Allergies</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="2">
-       <widget class="QLineEdit" name="allergies_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="QLabel" name="label_6">
-        <property name="text">
-         <string>Heart</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="2">
-       <widget class="QLineEdit" name="heart_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="0" colspan="2">
-       <widget class="QLabel" name="label_7">
-        <property name="text">
-         <string>Lungs</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="2">
-       <widget class="QLineEdit" name="lungs_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="1">
-       <widget class="QLabel" name="label_8">
-        <property name="text">
-         <string>Liver</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="2">
-       <widget class="QLineEdit" name="liver_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="0" colspan="2">
-       <widget class="QLabel" name="label_11">
-        <property name="text">
-         <string>Bleeding</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="2">
-       <widget class="QLineEdit" name="bleeding_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="7" column="0" colspan="2">
-       <widget class="QLabel" name="label_9">
-        <property name="text">
-         <string>Kidneys</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="7" column="2">
-       <widget class="QLineEdit" name="kidneys_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="8" column="0" colspan="2">
-       <widget class="QLabel" name="label_10">
-        <property name="text">
-         <string>Anaesthetic / operations</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="8" column="2">
-       <widget class="QLineEdit" name="anaesthetic_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-      <item row="9" column="0" colspan="2">
-       <widget class="QLabel" name="label_12">
-        <property name="text">
-         <string>Other</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="9" column="2">
-       <widget class="QLineEdit" name="other_lineEdit">
-        <property name="maxLength">
-         <number>60</number>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QPushButton" name="checked_pushButton">
-     <property name="text">
-      <string>Mark as Checked  Today</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <spacer name="horizontalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>40</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="2" column="2">
-    <widget class="QLabel" name="date_label">
-     <property name="text">
-      <string>Checked</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="3">
-    <widget class="QDateEdit" name="dateEdit">
-     <property name="readOnly">
-      <bool>true</bool>
-     </property>
-     <property name="buttonSymbols">
-      <enum>QAbstractSpinBox::NoButtons</enum>
-     </property>
-     <property name="dateTime">
-      <datetime>
-       <hour>0</hour>
-       <minute>0</minute>
-       <second>0</second>
-       <year>1900</year>
-       <month>1</month>
-       <day>1</day>
-      </datetime>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="4">
-    <spacer name="horizontalSpacer">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>40</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="2" column="5">
-    <widget class="QCheckBox" name="checkBox">
-     <property name="text">
-      <string>Mark Patient as Med Alert</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="6">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/memo_item.ui b/src/openmolar/qt-designer/memo_item.ui
deleted file mode 100644
index c80e1a5..0000000
--- a/src/openmolar/qt-designer/memo_item.ui
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>28</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
-   <property name="topMargin">
-    <number>2</number>
-   </property>
-   <property name="bottomMargin">
-    <number>2</number>
-   </property>
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize">
-      <size>
-       <width>60</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>60</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>TextLabel</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLineEdit" name="lineEdit">
-     <property name="maxLength">
-      <number>30</number>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/newBPE.ui b/src/openmolar/qt-designer/newBPE.ui
deleted file mode 100644
index 4d20b57..0000000
--- a/src/openmolar/qt-designer/newBPE.ui
+++ /dev/null
@@ -1,309 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>261</width>
-    <height>161</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>New CPITN score</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout" >
-   <item>
-    <widget class="QFrame" name="frame" >
-     <property name="sizePolicy" >
-      <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
-       <horstretch>120</horstretch>
-       <verstretch>90</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize" >
-      <size>
-       <width>200</width>
-       <height>90</height>
-      </size>
-     </property>
-     <property name="maximumSize" >
-      <size>
-       <width>300</width>
-       <height>90</height>
-      </size>
-     </property>
-     <property name="frameShape" >
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow" >
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QGridLayout" name="gridLayout" >
-      <item row="0" column="0" >
-       <widget class="QComboBox" name="bpe_comboBox" >
-        <item>
-         <property name="text" >
-          <string>0</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>1</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>2</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>3</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>4</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>*</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-      <item row="0" column="1" >
-       <widget class="QComboBox" name="bpe2_comboBox" >
-        <item>
-         <property name="text" >
-          <string>0</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>1</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>2</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>3</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>4</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>*</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-      <item row="0" column="2" >
-       <widget class="QComboBox" name="bpe3_comboBox" >
-        <item>
-         <property name="text" >
-          <string>0</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>1</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>2</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>3</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>4</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>*</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-      <item row="1" column="0" >
-       <widget class="QComboBox" name="bpe4_comboBox" >
-        <item>
-         <property name="text" >
-          <string>0</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>1</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>2</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>3</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>4</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>*</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-      <item row="1" column="1" >
-       <widget class="QComboBox" name="bpe5_comboBox" >
-        <item>
-         <property name="text" >
-          <string>0</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>1</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>2</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>3</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>4</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>*</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-      <item row="1" column="2" >
-       <widget class="QComboBox" name="bpe6_comboBox" >
-        <item>
-         <property name="text" >
-          <string>0</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>1</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>2</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>3</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>4</string>
-         </property>
-        </item>
-        <item>
-         <property name="text" >
-          <string>*</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
-     </property>
-     <property name="centerButtons" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <tabstops>
-  <tabstop>buttonBox</tabstop>
-  <tabstop>bpe_comboBox</tabstop>
-  <tabstop>bpe2_comboBox</tabstop>
-  <tabstop>bpe3_comboBox</tabstop>
-  <tabstop>bpe6_comboBox</tabstop>
-  <tabstop>bpe5_comboBox</tabstop>
-  <tabstop>bpe4_comboBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>251</x>
-     <y>145</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>160</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>251</x>
-     <y>145</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>260</x>
-     <y>160</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/newCourse.ui b/src/openmolar/qt-designer/newCourse.ui
deleted file mode 100644
index 00c25ee..0000000
--- a/src/openmolar/qt-designer/newCourse.ui
+++ /dev/null
@@ -1,146 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>272</width>
-    <height>310</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>New Course</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout" >
-   <item row="0" column="0" colspan="3" >
-    <widget class="QLabel" name="label" >
-     <property name="text" >
-      <string>Start a new Course of Treatment with the following Criteria?</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" >
-    <widget class="QLabel" name="label_2" >
-     <property name="text" >
-      <string>Contracted Dentist</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" >
-    <widget class="QLabel" name="label_3" >
-     <property name="text" >
-      <string>Course Dentist</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0" >
-    <widget class="QLabel" name="label_5" >
-     <property name="text" >
-      <string>Course Type</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" >
-    <widget class="QLabel" name="label_4" >
-     <property name="text" >
-      <string>Acceptance Date</string>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="0" colspan="3" >
-    <spacer name="verticalSpacer" >
-     <property name="orientation" >
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0" >
-      <size>
-       <width>188</width>
-       <height>89</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="6" column="0" colspan="3" >
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1" >
-    <widget class="QComboBox" name="dnt2_comboBox" />
-   </item>
-   <item row="1" column="1" >
-    <widget class="QComboBox" name="dnt1_comboBox" />
-   </item>
-   <item row="3" column="1" >
-    <widget class="QComboBox" name="cseType_comboBox" />
-   </item>
-   <item row="4" column="1" colspan="2" >
-    <widget class="QDateEdit" name="dateEdit" >
-     <property name="calendarPopup" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
-  <zorder>label</zorder>
-  <zorder>label_2</zorder>
-  <zorder>label_3</zorder>
-  <zorder>label_5</zorder>
-  <zorder>label_4</zorder>
-  <zorder>buttonBox</zorder>
-  <zorder>dateEdit</zorder>
-  <zorder>cseType_comboBox</zorder>
-  <zorder>dnt1_comboBox</zorder>
-  <zorder>dnt2_comboBox</zorder>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/newSetup.ui b/src/openmolar/qt-designer/newSetup.ui
deleted file mode 100644
index 07bdd26..0000000
--- a/src/openmolar/qt-designer/newSetup.ui
+++ /dev/null
@@ -1,686 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>589</width>
-    <height>413</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>OpenMolar - New Setup</string>
-  </property>
-  <widget class="QWidget" name="centralwidget">
-   <layout class="QVBoxLayout" name="verticalLayout">
-    <item>
-     <widget class="QLabel" name="title_label">
-      <property name="font">
-       <font>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>Welcome to the OpenMolar settings wizard.</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-    </item>
-    <item>
-     <widget class="QStackedWidget" name="stackedWidget">
-      <property name="currentIndex">
-       <number>0</number>
-      </property>
-      <widget class="QWidget" name="start_page">
-       <layout class="QVBoxLayout" name="verticalLayout_3">
-        <item>
-         <widget class="QLabel" name="label_7">
-          <property name="minimumSize">
-           <size>
-            <width>0</width>
-            <height>100</height>
-           </size>
-          </property>
-          <property name="text">
-           <string>This first run application will 
- - set your system password
- - make this client aware of your mysql server settings
- - install a small (3 patient) demo database if required.</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="sysAdvice_label">
-          <property name="text">
-           <string>TextLabel</string>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="verticalSpacer_8">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="application_password_page">
-       <layout class="QGridLayout" name="gridLayout">
-        <item row="0" column="0" colspan="3">
-         <widget class="QLabel" name="mainPassword_label">
-          <property name="minimumSize">
-           <size>
-            <width>0</width>
-            <height>80</height>
-           </size>
-          </property>
-          <property name="font">
-           <font>
-            <weight>50</weight>
-            <bold>false</bold>
-           </font>
-          </property>
-          <property name="text">
-           <string>Please enter a password to prevent unauthorised running of this application.</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignCenter</set>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="0">
-         <widget class="QLabel" name="label_5">
-          <property name="text">
-           <string>Password</string>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="1">
-         <widget class="QLineEdit" name="main_password_lineEdit">
-          <property name="minimumSize">
-           <size>
-            <width>100</width>
-            <height>0</height>
-           </size>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-          <property name="echoMode">
-           <enum>QLineEdit::Password</enum>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="2">
-         <widget class="QCheckBox" name="mainpassword_checkBox">
-          <property name="focusPolicy">
-           <enum>Qt::NoFocus</enum>
-          </property>
-          <property name="text">
-           <string>show</string>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="0">
-         <widget class="QLabel" name="label_8">
-          <property name="text">
-           <string>Repeat Password</string>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="1">
-         <widget class="QLineEdit" name="repeat_password_lineEdit">
-          <property name="minimumSize">
-           <size>
-            <width>100</width>
-            <height>0</height>
-           </size>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-          <property name="echoMode">
-           <enum>QLineEdit::Password</enum>
-          </property>
-         </widget>
-        </item>
-        <item row="3" column="1">
-         <spacer name="verticalSpacer">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="mysql_server_location">
-       <layout class="QGridLayout" name="gridLayout_2">
-        <item row="0" column="0" colspan="3">
-         <widget class="QLabel" name="label_13">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="minimumSize">
-           <size>
-            <width>0</width>
-            <height>40</height>
-           </size>
-          </property>
-          <property name="font">
-           <font>
-            <weight>50</weight>
-            <bold>false</bold>
-           </font>
-          </property>
-          <property name="text">
-           <string>Where is your mysql server located?  **</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="0">
-         <widget class="QLabel" name="label_12">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="text">
-           <string>Host</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="2">
-         <widget class="QLineEdit" name="host_lineEdit">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="minimumSize">
-           <size>
-            <width>100</width>
-            <height>0</height>
-           </size>
-          </property>
-          <property name="text">
-           <string notr="true">localhost</string>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="0">
-         <widget class="QLabel" name="label_14">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="text">
-           <string>Port</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="2">
-         <widget class="QLineEdit" name="port_lineEdit">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="minimumSize">
-           <size>
-            <width>100</width>
-            <height>0</height>
-           </size>
-          </property>
-          <property name="text">
-           <string notr="true">3306</string>
-          </property>
-         </widget>
-        </item>
-        <item row="4" column="0" colspan="3">
-         <widget class="QLabel" name="label_9">
-          <property name="text">
-           <string>** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.
-
-If you are a debian or ubuntu user, "sudo apt-get install mysql-server"
-and make a note of the root password you create during set up. </string>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="3" column="2">
-         <spacer name="verticalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="database_choice">
-       <layout class="QGridLayout" name="gridLayout_3">
-        <item row="4" column="0" rowspan="2" colspan="2">
-         <widget class="QGroupBox" name="groupBox">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="title">
-           <string>Database Details</string>
-          </property>
-          <property name="flat">
-           <bool>false</bool>
-          </property>
-          <layout class="QGridLayout" name="gridLayout_5">
-           <item row="2" column="0">
-            <widget class="QLabel" name="label_2">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="text">
-              <string>(mysql) User</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="2">
-            <widget class="QLineEdit" name="user_lineEdit">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="minimumSize">
-              <size>
-               <width>100</width>
-               <height>0</height>
-              </size>
-             </property>
-             <property name="text">
-              <string notr="true">OMuser</string>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="0">
-            <widget class="QLabel" name="label_3">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="text">
-              <string>(mysql) Password</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="2">
-            <widget class="QLineEdit" name="password_lineEdit">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="minimumSize">
-              <size>
-               <width>100</width>
-               <height>0</height>
-              </size>
-             </property>
-             <property name="text">
-              <string notr="true">password</string>
-             </property>
-             <property name="echoMode">
-              <enum>QLineEdit::Password</enum>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="3">
-            <widget class="QCheckBox" name="dbpassword_checkBox">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="focusPolicy">
-              <enum>Qt::NoFocus</enum>
-             </property>
-             <property name="text">
-              <string>show</string>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="2">
-            <widget class="QLineEdit" name="database_lineEdit">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="minimumSize">
-              <size>
-               <width>100</width>
-               <height>0</height>
-              </size>
-             </property>
-             <property name="text">
-              <string notr="true">openmolar_demo</string>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="0">
-            <widget class="QLabel" name="label_4">
-             <property name="text">
-              <string>Database Name</string>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="2">
-            <widget class="QPushButton" name="testDB_pushButton">
-             <property name="enabled">
-              <bool>true</bool>
-             </property>
-             <property name="focusPolicy">
-              <enum>Qt::NoFocus</enum>
-             </property>
-             <property name="text">
-              <string>Test this Connection</string>
-             </property>
-            </widget>
-           </item>
-           <item row="5" column="2">
-            <spacer name="verticalSpacer_3">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </widget>
-        </item>
-        <item row="0" column="0">
-         <widget class="QRadioButton" name="createDemo_radioButton">
-          <property name="text">
-           <string>Create A Demo Database</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="0">
-         <widget class="QRadioButton" name="existingDB_radioButton">
-          <property name="text">
-           <string>Use with an existing database</string>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="create_database_page">
-       <layout class="QGridLayout" name="gridLayout_4">
-        <item row="2" column="0">
-         <widget class="QLabel" name="label_6">
-          <property name="text">
-           <string>Root mysql password</string>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="0" colspan="3">
-         <widget class="QLabel" name="mainPassword_label_2">
-          <property name="minimumSize">
-           <size>
-            <width>0</width>
-            <height>100</height>
-           </size>
-          </property>
-          <property name="font">
-           <font>
-            <weight>50</weight>
-            <bold>false</bold>
-           </font>
-          </property>
-          <property name="text">
-           <string>To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.
-OpenMolar does NOT store this password.
-Please enter the password of the ROOT mysql user.
-(note - on most mysql setups, root access is disabled unless the server is on localhost)</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="3" column="0">
-         <widget class="QLineEdit" name="rootPassword_lineEdit">
-          <property name="minimumSize">
-           <size>
-            <width>100</width>
-            <height>0</height>
-           </size>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-          <property name="echoMode">
-           <enum>QLineEdit::Password</enum>
-          </property>
-         </widget>
-        </item>
-        <item row="3" column="1">
-         <widget class="QCheckBox" name="rootPassword_checkBox">
-          <property name="focusPolicy">
-           <enum>Qt::NoFocus</enum>
-          </property>
-          <property name="text">
-           <string>show</string>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="0" colspan="2">
-         <spacer name="verticalSpacer_5">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="database_creation_progress_page">
-       <layout class="QVBoxLayout" name="verticalLayout_4">
-        <item>
-         <spacer name="verticalSpacer_14">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QLabel" name="label_10">
-          <property name="text">
-           <string>Creating Database.... please wait</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="verticalSpacer_13">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QProgressBar" name="progressBar">
-          <property name="value">
-           <number>0</number>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="verticalSpacer_12">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="finish_page">
-       <layout class="QVBoxLayout" name="verticalLayout_2">
-        <item>
-         <spacer name="verticalSpacer_7">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QLabel" name="label">
-          <property name="text">
-           <string>OK.... you are all set to go!</string>
-          </property>
-          <property name="textFormat">
-           <enum>Qt::PlainText</enum>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="verticalSpacer_6">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
-     </widget>
-    </item>
-    <item>
-     <widget class="QFrame" name="frame">
-      <property name="frameShape">
-       <enum>QFrame::StyledPanel</enum>
-      </property>
-      <property name="frameShadow">
-       <enum>QFrame::Raised</enum>
-      </property>
-      <layout class="QHBoxLayout" name="horizontalLayout_3">
-       <item>
-        <widget class="QPushButton" name="back_pushButton">
-         <property name="focusPolicy">
-          <enum>Qt::TabFocus</enum>
-         </property>
-         <property name="text">
-          <string>Back</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QPushButton" name="go_pushButton">
-         <property name="text">
-          <string>Proceed</string>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QMenuBar" name="menubar">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>589</width>
-     <height>17</height>
-    </rect>
-   </property>
-  </widget>
-  <widget class="QStatusBar" name="statusbar"/>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/ortho_ref_wizard.ui b/src/openmolar/qt-designer/ortho_ref_wizard.ui
deleted file mode 100644
index 2b66659..0000000
--- a/src/openmolar/qt-designer/ortho_ref_wizard.ui
+++ /dev/null
@@ -1,406 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>910</width>
-    <height>594</height>
-   </rect>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>0</width>
-    <height>0</height>
-   </size>
-  </property>
-  <property name="maximumSize">
-   <size>
-    <width>16777215</width>
-    <height>16777215</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Dialog</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_5">
-   <item row="2" column="1">
-    <widget class="QGroupBox" name="groupBox_5">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="title">
-      <string>Dental History</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_4">
-      <property name="margin">
-       <number>2</number>
-      </property>
-      <item row="0" column="0" colspan="2">
-       <widget class="QPlainTextEdit" name="dh_plainTextEdit">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>16777215</width>
-          <height>16777215</height>
-         </size>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="0" column="0">
-    <widget class="QFrame" name="frame">
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="1" column="1">
-       <widget class="QLabel" name="label_2">
-        <property name="text">
-         <string>Previous Referral Date</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="QRadioButton" name="ref1_radioButton">
-        <property name="text">
-         <string>1st referral</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1" colspan="2">
-       <spacer name="horizontalSpacer">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>68</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="1" column="0">
-       <widget class="QRadioButton" name="ref2_radioButton">
-        <property name="text">
-         <string>re - referral</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="2">
-       <widget class="QDateEdit" name="dateEdit">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0" colspan="3">
-       <widget class="QCheckBox" name="tx_checkBox">
-        <property name="text">
-         <string>I am Willing to carry out simple treatment</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="QGroupBox" name="chart_groupBox">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>80</height>
-      </size>
-     </property>
-     <property name="title">
-      <string>Teeth With Poor Prognosis</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="3">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1">
-    <widget class="QGroupBox" name="groupBox_4">
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="title">
-      <string>Relevant Medical History</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_3">
-      <property name="margin">
-       <number>2</number>
-      </property>
-      <item row="0" column="0">
-       <widget class="QPlainTextEdit" name="mh__plainTextEdit">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>16777215</width>
-          <height>16777215</height>
-         </size>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="2" column="0" rowspan="2">
-    <widget class="QGroupBox" name="groupBox">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="title">
-      <string>Reason for Referral</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_2">
-      <property name="spacing">
-       <number>2</number>
-      </property>
-      <property name="margin">
-       <number>2</number>
-      </property>
-      <item>
-       <widget class="QGroupBox" name="groupBox_2">
-        <property name="title">
-         <string>Crowding</string>
-        </property>
-        <layout class="QVBoxLayout" name="verticalLayout_3">
-         <property name="margin">
-          <number>2</number>
-         </property>
-         <item>
-          <widget class="QRadioButton" name="crowding5_radioButton">
-           <property name="text">
-            <string>Severe</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="crowding4_radioButton">
-           <property name="text">
-            <string>Moderate</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="crowding3_radioButton">
-           <property name="text">
-            <string>Mild</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="crowding2_radioButton">
-           <property name="text">
-            <string>None</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="crowding1_radioButton">
-           <property name="text">
-            <string>Spaced</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item>
-       <widget class="QGroupBox" name="groupBox_3">
-        <property name="title">
-         <string>Incisal Relationship</string>
-        </property>
-        <layout class="QGridLayout" name="gridLayout_2">
-         <property name="margin">
-          <number>2</number>
-         </property>
-         <item row="0" column="0">
-          <widget class="QLabel" name="label">
-           <property name="text">
-            <string>Overjet:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="1">
-          <widget class="QSpinBox" name="oj_spinBox">
-           <property name="suffix">
-            <string>mm</string>
-           </property>
-           <property name="minimum">
-            <number>-20</number>
-           </property>
-           <property name="maximum">
-            <number>20</number>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="2" colspan="3">
-          <spacer name="horizontalSpacer_2">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>248</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item row="1" column="0">
-          <widget class="QLabel" name="label_3">
-           <property name="text">
-            <string>Overbite</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="2">
-          <widget class="QRadioButton" name="ob1_radioButton">
-           <property name="text">
-            <string>Complete</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="3">
-          <widget class="QRadioButton" name="ob2_radioButton">
-           <property name="text">
-            <string>InComplete</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="4">
-          <widget class="QRadioButton" name="ob3_radioButton">
-           <property name="text">
-            <string>Traumatic</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="1">
-          <widget class="QSpinBox" name="ob_spinBox">
-           <property name="suffix">
-            <string>%</string>
-           </property>
-           <property name="maximum">
-            <number>100</number>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item>
-       <widget class="QGroupBox" name="groupBox_6">
-        <property name="title">
-         <string>Patient Motivation</string>
-        </property>
-        <layout class="QVBoxLayout" name="verticalLayout">
-         <property name="spacing">
-          <number>2</number>
-         </property>
-         <property name="margin">
-          <number>2</number>
-         </property>
-         <item>
-          <widget class="QCheckBox" name="fixed_checkBox">
-           <property name="text">
-            <string>Fixed Appliance</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QCheckBox" name="removable_checkBox">
-           <property name="text">
-            <string>Removable Applicance</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/patient_diary.ui b/src/openmolar/qt-designer/patient_diary.ui
deleted file mode 100644
index 23c14d9..0000000
--- a/src/openmolar/qt-designer/patient_diary.ui
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>829</width>
-    <height>205</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <property name="margin">
-    <number>0</number>
-   </property>
-   <property name="spacing">
-    <number>6</number>
-   </property>
-   <item row="0" column="0" colspan="2">
-    <widget class="QLineEdit" name="appt_memo_lineEdit">
-     <property name="toolTip">
-      <string><html><head/><body><p>A place to keep a reminder of the patients appointment preferences.</p><p>Eg. &quot;30 minute appointments for examinations&quot; etc. </p></body></html></string>
-     </property>
-     <property name="styleSheet">
-      <string notr="true">color:rgb(255, 0, 0)</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="2">
-    <widget class="QPushButton" name="recall_settings_pushButton">
-     <property name="text">
-      <string>Recall Settings</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QTreeView" name="pt_diary_treeView"/>
-   </item>
-   <item row="1" column="1" colspan="2">
-    <widget class="QFrame" name="appt_buttons_frame">
-     <property name="enabled">
-      <bool>true</bool>
-     </property>
-     <property name="minimumSize">
-      <size>
-       <width>330</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_33">
-      <property name="spacing">
-       <number>0</number>
-      </property>
-      <property name="margin">
-       <number>0</number>
-      </property>
-      <item>
-       <widget class="QPushButton" name="apptWizard_pushButton">
-        <property name="enabled">
-         <bool>true</bool>
-        </property>
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>A Wizard to select some common appointment combinations</string>
-        </property>
-        <property name="text">
-         <string>Appointment Shortcuts</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <layout class="QGridLayout" name="gridLayout_16">
-        <item row="0" column="0">
-         <widget class="QPushButton" name="newAppt_pushButton">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>16777215</width>
-            <height>16777215</height>
-           </size>
-          </property>
-          <property name="toolTip">
-           <string>A New Appointment for this patient</string>
-          </property>
-          <property name="text">
-           <string>&New</string>
-          </property>
-          <property name="icon">
-           <iconset resource="../resources/resources.qrc">
-            <normaloff>:/add_user.png</normaloff>:/add_user.png</iconset>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="1">
-         <widget class="QPushButton" name="clearAppt_pushButton">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>16777215</width>
-            <height>16777215</height>
-           </size>
-          </property>
-          <property name="toolTip">
-           <string>delete or cancel the appointment</string>
-          </property>
-          <property name="text">
-           <string>Clear/Cancel</string>
-          </property>
-          <property name="icon">
-           <iconset resource="../resources/resources.qrc">
-            <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="2" rowspan="2">
-         <layout class="QVBoxLayout" name="verticalLayout_31">
-          <item>
-           <widget class="QPushButton" name="scheduleAppt_pushButton">
-            <property name="enabled">
-             <bool>true</bool>
-            </property>
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>16777215</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string>Make the selected appointment</string>
-            </property>
-            <property name="text">
-             <string>Schedule</string>
-            </property>
-            <property name="icon">
-             <iconset resource="../resources/resources.qrc">
-              <normaloff>:/month.png</normaloff>:/month.png</iconset>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QPushButton" name="findAppt_pushButton">
-            <property name="enabled">
-             <bool>true</bool>
-            </property>
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>16777215</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string>Find the appointment in the the practice appointment list</string>
-            </property>
-            <property name="text">
-             <string>Find in Book</string>
-            </property>
-            <property name="icon">
-             <iconset resource="../resources/resources.qrc">
-              <normaloff>:/schedule.png</normaloff>:/schedule.png</iconset>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </item>
-        <item row="1" column="0">
-         <widget class="QPushButton" name="printAppt_pushButton">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>16777215</width>
-            <height>16777215</height>
-           </size>
-          </property>
-          <property name="toolTip">
-           <string>Print out the next 5 appointments for this patient</string>
-          </property>
-          <property name="text">
-           <string>Print Card</string>
-          </property>
-          <property name="icon">
-           <iconset resource="../resources/resources.qrc">
-            <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="1">
-         <widget class="QPushButton" name="modifyAppt_pushButton">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>16777215</width>
-            <height>16777215</height>
-           </size>
-          </property>
-          <property name="toolTip">
-           <string>Allows modifcation of certain criteria for this appointment</string>
-          </property>
-          <property name="text">
-           <string>Modify</string>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/patient_finder.ui b/src/openmolar/qt-designer/patient_finder.ui
deleted file mode 100644
index 19e422d..0000000
--- a/src/openmolar/qt-designer/patient_finder.ui
+++ /dev/null
@@ -1,319 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>306</width>
-    <height>367</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Patient Finder</string>
-  </property>
-  <property name="windowIcon">
-   <iconset resource="../resources/resources.qrc">
-    <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0" colspan="3">
-    <widget class="QLabel" name="label_3">
-     <property name="text">
-      <string>Fill in a few of the following fields to get a list of possible patients</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="3">
-    <widget class="QPushButton" name="repeat_pushButton">
-     <property name="text">
-      <string>Repeat Last Search</string>
-     </property>
-     <property name="icon">
-      <iconset resource="../resources/resources.qrc">
-       <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" colspan="3">
-    <widget class="Line" name="line">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="label_5">
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>SNO or Surname</string>
-     </property>
-     <property name="buddy">
-      <cstring>sname</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1">
-    <widget class="QLineEdit" name="sname">
-     <property name="focusPolicy">
-      <enum>Qt::StrongFocus</enum>
-     </property>
-     <property name="toolTip">
-      <string>Enter either the full name or the first few letters of the name.
-
-If you are unsure of the spelling, type in the COMPLETE name,
-and check the adjacent "sounds like" box.</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="2">
-    <widget class="QCheckBox" name="snameSoundex_checkBox">
-     <property name="maximumSize">
-      <size>
-       <width>60</width>
-       <height>24</height>
-      </size>
-     </property>
-     <property name="toolTip">
-      <string>check to search for a similar sounding name</string>
-     </property>
-     <property name="text">
-      <string/>
-     </property>
-     <property name="icon">
-      <iconset resource="../resources/resources.qrc">
-       <normaloff>:/speaker.svg</normaloff>:/speaker.svg</iconset>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0">
-    <widget class="QLabel" name="label_6">
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>First Name</string>
-     </property>
-     <property name="buddy">
-      <cstring>fname</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="1">
-    <widget class="QLineEdit" name="fname">
-     <property name="focusPolicy">
-      <enum>Qt::StrongFocus</enum>
-     </property>
-     <property name="toolTip">
-      <string>Enter either the full name or the first few letters of the name.
-
-If you are unsure of the spelling, type in the COMPLETE name,
-and check the adjacent "sounds like" box.
-Be wary of middle names. 
-eg. "Neil" does NOT sound like "Neil Alexander"!</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="2">
-    <widget class="QCheckBox" name="fnameSoundex_checkBox">
-     <property name="maximumSize">
-      <size>
-       <width>60</width>
-       <height>24</height>
-      </size>
-     </property>
-     <property name="toolTip">
-      <string>check to search for a similar sounding name</string>
-     </property>
-     <property name="text">
-      <string/>
-     </property>
-     <property name="icon">
-      <iconset resource="../resources/resources.qrc">
-       <normaloff>:/speaker.svg</normaloff>:/speaker.svg</iconset>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="0">
-    <widget class="QLabel" name="label_2">
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>Date of Birth</string>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="0">
-    <widget class="QLabel" name="label_7">
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>Address includes</string>
-     </property>
-     <property name="buddy">
-      <cstring>addr1</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="1" colspan="2">
-    <widget class="QLineEdit" name="addr1">
-     <property name="focusPolicy">
-      <enum>Qt::StrongFocus</enum>
-     </property>
-     <property name="toolTip">
-      <string>openMolar will search line1 and line2 of the address for this text</string>
-     </property>
-    </widget>
-   </item>
-   <item row="7" column="0">
-    <widget class="QLabel" name="label_8">
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>Telephone</string>
-     </property>
-     <property name="buddy">
-      <cstring>tel</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="7" column="1">
-    <widget class="QLineEdit" name="tel">
-     <property name="focusPolicy">
-      <enum>Qt::StrongFocus</enum>
-     </property>
-     <property name="toolTip">
-      <string>open molar will search tel1, tel2 and mobile for numbers present here.</string>
-     </property>
-    </widget>
-   </item>
-   <item row="8" column="0">
-    <widget class="QLabel" name="label_9">
-     <property name="layoutDirection">
-      <enum>Qt::RightToLeft</enum>
-     </property>
-     <property name="text">
-      <string>Postcode</string>
-     </property>
-     <property name="buddy">
-      <cstring>pcde</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="8" column="1">
-    <widget class="QLineEdit" name="pcde">
-     <property name="focusPolicy">
-      <enum>Qt::StrongFocus</enum>
-     </property>
-     <property name="toolTip">
-      <string>search for a postcode</string>
-     </property>
-    </widget>
-   </item>
-   <item row="9" column="1">
-    <spacer>
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>21</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="10" column="0" colspan="3">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="1">
-    <widget class="QDateEdit" name="dateEdit">
-     <property name="dateTime">
-      <datetime>
-       <hour>0</hour>
-       <minute>0</minute>
-       <second>0</second>
-       <year>1900</year>
-       <month>1</month>
-       <day>1</day>
-      </datetime>
-     </property>
-     <property name="calendarPopup">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <tabstops>
-  <tabstop>sname</tabstop>
-  <tabstop>fname</tabstop>
-  <tabstop>dateEdit</tabstop>
-  <tabstop>addr1</tabstop>
-  <tabstop>tel</tabstop>
-  <tabstop>pcde</tabstop>
-  <tabstop>buttonBox</tabstop>
-  <tabstop>repeat_pushButton</tabstop>
-  <tabstop>snameSoundex_checkBox</tabstop>
-  <tabstop>fnameSoundex_checkBox</tabstop>
- </tabstops>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/payments.ui b/src/openmolar/qt-designer/payments.ui
deleted file mode 100644
index 2595287..0000000
--- a/src/openmolar/qt-designer/payments.ui
+++ /dev/null
@@ -1,419 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="windowModality" >
-   <enum>Qt::ApplicationModal</enum>
-  </property>
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>226</width>
-    <height>404</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Payments</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout" >
-   <item>
-    <widget class="QGroupBox" name="groupBox_2" >
-     <property name="title" >
-      <string>Payments for treatment</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_2" >
-      <item row="0" column="0" >
-       <widget class="QLabel" name="label" >
-        <property name="text" >
-         <string>Cash</string>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="buddy" >
-         <cstring>cash_lineEdit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="2" >
-       <widget class="QPushButton" name="cash_pushButton" >
-        <property name="maximumSize" >
-         <size>
-          <width>28</width>
-          <height>28</height>
-         </size>
-        </property>
-        <property name="text" >
-         <string>-</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0" >
-       <widget class="QLabel" name="label_2" >
-        <property name="text" >
-         <string>Cheque</string>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="buddy" >
-         <cstring>cheque_lineEdit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="2" >
-       <widget class="QPushButton" name="cheque_pushButton" >
-        <property name="maximumSize" >
-         <size>
-          <width>28</width>
-          <height>28</height>
-         </size>
-        </property>
-        <property name="text" >
-         <string>-</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0" >
-       <widget class="QLabel" name="label_3" >
-        <property name="text" >
-         <string>Debit Card</string>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="buddy" >
-         <cstring>debitCard_lineEdit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="2" >
-       <widget class="QPushButton" name="debit_pushButton" >
-        <property name="maximumSize" >
-         <size>
-          <width>28</width>
-          <height>28</height>
-         </size>
-        </property>
-        <property name="text" >
-         <string>-</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0" >
-       <widget class="QLabel" name="label_4" >
-        <property name="text" >
-         <string>Credit Card</string>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="buddy" >
-         <cstring>creditCard_lineEdit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="2" >
-       <widget class="QPushButton" name="credit_pushButton" >
-        <property name="maximumSize" >
-         <size>
-          <width>28</width>
-          <height>28</height>
-         </size>
-        </property>
-        <property name="text" >
-         <string>-</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1" >
-       <widget class="QLineEdit" name="cash_lineEdit" >
-        <property name="minimumSize" >
-         <size>
-          <width>70</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize" >
-         <size>
-          <width>70</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="maxLength" >
-         <number>10</number>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1" >
-       <widget class="QLineEdit" name="cheque_lineEdit" >
-        <property name="minimumSize" >
-         <size>
-          <width>70</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize" >
-         <size>
-          <width>70</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="maxLength" >
-         <number>10</number>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1" >
-       <widget class="QLineEdit" name="debitCard_lineEdit" >
-        <property name="minimumSize" >
-         <size>
-          <width>70</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize" >
-         <size>
-          <width>70</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="maxLength" >
-         <number>10</number>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1" >
-       <widget class="QLineEdit" name="creditCard_lineEdit" >
-        <property name="minimumSize" >
-         <size>
-          <width>70</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize" >
-         <size>
-          <width>70</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="maxLength" >
-         <number>10</number>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox" >
-     <property name="title" >
-      <string>Other Payments</string>
-     </property>
-     <property name="checkable" >
-      <bool>false</bool>
-     </property>
-     <layout class="QGridLayout" name="gridLayout" >
-      <item row="0" column="0" >
-       <widget class="QLabel" name="label_8" >
-        <property name="text" >
-         <string>Sundries</string>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="buddy" >
-         <cstring>sundries_lineEdit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1" >
-       <widget class="QLineEdit" name="sundries_lineEdit" >
-        <property name="minimumSize" >
-         <size>
-          <width>70</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize" >
-         <size>
-          <width>70</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="maxLength" >
-         <number>10</number>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0" >
-       <widget class="QLabel" name="label_7" >
-        <property name="text" >
-         <string>Annual HDP</string>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="buddy" >
-         <cstring>annualHDP_lineEdit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1" >
-       <widget class="QLineEdit" name="annualHDP_lineEdit" >
-        <property name="minimumSize" >
-         <size>
-          <width>70</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize" >
-         <size>
-          <width>70</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="maxLength" >
-         <number>10</number>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0" >
-       <widget class="QLabel" name="label_9" >
-        <property name="text" >
-         <string>Miscellaneous</string>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="buddy" >
-         <cstring>misc_lineEdit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1" >
-       <widget class="QLineEdit" name="misc_lineEdit" >
-        <property name="minimumSize" >
-         <size>
-          <width>70</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize" >
-         <size>
-          <width>70</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="maxLength" >
-         <number>10</number>
-        </property>
-        <property name="alignment" >
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout" >
-     <item>
-      <widget class="QLabel" name="label_6" >
-       <property name="text" >
-        <string>Amount which will appear on receipt  (read only)</string>
-       </property>
-       <property name="wordWrap" >
-        <bool>true</bool>
-       </property>
-       <property name="buddy" >
-        <cstring>total_doubleSpinBox</cstring>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QDoubleSpinBox" name="total_doubleSpinBox" >
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="minimumSize" >
-        <size>
-         <width>80</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="readOnly" >
-        <bool>true</bool>
-       </property>
-       <property name="maximum" >
-        <double>20000.000000000000000</double>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <tabstops>
-  <tabstop>cash_lineEdit</tabstop>
-  <tabstop>cheque_lineEdit</tabstop>
-  <tabstop>debitCard_lineEdit</tabstop>
-  <tabstop>creditCard_lineEdit</tabstop>
-  <tabstop>sundries_lineEdit</tabstop>
-  <tabstop>annualHDP_lineEdit</tabstop>
-  <tabstop>misc_lineEdit</tabstop>
-  <tabstop>total_doubleSpinBox</tabstop>
-  <tabstop>buttonBox</tabstop>
-  <tabstop>cheque_pushButton</tabstop>
-  <tabstop>credit_pushButton</tabstop>
-  <tabstop>debit_pushButton</tabstop>
-  <tabstop>cash_pushButton</tabstop>
- </tabstops>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>112</x>
-     <y>378</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>112</x>
-     <y>201</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/permissions.ui b/src/openmolar/qt-designer/permissions.ui
deleted file mode 100644
index 11ecce6..0000000
--- a/src/openmolar/qt-designer/permissions.ui
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>308</width>
-    <height>177</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Raise Permissions</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Supervisor Rights required to Perform This Action.
-Please enter password.</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLineEdit" name="lineEdit">
-     <property name="echoMode">
-      <enum>QLineEdit::Password</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/quick_daylist_print.ui b/src/openmolar/qt-designer/quick_daylist_print.ui
deleted file mode 100644
index beb20af..0000000
--- a/src/openmolar/qt-designer/quick_daylist_print.ui
+++ /dev/null
@@ -1,105 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>178</width>
-    <height>140</height>
-   </rect>
-  </property>
-  <property name="font" >
-   <font>
-    <weight>50</weight>
-    <bold>false</bold>
-   </font>
-  </property>
-  <property name="windowTitle" >
-   <string>Question</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout" >
-   <item>
-    <widget class="QLabel" name="label" >
-     <property name="font" >
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text" >
-      <string>Print Formatting</string>
-     </property>
-     <property name="scaledContents" >
-      <bool>false</bool>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QRadioButton" name="radioButton" >
-     <property name="text" >
-      <string>Minimal</string>
-     </property>
-     <property name="checked" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QRadioButton" name="radioButton_2" >
-     <property name="text" >
-      <string>Full Page</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/record_tools.ui b/src/openmolar/qt-designer/record_tools.ui
deleted file mode 100644
index 2449be0..0000000
--- a/src/openmolar/qt-designer/record_tools.ui
+++ /dev/null
@@ -1,1053 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>628</width>
-    <height>521</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Advanced Record Alteration</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QTabWidget" name="tabWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tab">
-      <attribute name="title">
-       <string>Money</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_2">
-       <item row="0" column="0" rowspan="4">
-        <widget class="QScrollArea" name="money_scrollArea">
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="money_scrollAreaWidgetContents">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>443</width>
-            <height>424</height>
-           </rect>
-          </property>
-          <layout class="QGridLayout" name="gridLayout">
-           <item row="1" column="0">
-            <widget class="QLabel" name="label">
-             <property name="text">
-              <string>NHS current fees (money0)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="1">
-            <widget class="QSpinBox" name="money0_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="0">
-            <widget class="QLabel" name="label_2">
-             <property name="text">
-              <string>NHS payments (money2)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="1">
-            <widget class="QSpinBox" name="money2_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="7" column="0">
-            <widget class="QLabel" name="label_5">
-             <property name="text">
-              <string>NHS estimated (money4)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="7" column="1">
-            <widget class="QSpinBox" name="money4_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="8" column="0">
-            <widget class="QLabel" name="label_6">
-             <property name="text">
-              <string>private estimate (money5)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="8" column="1">
-            <widget class="QSpinBox" name="money5_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="9" column="0">
-            <widget class="QLabel" name="label_7">
-             <property name="text">
-              <string>Exempt - nhs gross - completed treatment (money6)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="9" column="1">
-            <widget class="QSpinBox" name="money6_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="10" column="0">
-            <widget class="QLabel" name="label_8">
-             <property name="text">
-              <string>Exempt - NHS gross - estimated current (money7)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="10" column="1">
-            <widget class="QSpinBox" name="money7_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="11" column="0">
-            <widget class="QLabel" name="label_9">
-             <property name="text">
-              <string>credit (money8)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="11" column="1">
-            <widget class="QSpinBox" name="money8_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="12" column="0">
-            <widget class="QLabel" name="label_10">
-             <property name="text">
-              <string>debt (money9)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="12" column="1">
-            <widget class="QSpinBox" name="money9_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="13" column="0">
-            <widget class="QLabel" name="label_11">
-             <property name="text">
-              <string>debt2 (money10)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="13" column="1">
-            <widget class="QSpinBox" name="money10_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="14" column="0">
-            <widget class="QLabel" name="label_12">
-             <property name="text">
-              <string>money 11 (always 0!)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="14" column="1">
-            <widget class="QSpinBox" name="money11_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="0">
-            <widget class="QLabel" name="label_3">
-             <property name="text">
-              <string>private current fees (money1) </string>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="1">
-            <widget class="QSpinBox" name="money1_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="1">
-            <widget class="QSpinBox" name="money3_spinBox">
-             <property name="maximum">
-              <number>1000000</number>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="0">
-            <widget class="QLabel" name="label_4">
-             <property name="text">
-              <string>private payments (money3)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="15" column="0" colspan="2">
-            <spacer name="verticalSpacer">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-           <item row="0" column="0" colspan="2">
-            <widget class="QLabel" name="label_14">
-             <property name="text">
-              <string>ALL AMOUNTS ARE IN PENCE (cents)</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-       <item row="0" column="1">
-        <widget class="QLabel" name="label_13">
-         <property name="text">
-          <string>Outstanding <br />amount</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-         <property name="wordWrap">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="1">
-        <widget class="QLabel" name="total_label">
-         <property name="font">
-          <font>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
-         <property name="text">
-          <string>0.00</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="1">
-        <widget class="QPushButton" name="money_pushButton">
-         <property name="text">
-          <string>Apply Changes</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../resources/resources.qrc">
-           <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="1">
-        <spacer name="verticalSpacer_2">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>337</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_2">
-      <attribute name="title">
-       <string>Dates</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_4">
-       <item row="0" column="1">
-        <widget class="QPushButton" name="dates_pushButton">
-         <property name="text">
-          <string>Apply Changes</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../resources/resources.qrc">
-           <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="1">
-        <spacer name="verticalSpacer_3">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>82</width>
-           <height>388</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="0" column="0" rowspan="2">
-        <widget class="QScrollArea" name="scrollArea">
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="scrollAreaWidgetContents">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>345</width>
-            <height>263</height>
-           </rect>
-          </property>
-          <layout class="QGridLayout" name="gridLayout_3">
-           <item row="0" column="0">
-            <widget class="QLabel" name="label_15">
-             <property name="text">
-              <string>Last CE (pd5)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout">
-             <item>
-              <widget class="QDateEdit" name="pd5_dateEdit">
-               <property name="calendarPopup">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pd5_pushButton">
-               <property name="text">
-                <string>Add Date</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="1" column="0">
-            <widget class="QLabel" name="label_16">
-             <property name="text">
-              <string>Last ECE (pd6)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_2">
-             <item>
-              <widget class="QDateEdit" name="pd6_dateEdit">
-               <property name="calendarPopup">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pd6_pushButton">
-               <property name="text">
-                <string>Add Date</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="2" column="0">
-            <widget class="QLabel" name="label_17">
-             <property name="text">
-              <string>Last FCA (pd7)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_3">
-             <item>
-              <widget class="QDateEdit" name="pd7_dateEdit">
-               <property name="calendarPopup">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pd7_pushButton">
-               <property name="text">
-                <string>Add Date</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="3" column="0">
-            <widget class="QLabel" name="label_18">
-             <property name="text">
-              <string>Last OPT (pd8)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_4">
-             <item>
-              <widget class="QDateEdit" name="pd8_dateEdit">
-               <property name="calendarPopup">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pd8_pushButton">
-               <property name="text">
-                <string>Add Date</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="4" column="0">
-            <widget class="QLabel" name="label_19">
-             <property name="text">
-              <string>Last intraoral Xrays (pd9)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_5">
-             <item>
-              <widget class="QDateEdit" name="pd9_dateEdit">
-               <property name="calendarPopup">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pd9_pushButton">
-               <property name="text">
-                <string>Add Date</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="5" column="0">
-            <widget class="QLabel" name="label_20">
-             <property name="text">
-              <string>Last SP (pd10)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="5" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_6">
-             <item>
-              <widget class="QDateEdit" name="pd10_dateEdit">
-               <property name="calendarPopup">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pd10_pushButton">
-               <property name="text">
-                <string>Add Date</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="6" column="0">
-            <widget class="QLabel" name="label_21">
-             <property name="text">
-              <string>Last Account sent (billdate)</string>
-             </property>
-            </widget>
-           </item>
-           <item row="6" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_7">
-             <item>
-              <widget class="QDateEdit" name="billdate_dateEdit">
-               <property name="calendarPopup">
-                <bool>true</bool>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="billdate_pushButton">
-               <property name="text">
-                <string>Add Date</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="7" column="0">
-            <spacer name="verticalSpacer_4">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_3">
-      <attribute name="title">
-       <string>Treatment Plan</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_11">
-       <item row="0" column="0" rowspan="2" colspan="3">
-        <widget class="QScrollArea" name="scrollArea_2">
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="scrollAreaWidgetContents_2">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>36</width>
-            <height>28</height>
-           </rect>
-          </property>
-          <layout class="QVBoxLayout" name="verticalLayout_2">
-           <item>
-            <widget class="QFrame" name="chartplan_frame">
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-       <item row="0" column="3">
-        <widget class="QPushButton" name="plan_pushButton">
-         <property name="text">
-          <string>Apply Changes</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../resources/resources.qrc">
-           <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="3" rowspan="2">
-        <spacer name="verticalSpacer_5">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>82</width>
-           <height>388</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="2" column="0">
-        <layout class="QGridLayout" name="gridLayout_9">
-         <item row="0" column="0" colspan="2">
-          <widget class="QLabel" name="label_22">
-           <property name="text">
-            <string>Xray</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="2">
-          <widget class="QLineEdit" name="xraypl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0" colspan="2">
-          <widget class="QLabel" name="label_23">
-           <property name="text">
-            <string>Perio</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="2">
-          <widget class="QLineEdit" name="periopl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="0" colspan="2">
-          <widget class="QLabel" name="label_47">
-           <property name="text">
-            <string>anaesthetics</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="2">
-          <widget class="QLineEdit" name="anaespl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="0" colspan="2">
-          <widget class="QLabel" name="label_48">
-           <property name="text">
-            <string>other</string>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="2">
-          <widget class="QLineEdit" name="otherpl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="0" colspan="2">
-          <widget class="QLabel" name="label_49">
-           <property name="text">
-            <string>custom</string>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="2">
-          <widget class="QLineEdit" name="custompl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item row="2" column="1">
-        <widget class="Line" name="line_2">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="2">
-        <layout class="QGridLayout" name="gridLayout_10">
-         <item row="0" column="0" colspan="3">
-          <widget class="QLabel" name="label_51">
-           <property name="text">
-            <string>Dentures</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0" colspan="2">
-          <widget class="QLabel" name="label_52">
-           <property name="text">
-            <string>new upper</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="0" colspan="2">
-          <widget class="QLabel" name="label_53">
-           <property name="text">
-            <string>new lower</string>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="0" colspan="3">
-          <widget class="Line" name="line">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="0" colspan="2">
-          <widget class="QLabel" name="label_54">
-           <property name="text">
-            <string>repair upper</string>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="2">
-          <widget class="QLineEdit" name="odupl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="5" column="0" colspan="2">
-          <widget class="QLabel" name="label_55">
-           <property name="text">
-            <string>repair lower</string>
-           </property>
-          </widget>
-         </item>
-         <item row="5" column="2">
-          <widget class="QLineEdit" name="odlpl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="2">
-          <widget class="QLineEdit" name="ndupl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="2">
-          <widget class="QLineEdit" name="ndlpl_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_4">
-      <attribute name="title">
-       <string>Completed Treatment</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_5">
-       <item row="0" column="0" rowspan="2" colspan="3">
-        <widget class="QScrollArea" name="scrollArea_3">
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="scrollAreaWidgetContents_3">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>461</width>
-            <height>225</height>
-           </rect>
-          </property>
-          <layout class="QVBoxLayout" name="verticalLayout_3">
-           <item>
-            <widget class="QFrame" name="chartcompleted_frame">
-             <property name="frameShape">
-              <enum>QFrame::StyledPanel</enum>
-             </property>
-             <property name="frameShadow">
-              <enum>QFrame::Raised</enum>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-       <item row="0" column="3">
-        <widget class="QPushButton" name="completed_pushButton">
-         <property name="text">
-          <string>Apply Changes</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../resources/resources.qrc">
-           <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="3" rowspan="2">
-        <spacer name="verticalSpacer_6">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>82</width>
-           <height>388</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="2" column="0">
-        <layout class="QGridLayout" name="gridLayout_12">
-         <item row="0" column="0" colspan="2">
-          <widget class="QLabel" name="label_24">
-           <property name="text">
-            <string>Xray</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="2">
-          <widget class="QLineEdit" name="xraycmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0" colspan="2">
-          <widget class="QLabel" name="label_25">
-           <property name="text">
-            <string>Perio</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="2">
-          <widget class="QLineEdit" name="periocmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="0" colspan="2">
-          <widget class="QLabel" name="label_50">
-           <property name="text">
-            <string>anaesthetics</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="2">
-          <widget class="QLineEdit" name="anaescmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="0" colspan="2">
-          <widget class="QLabel" name="label_56">
-           <property name="text">
-            <string>other</string>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="2">
-          <widget class="QLineEdit" name="othercmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="0" colspan="2">
-          <widget class="QLabel" name="label_57">
-           <property name="text">
-            <string>custom</string>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="2">
-          <widget class="QLineEdit" name="customcmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item row="2" column="1">
-        <widget class="Line" name="line_3">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="2">
-        <layout class="QGridLayout" name="gridLayout_13">
-         <item row="0" column="0" colspan="3">
-          <widget class="QLabel" name="label_58">
-           <property name="text">
-            <string>Dentures</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0" colspan="2">
-          <widget class="QLabel" name="label_59">
-           <property name="text">
-            <string>new upper</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="0" colspan="2">
-          <widget class="QLabel" name="label_60">
-           <property name="text">
-            <string>new lower</string>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="0" colspan="3">
-          <widget class="Line" name="line_4">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="0" colspan="2">
-          <widget class="QLabel" name="label_61">
-           <property name="text">
-            <string>repair upper</string>
-           </property>
-          </widget>
-         </item>
-         <item row="4" column="2">
-          <widget class="QLineEdit" name="oducmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="5" column="0" colspan="2">
-          <widget class="QLabel" name="label_62">
-           <property name="text">
-            <string>repair lower</string>
-           </property>
-          </widget>
-         </item>
-         <item row="5" column="2">
-          <widget class="QLineEdit" name="odlcmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="2">
-          <widget class="QLineEdit" name="nducmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="2">
-          <widget class="QLineEdit" name="ndlcmp_lineEdit">
-           <property name="maxLength">
-            <number>56</number>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_5">
-      <attribute name="title">
-       <string>Miscellaneous</string>
-      </attribute>
-      <layout class="QGridLayout" name="gridLayout_6">
-       <item row="0" column="0" rowspan="2">
-        <layout class="QVBoxLayout" name="verticalLayout_4">
-         <item>
-          <widget class="QLabel" name="label_26">
-           <property name="text">
-            <string>Hidden Notes</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QTableWidget" name="hidden_notes_tableWidget"/>
-         </item>
-        </layout>
-       </item>
-       <item row="0" column="1">
-        <widget class="QPushButton" name="hidden_notes_pushButton">
-         <property name="text">
-          <string>Apply Changes</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../resources/resources.qrc">
-           <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="1">
-        <spacer name="verticalSpacer_7">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>377</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Close</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/saveMemo.ui b/src/openmolar/qt-designer/saveMemo.ui
deleted file mode 100644
index c5f56ff..0000000
--- a/src/openmolar/qt-designer/saveMemo.ui
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>584</width>
-    <height>236</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Post a memo about this Patient</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_2">
-   <item row="0" column="0" colspan="4">
-    <widget class="QTextEdit" name="textEdit">
-     <property name="acceptRichText">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" rowspan="2">
-    <widget class="QGroupBox" name="groupBox_2">
-     <property name="title">
-      <string>Expiry Policy</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="0">
-       <widget class="QRadioButton" name="noExpire_radioButton">
-        <property name="text">
-         <string>Do Not Expire</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QRadioButton" name="dateExpire_radioButton">
-        <property name="text">
-         <string>Expire on this date</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0">
-       <widget class="QDateEdit" name="dateEdit"/>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="1" column="1" rowspan="2">
-    <widget class="QGroupBox" name="groupBox_3">
-     <property name="title">
-      <string>Viewable by</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout">
-      <item>
-       <widget class="QRadioButton" name="viewAll_radioButton">
-        <property name="text">
-         <string>All</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="viewSurgery_radioButton">
-        <property name="text">
-         <string>Surgery Machines</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="viewReception_radioButton">
-        <property name="text">
-         <string>Reception Machines</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="1" column="2">
-    <widget class="QGroupBox" name="groupBox">
-     <property name="title">
-      <string>Author</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_2">
-      <item>
-       <widget class="QComboBox" name="author_comboBox"/>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="1" column="3">
-    <widget class="QPushButton" name="phraseBook_pushButton">
-     <property name="text">
-      <string>PhraseBook</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="2" colspan="2">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/select_patient.ui b/src/openmolar/qt-designer/select_patient.ui
deleted file mode 100644
index a7b1508..0000000
--- a/src/openmolar/qt-designer/select_patient.ui
+++ /dev/null
@@ -1,73 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>1014</width>
-    <height>398</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Make a Selection</string>
-  </property>
-  <layout class="QVBoxLayout" >
-   <item>
-    <widget class="QTableWidget" name="tableWidget" >
-     <property name="alternatingRowColors" >
-      <bool>true</bool>
-     </property>
-     <property name="selectionBehavior" >
-      <enum>QAbstractItemView::SelectRows</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/showMemo.ui b/src/openmolar/qt-designer/showMemo.ui
deleted file mode 100644
index 4d31f73..0000000
--- a/src/openmolar/qt-designer/showMemo.ui
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>611</width>
-    <height>262</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Memo</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0" rowspan="2">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string/>
-     </property>
-     <property name="pixmap">
-      <pixmap resource="../resources/resources.qrc">:/newlogo_launchpadSize.png</pixmap>
-     </property>
-     <property name="scaledContents">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1" colspan="2">
-    <widget class="QLabel" name="message_label">
-     <property name="font">
-      <font>
-       <pointsize>12</pointsize>
-      </font>
-     </property>
-     <property name="text">
-      <string>TextLabel</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="QCheckBox" name="checkBox">
-     <property name="text">
-      <string>Delete this memo when I close this</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="2">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/specify_appointment.ui b/src/openmolar/qt-designer/specify_appointment.ui
deleted file mode 100644
index b9b4336..0000000
--- a/src/openmolar/qt-designer/specify_appointment.ui
+++ /dev/null
@@ -1,420 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>593</width>
-    <height>404</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Enter an appointment</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_2" >
-   <item row="0" column="0" >
-    <spacer name="horizontalSpacer_3" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0" >
-      <size>
-       <width>81</width>
-       <height>56</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="0" column="1" >
-    <layout class="QGridLayout" name="gridLayout_3" >
-     <item row="0" column="0" >
-      <widget class="QLabel" name="label" >
-       <property name="text" >
-        <string>Appointment with</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="1" >
-      <widget class="QComboBox" name="practix_comboBox" />
-     </item>
-     <item row="1" column="0" >
-      <widget class="QLabel" name="label_2" >
-       <property name="text" >
-        <string>Length</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1" >
-      <widget class="QComboBox" name="apptlength_comboBox" >
-       <property name="maxVisibleItems" >
-        <number>20</number>
-       </property>
-       <item>
-        <property name="text" >
-         <string>5 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>10 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>15 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>20 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>30 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>40 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>45 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>1 hour</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>1 hour 15 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>1 hour 20 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>1 hour 30 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>1 hour 45 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>2 hours</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>2 hours 30 minutes</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>3 hours</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>other</string>
-        </property>
-       </item>
-      </widget>
-     </item>
-     <item row="2" column="0" colspan="2" >
-      <widget class="QCheckBox" name="combinedApptcheckBox" >
-       <property name="enabled" >
-        <bool>false</bool>
-       </property>
-       <property name="layoutDirection" >
-        <enum>Qt::LeftToRight</enum>
-       </property>
-       <property name="text" >
-        <string>Combined Appointment With Hygenist?</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="0" column="2" >
-    <spacer name="horizontalSpacer_2" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0" >
-      <size>
-       <width>152</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="1" column="0" colspan="3" >
-    <widget class="Line" name="line" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" colspan="3" >
-    <layout class="QGridLayout" name="gridLayout" >
-     <item row="0" column="0" >
-      <widget class="QLabel" name="label_3" >
-       <property name="maximumSize" >
-        <size>
-         <width>16777215</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="text" >
-        <string>Reason 1</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="2" >
-      <widget class="QLabel" name="label_5" >
-       <property name="maximumSize" >
-        <size>
-         <width>16777215</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="text" >
-        <string>Reason 3</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="0" >
-      <widget class="QComboBox" name="trt1_comboBox" >
-       <property name="minimumSize" >
-        <size>
-         <width>176</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maxVisibleItems" >
-        <number>20</number>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1" >
-      <widget class="QComboBox" name="trt2_comboBox" >
-       <property name="minimumSize" >
-        <size>
-         <width>176</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maxVisibleItems" >
-        <number>20</number>
-       </property>
-       <item>
-        <property name="text" >
-         <string/>
-        </property>
-       </item>
-      </widget>
-     </item>
-     <item row="1" column="2" >
-      <widget class="QComboBox" name="trt3_comboBox" >
-       <property name="minimumSize" >
-        <size>
-         <width>176</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maxVisibleItems" >
-        <number>20</number>
-       </property>
-       <item>
-        <property name="text" >
-         <string/>
-        </property>
-       </item>
-      </widget>
-     </item>
-     <item row="0" column="1" >
-      <widget class="QLabel" name="label_4" >
-       <property name="maximumSize" >
-        <size>
-         <width>16777215</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="text" >
-        <string>Reason 2</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="3" column="0" colspan="3" >
-    <widget class="Line" name="line_2" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="3" >
-    <layout class="QHBoxLayout" name="horizontalLayout" >
-     <item>
-      <widget class="QLabel" name="label_6" >
-       <property name="maximumSize" >
-        <size>
-         <width>16777215</width>
-         <height>30</height>
-        </size>
-       </property>
-       <property name="text" >
-        <string>Brief Note for Clinician (optional)</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QLineEdit" name="lineEdit" >
-       <property name="minimumSize" >
-        <size>
-         <width>180</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize" >
-        <size>
-         <width>300</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="maxLength" >
-        <number>20</number>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="5" column="0" colspan="3" >
-    <widget class="Line" name="line_3" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="0" colspan="3" >
-    <layout class="QHBoxLayout" name="horizontalLayout_2" >
-     <item>
-      <widget class="QPushButton" name="scheduleNow_pushButton" >
-       <property name="text" >
-        <string>Schedule Appointment Now</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer" >
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0" >
-        <size>
-         <width>128</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QDialogButtonBox" name="buttonBox" >
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="standardButtons" >
-        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
-       </property>
-       <property name="centerButtons" >
-        <bool>false</bool>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>553</x>
-     <y>258</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>553</x>
-     <y>258</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>scheduleNow_pushButton</sender>
-   <signal>clicked()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>90</x>
-     <y>305</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>296</x>
-     <y>175</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/staff_diary.ui b/src/openmolar/qt-designer/staff_diary.ui
deleted file mode 100644
index ea631ce..0000000
--- a/src/openmolar/qt-designer/staff_diary.ui
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>786</width>
-    <height>546</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="header_label">
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <italic>true</italic>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>TextLabel</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QTabWidget" name="tabWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tab_4">
-      <attribute name="title">
-       <string>Summary</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_5">
-       <item>
-        <widget class="QSplitter" name="splitter">
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <widget class="QWidget" name="">
-          <layout class="QVBoxLayout" name="verticalLayout_3">
-           <item>
-            <widget class="QLabel" name="label_3">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="font">
-              <font>
-               <weight>75</weight>
-               <italic>true</italic>
-               <bold>true</bold>
-              </font>
-             </property>
-             <property name="text">
-              <string>Summary</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignCenter</set>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="summary_label">
-             <property name="minimumSize">
-              <size>
-               <width>300</width>
-               <height>0</height>
-              </size>
-             </property>
-             <property name="text">
-              <string>TextLabel</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-             </property>
-             <property name="wordWrap">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-         <widget class="QWidget" name="">
-          <layout class="QVBoxLayout" name="verticalLayout_4">
-           <item>
-            <widget class="QLabel" name="label_2">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="font">
-              <font>
-               <weight>75</weight>
-               <italic>true</italic>
-               <bold>true</bold>
-              </font>
-             </property>
-             <property name="text">
-              <string>Agenda</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignCenter</set>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="agenda_label">
-             <property name="minimumSize">
-              <size>
-               <width>300</width>
-               <height>0</height>
-              </size>
-             </property>
-             <property name="text">
-              <string>TextLabel</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-             </property>
-             <property name="wordWrap">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab">
-      <attribute name="title">
-       <string>Messages and Tasks</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <widget class="QListWidget" name="messages_listWidget">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QFrame" name="task_frame">
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_2">
-      <attribute name="title">
-       <string>My Calendar</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_6">
-       <item>
-        <widget class="QFrame" name="calendar_frame">
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_3">
-      <attribute name="title">
-       <string>Holiday Planner</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_7">
-       <item>
-        <widget class="QFrame" name="planner_frame">
-         <property name="frameShape">
-          <enum>QFrame::StyledPanel</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/startscreen.ui b/src/openmolar/qt-designer/startscreen.ui
deleted file mode 100644
index 886a52b..0000000
--- a/src/openmolar/qt-designer/startscreen.ui
+++ /dev/null
@@ -1,301 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="windowModality">
-   <enum>Qt::WindowModal</enum>
-  </property>
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>276</width>
-    <height>343</height>
-   </rect>
-  </property>
-  <property name="sizePolicy">
-   <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-    <horstretch>0</horstretch>
-    <verstretch>0</verstretch>
-   </sizepolicy>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>200</width>
-    <height>200</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>openMolar</string>
-  </property>
-  <property name="windowIcon">
-   <iconset resource="../resources/resources.qrc">
-    <normaloff>:/openmolar.svg</normaloff>:/openmolar.svg</iconset>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_2">
-   <item row="0" column="0" colspan="2">
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QLabel" name="label_3">
-       <property name="layoutDirection">
-        <enum>Qt::RightToLeft</enum>
-       </property>
-       <property name="text">
-        <string>System Password</string>
-       </property>
-       <property name="alignment">
-        <set>Qt::AlignCenter</set>
-       </property>
-       <property name="wordWrap">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QLineEdit" name="password_lineEdit">
-       <property name="minimumSize">
-        <size>
-         <width>80</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>71</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="maxLength">
-        <number>10</number>
-       </property>
-       <property name="echoMode">
-        <enum>QLineEdit::Password</enum>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="1" column="0" colspan="2">
-    <widget class="Line" name="line">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>16</height>
-      </size>
-     </property>
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" colspan="2">
-    <layout class="QGridLayout" name="gridLayout">
-     <item row="0" column="0">
-      <widget class="QLabel" name="label">
-       <property name="layoutDirection">
-        <enum>Qt::LeftToRight</enum>
-       </property>
-       <property name="text">
-        <string>User 1(required)</string>
-       </property>
-       <property name="alignment">
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="1">
-      <widget class="QLineEdit" name="user1_lineEdit">
-       <property name="maximumSize">
-        <size>
-         <width>40</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-       <property name="maxLength">
-        <number>6</number>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="0">
-      <widget class="QLabel" name="label_2">
-       <property name="layoutDirection">
-        <enum>Qt::LeftToRight</enum>
-       </property>
-       <property name="text">
-        <string>User 2 (optional)</string>
-       </property>
-       <property name="alignment">
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1">
-      <widget class="QLineEdit" name="user2_lineEdit">
-       <property name="maximumSize">
-        <size>
-         <width>40</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="maxLength">
-        <number>6</number>
-       </property>
-      </widget>
-     </item>
-     <item row="2" column="0" colspan="2">
-      <widget class="QRadioButton" name="surgery_radioButton">
-       <property name="layoutDirection">
-        <enum>Qt::RightToLeft</enum>
-       </property>
-       <property name="text">
-        <string>Surgery Machine</string>
-       </property>
-       <property name="checked">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item row="3" column="0" colspan="2">
-      <widget class="QRadioButton" name="reception_radioButton">
-       <property name="layoutDirection">
-        <enum>Qt::RightToLeft</enum>
-       </property>
-       <property name="text">
-        <string>Reception Machine</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="4" column="0" colspan="2">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="0" colspan="2">
-    <widget class="QFrame" name="advanced_frame">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>40</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_3">
-      <item row="0" column="0" colspan="2">
-       <widget class="Line" name="line_2">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0" rowspan="2">
-       <widget class="QLabel" name="chosenServer_label">
-        <property name="text">
-         <string>TextLabel</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QToolButton" name="advanced_toolButton">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string>change</string>
-        </property>
-        <property name="popupMode">
-         <enum>QToolButton::InstantPopup</enum>
-        </property>
-        <property name="toolButtonStyle">
-         <enum>Qt::ToolButtonTextOnly</enum>
-        </property>
-        <property name="arrowType">
-         <enum>Qt::DownArrow</enum>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="3" column="0" colspan="2">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/surgeryNumber.ui b/src/openmolar/qt-designer/surgeryNumber.ui
deleted file mode 100644
index a01249f..0000000
--- a/src/openmolar/qt-designer/surgeryNumber.ui
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>301</width>
-    <height>167</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Question</string>
-  </property>
-  <property name="windowIcon">
-   <iconset resource="../resources/resources.qrc">
-    <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="3" column="0" colspan="3">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="0" colspan="3">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Please set the Surgery Number</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="1" column="0" colspan="3">
-    <widget class="QComboBox" name="comboBox">
-     <item>
-      <property name="text">
-       <string>Reception Machine</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Surgery One</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Surgery Two</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Surgery Three</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Surgery Four</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Surgery Five</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Surgery Six</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/toothPerioProps.ui b/src/openmolar/qt-designer/toothPerioProps.ui
deleted file mode 100644
index e618378..0000000
--- a/src/openmolar/qt-designer/toothPerioProps.ui
+++ /dev/null
@@ -1,330 +0,0 @@
-<ui version="4.0" >
- <class>Form</class>
- <widget class="QWidget" name="Form" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>499</width>
-    <height>148</height>
-   </rect>
-  </property>
-  <property name="minimumSize" >
-   <size>
-    <width>0</width>
-    <height>120</height>
-   </size>
-  </property>
-  <property name="maximumSize" >
-   <size>
-    <width>16777215</width>
-    <height>517</height>
-   </size>
-  </property>
-  <property name="windowTitle" >
-   <string>Form</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout" >
-   <item row="0" column="0" >
-    <widget class="QLabel" name="tooth_label" >
-     <property name="maximumSize" >
-      <size>
-       <width>16777215</width>
-       <height>28</height>
-      </size>
-     </property>
-     <property name="font" >
-      <font>
-       <pointsize>14</pointsize>
-      </font>
-     </property>
-     <property name="text" >
-      <string>ToothId</string>
-     </property>
-     <property name="alignment" >
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="3" colspan="2" >
-    <widget class="QComboBox" name="comboBox" >
-     <item>
-      <property name="text" >
-       <string>Pocketing</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>Bleeding</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>Plaque</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>Recession</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>Furcation</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>Suppuration</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>Mobility</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>Other</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-   <item rowspan="2" row="1" column="0" >
-    <widget class="QFrame" name="orig_frame" >
-     <property name="minimumSize" >
-      <size>
-       <width>100</width>
-       <height>100</height>
-      </size>
-     </property>
-     <property name="maximumSize" >
-      <size>
-       <width>16777215</width>
-       <height>100</height>
-      </size>
-     </property>
-     <property name="frameShape" >
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow" >
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item rowspan="2" row="1" column="1" >
-    <widget class="QFrame" name="new_frame" >
-     <property name="minimumSize" >
-      <size>
-       <width>100</width>
-       <height>100</height>
-      </size>
-     </property>
-     <property name="maximumSize" >
-      <size>
-       <width>16777215</width>
-       <height>100</height>
-      </size>
-     </property>
-     <property name="frameShape" >
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow" >
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="2" >
-    <widget class="QPushButton" name="copy_pushButton" >
-     <property name="maximumSize" >
-      <size>
-       <width>16777215</width>
-       <height>28</height>
-      </size>
-     </property>
-     <property name="text" >
-      <string>Copy &All</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="3" >
-    <widget class="QPushButton" name="cp_pushButton" >
-     <property name="sizePolicy" >
-      <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize" >
-      <size>
-       <width>0</width>
-       <height>20</height>
-      </size>
-     </property>
-     <property name="maximumSize" >
-      <size>
-       <width>40</width>
-       <height>28</height>
-      </size>
-     </property>
-     <property name="toolTip" >
-      <string>delete tooth data</string>
-     </property>
-     <property name="text" >
-      <string>Cp</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="4" >
-    <widget class="QPushButton" name="clear_pushButton" >
-     <property name="sizePolicy" >
-      <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize" >
-      <size>
-       <width>0</width>
-       <height>20</height>
-      </size>
-     </property>
-     <property name="maximumSize" >
-      <size>
-       <width>40</width>
-       <height>28</height>
-      </size>
-     </property>
-     <property name="toolTip" >
-      <string>delete tooth data</string>
-     </property>
-     <property name="text" >
-      <string/>
-     </property>
-     <property name="icon" >
-      <iconset resource="../resources/resources.qrc" >
-       <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="2" colspan="2" >
-    <layout class="QHBoxLayout" name="horizontalLayout" >
-     <item>
-      <widget class="QPushButton" name="leftTooth_pushButton" >
-       <property name="minimumSize" >
-        <size>
-         <width>24</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize" >
-        <size>
-         <width>24</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="toolTip" >
-        <string>Apply and move Back a tooth</string>
-       </property>
-       <property name="text" >
-        <string/>
-       </property>
-       <property name="icon" >
-        <iconset resource="../resources/resources.qrc" >
-         <normaloff>:/back.png</normaloff>:/back.png</iconset>
-       </property>
-       <property name="iconSize" >
-        <size>
-         <width>24</width>
-         <height>18</height>
-        </size>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QFrame" name="le_frame" >
-       <property name="maximumSize" >
-        <size>
-         <width>16777215</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="frameShape" >
-        <enum>QFrame::StyledPanel</enum>
-       </property>
-       <property name="frameShadow" >
-        <enum>QFrame::Raised</enum>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="rightTooth_pushButton" >
-       <property name="minimumSize" >
-        <size>
-         <width>24</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize" >
-        <size>
-         <width>24</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="toolTip" >
-        <string>Apply & Move to Next Tooth</string>
-       </property>
-       <property name="text" >
-        <string/>
-       </property>
-       <property name="icon" >
-        <iconset resource="../resources/resources.qrc" >
-         <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
-       </property>
-       <property name="iconSize" >
-        <size>
-         <width>24</width>
-         <height>18</height>
-        </size>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="2" column="4" >
-    <widget class="QComboBox" name="mobilitycomboBox" >
-     <property name="maximumSize" >
-      <size>
-       <width>16777215</width>
-       <height>28</height>
-      </size>
-     </property>
-     <item>
-      <property name="text" >
-       <string>-</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>I</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>II</string>
-      </property>
-     </item>
-     <item>
-      <property name="text" >
-       <string>III</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc" />
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/toothProps.ui b/src/openmolar/qt-designer/toothProps.ui
deleted file mode 100644
index ffb6f77..0000000
--- a/src/openmolar/qt-designer/toothProps.ui
+++ /dev/null
@@ -1,548 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>150</width>
-    <height>479</height>
-   </rect>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>150</width>
-    <height>459</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="spacing">
-    <number>4</number>
-   </property>
-   <property name="margin">
-    <number>2</number>
-   </property>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QPushButton" name="edit_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>16777215</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-       <property name="icon">
-        <iconset resource="../resources/resources.qrc">
-         <normaloff>:/icons/pencil.png</normaloff>:/icons/pencil.png</iconset>
-       </property>
-       <property name="flat">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QLabel" name="tooth_label">
-       <property name="maximumSize">
-        <size>
-         <width>16777215</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="font">
-        <font>
-         <pointsize>14</pointsize>
-        </font>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-       <property name="alignment">
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="clear_pushButton">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>16777215</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="toolTip">
-        <string>delete tooth data</string>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-       <property name="icon">
-        <iconset resource="../resources/resources.qrc">
-         <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
-       </property>
-       <property name="flat">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="QFrame" name="editframe">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize">
-      <size>
-       <width>131</width>
-       <height>24</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>24</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Plain</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QComboBox" name="comments_comboBox">
-     <item>
-      <property name="text">
-       <string>ADD COMMENTS</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!KUO</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Mobile Tooth</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Early Caries</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Filling Missing</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Chipped</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Cracked</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Poor Prognosis</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Extract Soon</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>!Implant required</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>DELETE COMMENTS</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-   <item>
-    <widget class="QFrame" name="frame">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>120</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_2">
-     <property name="spacing">
-      <number>2</number>
-     </property>
-     <property name="margin">
-      <number>2</number>
-     </property>
-     <item>
-      <widget class="QPushButton" name="am_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>48</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="autoFillBackground">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>AM</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="co_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>48</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="autoFillBackground">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>CO</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="gl_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>48</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="autoFillBackground">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>GL</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="gold_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>48</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="autoFillBackground">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>Go</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="porc_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>48</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="autoFillBackground">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>Po</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QGridLayout" name="gridLayout_2">
-     <item row="1" column="0">
-      <widget class="QPushButton" name="ex_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>32</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>80</width>
-         <height>40</height>
-        </size>
-       </property>
-       <property name="toolTip">
-        <string>extract (plan only!)</string>
-       </property>
-       <property name="text">
-        <string>EX</string>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1">
-      <widget class="QPushButton" name="rt_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>32</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>80</width>
-         <height>40</height>
-        </size>
-       </property>
-       <property name="toolTip">
-        <string>root treatment</string>
-       </property>
-       <property name="text">
-        <string>RT</string>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="0">
-      <widget class="QPushButton" name="leftTooth_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>32</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>80</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="toolTip">
-        <string>Apply and move Back a tooth</string>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-       <property name="icon">
-        <iconset resource="../resources/resources.qrc">
-         <normaloff>:/back.png</normaloff>:/back.png</iconset>
-       </property>
-       <property name="iconSize">
-        <size>
-         <width>24</width>
-         <height>18</height>
-        </size>
-       </property>
-       <property name="flat">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="2">
-      <widget class="QPushButton" name="dressing_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>32</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>80</width>
-         <height>40</height>
-        </size>
-       </property>
-       <property name="toolTip">
-        <string>porcelain veneer</string>
-       </property>
-       <property name="text">
-        <string>DR</string>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="1">
-      <widget class="QPushButton" name="pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>32</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>80</width>
-         <height>40</height>
-        </size>
-       </property>
-       <property name="toolTip">
-        <string>Apply & Add Another Item</string>
-       </property>
-       <property name="text">
-        <string>&&</string>
-       </property>
-       <property name="iconSize">
-        <size>
-         <width>18</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="flat">
-        <bool>false</bool>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="2">
-      <widget class="QPushButton" name="rightTooth_pushButton">
-       <property name="minimumSize">
-        <size>
-         <width>32</width>
-         <height>24</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>80</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="toolTip">
-        <string>Apply & Move to Next Tooth</string>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-       <property name="icon">
-        <iconset resource="../resources/resources.qrc">
-         <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
-       </property>
-       <property name="iconSize">
-        <size>
-         <width>24</width>
-         <height>18</height>
-        </size>
-       </property>
-       <property name="flat">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="Line" name="line">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QScrollArea" name="cb_scrollArea">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>140</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="widgetResizable">
-      <bool>true</bool>
-     </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>144</width>
-        <height>147</height>
-       </rect>
-      </property>
-     </widget>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/toothprops_full_edit.ui b/src/openmolar/qt-designer/toothprops_full_edit.ui
deleted file mode 100644
index 40aeb79..0000000
--- a/src/openmolar/qt-designer/toothprops_full_edit.ui
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>360</width>
-    <height>420</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Tooth Property Editor</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="tooth_label">
-     <property name="font">
-      <font>
-       <pointsize>10</pointsize>
-      </font>
-     </property>
-     <property name="text">
-      <string>UR8</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Items</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QTableWidget" name="tableWidget">
-     <attribute name="horizontalHeaderDefaultSectionSize">
-      <number>50</number>
-     </attribute>
-     <attribute name="horizontalHeaderMinimumSectionSize">
-      <number>50</number>
-     </attribute>
-     <attribute name="horizontalHeaderStretchLastSection">
-      <bool>true</bool>
-     </attribute>
-     <attribute name="verticalHeaderVisible">
-      <bool>false</bool>
-     </attribute>
-     <attribute name="verticalHeaderDefaultSectionSize">
-      <number>50</number>
-     </attribute>
-     <attribute name="verticalHeaderMinimumSectionSize">
-      <number>50</number>
-     </attribute>
-     <attribute name="verticalHeaderStretchLastSection">
-      <bool>false</bool>
-     </attribute>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label_2">
-     <property name="text">
-      <string>Database Line</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QFrame" name="frame">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>32</height>
-      </size>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-     <property name="centerButtons">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/treatmentItemWidget.ui b/src/openmolar/qt-designer/treatmentItemWidget.ui
deleted file mode 100644
index 8b83e68..0000000
--- a/src/openmolar/qt-designer/treatmentItemWidget.ui
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>415</width>
-    <height>31</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
-   <property name="spacing">
-    <number>4</number>
-   </property>
-   <property name="topMargin">
-    <number>3</number>
-   </property>
-   <property name="bottomMargin">
-    <number>3</number>
-   </property>
-   <item>
-    <widget class="QSpinBox" name="spinBox">
-     <property name="maximumSize">
-      <size>
-       <width>60</width>
-       <height>16777215</height>
-      </size>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="text">
-      <string>TextLabel</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/list_models.py b/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
index 0cd6dc4..aa08edf 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
@@ -137,8 +137,12 @@ class SimpleListModel(QtCore.QAbstractListModel):
             if app.flag == -128:
                 info = "%s (%s)" % (app.name, app.length)
             elif app.unscheduled:
-                info = "%s %s - %s" % (app.length,
-                                       app.trt1, app.dent_inits)
+                info = "%s %s - %s" % (
+                    app.length,
+                    " ".join(
+                        [tx for tx in (
+                            app.trt1, app.trt2, app.trt3) if tx != ""]),
+                    app.dent_inits)
             else:
                 info = "%s %s with %s" % (app.readableDate,
                                           app.readableTime, app.dent_inits)
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py b/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
index 8b67a24..5db21c2 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
@@ -103,6 +103,7 @@ class treeModel(QtCore.QAbstractItemModel):
     '''
     a model to display a feetables data
     '''
+    appointments_changed_signal = QtCore.pyqtSignal()
 
     def __init__(self, parent=None):
         super(treeModel, self).__init__(parent)
@@ -123,6 +124,7 @@ class treeModel(QtCore.QAbstractItemModel):
             self.clear()
             self.appointments = appointments
             self.setupModelData()
+            self.appointments_changed_signal.emit()
 
     def setSelectedAppt(self, appt):
         if appt and self.om_gui:
diff --git a/src/openmolar/qt4gui/charts/charts_gui.py b/src/openmolar/qt4gui/charts/charts_gui.py
index 02c861c..c86c692 100644
--- a/src/openmolar/qt4gui/charts/charts_gui.py
+++ b/src/openmolar/qt4gui/charts/charts_gui.py
@@ -132,9 +132,11 @@ def flipDeciduous(om_gui):
                 om_gui.ui.chartsTableWidget.item(row, 0).text().toAscii())
 
             om_gui.pt.flipDec_Perm(selectedTooth)
-        for chart in (om_gui.ui.staticChartWidget, om_gui.ui.planChartWidget,
-                      om_gui.ui.completedChartWidget, om_gui.ui.perioChartWidget,
-                      om_gui.ui.summaryChartWidget):
+        for chart in (om_gui.ui.staticChartWidget,
+                      om_gui.ui.planChartWidget,
+                      om_gui.ui.completedChartWidget,
+                      om_gui.ui.summaryChartWidget
+                      ):
             chart.chartgrid = om_gui.pt.chartgrid
             #--necessary to restore the chart to full dentition
             chart.update()
@@ -210,23 +212,6 @@ def selectChartedTooth(om_gui, x, y):
                                             om_gui.selectedChartWidget == "st")
 
 
-def bpe_dates(om_gui):
-    '''
-    updates the date in the bpe date groupbox
-    '''
-    #--bpe = "basic periodontal exam"
-    om_gui.ui.bpeDateComboBox.clear()
-    om_gui.ui.bpe_textBrowser.setPlainText("")
-    if om_gui.pt.bpe == []:
-        om_gui.ui.bpeDateComboBox.addItem(QtCore.QString("NO BPE"))
-    else:
-        l = copy.deepcopy(om_gui.pt.bpe)
-        l.reverse()  # show newest first
-        for sets in l:
-            bpedate = localsettings.formatDate(sets[0])
-            om_gui.ui.bpeDateComboBox.addItem(bpedate)
-
-
 def bpe_table(om_gui, arg):
     '''
     updates the BPE chart on the clinical summary page
@@ -254,39 +239,6 @@ def bpe_table(om_gui, arg):
         om_gui.ui.bpe_textBrowser.setHtml("")
 
 
-def periochart_dates(om_gui):
-    '''
-    multiple perio charts on multiple dates....
-    display those dates in a combo box
-    '''
-    om_gui.ui.perioChartDateComboBox.clear()
-    for date in om_gui.pt.perioData.keys():
-        om_gui.ui.perioChartDateComboBox.addItem(QtCore.QString(date))
-    if om_gui.pt.perioData == {}:
-        om_gui.ui.perioChartDateComboBox.addItem(_("NO CHARTS"))
-
-
-def layoutPerioCharts(om_gui):
-    '''
-    layout the perio charts
-    '''
-    #--convert from QString
-    selected_date = str(om_gui.ui.perioChartDateComboBox.currentText())
-    if selected_date in om_gui.pt.perioData:
-        perioD = om_gui.pt.perioData[selected_date]
-        #--headers=("Recession", "Pocketing", "Plaque", "Bleeding", "Other",
-        #--"Suppuration", "Furcation", "Mobility")
-        for key in perioD.keys():
-            for i in range(8):
-                om_gui.ui.perioChartWidgets[i].setProps(key, perioD[key][i])
-    else:
-        om_gui.advise("no perio data found for", selected_date)
-        for i in range(8):
-            om_gui.ui.perioChartWidgets[i].props = {}
-    for chart in om_gui.ui.perioChartWidgets:
-        chart.update()
-
-
 def chartsTable(om_gui):
     '''
     update the charts table
@@ -303,7 +255,7 @@ def chartsTable(om_gui):
                   om_gui.ui.staticChartWidget,
                   om_gui.ui.planChartWidget,
                   om_gui.ui.completedChartWidget,
-                  om_gui.ui.perioChartWidget):
+                  ):
         chart.chartgrid = om_gui.pt.chartgrid
         #--sets the tooth numbering
     row = 0
@@ -332,7 +284,5 @@ def chartsTable(om_gui):
         om_gui.ui.planChartWidget.setToothProps(tooth, pItem.lower())
         om_gui.ui.completedChartWidget.setToothProps(tooth, cItem.lower())
 
-        if static_text[:2] in ("AT", "TM", "UE"):
-            om_gui.ui.perioChartWidget.setToothProps(tooth, static_text)
     om_gui.ui.chartsTableWidget.resizeColumnsToContents()
     om_gui.ui.chartsTableWidget.setCurrentCell(0, 0)
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py
deleted file mode 100644
index 09382d9..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py
+++ /dev/null
@@ -1,219 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptOpenDay.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(540, 377)
-        self.gridLayout_2 = QtGui.QGridLayout(Dialog)
-        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
-        self.label_2 = QtGui.QLabel(Dialog)
-        self.label_2.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_2.setObjectName(_fromUtf8("label_2"))
-        self.gridLayout_2.addWidget(self.label_2, 0, 1, 1, 1)
-        self.comboBox = QtGui.QComboBox(Dialog)
-        self.comboBox.setObjectName(_fromUtf8("comboBox"))
-        self.gridLayout_2.addWidget(self.comboBox, 0, 2, 1, 1)
-        spacerItem = QtGui.QSpacerItem(
-            141,
-            20,
-            QtGui.QSizePolicy.Expanding,
-            QtGui.QSizePolicy.Minimum)
-        self.gridLayout_2.addItem(spacerItem, 0, 3, 1, 1)
-        self.label_3 = QtGui.QLabel(Dialog)
-        self.label_3.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_3.setObjectName(_fromUtf8("label_3"))
-        self.gridLayout_2.addWidget(self.label_3, 1, 1, 1, 1)
-        self.dateEdit = QtGui.QDateEdit(Dialog)
-        self.dateEdit.setMinimumSize(QtCore.QSize(140, 0))
-        self.dateEdit.setCalendarPopup(True)
-        self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
-        self.gridLayout_2.addWidget(self.dateEdit, 1, 2, 1, 1)
-        self.label = QtGui.QLabel(Dialog)
-        self.label.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.gridLayout_2.addWidget(self.label, 2, 0, 1, 2)
-        self.memo_lineEdit = QtGui.QLineEdit(Dialog)
-        self.memo_lineEdit.setMaxLength(30)
-        self.memo_lineEdit.setObjectName(_fromUtf8("memo_lineEdit"))
-        self.gridLayout_2.addWidget(self.memo_lineEdit, 2, 2, 1, 2)
-        self.frame = QtGui.QFrame(Dialog)
-        self.frame.setMinimumSize(QtCore.QSize(522, 0))
-        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame.setObjectName(_fromUtf8("frame"))
-        self.gridLayout = QtGui.QGridLayout(self.frame)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.label_10 = QtGui.QLabel(self.frame)
-        self.label_10.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_10.setObjectName(_fromUtf8("label_10"))
-        self.gridLayout.addWidget(self.label_10, 0, 1, 1, 1)
-        self.dayStart_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.dayStart_timeEdit.setObjectName(_fromUtf8("dayStart_timeEdit"))
-        self.gridLayout.addWidget(self.dayStart_timeEdit, 0, 2, 1, 1)
-        self.es1_checkBox = QtGui.QCheckBox(self.frame)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.es1_checkBox.sizePolicy(
-            ).hasHeightForWidth(
-            ))
-        self.es1_checkBox.setSizePolicy(sizePolicy)
-        self.es1_checkBox.setObjectName(_fromUtf8("es1_checkBox"))
-        self.gridLayout.addWidget(self.es1_checkBox, 1, 0, 1, 1)
-        self.label_4 = QtGui.QLabel(self.frame)
-        self.label_4.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_4.setObjectName(_fromUtf8("label_4"))
-        self.gridLayout.addWidget(self.label_4, 1, 1, 1, 1)
-        self.es1Start_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.es1Start_timeEdit.setObjectName(_fromUtf8("es1Start_timeEdit"))
-        self.gridLayout.addWidget(self.es1Start_timeEdit, 1, 2, 1, 1)
-        self.label_7 = QtGui.QLabel(self.frame)
-        self.label_7.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_7.setObjectName(_fromUtf8("label_7"))
-        self.gridLayout.addWidget(self.label_7, 1, 3, 1, 1)
-        self.es1Finish_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.es1Finish_timeEdit.setObjectName(_fromUtf8("es1Finish_timeEdit"))
-        self.gridLayout.addWidget(self.es1Finish_timeEdit, 1, 4, 1, 1)
-        self.lunch_checkBox = QtGui.QCheckBox(self.frame)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.lunch_checkBox.sizePolicy().hasHeightForWidth())
-        self.lunch_checkBox.setSizePolicy(sizePolicy)
-        self.lunch_checkBox.setObjectName(_fromUtf8("lunch_checkBox"))
-        self.gridLayout.addWidget(self.lunch_checkBox, 2, 0, 1, 1)
-        self.label_5 = QtGui.QLabel(self.frame)
-        self.label_5.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_5.setObjectName(_fromUtf8("label_5"))
-        self.gridLayout.addWidget(self.label_5, 2, 1, 1, 1)
-        self.lunchStart_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.lunchStart_timeEdit.setObjectName(
-            _fromUtf8("lunchStart_timeEdit"))
-        self.gridLayout.addWidget(self.lunchStart_timeEdit, 2, 2, 1, 1)
-        self.label_8 = QtGui.QLabel(self.frame)
-        self.label_8.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_8.setObjectName(_fromUtf8("label_8"))
-        self.gridLayout.addWidget(self.label_8, 2, 3, 1, 1)
-        self.lunchFinish_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.lunchFinish_timeEdit.setObjectName(
-            _fromUtf8("lunchFinish_timeEdit"))
-        self.gridLayout.addWidget(self.lunchFinish_timeEdit, 2, 4, 1, 1)
-        self.es2_checkBox = QtGui.QCheckBox(self.frame)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.es2_checkBox.sizePolicy().hasHeightForWidth())
-        self.es2_checkBox.setSizePolicy(sizePolicy)
-        self.es2_checkBox.setObjectName(_fromUtf8("es2_checkBox"))
-        self.gridLayout.addWidget(self.es2_checkBox, 3, 0, 1, 1)
-        self.label_6 = QtGui.QLabel(self.frame)
-        self.label_6.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_6.setObjectName(_fromUtf8("label_6"))
-        self.gridLayout.addWidget(self.label_6, 3, 1, 1, 1)
-        self.es2Start_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.es2Start_timeEdit.setObjectName(_fromUtf8("es2Start_timeEdit"))
-        self.gridLayout.addWidget(self.es2Start_timeEdit, 3, 2, 1, 1)
-        self.label_9 = QtGui.QLabel(self.frame)
-        self.label_9.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_9.setObjectName(_fromUtf8("label_9"))
-        self.gridLayout.addWidget(self.label_9, 3, 3, 1, 1)
-        self.es2Finish_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.es2Finish_timeEdit.setObjectName(_fromUtf8("es2Finish_timeEdit"))
-        self.gridLayout.addWidget(self.es2Finish_timeEdit, 3, 4, 1, 1)
-        self.label_11 = QtGui.QLabel(self.frame)
-        self.label_11.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_11.setObjectName(_fromUtf8("label_11"))
-        self.gridLayout.addWidget(self.label_11, 4, 3, 1, 1)
-        self.dayFinish_timeEdit = QtGui.QTimeEdit(self.frame)
-        self.dayFinish_timeEdit.setObjectName(_fromUtf8("dayFinish_timeEdit"))
-        self.gridLayout.addWidget(self.dayFinish_timeEdit, 4, 4, 1, 1)
-        self.gridLayout_2.addWidget(self.frame, 3, 0, 1, 4)
-        spacerItem1 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_2.addItem(spacerItem1, 4, 0, 1, 1)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.gridLayout_2.addWidget(self.buttonBox, 5, 0, 1, 4)
-
-        self.retranslateUi(Dialog)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Open a Day"))
-        self.label_2.setText(_("Clinician"))
-        self.label_3.setText(_("Date to Open"))
-        self.label.setText(_("Day Memo - optional"))
-        self.label_10.setText(_("Day Start"))
-        self.es1_checkBox.setText(_("Morning Emergency Slot"))
-        self.label_4.setText(_("Start"))
-        self.label_7.setText(_("Finish"))
-        self.lunch_checkBox.setText(_("Lunch"))
-        self.label_5.setText(_("Start"))
-        self.label_8.setText(_("Finish"))
-        self.es2_checkBox.setText(_("Afternoon Emergency Slot "))
-        self.label_6.setText(_("Start"))
-        self.label_9.setText(_("Finish"))
-        self.label_11.setText(_("Day Finish"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py
deleted file mode 100644
index 35de4f1..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptTools.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_MainWindow(object):
-
-    def setupUi(self, MainWindow):
-        MainWindow.setObjectName(_fromUtf8("MainWindow"))
-        MainWindow.resize(599, 255)
-        icon = QtGui.QIcon()
-        icon.addPixmap(
-            QtGui.QPixmap(_fromUtf8(":/logo.png")),
-            QtGui.QIcon.Normal,
-            QtGui.QIcon.Off)
-        MainWindow.setWindowIcon(icon)
-        self.centralwidget = QtGui.QWidget(MainWindow)
-        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
-        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.label = QtGui.QLabel(self.centralwidget)
-        self.label.setFrameShape(QtGui.QFrame.NoFrame)
-        self.label.setText(_fromUtf8(""))
-        self.label.setPixmap(QtGui.QPixmap(_fromUtf8(":/appt_ov.png")))
-        self.label.setScaledContents(True)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.gridLayout.addWidget(self.label, 0, 0, 5, 1)
-        self.extendBook_pushButton = QtGui.QPushButton(self.centralwidget)
-        self.extendBook_pushButton.setObjectName(
-            _fromUtf8("extendBook_pushButton"))
-        self.gridLayout.addWidget(self.extendBook_pushButton, 0, 1, 1, 1)
-        self.removeOld_pushButton = QtGui.QPushButton(self.centralwidget)
-        self.removeOld_pushButton.setObjectName(
-            _fromUtf8("removeOld_pushButton"))
-        self.gridLayout.addWidget(self.removeOld_pushButton, 2, 1, 1, 1)
-        self.editWeeks_pushButton = QtGui.QPushButton(self.centralwidget)
-        self.editWeeks_pushButton.setObjectName(
-            _fromUtf8("editWeeks_pushButton"))
-        self.gridLayout.addWidget(self.editWeeks_pushButton, 3, 1, 1, 1)
-        self.openDay_pushButton = QtGui.QPushButton(self.centralwidget)
-        self.openDay_pushButton.setObjectName(_fromUtf8("openDay_pushButton"))
-        self.gridLayout.addWidget(self.openDay_pushButton, 4, 1, 1, 1)
-        self.blocks_pushButton = QtGui.QPushButton(self.centralwidget)
-        self.blocks_pushButton.setObjectName(_fromUtf8("blocks_pushButton"))
-        self.gridLayout.addWidget(self.blocks_pushButton, 1, 1, 1, 1)
-        MainWindow.setCentralWidget(self.centralwidget)
-        self.menubar = QtGui.QMenuBar(MainWindow)
-        self.menubar.setGeometry(QtCore.QRect(0, 0, 599, 22))
-        self.menubar.setObjectName(_fromUtf8("menubar"))
-        self.menu_Quit = QtGui.QMenu(self.menubar)
-        self.menu_Quit.setObjectName(_fromUtf8("menu_Quit"))
-        MainWindow.setMenuBar(self.menubar)
-        self.statusbar = QtGui.QStatusBar(MainWindow)
-        self.statusbar.setObjectName(_fromUtf8("statusbar"))
-        MainWindow.setStatusBar(self.statusbar)
-        self.menubar.addAction(self.menu_Quit.menuAction())
-
-        self.retranslateUi(MainWindow)
-        QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
-    def retranslateUi(self, MainWindow):
-        MainWindow.setWindowTitle(_("Appointment Tools"))
-        self.extendBook_pushButton.setToolTip(
-            _("Move the end date for making appointments."))
-        self.extendBook_pushButton.setText(_("Extend Books"))
-        self.removeOld_pushButton.setText(_("Remove old weeks"))
-        self.editWeeks_pushButton.setText(
-            _("Edit Standard Working Weeks for Clinicians"))
-        self.openDay_pushButton.setText(_("Open A Day"))
-        self.blocks_pushButton.setText(_("Insert regular blocks"))
-        self.menu_Quit.setTitle(_("&Quit"))
-
-from openmolar.qt4gui import resources_rc
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    MainWindow = QtGui.QMainWindow()
-    ui = Ui_MainWindow()
-    ui.setupUi(MainWindow)
-    MainWindow.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py b/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py
deleted file mode 100644
index 8392740..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py
+++ /dev/null
@@ -1,162 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/block_wizard.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(403, 437)
-        self.gridLayout_2 = QtGui.QGridLayout(Dialog)
-        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
-        self.label_7 = QtGui.QLabel(Dialog)
-        self.label_7.setAlignment(QtCore.Qt.AlignCenter)
-        self.label_7.setObjectName(_fromUtf8("label_7"))
-        self.gridLayout_2.addWidget(self.label_7, 0, 0, 1, 4)
-        self.label_2 = QtGui.QLabel(Dialog)
-        self.label_2.setObjectName(_fromUtf8("label_2"))
-        self.gridLayout_2.addWidget(self.label_2, 2, 0, 1, 1)
-        self.start_dateEdit = QtGui.QDateEdit(Dialog)
-        self.start_dateEdit.setMinimumSize(QtCore.QSize(120, 0))
-        self.start_dateEdit.setCalendarPopup(True)
-        self.start_dateEdit.setObjectName(_fromUtf8("start_dateEdit"))
-        self.gridLayout_2.addWidget(self.start_dateEdit, 2, 1, 1, 1)
-        spacerItem = QtGui.QSpacerItem(
-            202,
-            21,
-            QtGui.QSizePolicy.Expanding,
-            QtGui.QSizePolicy.Minimum)
-        self.gridLayout_2.addItem(spacerItem, 2, 3, 1, 1)
-        self.label_3 = QtGui.QLabel(Dialog)
-        self.label_3.setObjectName(_fromUtf8("label_3"))
-        self.gridLayout_2.addWidget(self.label_3, 3, 0, 1, 1)
-        self.end_dateEdit = QtGui.QDateEdit(Dialog)
-        self.end_dateEdit.setMinimumSize(QtCore.QSize(120, 0))
-        self.end_dateEdit.setCalendarPopup(True)
-        self.end_dateEdit.setObjectName(_fromUtf8("end_dateEdit"))
-        self.gridLayout_2.addWidget(self.end_dateEdit, 3, 1, 1, 1)
-        spacerItem1 = QtGui.QSpacerItem(
-            202,
-            21,
-            QtGui.QSizePolicy.Expanding,
-            QtGui.QSizePolicy.Minimum)
-        self.gridLayout_2.addItem(spacerItem1, 3, 3, 1, 1)
-        self.label_4 = QtGui.QLabel(Dialog)
-        self.label_4.setObjectName(_fromUtf8("label_4"))
-        self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)
-        spacerItem2 = QtGui.QSpacerItem(
-            202,
-            21,
-            QtGui.QSizePolicy.Expanding,
-            QtGui.QSizePolicy.Minimum)
-        self.gridLayout_2.addItem(spacerItem2, 4, 3, 1, 1)
-        self.label_5 = QtGui.QLabel(Dialog)
-        self.label_5.setObjectName(_fromUtf8("label_5"))
-        self.gridLayout_2.addWidget(self.label_5, 5, 0, 1, 1)
-        spacerItem3 = QtGui.QSpacerItem(
-            202,
-            22,
-            QtGui.QSizePolicy.Expanding,
-            QtGui.QSizePolicy.Minimum)
-        self.gridLayout_2.addItem(spacerItem3, 5, 3, 1, 1)
-        self.label_6 = QtGui.QLabel(Dialog)
-        self.label_6.setObjectName(_fromUtf8("label_6"))
-        self.gridLayout_2.addWidget(self.label_6, 6, 0, 1, 1)
-        self.lineEdit = QtGui.QLineEdit(Dialog)
-        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
-        self.gridLayout_2.addWidget(self.lineEdit, 6, 1, 1, 3)
-        self.day_groupBox = QtGui.QGroupBox(Dialog)
-        self.day_groupBox.setObjectName(_fromUtf8("day_groupBox"))
-        self.gridLayout_2.addWidget(self.day_groupBox, 7, 0, 1, 4)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Cancel)
-        self.buttonBox.setCenterButtons(True)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.gridLayout_2.addWidget(self.buttonBox, 12, 0, 1, 4)
-        spacerItem4 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_2.addItem(spacerItem4, 8, 0, 1, 1)
-        self.time_frame = QtGui.QFrame(Dialog)
-        self.time_frame.setFrameShape(QtGui.QFrame.NoFrame)
-        self.time_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.time_frame.setObjectName(_fromUtf8("time_frame"))
-        self.gridLayout_2.addWidget(self.time_frame, 4, 1, 1, 1)
-        self.clinicians_groupBox = QtGui.QGroupBox(Dialog)
-        self.clinicians_groupBox.setObjectName(
-            _fromUtf8("clinicians_groupBox"))
-        self.gridLayout_2.addWidget(self.clinicians_groupBox, 1, 0, 1, 4)
-        self.spinBox = QtGui.QSpinBox(Dialog)
-        self.spinBox.setMaximum(300)
-        self.spinBox.setSingleStep(5)
-        self.spinBox.setObjectName(_fromUtf8("spinBox"))
-        self.gridLayout_2.addWidget(self.spinBox, 5, 1, 1, 1)
-        spacerItem5 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_2.addItem(spacerItem5, 11, 0, 1, 1)
-        self.progress_label = QtGui.QLabel(Dialog)
-        self.progress_label.setText(_fromUtf8(""))
-        self.progress_label.setObjectName(_fromUtf8("progress_label"))
-        self.gridLayout_2.addWidget(self.progress_label, 9, 0, 1, 4)
-        self.progressBar = QtGui.QProgressBar(Dialog)
-        self.progressBar.setProperty("value", 0)
-        self.progressBar.setObjectName(_fromUtf8("progressBar"))
-        self.gridLayout_2.addWidget(self.progressBar, 10, 0, 1, 4)
-
-        self.retranslateUi(Dialog)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Block Wizard"))
-        self.label_7.setText(
-            _("Insert a block into a book for a range of dates."))
-        self.label_2.setText(_("Start Date"))
-        self.label_3.setText(_("End Date (inclusive)"))
-        self.label_4.setText(_("Time"))
-        self.label_5.setText(_("Length"))
-        self.label_6.setText(_("Text to Apply"))
-        self.day_groupBox.setTitle(_("Days to Apply"))
-        self.clinicians_groupBox.setTitle(_("Clinicians"))
-        self.spinBox.setSuffix(_(" minutes"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py b/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py
deleted file mode 100644
index be62174..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py
+++ /dev/null
@@ -1,164 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/bridge_denture.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(632, 480)
-        self.gridLayout = QtGui.QGridLayout(Dialog)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.frame = QtGui.QFrame(Dialog)
-        self.frame.setMinimumSize(QtCore.QSize(331, 451))
-        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame.setObjectName(_fromUtf8("frame"))
-        self.gridLayout.addWidget(self.frame, 0, 0, 2, 1)
-        self.tabWidget = QtGui.QTabWidget(Dialog)
-        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
-        self.tab = QtGui.QWidget()
-        self.tab.setObjectName(_fromUtf8("tab"))
-        self.verticalLayout_4 = QtGui.QVBoxLayout(self.tab)
-        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
-        self.radioButton = QtGui.QRadioButton(self.tab)
-        self.radioButton.setObjectName(_fromUtf8("radioButton"))
-        self.verticalLayout_4.addWidget(self.radioButton)
-        self.radioButton_2 = QtGui.QRadioButton(self.tab)
-        self.radioButton_2.setObjectName(_fromUtf8("radioButton_2"))
-        self.verticalLayout_4.addWidget(self.radioButton_2)
-        self.radioButton_3 = QtGui.QRadioButton(self.tab)
-        self.radioButton_3.setObjectName(_fromUtf8("radioButton_3"))
-        self.verticalLayout_4.addWidget(self.radioButton_3)
-        spacerItem = QtGui.QSpacerItem(
-            20,
-            295,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_4.addItem(spacerItem)
-        self.tabWidget.addTab(self.tab, _fromUtf8(""))
-        self.tab_2 = QtGui.QWidget()
-        self.tab_2.setObjectName(_fromUtf8("tab_2"))
-        self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab_2)
-        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
-        self.frame_2 = QtGui.QFrame(self.tab_2)
-        self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame_2.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame_2.setObjectName(_fromUtf8("frame_2"))
-        self.verticalLayout = QtGui.QVBoxLayout(self.frame_2)
-        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.label_2 = QtGui.QLabel(self.frame_2)
-        self.label_2.setObjectName(_fromUtf8("label_2"))
-        self.verticalLayout.addWidget(self.label_2)
-        self.radioButton_4 = QtGui.QRadioButton(self.frame_2)
-        self.radioButton_4.setObjectName(_fromUtf8("radioButton_4"))
-        self.verticalLayout.addWidget(self.radioButton_4)
-        self.radioButton_8 = QtGui.QRadioButton(self.frame_2)
-        self.radioButton_8.setObjectName(_fromUtf8("radioButton_8"))
-        self.verticalLayout.addWidget(self.radioButton_8)
-        self.radioButton_5 = QtGui.QRadioButton(self.frame_2)
-        self.radioButton_5.setObjectName(_fromUtf8("radioButton_5"))
-        self.verticalLayout.addWidget(self.radioButton_5)
-        self.radioButton_6 = QtGui.QRadioButton(self.frame_2)
-        self.radioButton_6.setObjectName(_fromUtf8("radioButton_6"))
-        self.verticalLayout.addWidget(self.radioButton_6)
-        self.radioButton_7 = QtGui.QRadioButton(self.frame_2)
-        self.radioButton_7.setObjectName(_fromUtf8("radioButton_7"))
-        self.verticalLayout.addWidget(self.radioButton_7)
-        self.verticalLayout_3.addWidget(self.frame_2)
-        self.frame_3 = QtGui.QFrame(self.tab_2)
-        self.frame_3.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame_3.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame_3.setObjectName(_fromUtf8("frame_3"))
-        self.verticalLayout_2 = QtGui.QVBoxLayout(self.frame_3)
-        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
-        self.label = QtGui.QLabel(self.frame_3)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.verticalLayout_2.addWidget(self.label)
-        self.radioButton_9 = QtGui.QRadioButton(self.frame_3)
-        self.radioButton_9.setObjectName(_fromUtf8("radioButton_9"))
-        self.verticalLayout_2.addWidget(self.radioButton_9)
-        self.radioButton_13 = QtGui.QRadioButton(self.frame_3)
-        self.radioButton_13.setObjectName(_fromUtf8("radioButton_13"))
-        self.verticalLayout_2.addWidget(self.radioButton_13)
-        self.radioButton_10 = QtGui.QRadioButton(self.frame_3)
-        self.radioButton_10.setObjectName(_fromUtf8("radioButton_10"))
-        self.verticalLayout_2.addWidget(self.radioButton_10)
-        self.radioButton_11 = QtGui.QRadioButton(self.frame_3)
-        self.radioButton_11.setObjectName(_fromUtf8("radioButton_11"))
-        self.verticalLayout_2.addWidget(self.radioButton_11)
-        self.radioButton_12 = QtGui.QRadioButton(self.frame_3)
-        self.radioButton_12.setObjectName(_fromUtf8("radioButton_12"))
-        self.verticalLayout_2.addWidget(self.radioButton_12)
-        self.verticalLayout_3.addWidget(self.frame_3)
-        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
-        self.gridLayout.addWidget(self.tabWidget, 0, 1, 1, 1)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.gridLayout.addWidget(self.buttonBox, 1, 1, 1, 1)
-
-        self.retranslateUi(Dialog)
-        self.tabWidget.setCurrentIndex(0)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Bridge - Denture Entry"))
-        self.radioButton.setText(_("Porcelain / Precious Metal"))
-        self.radioButton_2.setText(_("Lava (or all ceramic)"))
-        self.radioButton_3.setText(_("Resin Retained"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab),
-            _("Bridge"))
-        self.label_2.setText(_("Upper"))
-        self.radioButton_4.setText(_("Full (acrylic)"))
-        self.radioButton_8.setText(_("Full (co-chrome)"))
-        self.radioButton_5.setText(_("Partial (acrylic)"))
-        self.radioButton_6.setText(_("Partial (co-chrome)"))
-        self.radioButton_7.setText(_("Other"))
-        self.label.setText(_("Lower"))
-        self.radioButton_9.setText(_("Full (acrylic)"))
-        self.radioButton_13.setText(_("Full (co-chrome)"))
-        self.radioButton_10.setText(_("Partial (acrylic)"))
-        self.radioButton_11.setText(_("Partial (co-chrome)"))
-        self.radioButton_12.setText(_("Other"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_2),
-            _("Denture"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py b/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py
deleted file mode 100644
index 72cffc6..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/completionDate.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(340, 227)
-        self.verticalLayout = QtGui.QVBoxLayout(Dialog)
-        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.pt_label = QtGui.QLabel(Dialog)
-        self.pt_label.setAlignment(QtCore.Qt.AlignCenter)
-        self.pt_label.setObjectName(_fromUtf8("pt_label"))
-        self.verticalLayout.addWidget(self.pt_label)
-        self.autoComplete_label = QtGui.QLabel(Dialog)
-        self.autoComplete_label.setAlignment(QtCore.Qt.AlignCenter)
-        self.autoComplete_label.setWordWrap(True)
-        self.autoComplete_label.setObjectName(_fromUtf8("autoComplete_label"))
-        self.verticalLayout.addWidget(self.autoComplete_label)
-        spacerItem = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout.addItem(spacerItem)
-        self.horizontalLayout = QtGui.QHBoxLayout()
-        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        self.label_4 = QtGui.QLabel(Dialog)
-        self.label_4.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.label_4.setObjectName(_fromUtf8("label_4"))
-        self.horizontalLayout.addWidget(self.label_4)
-        self.dateEdit = QtGui.QDateEdit(Dialog)
-        self.dateEdit.setFocusPolicy(QtCore.Qt.TabFocus)
-        self.dateEdit.setCalendarPopup(True)
-        self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
-        self.horizontalLayout.addWidget(self.dateEdit)
-        self.verticalLayout.addLayout(self.horizontalLayout)
-        self.label = QtGui.QLabel(Dialog)
-        self.label.setAlignment(QtCore.Qt.AlignCenter)
-        self.label.setWordWrap(True)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.verticalLayout.addWidget(self.label)
-        spacerItem1 = QtGui.QSpacerItem(
-            20,
-            14,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout.addItem(spacerItem1)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.No | QtGui.QDialogButtonBox.Yes)
-        self.buttonBox.setCenterButtons(True)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.verticalLayout.addWidget(self.buttonBox)
-
-        self.retranslateUi(Dialog)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Completion Date"))
-        self.pt_label.setText(_("UNNAMED PT - (000000)"))
-        self.autoComplete_label.setText(
-            _("You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."))
-        self.label_4.setText(_("Suggested completion Date"))
-        self.label.setText(_("Apply this Date Now?\n"
-                             "(course can be re-opened later if necessary)"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py b/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py
deleted file mode 100644
index 9cf34ca..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/editmemos.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(417, 395)
-        self.gridLayout = QtGui.QGridLayout(Dialog)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.label = QtGui.QLabel(Dialog)
-        font = QtGui.QFont()
-        font.setBold(True)
-        font.setWeight(75)
-        self.label.setFont(font)
-        self.label.setText(_fromUtf8(""))
-        self.label.setAlignment(QtCore.Qt.AlignCenter)
-        self.label.setWordWrap(True)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.gridLayout.addWidget(self.label, 0, 0, 1, 3)
-        self.label_2 = QtGui.QLabel(Dialog)
-        self.label_2.setObjectName(_fromUtf8("label_2"))
-        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
-        self.lineEdit = QtGui.QLineEdit(Dialog)
-        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
-        self.gridLayout.addWidget(self.lineEdit, 1, 1, 1, 2)
-        self.label_3 = QtGui.QLabel(Dialog)
-        self.label_3.setObjectName(_fromUtf8("label_3"))
-        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 2)
-        self.scrollArea = QtGui.QScrollArea(Dialog)
-        self.scrollArea.setFrameShape(QtGui.QFrame.NoFrame)
-        self.scrollArea.setWidgetResizable(True)
-        self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
-        self.scrollAreaWidgetContents = QtGui.QWidget()
-        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 399, 238))
-        self.scrollAreaWidgetContents.setObjectName(
-            _fromUtf8("scrollAreaWidgetContents"))
-        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
-        self.gridLayout.addWidget(self.scrollArea, 3, 0, 1, 3)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
-        self.buttonBox.setCenterButtons(True)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.gridLayout.addWidget(self.buttonBox, 4, 2, 1, 1)
-
-        self.retranslateUi(Dialog)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Edit Memos"))
-        self.label_2.setText(_("Global Memo"))
-        self.label_3.setText(_("Clinician Memos"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py b/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py
deleted file mode 100644
index 1f60996..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py
+++ /dev/null
@@ -1,637 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/initialise.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_MainWindow(object):
-
-    def setupUi(self, MainWindow):
-        MainWindow.setObjectName(_fromUtf8("MainWindow"))
-        MainWindow.resize(800, 507)
-        self.centralwidget = QtGui.QWidget(MainWindow)
-        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
-        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
-        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
-        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
-        self.tab_8 = QtGui.QWidget()
-        self.tab_8.setObjectName(_fromUtf8("tab_8"))
-        self.gridLayout_3 = QtGui.QGridLayout(self.tab_8)
-        self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
-        self.label_17 = QtGui.QLabel(self.tab_8)
-        self.label_17.setObjectName(_fromUtf8("label_17"))
-        self.gridLayout_3.addWidget(self.label_17, 0, 0, 1, 2)
-        self.modifydb_radioButton = QtGui.QRadioButton(self.tab_8)
-        self.modifydb_radioButton.setEnabled(False)
-        self.modifydb_radioButton.setObjectName(
-            _fromUtf8("modifydb_radioButton"))
-        self.gridLayout_3.addWidget(self.modifydb_radioButton, 4, 0, 1, 1)
-        self.comboBox = QtGui.QComboBox(self.tab_8)
-        self.comboBox.setEnabled(False)
-        self.comboBox.setObjectName(_fromUtf8("comboBox"))
-        self.gridLayout_3.addWidget(self.comboBox, 4, 1, 1, 1)
-        self.line = QtGui.QFrame(self.tab_8)
-        self.line.setFrameShape(QtGui.QFrame.HLine)
-        self.line.setFrameShadow(QtGui.QFrame.Sunken)
-        self.line.setObjectName(_fromUtf8("line"))
-        self.gridLayout_3.addWidget(self.line, 5, 0, 1, 3)
-        spacerItem = QtGui.QSpacerItem(
-            20,
-            407,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_3.addItem(spacerItem, 6, 1, 1, 1)
-        self.blankdb_radioButton = QtGui.QRadioButton(self.tab_8)
-        self.blankdb_radioButton.setChecked(True)
-        self.blankdb_radioButton.setObjectName(
-            _fromUtf8("blankdb_radioButton"))
-        self.gridLayout_3.addWidget(self.blankdb_radioButton, 2, 0, 1, 1)
-        self.newdb_template_radioButton = QtGui.QRadioButton(self.tab_8)
-        self.newdb_template_radioButton.setChecked(False)
-        self.newdb_template_radioButton.setObjectName(
-            _fromUtf8("newdb_template_radioButton"))
-        self.gridLayout_3.addWidget(
-            self.newdb_template_radioButton,
-            3,
-            0,
-            1,
-            1)
-        self.tabWidget.addTab(self.tab_8, _fromUtf8(""))
-        self.tab = QtGui.QWidget()
-        self.tab.setObjectName(_fromUtf8("tab"))
-        self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab)
-        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
-        self.practice_frame = QtGui.QFrame(self.tab)
-        self.practice_frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.practice_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.practice_frame.setObjectName(_fromUtf8("practice_frame"))
-        self.gridLayout = QtGui.QGridLayout(self.practice_frame)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.label = QtGui.QLabel(self.practice_frame)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
-        self.lineEdit = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
-        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
-        self.label_18 = QtGui.QLabel(self.practice_frame)
-        self.label_18.setObjectName(_fromUtf8("label_18"))
-        self.gridLayout.addWidget(self.label_18, 0, 2, 1, 1)
-        self.label_2 = QtGui.QLabel(self.practice_frame)
-        self.label_2.setObjectName(_fromUtf8("label_2"))
-        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
-        self.lineEdit_2 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
-        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1)
-        self.label_22 = QtGui.QLabel(self.practice_frame)
-        self.label_22.setText(_fromUtf8(""))
-        self.label_22.setObjectName(_fromUtf8("label_22"))
-        self.gridLayout.addWidget(self.label_22, 1, 2, 1, 1)
-        self.label_3 = QtGui.QLabel(self.practice_frame)
-        self.label_3.setObjectName(_fromUtf8("label_3"))
-        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
-        self.lineEdit_3 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_3.setObjectName(_fromUtf8("lineEdit_3"))
-        self.gridLayout.addWidget(self.lineEdit_3, 2, 1, 1, 1)
-        self.label_23 = QtGui.QLabel(self.practice_frame)
-        self.label_23.setText(_fromUtf8(""))
-        self.label_23.setObjectName(_fromUtf8("label_23"))
-        self.gridLayout.addWidget(self.label_23, 2, 2, 1, 1)
-        self.label_4 = QtGui.QLabel(self.practice_frame)
-        self.label_4.setObjectName(_fromUtf8("label_4"))
-        self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
-        self.lineEdit_4 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_4.setObjectName(_fromUtf8("lineEdit_4"))
-        self.gridLayout.addWidget(self.lineEdit_4, 3, 1, 1, 1)
-        self.label_27 = QtGui.QLabel(self.practice_frame)
-        self.label_27.setText(_fromUtf8(""))
-        self.label_27.setObjectName(_fromUtf8("label_27"))
-        self.gridLayout.addWidget(self.label_27, 3, 2, 1, 1)
-        self.label_5 = QtGui.QLabel(self.practice_frame)
-        self.label_5.setObjectName(_fromUtf8("label_5"))
-        self.gridLayout.addWidget(self.label_5, 4, 0, 1, 1)
-        self.lineEdit_5 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_5.setObjectName(_fromUtf8("lineEdit_5"))
-        self.gridLayout.addWidget(self.lineEdit_5, 4, 1, 1, 1)
-        self.label_19 = QtGui.QLabel(self.practice_frame)
-        self.label_19.setText(_fromUtf8(""))
-        self.label_19.setObjectName(_fromUtf8("label_19"))
-        self.gridLayout.addWidget(self.label_19, 4, 2, 1, 1)
-        self.label_6 = QtGui.QLabel(self.practice_frame)
-        self.label_6.setObjectName(_fromUtf8("label_6"))
-        self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1)
-        self.lineEdit_6 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_6.setObjectName(_fromUtf8("lineEdit_6"))
-        self.gridLayout.addWidget(self.lineEdit_6, 5, 1, 1, 1)
-        self.label_28 = QtGui.QLabel(self.practice_frame)
-        self.label_28.setText(_fromUtf8(""))
-        self.label_28.setObjectName(_fromUtf8("label_28"))
-        self.gridLayout.addWidget(self.label_28, 5, 2, 1, 1)
-        self.label_7 = QtGui.QLabel(self.practice_frame)
-        self.label_7.setObjectName(_fromUtf8("label_7"))
-        self.gridLayout.addWidget(self.label_7, 6, 0, 1, 1)
-        self.lineEdit_7 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_7.setObjectName(_fromUtf8("lineEdit_7"))
-        self.gridLayout.addWidget(self.lineEdit_7, 6, 1, 1, 1)
-        self.label_25 = QtGui.QLabel(self.practice_frame)
-        self.label_25.setText(_fromUtf8(""))
-        self.label_25.setObjectName(_fromUtf8("label_25"))
-        self.gridLayout.addWidget(self.label_25, 6, 2, 1, 1)
-        self.label_8 = QtGui.QLabel(self.practice_frame)
-        self.label_8.setObjectName(_fromUtf8("label_8"))
-        self.gridLayout.addWidget(self.label_8, 7, 0, 1, 1)
-        self.lineEdit_8 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_8.setObjectName(_fromUtf8("lineEdit_8"))
-        self.gridLayout.addWidget(self.lineEdit_8, 7, 1, 1, 1)
-        self.label_26 = QtGui.QLabel(self.practice_frame)
-        self.label_26.setText(_fromUtf8(""))
-        self.label_26.setObjectName(_fromUtf8("label_26"))
-        self.gridLayout.addWidget(self.label_26, 7, 2, 1, 1)
-        self.label_9 = QtGui.QLabel(self.practice_frame)
-        self.label_9.setObjectName(_fromUtf8("label_9"))
-        self.gridLayout.addWidget(self.label_9, 8, 0, 1, 1)
-        self.lineEdit_9 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_9.setObjectName(_fromUtf8("lineEdit_9"))
-        self.gridLayout.addWidget(self.lineEdit_9, 8, 1, 1, 1)
-        self.label_24 = QtGui.QLabel(self.practice_frame)
-        self.label_24.setText(_fromUtf8(""))
-        self.label_24.setObjectName(_fromUtf8("label_24"))
-        self.gridLayout.addWidget(self.label_24, 8, 2, 1, 1)
-        self.label_10 = QtGui.QLabel(self.practice_frame)
-        self.label_10.setObjectName(_fromUtf8("label_10"))
-        self.gridLayout.addWidget(self.label_10, 9, 0, 1, 1)
-        self.lineEdit_10 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_10.setObjectName(_fromUtf8("lineEdit_10"))
-        self.gridLayout.addWidget(self.lineEdit_10, 9, 1, 1, 1)
-        self.label_21 = QtGui.QLabel(self.practice_frame)
-        self.label_21.setText(_fromUtf8(""))
-        self.label_21.setObjectName(_fromUtf8("label_21"))
-        self.gridLayout.addWidget(self.label_21, 9, 2, 1, 1)
-        self.label_11 = QtGui.QLabel(self.practice_frame)
-        self.label_11.setObjectName(_fromUtf8("label_11"))
-        self.gridLayout.addWidget(self.label_11, 10, 0, 1, 1)
-        self.lineEdit_11 = QtGui.QLineEdit(self.practice_frame)
-        self.lineEdit_11.setObjectName(_fromUtf8("lineEdit_11"))
-        self.gridLayout.addWidget(self.lineEdit_11, 10, 1, 1, 1)
-        self.label_20 = QtGui.QLabel(self.practice_frame)
-        self.label_20.setText(_fromUtf8(""))
-        self.label_20.setObjectName(_fromUtf8("label_20"))
-        self.gridLayout.addWidget(self.label_20, 10, 2, 1, 1)
-        self.verticalLayout_3.addWidget(self.practice_frame)
-        spacerItem1 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_3.addItem(spacerItem1)
-        self.tabWidget.addTab(self.tab, _fromUtf8(""))
-        self.tab_2 = QtGui.QWidget()
-        self.tab_2.setObjectName(_fromUtf8("tab_2"))
-        self.verticalLayout_2 = QtGui.QVBoxLayout(self.tab_2)
-        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
-        self.label_12 = QtGui.QLabel(self.tab_2)
-        self.label_12.setObjectName(_fromUtf8("label_12"))
-        self.verticalLayout_2.addWidget(self.label_12)
-        self.users_tableWidget = QtGui.QTableWidget(self.tab_2)
-        self.users_tableWidget.setAlternatingRowColors(True)
-        self.users_tableWidget.setSelectionMode(
-            QtGui.QAbstractItemView.SingleSelection)
-        self.users_tableWidget.setSelectionBehavior(
-            QtGui.QAbstractItemView.SelectRows)
-        self.users_tableWidget.setObjectName(_fromUtf8("users_tableWidget"))
-        self.users_tableWidget.setColumnCount(6)
-        self.users_tableWidget.setRowCount(0)
-        item = QtGui.QTableWidgetItem()
-        self.users_tableWidget.setHorizontalHeaderItem(0, item)
-        item = QtGui.QTableWidgetItem()
-        self.users_tableWidget.setHorizontalHeaderItem(1, item)
-        item = QtGui.QTableWidgetItem()
-        self.users_tableWidget.setHorizontalHeaderItem(2, item)
-        item = QtGui.QTableWidgetItem()
-        self.users_tableWidget.setHorizontalHeaderItem(3, item)
-        item = QtGui.QTableWidgetItem()
-        self.users_tableWidget.setHorizontalHeaderItem(4, item)
-        item = QtGui.QTableWidgetItem()
-        self.users_tableWidget.setHorizontalHeaderItem(5, item)
-        self.verticalLayout_2.addWidget(self.users_tableWidget)
-        self.frame_2 = QtGui.QFrame(self.tab_2)
-        self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame_2.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame_2.setObjectName(_fromUtf8("frame_2"))
-        self.horizontalLayout = QtGui.QHBoxLayout(self.frame_2)
-        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        self.verticalLayout_11 = QtGui.QVBoxLayout()
-        self.verticalLayout_11.setObjectName(_fromUtf8("verticalLayout_11"))
-        self.modifyUser_pushButton = QtGui.QPushButton(self.frame_2)
-        self.modifyUser_pushButton.setObjectName(
-            _fromUtf8("modifyUser_pushButton"))
-        self.verticalLayout_11.addWidget(self.modifyUser_pushButton)
-        self.horizontalLayout.addLayout(self.verticalLayout_11)
-        self.user_groupBox = QtGui.QGroupBox(self.frame_2)
-        self.user_groupBox.setObjectName(_fromUtf8("user_groupBox"))
-        self.gridLayout_8 = QtGui.QGridLayout(self.user_groupBox)
-        self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8"))
-        self.label_14 = QtGui.QLabel(self.user_groupBox)
-        self.label_14.setObjectName(_fromUtf8("label_14"))
-        self.gridLayout_8.addWidget(self.label_14, 0, 0, 1, 1)
-        self.userName_lineEdit = QtGui.QLineEdit(self.user_groupBox)
-        self.userName_lineEdit.setObjectName(_fromUtf8("userName_lineEdit"))
-        self.gridLayout_8.addWidget(self.userName_lineEdit, 0, 1, 1, 1)
-        self.label_13 = QtGui.QLabel(self.user_groupBox)
-        self.label_13.setObjectName(_fromUtf8("label_13"))
-        self.gridLayout_8.addWidget(self.label_13, 1, 0, 1, 1)
-        self.userInits_lineEdit = QtGui.QLineEdit(self.user_groupBox)
-        self.userInits_lineEdit.setObjectName(_fromUtf8("userInits_lineEdit"))
-        self.gridLayout_8.addWidget(self.userInits_lineEdit, 1, 1, 1, 1)
-        self.label_15 = QtGui.QLabel(self.user_groupBox)
-        self.label_15.setObjectName(_fromUtf8("label_15"))
-        self.gridLayout_8.addWidget(self.label_15, 2, 0, 1, 1)
-        self.userGroup_comboBox = QtGui.QComboBox(self.user_groupBox)
-        self.userGroup_comboBox.setObjectName(_fromUtf8("userGroup_comboBox"))
-        self.userGroup_comboBox.addItem(_fromUtf8(""))
-        self.userGroup_comboBox.addItem(_fromUtf8(""))
-        self.userGroup_comboBox.addItem(_fromUtf8(""))
-        self.userGroup_comboBox.addItem(_fromUtf8(""))
-        self.gridLayout_8.addWidget(self.userGroup_comboBox, 2, 1, 1, 1)
-        self.userActive_checkBox = QtGui.QCheckBox(self.user_groupBox)
-        self.userActive_checkBox.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.userActive_checkBox.setChecked(True)
-        self.userActive_checkBox.setObjectName(
-            _fromUtf8("userActive_checkBox"))
-        self.gridLayout_8.addWidget(self.userActive_checkBox, 2, 2, 1, 1)
-        self.user_date_label = QtGui.QLabel(self.user_groupBox)
-        self.user_date_label.setObjectName(_fromUtf8("user_date_label"))
-        self.gridLayout_8.addWidget(self.user_date_label, 3, 0, 1, 1)
-        self.user_dateEdit = QtGui.QDateEdit(self.user_groupBox)
-        self.user_dateEdit.setCalendarPopup(True)
-        self.user_dateEdit.setObjectName(_fromUtf8("user_dateEdit"))
-        self.gridLayout_8.addWidget(self.user_dateEdit, 3, 1, 1, 1)
-        self.horizontalLayout.addWidget(self.user_groupBox)
-        self.newUser_pushButton = QtGui.QPushButton(self.frame_2)
-        self.newUser_pushButton.setEnabled(True)
-        self.newUser_pushButton.setObjectName(_fromUtf8("newUser_pushButton"))
-        self.horizontalLayout.addWidget(self.newUser_pushButton)
-        self.verticalLayout_2.addWidget(self.frame_2)
-        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
-        self.tab_3 = QtGui.QWidget()
-        self.tab_3.setObjectName(_fromUtf8("tab_3"))
-        self.verticalLayout_5 = QtGui.QVBoxLayout(self.tab_3)
-        self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
-        self.label_33 = QtGui.QLabel(self.tab_3)
-        self.label_33.setWordWrap(True)
-        self.label_33.setObjectName(_fromUtf8("label_33"))
-        self.verticalLayout_5.addWidget(self.label_33)
-        self.tableWidget_2 = QtGui.QTableWidget(self.tab_3)
-        self.tableWidget_2.setObjectName(_fromUtf8("tableWidget_2"))
-        self.tableWidget_2.setColumnCount(4)
-        self.tableWidget_2.setRowCount(0)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_2.setHorizontalHeaderItem(0, item)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_2.setHorizontalHeaderItem(1, item)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_2.setHorizontalHeaderItem(2, item)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_2.setHorizontalHeaderItem(3, item)
-        self.verticalLayout_5.addWidget(self.tableWidget_2)
-        self.frame_3 = QtGui.QFrame(self.tab_3)
-        self.frame_3.setMinimumSize(QtCore.QSize(0, 200))
-        self.frame_3.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame_3.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame_3.setObjectName(_fromUtf8("frame_3"))
-        self.verticalLayout_7 = QtGui.QVBoxLayout(self.frame_3)
-        self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7"))
-        self.label_29 = QtGui.QLabel(self.frame_3)
-        self.label_29.setObjectName(_fromUtf8("label_29"))
-        self.verticalLayout_7.addWidget(self.label_29)
-        self.gridLayout_4 = QtGui.QGridLayout()
-        self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
-        self.label_30 = QtGui.QLabel(self.frame_3)
-        self.label_30.setObjectName(_fromUtf8("label_30"))
-        self.gridLayout_4.addWidget(self.label_30, 0, 0, 1, 1)
-        self.lineEdit_14 = QtGui.QLineEdit(self.frame_3)
-        self.lineEdit_14.setObjectName(_fromUtf8("lineEdit_14"))
-        self.gridLayout_4.addWidget(self.lineEdit_14, 0, 1, 1, 1)
-        self.label_31 = QtGui.QLabel(self.frame_3)
-        self.label_31.setObjectName(_fromUtf8("label_31"))
-        self.gridLayout_4.addWidget(self.label_31, 1, 0, 1, 1)
-        self.lineEdit_15 = QtGui.QLineEdit(self.frame_3)
-        self.lineEdit_15.setObjectName(_fromUtf8("lineEdit_15"))
-        self.gridLayout_4.addWidget(self.lineEdit_15, 1, 1, 1, 1)
-        self.label_45 = QtGui.QLabel(self.frame_3)
-        self.label_45.setObjectName(_fromUtf8("label_45"))
-        self.gridLayout_4.addWidget(self.label_45, 2, 0, 1, 1)
-        self.lineEdit_21 = QtGui.QLineEdit(self.frame_3)
-        self.lineEdit_21.setText(_fromUtf8(""))
-        self.lineEdit_21.setObjectName(_fromUtf8("lineEdit_21"))
-        self.gridLayout_4.addWidget(self.lineEdit_21, 2, 1, 1, 1)
-        self.verticalLayout_7.addLayout(self.gridLayout_4)
-        self.checkBox_2 = QtGui.QCheckBox(self.frame_3)
-        self.checkBox_2.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.checkBox_2.setChecked(True)
-        self.checkBox_2.setObjectName(_fromUtf8("checkBox_2"))
-        self.verticalLayout_7.addWidget(self.checkBox_2)
-        self.verticalLayout_5.addWidget(self.frame_3)
-        self.tabWidget.addTab(self.tab_3, _fromUtf8(""))
-        self.tab_4 = QtGui.QWidget()
-        self.tab_4.setObjectName(_fromUtf8("tab_4"))
-        self.verticalLayout_4 = QtGui.QVBoxLayout(self.tab_4)
-        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
-        self.label_38 = QtGui.QLabel(self.tab_4)
-        self.label_38.setObjectName(_fromUtf8("label_38"))
-        self.verticalLayout_4.addWidget(self.label_38)
-        self.tableWidget_3 = QtGui.QTableWidget(self.tab_4)
-        self.tableWidget_3.setObjectName(_fromUtf8("tableWidget_3"))
-        self.tableWidget_3.setColumnCount(4)
-        self.tableWidget_3.setRowCount(0)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_3.setHorizontalHeaderItem(0, item)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_3.setHorizontalHeaderItem(1, item)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_3.setHorizontalHeaderItem(2, item)
-        item = QtGui.QTableWidgetItem()
-        self.tableWidget_3.setHorizontalHeaderItem(3, item)
-        self.verticalLayout_4.addWidget(self.tableWidget_3)
-        self.frame_4 = QtGui.QFrame(self.tab_4)
-        self.frame_4.setMinimumSize(QtCore.QSize(0, 200))
-        self.frame_4.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame_4.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame_4.setObjectName(_fromUtf8("frame_4"))
-        self.verticalLayout_8 = QtGui.QVBoxLayout(self.frame_4)
-        self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8"))
-        self.label_32 = QtGui.QLabel(self.frame_4)
-        self.label_32.setObjectName(_fromUtf8("label_32"))
-        self.verticalLayout_8.addWidget(self.label_32)
-        self.gridLayout_5 = QtGui.QGridLayout()
-        self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
-        self.label_34 = QtGui.QLabel(self.frame_4)
-        self.label_34.setObjectName(_fromUtf8("label_34"))
-        self.gridLayout_5.addWidget(self.label_34, 0, 0, 1, 1)
-        self.lineEdit_16 = QtGui.QLineEdit(self.frame_4)
-        self.lineEdit_16.setObjectName(_fromUtf8("lineEdit_16"))
-        self.gridLayout_5.addWidget(self.lineEdit_16, 0, 1, 1, 1)
-        self.label_35 = QtGui.QLabel(self.frame_4)
-        self.label_35.setObjectName(_fromUtf8("label_35"))
-        self.gridLayout_5.addWidget(self.label_35, 1, 0, 1, 1)
-        self.lineEdit_17 = QtGui.QLineEdit(self.frame_4)
-        self.lineEdit_17.setObjectName(_fromUtf8("lineEdit_17"))
-        self.gridLayout_5.addWidget(self.lineEdit_17, 1, 1, 1, 1)
-        self.label_46 = QtGui.QLabel(self.frame_4)
-        self.label_46.setObjectName(_fromUtf8("label_46"))
-        self.gridLayout_5.addWidget(self.label_46, 2, 0, 1, 1)
-        self.lineEdit_22 = QtGui.QLineEdit(self.frame_4)
-        self.lineEdit_22.setText(_fromUtf8(""))
-        self.lineEdit_22.setObjectName(_fromUtf8("lineEdit_22"))
-        self.gridLayout_5.addWidget(self.lineEdit_22, 2, 1, 1, 1)
-        self.verticalLayout_8.addLayout(self.gridLayout_5)
-        self.checkBox_3 = QtGui.QCheckBox(self.frame_4)
-        self.checkBox_3.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.checkBox_3.setChecked(True)
-        self.checkBox_3.setObjectName(_fromUtf8("checkBox_3"))
-        self.verticalLayout_8.addWidget(self.checkBox_3)
-        self.verticalLayout_4.addWidget(self.frame_4)
-        self.tabWidget.addTab(self.tab_4, _fromUtf8(""))
-        self.tab_5 = QtGui.QWidget()
-        self.tab_5.setObjectName(_fromUtf8("tab_5"))
-        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.tab_5)
-        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
-        self.frame_6 = QtGui.QFrame(self.tab_5)
-        self.frame_6.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame_6.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame_6.setObjectName(_fromUtf8("frame_6"))
-        self.gridLayout_7 = QtGui.QGridLayout(self.frame_6)
-        self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7"))
-        self.checkBox_7 = QtGui.QCheckBox(self.frame_6)
-        self.checkBox_7.setChecked(True)
-        self.checkBox_7.setObjectName(_fromUtf8("checkBox_7"))
-        self.gridLayout_7.addWidget(self.checkBox_7, 0, 0, 1, 1)
-        self.timeEdit = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit.setObjectName(_fromUtf8("timeEdit"))
-        self.gridLayout_7.addWidget(self.timeEdit, 0, 1, 1, 1)
-        self.timeEdit_2 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_2.setObjectName(_fromUtf8("timeEdit_2"))
-        self.gridLayout_7.addWidget(self.timeEdit_2, 0, 2, 1, 1)
-        self.checkBox_8 = QtGui.QCheckBox(self.frame_6)
-        self.checkBox_8.setChecked(True)
-        self.checkBox_8.setObjectName(_fromUtf8("checkBox_8"))
-        self.gridLayout_7.addWidget(self.checkBox_8, 1, 0, 1, 1)
-        self.timeEdit_3 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_3.setObjectName(_fromUtf8("timeEdit_3"))
-        self.gridLayout_7.addWidget(self.timeEdit_3, 1, 1, 1, 1)
-        self.timeEdit_4 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_4.setObjectName(_fromUtf8("timeEdit_4"))
-        self.gridLayout_7.addWidget(self.timeEdit_4, 1, 2, 1, 1)
-        self.checkBox_9 = QtGui.QCheckBox(self.frame_6)
-        self.checkBox_9.setChecked(True)
-        self.checkBox_9.setObjectName(_fromUtf8("checkBox_9"))
-        self.gridLayout_7.addWidget(self.checkBox_9, 2, 0, 1, 1)
-        self.timeEdit_5 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_5.setObjectName(_fromUtf8("timeEdit_5"))
-        self.gridLayout_7.addWidget(self.timeEdit_5, 2, 1, 1, 1)
-        self.timeEdit_6 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_6.setObjectName(_fromUtf8("timeEdit_6"))
-        self.gridLayout_7.addWidget(self.timeEdit_6, 2, 2, 1, 1)
-        self.checkBox_10 = QtGui.QCheckBox(self.frame_6)
-        self.checkBox_10.setChecked(True)
-        self.checkBox_10.setObjectName(_fromUtf8("checkBox_10"))
-        self.gridLayout_7.addWidget(self.checkBox_10, 3, 0, 1, 1)
-        self.timeEdit_7 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_7.setObjectName(_fromUtf8("timeEdit_7"))
-        self.gridLayout_7.addWidget(self.timeEdit_7, 3, 1, 1, 1)
-        self.timeEdit_8 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_8.setObjectName(_fromUtf8("timeEdit_8"))
-        self.gridLayout_7.addWidget(self.timeEdit_8, 3, 2, 1, 1)
-        self.checkBox_11 = QtGui.QCheckBox(self.frame_6)
-        self.checkBox_11.setChecked(True)
-        self.checkBox_11.setObjectName(_fromUtf8("checkBox_11"))
-        self.gridLayout_7.addWidget(self.checkBox_11, 4, 0, 1, 1)
-        self.timeEdit_10 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_10.setObjectName(_fromUtf8("timeEdit_10"))
-        self.gridLayout_7.addWidget(self.timeEdit_10, 4, 1, 1, 1)
-        self.timeEdit_11 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_11.setObjectName(_fromUtf8("timeEdit_11"))
-        self.gridLayout_7.addWidget(self.timeEdit_11, 4, 2, 1, 1)
-        self.checkBox_12 = QtGui.QCheckBox(self.frame_6)
-        self.checkBox_12.setObjectName(_fromUtf8("checkBox_12"))
-        self.gridLayout_7.addWidget(self.checkBox_12, 5, 0, 1, 1)
-        self.timeEdit_12 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_12.setObjectName(_fromUtf8("timeEdit_12"))
-        self.gridLayout_7.addWidget(self.timeEdit_12, 5, 1, 1, 1)
-        self.timeEdit_9 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_9.setObjectName(_fromUtf8("timeEdit_9"))
-        self.gridLayout_7.addWidget(self.timeEdit_9, 5, 2, 1, 1)
-        self.checkBox_13 = QtGui.QCheckBox(self.frame_6)
-        self.checkBox_13.setObjectName(_fromUtf8("checkBox_13"))
-        self.gridLayout_7.addWidget(self.checkBox_13, 6, 0, 1, 1)
-        self.timeEdit_13 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_13.setObjectName(_fromUtf8("timeEdit_13"))
-        self.gridLayout_7.addWidget(self.timeEdit_13, 6, 1, 1, 1)
-        self.timeEdit_14 = QtGui.QTimeEdit(self.frame_6)
-        self.timeEdit_14.setObjectName(_fromUtf8("timeEdit_14"))
-        self.gridLayout_7.addWidget(self.timeEdit_14, 6, 2, 1, 1)
-        self.horizontalLayout_2.addWidget(self.frame_6)
-        self.tabWidget.addTab(self.tab_5, _fromUtf8(""))
-        self.tab_7 = QtGui.QWidget()
-        self.tab_7.setObjectName(_fromUtf8("tab_7"))
-        self.verticalLayout_10 = QtGui.QVBoxLayout(self.tab_7)
-        self.verticalLayout_10.setObjectName(_fromUtf8("verticalLayout_10"))
-        self.tabWidget.addTab(self.tab_7, _fromUtf8(""))
-        self.verticalLayout.addWidget(self.tabWidget)
-        MainWindow.setCentralWidget(self.centralwidget)
-        self.menubar = QtGui.QMenuBar(MainWindow)
-        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
-        self.menubar.setObjectName(_fromUtf8("menubar"))
-        self.menuFile = QtGui.QMenu(self.menubar)
-        self.menuFile.setObjectName(_fromUtf8("menuFile"))
-        MainWindow.setMenuBar(self.menubar)
-        self.statusbar = QtGui.QStatusBar(MainWindow)
-        self.statusbar.setObjectName(_fromUtf8("statusbar"))
-        MainWindow.setStatusBar(self.statusbar)
-        self.actionLoad_Template = QtGui.QAction(MainWindow)
-        self.actionLoad_Template.setObjectName(
-            _fromUtf8("actionLoad_Template"))
-        self.action_Save_Template = QtGui.QAction(MainWindow)
-        self.action_Save_Template.setObjectName(
-            _fromUtf8("action_Save_Template"))
-        self.menuFile.addAction(self.actionLoad_Template)
-        self.menuFile.addAction(self.action_Save_Template)
-        self.menubar.addAction(self.menuFile.menuAction())
-
-        self.retranslateUi(MainWindow)
-        self.tabWidget.setCurrentIndex(0)
-        QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
-    def retranslateUi(self, MainWindow):
-        MainWindow.setWindowTitle(_("OpenMolar - database wizard"))
-        self.label_17.setText(_("What do you want to do?"))
-        self.modifydb_radioButton.setText(
-            _("Modify an existing openmolar database"))
-        self.blankdb_radioButton.setText(
-            _("Create a New database from scratch"))
-        self.newdb_template_radioButton.setText(
-            _("Create a New database (from a known template)"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_8),
-            _("Start"))
-        self.label.setText(_("Practice Name"))
-        self.label_18.setText(_("Used in receipts, appointment cards etc."))
-        self.label_2.setText(_("Address Line 1"))
-        self.label_3.setText(_("Address Line 2"))
-        self.label_4.setText(_("Address Line 3"))
-        self.label_5.setText(_("Town"))
-        self.label_6.setText(_("County"))
-        self.label_7.setText(_("Postcode / Zip"))
-        self.label_8.setText(_("Telephone"))
-        self.label_9.setText(_("Fax"))
-        self.label_10.setText(_("Website"))
-        self.label_11.setText(_("Email"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab),
-            _("Practice Details"))
-        self.label_12.setText(
-            _("The Following users can login to the application"))
-        item = self.users_tableWidget.horizontalHeaderItem(0)
-        item.setText(_("Id"))
-        item = self.users_tableWidget.horizontalHeaderItem(1)
-        item.setText(_("Initials"))
-        item = self.users_tableWidget.horizontalHeaderItem(2)
-        item.setText(_("Name"))
-        item = self.users_tableWidget.horizontalHeaderItem(3)
-        item.setText(_("User Group"))
-        item = self.users_tableWidget.horizontalHeaderItem(4)
-        item.setText(_("Active?"))
-        item = self.users_tableWidget.horizontalHeaderItem(5)
-        item.setText(_("DeActivation Date"))
-        self.modifyUser_pushButton.setText(_("Modify Selected User"))
-        self.user_groupBox.setTitle(_("New User Details"))
-        self.label_14.setText(_("Name"))
-        self.label_13.setText(_("Initials"))
-        self.label_15.setText(_("User Group"))
-        self.userGroup_comboBox.setItemText(0, _("Standard User"))
-        self.userGroup_comboBox.setItemText(1, _("Dentist"))
-        self.userGroup_comboBox.setItemText(2, _("Hygienist"))
-        self.userGroup_comboBox.setItemText(3, _("Receptionist"))
-        self.userActive_checkBox.setText(_("Active User"))
-        self.user_date_label.setText(_("DeActivation Date"))
-        self.newUser_pushButton.setText(_("Add a New User"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_2),
-            _("Users"))
-        self.label_33.setText(_("The Following dentists have notes in this database\n"
-                                "(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "))
-        item = self.tableWidget_2.horizontalHeaderItem(0)
-        item.setText(_("Initials"))
-        item = self.tableWidget_2.horizontalHeaderItem(1)
-        item.setText(_("Name"))
-        item = self.tableWidget_2.horizontalHeaderItem(2)
-        item.setText(_("User Group"))
-        item = self.tableWidget_2.horizontalHeaderItem(3)
-        item.setText(_("Active?"))
-        self.label_29.setText(_("Add a Dentist"))
-        self.label_30.setText(_("Initials"))
-        self.label_31.setText(_("Name"))
-        self.label_45.setText(_("Registration"))
-        self.checkBox_2.setText(_("Active Appointment Book"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_3),
-            _("Dentists"))
-        self.label_38.setText(_("The Following hygienists have notes in this database\n"
-                                "(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "))
-        item = self.tableWidget_3.horizontalHeaderItem(0)
-        item.setText(_("Initials"))
-        item = self.tableWidget_3.horizontalHeaderItem(1)
-        item.setText(_("Name"))
-        item = self.tableWidget_3.horizontalHeaderItem(2)
-        item.setText(_("User Group"))
-        item = self.tableWidget_3.horizontalHeaderItem(3)
-        item.setText(_("Active?"))
-        self.label_32.setText(_("Add a Dentist"))
-        self.label_34.setText(_("Initials"))
-        self.label_35.setText(_("Name"))
-        self.label_46.setText(_("Registration"))
-        self.checkBox_3.setText(_("Active Appointment Book"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_4),
-            _("Hygienists"))
-        self.checkBox_7.setText(_("Monday"))
-        self.checkBox_8.setText(_("Tuesday"))
-        self.checkBox_9.setText(_("Wednesday"))
-        self.checkBox_10.setText(_("Thursday"))
-        self.checkBox_11.setText(_("Friday"))
-        self.checkBox_12.setText(_("Saturday"))
-        self.checkBox_13.setText(_("Sunday"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_5),
-            _("Practice Hours"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_7),
-            _("View XML"))
-        self.menuFile.setTitle(_("File"))
-        self.actionLoad_Template.setText(_("L&oad Template"))
-        self.action_Save_Template.setText(_("&Save Template"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    MainWindow = QtGui.QMainWindow()
-    ui = Ui_MainWindow()
-    ui.setupUi(MainWindow)
-    MainWindow.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_main.py b/src/openmolar/qt4gui/compiled_uis/Ui_main.py
index 8141858..fbaae2e 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_main.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_main.py
@@ -3,8 +3,8 @@
 
 # Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/main.ui'
 #
-# Created: Thu May  1 15:04:57 2014
-#      by: PyQt4 UI code generator 4.10.3
+# Created: Mon Jun 23 13:41:48 2014
+#      by: PyQt4 UI code generator 4.11
 #
 # WARNING! All changes made in this file will be lost!
 
@@ -283,7 +283,7 @@ class Ui_MainWindow(object):
         self.scrollArea_4.setObjectName(_fromUtf8("scrollArea_4"))
         self.scrollAreaWidgetContents_7 = QtGui.QWidget()
         self.scrollAreaWidgetContents_7.setGeometry(
-            QtCore.QRect(0, 0, 469, 644))
+            QtCore.QRect(0, 0, 743, 644))
         self.scrollAreaWidgetContents_7.setObjectName(
             _fromUtf8("scrollAreaWidgetContents_7"))
         self.verticalLayout_6 = QtGui.QVBoxLayout(
@@ -919,7 +919,7 @@ class Ui_MainWindow(object):
         self.scrollArea_5.setObjectName(_fromUtf8("scrollArea_5"))
         self.scrollAreaWidgetContents_8 = QtGui.QWidget()
         self.scrollAreaWidgetContents_8.setGeometry(
-            QtCore.QRect(0, 0, 423, 421))
+            QtCore.QRect(0, 0, 725, 421))
         self.scrollAreaWidgetContents_8.setObjectName(
             _fromUtf8("scrollAreaWidgetContents_8"))
         self.gridLayout = QtGui.QGridLayout(self.scrollAreaWidgetContents_8)
@@ -1112,7 +1112,7 @@ class Ui_MainWindow(object):
         self.scrollArea_2.setObjectName(_fromUtf8("scrollArea_2"))
         self.scrollAreaWidgetContents_5 = QtGui.QWidget()
         self.scrollAreaWidgetContents_5.setGeometry(
-            QtCore.QRect(0, 0, 283, 470))
+            QtCore.QRect(0, 0, 745, 470))
         self.scrollAreaWidgetContents_5.setObjectName(
             _fromUtf8("scrollAreaWidgetContents_5"))
         self.horizontalLayout_26 = QtGui.QHBoxLayout(
@@ -1500,8 +1500,6 @@ class Ui_MainWindow(object):
         self.chartsTableWidget.setSelectionBehavior(
             QtGui.QAbstractItemView.SelectItems)
         self.chartsTableWidget.setObjectName(_fromUtf8("chartsTableWidget"))
-        self.chartsTableWidget.setColumnCount(0)
-        self.chartsTableWidget.setRowCount(0)
         self.horizontalLayout_4.addWidget(self.chartsTableWidget)
         self.stackedWidget.addWidget(self.table)
         self.charts = QtGui.QWidget()
@@ -1654,7 +1652,7 @@ class Ui_MainWindow(object):
             _fromUtf8("estimate_scrollArea"))
         self.scrollAreaWidgetContents_11 = QtGui.QWidget()
         self.scrollAreaWidgetContents_11.setGeometry(
-            QtCore.QRect(0, 0, 98, 200))
+            QtCore.QRect(0, 0, 532, 375))
         self.scrollAreaWidgetContents_11.setObjectName(
             _fromUtf8("scrollAreaWidgetContents_11"))
         self.horizontalLayout_19 = QtGui.QHBoxLayout(
@@ -1677,7 +1675,7 @@ class Ui_MainWindow(object):
         self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
         self.scrollAreaWidgetContents_4 = QtGui.QWidget()
         self.scrollAreaWidgetContents_4.setGeometry(
-            QtCore.QRect(0, 0, 139, 212))
+            QtCore.QRect(0, 0, 198, 375))
         self.scrollAreaWidgetContents_4.setObjectName(
             _fromUtf8("scrollAreaWidgetContents_4"))
         self.verticalLayout_9 = QtGui.QVBoxLayout(
@@ -1730,139 +1728,18 @@ class Ui_MainWindow(object):
         self.tab_patient_perio = QtGui.QWidget()
         self.tab_patient_perio.setObjectName(_fromUtf8("tab_patient_perio"))
         self.horizontalLayout_8 = QtGui.QHBoxLayout(self.tab_patient_perio)
+        self.horizontalLayout_8.setSpacing(0)
+        self.horizontalLayout_8.setMargin(0)
         self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8"))
-        self.perioCharts_scrollArea = QtGui.QScrollArea(self.tab_patient_perio)
-        self.perioCharts_scrollArea.setFrameShape(QtGui.QFrame.NoFrame)
-        self.perioCharts_scrollArea.setWidgetResizable(True)
-        self.perioCharts_scrollArea.setObjectName(
-            _fromUtf8("perioCharts_scrollArea"))
-        self.scrollAreaWidgetContents_6 = QtGui.QWidget()
-        self.scrollAreaWidgetContents_6.setGeometry(
-            QtCore.QRect(0, 0, 252, 374))
-        self.scrollAreaWidgetContents_6.setObjectName(
-            _fromUtf8("scrollAreaWidgetContents_6"))
-        self.gridLayout_15 = QtGui.QGridLayout(self.scrollAreaWidgetContents_6)
-        self.gridLayout_15.setObjectName(_fromUtf8("gridLayout_15"))
-        self.perioChart_frame = QtGui.QFrame(self.scrollAreaWidgetContents_6)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Expanding,
-            QtGui.QSizePolicy.Preferred)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.perioChart_frame.sizePolicy(
-            ).hasHeightForWidth(
-            ))
-        self.perioChart_frame.setSizePolicy(sizePolicy)
-        self.perioChart_frame.setMinimumSize(QtCore.QSize(0, 140))
-        self.perioChart_frame.setMaximumSize(QtCore.QSize(16777215, 140))
-        self.perioChart_frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.perioChart_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.perioChart_frame.setObjectName(_fromUtf8("perioChart_frame"))
-        self.gridLayout_15.addWidget(self.perioChart_frame, 0, 0, 1, 3)
-        self.perioChartData_scrollArea = QtGui.QScrollArea(
-            self.scrollAreaWidgetContents_6)
-        self.perioChartData_scrollArea.setMinimumSize(QtCore.QSize(0, 0))
-        self.perioChartData_scrollArea.setWidgetResizable(True)
-        self.perioChartData_scrollArea.setObjectName(
-            _fromUtf8("perioChartData_scrollArea"))
-        self.scrollAreaWidgetContents_10 = QtGui.QWidget()
-        self.scrollAreaWidgetContents_10.setGeometry(
-            QtCore.QRect(0, 0, 918, 1218))
-        self.scrollAreaWidgetContents_10.setObjectName(
-            _fromUtf8("scrollAreaWidgetContents_10"))
-        self.horizontalLayout_15 = QtGui.QHBoxLayout(
-            self.scrollAreaWidgetContents_10)
-        self.horizontalLayout_15.setObjectName(
-            _fromUtf8("horizontalLayout_15"))
-        self.perioChartData_frame = QtGui.QFrame(
-            self.scrollAreaWidgetContents_10)
-        self.perioChartData_frame.setMinimumSize(QtCore.QSize(900, 1200))
-        self.perioChartData_frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.perioChartData_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.perioChartData_frame.setObjectName(
-            _fromUtf8("perioChartData_frame"))
-        self.horizontalLayout_15.addWidget(self.perioChartData_frame)
-        self.perioChartData_scrollArea.setWidget(
-            self.scrollAreaWidgetContents_10)
-        self.gridLayout_15.addWidget(
-            self.perioChartData_scrollArea,
-            1,
-            0,
-            1,
-            3)
-        self.groupBox_11 = QtGui.QGroupBox(self.scrollAreaWidgetContents_6)
-        self.groupBox_11.setObjectName(_fromUtf8("groupBox_11"))
-        self.verticalLayout_16 = QtGui.QVBoxLayout(self.groupBox_11)
-        self.verticalLayout_16.setObjectName(_fromUtf8("verticalLayout_16"))
-        self.label_41 = QtGui.QLabel(self.groupBox_11)
-        font = QtGui.QFont()
-        font.setPointSize(12)
-        self.label_41.setFont(font)
-        self.label_41.setAlignment(QtCore.Qt.AlignCenter)
-        self.label_41.setObjectName(_fromUtf8("label_41"))
-        self.verticalLayout_16.addWidget(self.label_41)
-        self.perioChartDateComboBox = QtGui.QComboBox(self.groupBox_11)
-        self.perioChartDateComboBox.setObjectName(
-            _fromUtf8("perioChartDateComboBox"))
-        self.verticalLayout_16.addWidget(self.perioChartDateComboBox)
-        self.newPerioChartPushButton = QtGui.QPushButton(self.groupBox_11)
-        self.newPerioChartPushButton.setAutoDefault(False)
-        self.newPerioChartPushButton.setObjectName(
-            _fromUtf8("newPerioChartPushButton"))
-        self.verticalLayout_16.addWidget(self.newPerioChartPushButton)
-        self.gridLayout_15.addWidget(self.groupBox_11, 2, 0, 1, 1)
-        self.perioToothProps_frame = QtGui.QFrame(
-            self.scrollAreaWidgetContents_6)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Expanding,
-            QtGui.QSizePolicy.Preferred)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.perioToothProps_frame.sizePolicy(
-            ).hasHeightForWidth(
-            ))
-        self.perioToothProps_frame.setSizePolicy(sizePolicy)
-        self.perioToothProps_frame.setMinimumSize(QtCore.QSize(0, 0))
-        self.perioToothProps_frame.setMaximumSize(
-            QtCore.QSize(16777215, 16777215))
-        self.perioToothProps_frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.perioToothProps_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.perioToothProps_frame.setObjectName(
-            _fromUtf8("perioToothProps_frame"))
-        self.gridLayout_15.addWidget(self.perioToothProps_frame, 2, 1, 1, 1)
-        self.groupBox_12 = QtGui.QGroupBox(self.scrollAreaWidgetContents_6)
-        self.groupBox_12.setMaximumSize(QtCore.QSize(120, 16777215))
-        self.groupBox_12.setObjectName(_fromUtf8("groupBox_12"))
-        self.verticalLayout_15 = QtGui.QVBoxLayout(self.groupBox_12)
-        self.verticalLayout_15.setObjectName(_fromUtf8("verticalLayout_15"))
-        self.bpe_textBrowser_2 = QtGui.QTextBrowser(self.groupBox_12)
-        self.bpe_textBrowser_2.setMinimumSize(QtCore.QSize(0, 0))
-        self.bpe_textBrowser_2.setMaximumSize(QtCore.QSize(16777215, 65))
-        self.bpe_textBrowser_2.setVerticalScrollBarPolicy(
-            QtCore.Qt.ScrollBarAlwaysOff)
-        self.bpe_textBrowser_2.setHorizontalScrollBarPolicy(
-            QtCore.Qt.ScrollBarAlwaysOff)
-        self.bpe_textBrowser_2.setObjectName(_fromUtf8("bpe_textBrowser_2"))
-        self.verticalLayout_15.addWidget(self.bpe_textBrowser_2)
-        self.bpeDateComboBox = QtGui.QComboBox(self.groupBox_12)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.bpeDateComboBox.sizePolicy().hasHeightForWidth())
-        self.bpeDateComboBox.setSizePolicy(sizePolicy)
-        self.bpeDateComboBox.setMinimumSize(QtCore.QSize(0, 0))
-        self.bpeDateComboBox.setSizeAdjustPolicy(
-            QtGui.QComboBox.AdjustToContentsOnFirstShow)
-        self.bpeDateComboBox.setObjectName(_fromUtf8("bpeDateComboBox"))
-        self.verticalLayout_15.addWidget(self.bpeDateComboBox)
-        self.gridLayout_15.addWidget(self.groupBox_12, 2, 2, 1, 1)
-        self.perioCharts_scrollArea.setWidget(self.scrollAreaWidgetContents_6)
-        self.horizontalLayout_8.addWidget(self.perioCharts_scrollArea)
+        self.perio_scrollArea = QtGui.QScrollArea(self.tab_patient_perio)
+        self.perio_scrollArea.setWidgetResizable(True)
+        self.perio_scrollArea.setObjectName(_fromUtf8("perio_scrollArea"))
+        self.scrollAreaWidgetContents = QtGui.QWidget()
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 756, 393))
+        self.scrollAreaWidgetContents.setObjectName(
+            _fromUtf8("scrollAreaWidgetContents"))
+        self.perio_scrollArea.setWidget(self.scrollAreaWidgetContents)
+        self.horizontalLayout_8.addWidget(self.perio_scrollArea)
         self.tabWidget.addTab(self.tab_patient_perio, _fromUtf8(""))
         self.tab_patient_history = QtGui.QWidget()
         self.tab_patient_history.setObjectName(
@@ -1892,10 +1769,6 @@ class Ui_MainWindow(object):
         self.pastTreatment_pushButton.setObjectName(
             _fromUtf8("pastTreatment_pushButton"))
         self.verticalLayout_25.addWidget(self.pastTreatment_pushButton)
-        self.past_course_estimates_pushButton = QtGui.QPushButton(self.frame_3)
-        self.past_course_estimates_pushButton.setObjectName(
-            _fromUtf8("past_course_estimates_pushButton"))
-        self.verticalLayout_25.addWidget(self.past_course_estimates_pushButton)
         self.pastCourses_pushButton = QtGui.QPushButton(self.frame_3)
         self.pastCourses_pushButton.setObjectName(
             _fromUtf8("pastCourses_pushButton"))
@@ -1918,21 +1791,6 @@ class Ui_MainWindow(object):
         self.memo_history_pushButton.setObjectName(
             _fromUtf8("memo_history_pushButton"))
         self.verticalLayout_25.addWidget(self.memo_history_pushButton)
-        self.historyPrint_pushButton = QtGui.QPushButton(self.frame_3)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.historyPrint_pushButton.sizePolicy(
-            ).hasHeightForWidth(
-            ))
-        self.historyPrint_pushButton.setSizePolicy(sizePolicy)
-        self.historyPrint_pushButton.setIcon(icon10)
-        self.historyPrint_pushButton.setObjectName(
-            _fromUtf8("historyPrint_pushButton"))
-        self.verticalLayout_25.addWidget(self.historyPrint_pushButton)
         spacerItem15 = QtGui.QSpacerItem(
             20,
             123,
@@ -1963,6 +1821,33 @@ class Ui_MainWindow(object):
         self.ptAtts_checkBox = QtGui.QCheckBox(self.frame_3)
         self.ptAtts_checkBox.setObjectName(_fromUtf8("ptAtts_checkBox"))
         self.verticalLayout_25.addWidget(self.ptAtts_checkBox)
+        spacerItem16 = QtGui.QSpacerItem(
+            20,
+            40,
+            QtGui.QSizePolicy.Minimum,
+            QtGui.QSizePolicy.Expanding)
+        self.verticalLayout_25.addItem(spacerItem16)
+        spacerItem17 = QtGui.QSpacerItem(
+            20,
+            40,
+            QtGui.QSizePolicy.Minimum,
+            QtGui.QSizePolicy.Expanding)
+        self.verticalLayout_25.addItem(spacerItem17)
+        self.historyPrint_pushButton = QtGui.QPushButton(self.frame_3)
+        sizePolicy = QtGui.QSizePolicy(
+            QtGui.QSizePolicy.Preferred,
+            QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(
+            self.historyPrint_pushButton.sizePolicy(
+            ).hasHeightForWidth(
+            ))
+        self.historyPrint_pushButton.setSizePolicy(sizePolicy)
+        self.historyPrint_pushButton.setIcon(icon10)
+        self.historyPrint_pushButton.setObjectName(
+            _fromUtf8("historyPrint_pushButton"))
+        self.verticalLayout_25.addWidget(self.historyPrint_pushButton)
         self.horizontalLayout_29.addWidget(self.frame_3)
         self.tabWidget.addTab(self.tab_patient_history, _fromUtf8(""))
         self.new_notes_frame = QtGui.QFrame(self.splitter_patient)
@@ -2225,12 +2110,12 @@ class Ui_MainWindow(object):
         self.cashbookDentComboBox.setObjectName(
             _fromUtf8("cashbookDentComboBox"))
         self.gridLayout_5.addWidget(self.cashbookDentComboBox, 1, 2, 1, 1)
-        spacerItem16 = QtGui.QSpacerItem(
+        spacerItem18 = QtGui.QSpacerItem(
             389,
             20,
             QtGui.QSizePolicy.Expanding,
             QtGui.QSizePolicy.Minimum)
-        self.gridLayout_5.addItem(spacerItem16, 1, 5, 1, 1)
+        self.gridLayout_5.addItem(spacerItem18, 1, 5, 1, 1)
         self.all_payments_radioButton = QtGui.QRadioButton(self.tab_cashbook)
         self.all_payments_radioButton.setChecked(True)
         self.all_payments_radioButton.setObjectName(
@@ -2441,12 +2326,12 @@ class Ui_MainWindow(object):
             _fromUtf8("loadAccountsTable_pushButton"))
         self.horizontalLayout_28.addWidget(self.loadAccountsTable_pushButton)
         self.gridLayout_9.addLayout(self.horizontalLayout_28, 0, 0, 1, 1)
-        spacerItem17 = QtGui.QSpacerItem(
+        spacerItem19 = QtGui.QSpacerItem(
             206,
             20,
             QtGui.QSizePolicy.Expanding,
             QtGui.QSizePolicy.Minimum)
-        self.gridLayout_9.addItem(spacerItem17, 0, 1, 1, 1)
+        self.gridLayout_9.addItem(spacerItem19, 0, 1, 1, 1)
         self.printAccountsTable_pushButton = QtGui.QPushButton(
             self.tab_accounts)
         self.printAccountsTable_pushButton.setIcon(icon10)
@@ -2478,15 +2363,13 @@ class Ui_MainWindow(object):
             QtGui.QAbstractItemView.SelectRows)
         self.accounts_tableWidget.setObjectName(
             _fromUtf8("accounts_tableWidget"))
-        self.accounts_tableWidget.setColumnCount(0)
-        self.accounts_tableWidget.setRowCount(0)
         self.gridLayout_9.addWidget(self.accounts_tableWidget, 1, 0, 1, 5)
-        spacerItem18 = QtGui.QSpacerItem(
+        spacerItem20 = QtGui.QSpacerItem(
             746,
             20,
             QtGui.QSizePolicy.Expanding,
             QtGui.QSizePolicy.Minimum)
-        self.gridLayout_9.addItem(spacerItem18, 2, 0, 1, 2)
+        self.gridLayout_9.addItem(spacerItem20, 2, 0, 1, 2)
         self.label_43 = QtGui.QLabel(self.tab_accounts)
         self.label_43.setObjectName(_fromUtf8("label_43"))
         self.gridLayout_9.addWidget(self.label_43, 2, 2, 1, 1)
@@ -2555,12 +2438,12 @@ class Ui_MainWindow(object):
             4,
             1,
             1)
-        spacerItem19 = QtGui.QSpacerItem(
+        spacerItem21 = QtGui.QSpacerItem(
             40,
             20,
             QtGui.QSizePolicy.Expanding,
             QtGui.QSizePolicy.Minimum)
-        self.gridLayout_10.addItem(spacerItem19, 1, 1, 1, 1)
+        self.gridLayout_10.addItem(spacerItem21, 1, 1, 1, 1)
         self.main_tabWidget.addTab(self.tab_bulk_mail, _fromUtf8(""))
         self.tab_feescales = QtGui.QWidget()
         self.tab_feescales.setObjectName(_fromUtf8("tab_feescales"))
@@ -2597,12 +2480,12 @@ class Ui_MainWindow(object):
         self.chooseFeescale_comboBox.setObjectName(
             _fromUtf8("chooseFeescale_comboBox"))
         self.verticalLayout_10.addWidget(self.chooseFeescale_comboBox)
-        spacerItem20 = QtGui.QSpacerItem(
+        spacerItem22 = QtGui.QSpacerItem(
             20,
             40,
             QtGui.QSizePolicy.Minimum,
             QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_10.addItem(spacerItem20)
+        self.verticalLayout_10.addItem(spacerItem22)
         self.frame_6 = QtGui.QFrame(self.frame_5)
         self.frame_6.setEnabled(True)
         self.frame_6.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -2660,12 +2543,12 @@ class Ui_MainWindow(object):
             _fromUtf8("feesearch_results_label"))
         self.gridLayout_16.addWidget(self.feesearch_results_label, 4, 0, 1, 2)
         self.verticalLayout_10.addWidget(self.frame_6)
-        spacerItem21 = QtGui.QSpacerItem(
+        spacerItem23 = QtGui.QSpacerItem(
             20,
             40,
             QtGui.QSizePolicy.Minimum,
             QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_10.addItem(spacerItem21)
+        self.verticalLayout_10.addItem(spacerItem23)
         self.hide_rare_feescale_codes_checkBox = QtGui.QCheckBox(self.frame_5)
         self.hide_rare_feescale_codes_checkBox.setChecked(True)
         self.hide_rare_feescale_codes_checkBox.setObjectName(
@@ -2683,12 +2566,12 @@ class Ui_MainWindow(object):
         self.feeCompress_radioButton.setObjectName(
             _fromUtf8("feeCompress_radioButton"))
         self.verticalLayout_10.addWidget(self.feeCompress_radioButton)
-        spacerItem22 = QtGui.QSpacerItem(
+        spacerItem24 = QtGui.QSpacerItem(
             20,
             40,
             QtGui.QSizePolicy.Minimum,
             QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_10.addItem(spacerItem22)
+        self.verticalLayout_10.addItem(spacerItem24)
         self.groupBox = QtGui.QGroupBox(self.frame_5)
         self.groupBox.setObjectName(_fromUtf8("groupBox"))
         self.verticalLayout_13 = QtGui.QVBoxLayout(self.groupBox)
@@ -2701,12 +2584,12 @@ class Ui_MainWindow(object):
             _fromUtf8("documents_pushButton"))
         self.verticalLayout_13.addWidget(self.documents_pushButton)
         self.verticalLayout_10.addWidget(self.groupBox)
-        spacerItem23 = QtGui.QSpacerItem(
+        spacerItem25 = QtGui.QSpacerItem(
             20,
             40,
             QtGui.QSizePolicy.Minimum,
             QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_10.addItem(spacerItem23)
+        self.verticalLayout_10.addItem(spacerItem25)
         self.feeadjuster_groupBox = QtGui.QGroupBox(self.frame_5)
         self.feeadjuster_groupBox.setEnabled(True)
         self.feeadjuster_groupBox.setToolTip(_fromUtf8(""))
@@ -2823,12 +2706,12 @@ class Ui_MainWindow(object):
         self.feeSearch_lineEdit_2.setObjectName(
             _fromUtf8("feeSearch_lineEdit_2"))
         self.gridLayout_30.addWidget(self.feeSearch_lineEdit_2, 1, 0, 1, 2)
-        spacerItem24 = QtGui.QSpacerItem(
+        spacerItem26 = QtGui.QSpacerItem(
             67,
             20,
             QtGui.QSizePolicy.Expanding,
             QtGui.QSizePolicy.Minimum)
-        self.gridLayout_30.addItem(spacerItem24, 2, 0, 1, 1)
+        self.gridLayout_30.addItem(spacerItem26, 2, 0, 1, 1)
         self.feeSearch_pushButton_2 = QtGui.QPushButton(self.frame_9)
         self.feeSearch_pushButton_2.setEnabled(False)
         sizePolicy = QtGui.QSizePolicy(
@@ -2953,8 +2836,12 @@ class Ui_MainWindow(object):
         self.menuCashbook.setObjectName(_fromUtf8("menuCashbook"))
         self.menuDaybook = QtGui.QMenu(self.menu_Prefences)
         self.menuDaybook.setObjectName(_fromUtf8("menuDaybook"))
+        self.menu_History = QtGui.QMenu(self.menu_Prefences)
+        self.menu_History.setObjectName(_fromUtf8("menu_History"))
         self.menuTools = QtGui.QMenu(self.menubar)
         self.menuTools.setObjectName(_fromUtf8("menuTools"))
+        self.menu_Appointments = QtGui.QMenu(self.menubar)
+        self.menu_Appointments.setObjectName(_fromUtf8("menu_Appointments"))
         MainWindow.setMenuBar(self.menubar)
         self.statusbar = QtGui.QStatusBar(MainWindow)
         self.statusbar.setObjectName(_fromUtf8("statusbar"))
@@ -2977,12 +2864,6 @@ class Ui_MainWindow(object):
             QtGui.QIcon.Off)
         self.action_Quit.setIcon(icon19)
         self.action_Quit.setObjectName(_fromUtf8("action_Quit"))
-        self.actionClear_Today_s_Emergency_Slots = QtGui.QAction(MainWindow)
-        self.actionClear_Today_s_Emergency_Slots.setObjectName(
-            _fromUtf8("actionClear_Today_s_Emergency_Slots"))
-        self.actionAppointment_Tools = QtGui.QAction(MainWindow)
-        self.actionAppointment_Tools.setObjectName(
-            _fromUtf8("actionAppointment_Tools"))
         self.actionChange_Language = QtGui.QAction(MainWindow)
         self.actionChange_Language.setObjectName(
             _fromUtf8("actionChange_Language"))
@@ -3036,9 +2917,6 @@ class Ui_MainWindow(object):
         self.actionEdit_Phrasebooks = QtGui.QAction(MainWindow)
         self.actionEdit_Phrasebooks.setObjectName(
             _fromUtf8("actionEdit_Phrasebooks"))
-        self.actionDocuments_Dialog = QtGui.QAction(MainWindow)
-        self.actionDocuments_Dialog.setObjectName(
-            _fromUtf8("actionDocuments_Dialog"))
         self.actionAllow_Edit = QtGui.QAction(MainWindow)
         self.actionAllow_Edit.setCheckable(True)
         self.actionAllow_Edit.setObjectName(_fromUtf8("actionAllow_Edit"))
@@ -3046,10 +2924,52 @@ class Ui_MainWindow(object):
         self.actionEnable_Filters.setCheckable(True)
         self.actionEnable_Filters.setObjectName(
             _fromUtf8("actionEnable_Filters"))
+        self.actionEdit_Courses = QtGui.QAction(MainWindow)
+        self.actionEdit_Courses.setCheckable(True)
+        self.actionEdit_Courses.setObjectName(_fromUtf8("actionEdit_Courses"))
+        self.actionEdit_Estimates = QtGui.QAction(MainWindow)
+        self.actionEdit_Estimates.setCheckable(True)
+        self.actionEdit_Estimates.setObjectName(
+            _fromUtf8("actionEdit_Estimates"))
+        self.actionAllow_Edit_Treatment = QtGui.QAction(MainWindow)
+        self.actionAllow_Edit_Treatment.setCheckable(True)
+        self.actionAllow_Edit_Treatment.setObjectName(
+            _fromUtf8("actionAllow_Edit_Treatment"))
+        self.action_all_history_edits = QtGui.QAction(MainWindow)
+        self.action_all_history_edits.setCheckable(True)
+        self.action_all_history_edits.setObjectName(
+            _fromUtf8("action_all_history_edits"))
+        self.actionEdit_Referral_Centres = QtGui.QAction(MainWindow)
+        self.actionEdit_Referral_Centres.setObjectName(
+            _fromUtf8("actionEdit_Referral_Centres"))
+        self.actionEdit_Feescales = QtGui.QAction(MainWindow)
+        self.actionEdit_Feescales.setObjectName(
+            _fromUtf8("actionEdit_Feescales"))
+        self.actionDocuments_Dialog = QtGui.QAction(MainWindow)
+        self.actionDocuments_Dialog.setObjectName(
+            _fromUtf8("actionDocuments_Dialog"))
+        self.actionReset_Supervisor_Password = QtGui.QAction(MainWindow)
+        self.actionReset_Supervisor_Password.setObjectName(
+            _fromUtf8("actionReset_Supervisor_Password"))
+        self.actionAdd_User = QtGui.QAction(MainWindow)
+        self.actionAdd_User.setObjectName(_fromUtf8("actionAdd_User"))
+        self.actionAdd_Clinician = QtGui.QAction(MainWindow)
+        self.actionAdd_Clinician.setObjectName(
+            _fromUtf8("actionAdd_Clinician"))
+        self.actionEdit_Practice_Details = QtGui.QAction(MainWindow)
+        self.actionEdit_Practice_Details.setObjectName(
+            _fromUtf8("actionEdit_Practice_Details"))
+        self.actionClear_Today_s_Emergency_Slots = QtGui.QAction(MainWindow)
+        self.actionClear_Today_s_Emergency_Slots.setObjectName(
+            _fromUtf8("actionClear_Today_s_Emergency_Slots"))
+        self.actionInsert_Regular_Blocks = QtGui.QAction(MainWindow)
+        self.actionInsert_Regular_Blocks.setObjectName(
+            _fromUtf8("actionInsert_Regular_Blocks"))
         self.menuMenu.addAction(self.action_Open_Patient)
-        self.menuMenu.addSeparator()
         self.menuMenu.addAction(self.action_save_patient)
+        self.menuMenu.addSeparator()
         self.menuMenu.addAction(self.actionPrint_Daylists)
+        self.menuMenu.addAction(self.actionDocuments_Dialog)
         self.menuMenu.addSeparator()
         self.menuMenu.addAction(self.action_Quit)
         self.menu_Help.addAction(self.action_About)
@@ -3066,6 +2986,10 @@ class Ui_MainWindow(object):
         self.menuDaybook.addSeparator()
         self.menuDaybook.addAction(self.actionAllow_Edit)
         self.menuDaybook.addAction(self.actionEnable_Filters)
+        self.menu_History.addAction(self.action_all_history_edits)
+        self.menu_History.addAction(self.actionEdit_Courses)
+        self.menu_History.addAction(self.actionEdit_Estimates)
+        self.menu_History.addAction(self.actionAllow_Edit_Treatment)
         self.menu_Prefences.addAction(self.actionChange_Language)
         self.menu_Prefences.addSeparator()
         self.menu_Prefences.addAction(self.menuView.menuAction())
@@ -3074,23 +2998,33 @@ class Ui_MainWindow(object):
         self.menu_Prefences.addAction(self.menuForum.menuAction())
         self.menu_Prefences.addAction(self.menuCashbook.menuAction())
         self.menu_Prefences.addAction(self.menuDaybook.menuAction())
+        self.menu_Prefences.addAction(self.menu_History.menuAction())
         self.menu_Prefences.addAction(self.menuPrinting.menuAction())
         self.menu_Prefences.addSeparator()
         self.menu_Prefences.addAction(self.menuMode.menuAction())
-        self.menuTools.addAction(self.actionClear_Today_s_Emergency_Slots)
-        self.menuTools.addAction(self.actionAppointment_Tools)
         self.menuTools.addAction(self.actionAdvanced_Record_Management)
+        self.menuTools.addSeparator()
         self.menuTools.addAction(self.actionFix_Locked_New_Course_of_Treatment)
         self.menuTools.addSeparator()
         self.menuTools.addAction(self.actionSet_Clinician)
         self.menuTools.addAction(self.actionSet_Assistant)
         self.menuTools.addAction(self.actionSet_Surgery_Number)
         self.menuTools.addSeparator()
-        self.menuTools.addAction(self.actionDocuments_Dialog)
-        self.menuTools.addSeparator()
         self.menuTools.addAction(self.actionEdit_Phrasebooks)
+        self.menuTools.addAction(self.actionEdit_Referral_Centres)
+        self.menuTools.addAction(self.actionEdit_Feescales)
+        self.menuTools.addSeparator()
+        self.menuTools.addAction(self.actionReset_Supervisor_Password)
+        self.menuTools.addAction(self.actionAdd_User)
+        self.menuTools.addAction(self.actionAdd_Clinician)
+        self.menuTools.addAction(self.actionEdit_Practice_Details)
+        self.menu_Appointments.addAction(
+            self.actionClear_Today_s_Emergency_Slots)
+        self.menu_Appointments.addSeparator()
+        self.menu_Appointments.addAction(self.actionInsert_Regular_Blocks)
         self.menubar.addAction(self.menuMenu.menuAction())
         self.menubar.addAction(self.menu_Prefences.menuAction())
+        self.menubar.addAction(self.menu_Appointments.menuAction())
         self.menubar.addAction(self.menuTools.menuAction())
         self.menubar.addAction(self.menu_Help.menuAction())
         self.label_9.setBuddy(self.addr3Edit)
@@ -3161,10 +3095,7 @@ class Ui_MainWindow(object):
         MainWindow.setTabOrder(
             self.printAccount_pushButton,
             self.takePayment_pushButton)
-        MainWindow.setTabOrder(
-            self.takePayment_pushButton,
-            self.perioChartDateComboBox)
-        MainWindow.setTabOrder(self.perioChartDateComboBox, self.dnt1comboBox)
+        MainWindow.setTabOrder(self.takePayment_pushButton, self.dnt1comboBox)
         MainWindow.setTabOrder(self.dnt1comboBox, self.scrollArea)
         MainWindow.setTabOrder(self.scrollArea, self.accounts_tableWidget)
         MainWindow.setTabOrder(
@@ -3207,18 +3138,6 @@ class Ui_MainWindow(object):
         MainWindow.setTabOrder(self.exampushButton, self.medNotes_pushButton)
         MainWindow.setTabOrder(
             self.medNotes_pushButton,
-            self.perioCharts_scrollArea)
-        MainWindow.setTabOrder(
-            self.perioCharts_scrollArea,
-            self.newPerioChartPushButton)
-        MainWindow.setTabOrder(
-            self.newPerioChartPushButton,
-            self.bpeDateComboBox)
-        MainWindow.setTabOrder(
-            self.bpeDateComboBox,
-            self.perioChartData_scrollArea)
-        MainWindow.setTabOrder(
-            self.perioChartData_scrollArea,
             self.contract_tabWidget)
         MainWindow.setTabOrder(self.contract_tabWidget, self.notesPrintButton)
         MainWindow.setTabOrder(
@@ -3426,22 +3345,15 @@ class Ui_MainWindow(object):
         self.tabWidget.setTabText(
             self.tabWidget.indexOf(self.tab_patient_estimate),
             _("Estimate"))
-        self.groupBox_11.setTitle(_("Choose Data"))
-        self.label_41.setText(_("Chart Date"))
-        self.newPerioChartPushButton.setText(_("New"))
-        self.groupBox_12.setTitle(_("BPE"))
         self.tabWidget.setTabText(
             self.tabWidget.indexOf(self.tab_patient_perio),
             _("Perio Charts"))
         self.pastPayments_pushButton.setToolTip(
             _("See all payments in the database made by this patient"))
-        self.pastPayments_pushButton.setText(_("Past Payments"))
+        self.pastPayments_pushButton.setText(_("Payments"))
         self.pastTreatment_pushButton.setToolTip(
             _("View treatments completed, by date order"))
-        self.pastTreatment_pushButton.setText(_("Past Treatment"))
-        self.past_course_estimates_pushButton.setToolTip(
-            _("display a combination of courses and estimates."))
-        self.past_course_estimates_pushButton.setText(_("Courses / Estimates"))
+        self.pastTreatment_pushButton.setText(_("Treatment"))
         self.pastCourses_pushButton.setToolTip(
             _("View all Courses of treatment. This includes treatment that was planned but not completed."))
         self.pastCourses_pushButton.setText(_("Courses"))
@@ -3451,14 +3363,14 @@ class Ui_MainWindow(object):
         self.current_est_versioning_pushButton.setText(_("Current Estimate"))
         self.NHSClaims_pushButton.setText(_("NHS Claims"))
         self.memo_history_pushButton.setText(_("Memos"))
-        self.historyPrint_pushButton.setToolTip(
-            _("Print the text displayed on this page."))
-        self.historyPrint_pushButton.setText(_("Print"))
         self.debug_toolButton.setToolTip(_("Advanced options for developer use. Don\'t expect this to make much sense!\n"
                                            "\n"
                                            "If the \"changes only\" checkbox is checked, only data which has been changed will be displayed."))
         self.debug_toolButton.setText(_("debug tools"))
         self.ptAtts_checkBox.setText(_("changes only"))
+        self.historyPrint_pushButton.setToolTip(
+            _("Print the text displayed on this page."))
+        self.historyPrint_pushButton.setText(_("Print"))
         self.tabWidget.setTabText(
             self.tabWidget.indexOf(self.tab_patient_history),
             _("History"))
@@ -3592,15 +3504,14 @@ class Ui_MainWindow(object):
         self.menuMode.setTitle(_("&Mode (reception or surgery)"))
         self.menuCashbook.setTitle(_("&Cashbook"))
         self.menuDaybook.setTitle(_("&Daybook"))
+        self.menu_History.setTitle(_("&History"))
         self.menuTools.setTitle(_("&Tools"))
+        self.menu_Appointments.setTitle(_("&Appointments"))
         self.action_save_patient.setText(_("&Export Patient to disk"))
         self.action_Open_Patient.setText(_("&Import Patient from disk"))
         self.action_About.setText(_("About &OpenMolar"))
         self.action_About_QT.setText(_("&About QT"))
         self.action_Quit.setText(_("&Quit"))
-        self.actionClear_Today_s_Emergency_Slots.setText(
-            _("Clear Today\'s Emergency Slots"))
-        self.actionAppointment_Tools.setText(_("Appointment Tools"))
         self.actionChange_Language.setText(_("Select Interface Language"))
         self.actionFull_Screen_Mode_Ctrl_Alt_F.setText(
             _("Full Screen Mode (Ctrl-Alt-F)"))
@@ -3625,9 +3536,23 @@ class Ui_MainWindow(object):
         self.actionSet_Surgery_Number.setToolTip(
             _("Set Surgery Number (used so other applications can see which record is loaded)"))
         self.actionEdit_Phrasebooks.setText(_("Edit Phrasebooks"))
-        self.actionDocuments_Dialog.setText(_("Documents Dialog"))
         self.actionAllow_Edit.setText(_("Allow &Edit"))
         self.actionEnable_Filters.setText(_("Enable &Filters"))
+        self.actionEdit_Courses.setText(_("Allow Edit &Courses"))
+        self.actionEdit_Estimates.setText(_("Allow Edit &Estimates"))
+        self.actionAllow_Edit_Treatment.setText(_("Allow Edit &Treatment"))
+        self.action_all_history_edits.setText(_("Allow &ALL Edits"))
+        self.actionEdit_Referral_Centres.setText(_("Edit Referral Centres"))
+        self.actionEdit_Feescales.setText(_("Edit Feescales"))
+        self.actionDocuments_Dialog.setText(_("Open Document Dialog"))
+        self.actionReset_Supervisor_Password.setText(
+            _("Reset Supervisor Password"))
+        self.actionAdd_User.setText(_("Add User"))
+        self.actionAdd_Clinician.setText(_("Add Clinician"))
+        self.actionEdit_Practice_Details.setText(_("Edit Practice Details"))
+        self.actionClear_Today_s_Emergency_Slots.setText(
+            _("Clear Today\'s Emergency Slots"))
+        self.actionInsert_Regular_Blocks.setText(_("Insert Regular Blocks"))
 
 from PyQt4 import QtWebKit
 from openmolar.qt4gui import resources_rc
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py b/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py
deleted file mode 100644
index 5dd0c5f..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/memo_item.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Form(object):
-
-    def setupUi(self, Form):
-        Form.setObjectName(_fromUtf8("Form"))
-        Form.resize(400, 28)
-        self.horizontalLayout = QtGui.QHBoxLayout(Form)
-        self.horizontalLayout.setContentsMargins(-1, 2, -1, 2)
-        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        self.label = QtGui.QLabel(Form)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Fixed,
-            QtGui.QSizePolicy.Preferred)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.label.sizePolicy().hasHeightForWidth())
-        self.label.setSizePolicy(sizePolicy)
-        self.label.setMinimumSize(QtCore.QSize(60, 0))
-        self.label.setMaximumSize(QtCore.QSize(60, 16777215))
-        self.label.setAlignment(QtCore.Qt.AlignCenter)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.horizontalLayout.addWidget(self.label)
-        self.lineEdit = QtGui.QLineEdit(Form)
-        self.lineEdit.setMaxLength(30)
-        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
-        self.horizontalLayout.addWidget(self.lineEdit)
-
-        self.retranslateUi(Form)
-        QtCore.QMetaObject.connectSlotsByName(Form)
-
-    def retranslateUi(self, Form):
-        Form.setWindowTitle(_("Form"))
-        self.label.setText(_("TextLabel"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Form = QtGui.QWidget()
-    ui = Ui_Form()
-    ui.setupUi(Form)
-    Form.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py b/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py
deleted file mode 100644
index f9f3889..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py
+++ /dev/null
@@ -1,408 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/newSetup.ui'
-#
-# Created: Sun Apr  6 21:20:55 2014
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_MainWindow(object):
-
-    def setupUi(self, MainWindow):
-        MainWindow.setObjectName(_fromUtf8("MainWindow"))
-        MainWindow.resize(589, 413)
-        self.centralwidget = QtGui.QWidget(MainWindow)
-        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
-        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
-        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.title_label = QtGui.QLabel(self.centralwidget)
-        font = QtGui.QFont()
-        font.setBold(True)
-        font.setWeight(75)
-        self.title_label.setFont(font)
-        self.title_label.setAlignment(QtCore.Qt.AlignCenter)
-        self.title_label.setObjectName(_fromUtf8("title_label"))
-        self.verticalLayout.addWidget(self.title_label)
-        self.stackedWidget = QtGui.QStackedWidget(self.centralwidget)
-        self.stackedWidget.setObjectName(_fromUtf8("stackedWidget"))
-        self.start_page = QtGui.QWidget()
-        self.start_page.setObjectName(_fromUtf8("start_page"))
-        self.verticalLayout_3 = QtGui.QVBoxLayout(self.start_page)
-        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
-        self.label_7 = QtGui.QLabel(self.start_page)
-        self.label_7.setMinimumSize(QtCore.QSize(0, 100))
-        self.label_7.setAlignment(
-            QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
-        self.label_7.setWordWrap(True)
-        self.label_7.setObjectName(_fromUtf8("label_7"))
-        self.verticalLayout_3.addWidget(self.label_7)
-        self.sysAdvice_label = QtGui.QLabel(self.start_page)
-        self.sysAdvice_label.setWordWrap(True)
-        self.sysAdvice_label.setObjectName(_fromUtf8("sysAdvice_label"))
-        self.verticalLayout_3.addWidget(self.sysAdvice_label)
-        spacerItem = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_3.addItem(spacerItem)
-        self.stackedWidget.addWidget(self.start_page)
-        self.application_password_page = QtGui.QWidget()
-        self.application_password_page.setObjectName(
-            _fromUtf8("application_password_page"))
-        self.gridLayout = QtGui.QGridLayout(self.application_password_page)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.mainPassword_label = QtGui.QLabel(self.application_password_page)
-        self.mainPassword_label.setMinimumSize(QtCore.QSize(0, 80))
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setWeight(50)
-        self.mainPassword_label.setFont(font)
-        self.mainPassword_label.setAlignment(QtCore.Qt.AlignCenter)
-        self.mainPassword_label.setWordWrap(True)
-        self.mainPassword_label.setObjectName(_fromUtf8("mainPassword_label"))
-        self.gridLayout.addWidget(self.mainPassword_label, 0, 0, 1, 3)
-        self.label_5 = QtGui.QLabel(self.application_password_page)
-        self.label_5.setObjectName(_fromUtf8("label_5"))
-        self.gridLayout.addWidget(self.label_5, 1, 0, 1, 1)
-        self.main_password_lineEdit = QtGui.QLineEdit(
-            self.application_password_page)
-        self.main_password_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.main_password_lineEdit.setText(_fromUtf8(""))
-        self.main_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        self.main_password_lineEdit.setObjectName(
-            _fromUtf8("main_password_lineEdit"))
-        self.gridLayout.addWidget(self.main_password_lineEdit, 1, 1, 1, 1)
-        self.mainpassword_checkBox = QtGui.QCheckBox(
-            self.application_password_page)
-        self.mainpassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
-        self.mainpassword_checkBox.setObjectName(
-            _fromUtf8("mainpassword_checkBox"))
-        self.gridLayout.addWidget(self.mainpassword_checkBox, 1, 2, 1, 1)
-        self.label_8 = QtGui.QLabel(self.application_password_page)
-        self.label_8.setObjectName(_fromUtf8("label_8"))
-        self.gridLayout.addWidget(self.label_8, 2, 0, 1, 1)
-        self.repeat_password_lineEdit = QtGui.QLineEdit(
-            self.application_password_page)
-        self.repeat_password_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.repeat_password_lineEdit.setText(_fromUtf8(""))
-        self.repeat_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        self.repeat_password_lineEdit.setObjectName(
-            _fromUtf8("repeat_password_lineEdit"))
-        self.gridLayout.addWidget(self.repeat_password_lineEdit, 2, 1, 1, 1)
-        spacerItem1 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout.addItem(spacerItem1, 3, 1, 1, 1)
-        self.stackedWidget.addWidget(self.application_password_page)
-        self.mysql_server_location = QtGui.QWidget()
-        self.mysql_server_location.setObjectName(
-            _fromUtf8("mysql_server_location"))
-        self.gridLayout_2 = QtGui.QGridLayout(self.mysql_server_location)
-        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
-        self.label_13 = QtGui.QLabel(self.mysql_server_location)
-        self.label_13.setEnabled(True)
-        self.label_13.setMinimumSize(QtCore.QSize(0, 40))
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setWeight(50)
-        self.label_13.setFont(font)
-        self.label_13.setAlignment(
-            QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
-        self.label_13.setWordWrap(True)
-        self.label_13.setObjectName(_fromUtf8("label_13"))
-        self.gridLayout_2.addWidget(self.label_13, 0, 0, 1, 3)
-        self.label_12 = QtGui.QLabel(self.mysql_server_location)
-        self.label_12.setEnabled(True)
-        self.label_12.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_12.setObjectName(_fromUtf8("label_12"))
-        self.gridLayout_2.addWidget(self.label_12, 1, 0, 1, 1)
-        self.host_lineEdit = QtGui.QLineEdit(self.mysql_server_location)
-        self.host_lineEdit.setEnabled(True)
-        self.host_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.host_lineEdit.setText(_fromUtf8("localhost"))
-        self.host_lineEdit.setObjectName(_fromUtf8("host_lineEdit"))
-        self.gridLayout_2.addWidget(self.host_lineEdit, 1, 2, 1, 1)
-        self.label_14 = QtGui.QLabel(self.mysql_server_location)
-        self.label_14.setEnabled(True)
-        self.label_14.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_14.setObjectName(_fromUtf8("label_14"))
-        self.gridLayout_2.addWidget(self.label_14, 2, 0, 1, 1)
-        self.port_lineEdit = QtGui.QLineEdit(self.mysql_server_location)
-        self.port_lineEdit.setEnabled(True)
-        self.port_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.port_lineEdit.setText(_fromUtf8("3306"))
-        self.port_lineEdit.setObjectName(_fromUtf8("port_lineEdit"))
-        self.gridLayout_2.addWidget(self.port_lineEdit, 2, 2, 1, 1)
-        self.label_9 = QtGui.QLabel(self.mysql_server_location)
-        self.label_9.setWordWrap(True)
-        self.label_9.setObjectName(_fromUtf8("label_9"))
-        self.gridLayout_2.addWidget(self.label_9, 4, 0, 1, 3)
-        spacerItem2 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_2.addItem(spacerItem2, 3, 2, 1, 1)
-        self.stackedWidget.addWidget(self.mysql_server_location)
-        self.database_choice = QtGui.QWidget()
-        self.database_choice.setObjectName(_fromUtf8("database_choice"))
-        self.gridLayout_3 = QtGui.QGridLayout(self.database_choice)
-        self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
-        self.groupBox = QtGui.QGroupBox(self.database_choice)
-        self.groupBox.setEnabled(True)
-        self.groupBox.setFlat(False)
-        self.groupBox.setObjectName(_fromUtf8("groupBox"))
-        self.gridLayout_5 = QtGui.QGridLayout(self.groupBox)
-        self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
-        self.label_2 = QtGui.QLabel(self.groupBox)
-        self.label_2.setEnabled(True)
-        self.label_2.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_2.setObjectName(_fromUtf8("label_2"))
-        self.gridLayout_5.addWidget(self.label_2, 2, 0, 1, 1)
-        self.user_lineEdit = QtGui.QLineEdit(self.groupBox)
-        self.user_lineEdit.setEnabled(True)
-        self.user_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.user_lineEdit.setText(_fromUtf8("OMuser"))
-        self.user_lineEdit.setObjectName(_fromUtf8("user_lineEdit"))
-        self.gridLayout_5.addWidget(self.user_lineEdit, 2, 2, 1, 1)
-        self.label_3 = QtGui.QLabel(self.groupBox)
-        self.label_3.setEnabled(True)
-        self.label_3.setAlignment(
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
-        self.label_3.setObjectName(_fromUtf8("label_3"))
-        self.gridLayout_5.addWidget(self.label_3, 3, 0, 1, 1)
-        self.password_lineEdit = QtGui.QLineEdit(self.groupBox)
-        self.password_lineEdit.setEnabled(True)
-        self.password_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.password_lineEdit.setText(_fromUtf8("password"))
-        self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        self.password_lineEdit.setObjectName(_fromUtf8("password_lineEdit"))
-        self.gridLayout_5.addWidget(self.password_lineEdit, 3, 2, 1, 1)
-        self.dbpassword_checkBox = QtGui.QCheckBox(self.groupBox)
-        self.dbpassword_checkBox.setEnabled(True)
-        self.dbpassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
-        self.dbpassword_checkBox.setObjectName(
-            _fromUtf8("dbpassword_checkBox"))
-        self.gridLayout_5.addWidget(self.dbpassword_checkBox, 3, 3, 1, 1)
-        self.database_lineEdit = QtGui.QLineEdit(self.groupBox)
-        self.database_lineEdit.setEnabled(True)
-        self.database_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.database_lineEdit.setText(_fromUtf8("openmolar_demo"))
-        self.database_lineEdit.setObjectName(_fromUtf8("database_lineEdit"))
-        self.gridLayout_5.addWidget(self.database_lineEdit, 1, 2, 1, 1)
-        self.label_4 = QtGui.QLabel(self.groupBox)
-        self.label_4.setObjectName(_fromUtf8("label_4"))
-        self.gridLayout_5.addWidget(self.label_4, 1, 0, 1, 1)
-        self.testDB_pushButton = QtGui.QPushButton(self.groupBox)
-        self.testDB_pushButton.setEnabled(True)
-        self.testDB_pushButton.setFocusPolicy(QtCore.Qt.NoFocus)
-        self.testDB_pushButton.setObjectName(_fromUtf8("testDB_pushButton"))
-        self.gridLayout_5.addWidget(self.testDB_pushButton, 4, 2, 1, 1)
-        spacerItem3 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_5.addItem(spacerItem3, 5, 2, 1, 1)
-        self.gridLayout_3.addWidget(self.groupBox, 4, 0, 2, 2)
-        self.createDemo_radioButton = QtGui.QRadioButton(self.database_choice)
-        self.createDemo_radioButton.setChecked(True)
-        self.createDemo_radioButton.setObjectName(
-            _fromUtf8("createDemo_radioButton"))
-        self.gridLayout_3.addWidget(self.createDemo_radioButton, 0, 0, 1, 1)
-        self.existingDB_radioButton = QtGui.QRadioButton(self.database_choice)
-        self.existingDB_radioButton.setObjectName(
-            _fromUtf8("existingDB_radioButton"))
-        self.gridLayout_3.addWidget(self.existingDB_radioButton, 1, 0, 1, 1)
-        self.stackedWidget.addWidget(self.database_choice)
-        self.create_database_page = QtGui.QWidget()
-        self.create_database_page.setObjectName(
-            _fromUtf8("create_database_page"))
-        self.gridLayout_4 = QtGui.QGridLayout(self.create_database_page)
-        self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
-        self.label_6 = QtGui.QLabel(self.create_database_page)
-        self.label_6.setObjectName(_fromUtf8("label_6"))
-        self.gridLayout_4.addWidget(self.label_6, 2, 0, 1, 1)
-        self.mainPassword_label_2 = QtGui.QLabel(self.create_database_page)
-        self.mainPassword_label_2.setMinimumSize(QtCore.QSize(0, 100))
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setWeight(50)
-        self.mainPassword_label_2.setFont(font)
-        self.mainPassword_label_2.setAlignment(
-            QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
-        self.mainPassword_label_2.setWordWrap(True)
-        self.mainPassword_label_2.setObjectName(
-            _fromUtf8("mainPassword_label_2"))
-        self.gridLayout_4.addWidget(self.mainPassword_label_2, 0, 0, 1, 3)
-        self.rootPassword_lineEdit = QtGui.QLineEdit(self.create_database_page)
-        self.rootPassword_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
-        self.rootPassword_lineEdit.setText(_fromUtf8(""))
-        self.rootPassword_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        self.rootPassword_lineEdit.setObjectName(
-            _fromUtf8("rootPassword_lineEdit"))
-        self.gridLayout_4.addWidget(self.rootPassword_lineEdit, 3, 0, 1, 1)
-        self.rootPassword_checkBox = QtGui.QCheckBox(self.create_database_page)
-        self.rootPassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
-        self.rootPassword_checkBox.setObjectName(
-            _fromUtf8("rootPassword_checkBox"))
-        self.gridLayout_4.addWidget(self.rootPassword_checkBox, 3, 1, 1, 1)
-        spacerItem4 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_4.addItem(spacerItem4, 1, 0, 1, 2)
-        self.stackedWidget.addWidget(self.create_database_page)
-        self.database_creation_progress_page = QtGui.QWidget()
-        self.database_creation_progress_page.setObjectName(
-            _fromUtf8("database_creation_progress_page"))
-        self.verticalLayout_4 = QtGui.QVBoxLayout(
-            self.database_creation_progress_page)
-        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
-        spacerItem5 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_4.addItem(spacerItem5)
-        self.label_10 = QtGui.QLabel(self.database_creation_progress_page)
-        self.label_10.setObjectName(_fromUtf8("label_10"))
-        self.verticalLayout_4.addWidget(self.label_10)
-        spacerItem6 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_4.addItem(spacerItem6)
-        self.progressBar = QtGui.QProgressBar(
-            self.database_creation_progress_page)
-        self.progressBar.setProperty("value", 0)
-        self.progressBar.setObjectName(_fromUtf8("progressBar"))
-        self.verticalLayout_4.addWidget(self.progressBar)
-        spacerItem7 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_4.addItem(spacerItem7)
-        self.stackedWidget.addWidget(self.database_creation_progress_page)
-        self.finish_page = QtGui.QWidget()
-        self.finish_page.setObjectName(_fromUtf8("finish_page"))
-        self.verticalLayout_2 = QtGui.QVBoxLayout(self.finish_page)
-        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
-        spacerItem8 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_2.addItem(spacerItem8)
-        self.label = QtGui.QLabel(self.finish_page)
-        self.label.setTextFormat(QtCore.Qt.PlainText)
-        self.label.setAlignment(
-            QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.verticalLayout_2.addWidget(self.label)
-        spacerItem9 = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.verticalLayout_2.addItem(spacerItem9)
-        self.stackedWidget.addWidget(self.finish_page)
-        self.verticalLayout.addWidget(self.stackedWidget)
-        self.frame = QtGui.QFrame(self.centralwidget)
-        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.frame.setObjectName(_fromUtf8("frame"))
-        self.horizontalLayout_3 = QtGui.QHBoxLayout(self.frame)
-        self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
-        self.back_pushButton = QtGui.QPushButton(self.frame)
-        self.back_pushButton.setFocusPolicy(QtCore.Qt.TabFocus)
-        self.back_pushButton.setObjectName(_fromUtf8("back_pushButton"))
-        self.horizontalLayout_3.addWidget(self.back_pushButton)
-        self.go_pushButton = QtGui.QPushButton(self.frame)
-        self.go_pushButton.setObjectName(_fromUtf8("go_pushButton"))
-        self.horizontalLayout_3.addWidget(self.go_pushButton)
-        self.verticalLayout.addWidget(self.frame)
-        MainWindow.setCentralWidget(self.centralwidget)
-        self.menubar = QtGui.QMenuBar(MainWindow)
-        self.menubar.setGeometry(QtCore.QRect(0, 0, 589, 17))
-        self.menubar.setObjectName(_fromUtf8("menubar"))
-        MainWindow.setMenuBar(self.menubar)
-        self.statusbar = QtGui.QStatusBar(MainWindow)
-        self.statusbar.setObjectName(_fromUtf8("statusbar"))
-        MainWindow.setStatusBar(self.statusbar)
-
-        self.retranslateUi(MainWindow)
-        self.stackedWidget.setCurrentIndex(0)
-        QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
-    def retranslateUi(self, MainWindow):
-        MainWindow.setWindowTitle(_("OpenMolar - New Setup"))
-        self.title_label.setText(
-            _("Welcome to the OpenMolar settings wizard."))
-        self.label_7.setText(_("This first run application will \n"
-                               " - set your system password\n"
-                               " - make this client aware of your mysql server settings\n"
-                               " - install a small (3 patient) demo database if required."))
-        self.sysAdvice_label.setText(_("TextLabel"))
-        self.mainPassword_label.setText(
-            _("Please enter a password to prevent unauthorised running of this application."))
-        self.label_5.setText(_("Password"))
-        self.mainpassword_checkBox.setText(_("show"))
-        self.label_8.setText(_("Repeat Password"))
-        self.label_13.setText(_("Where is your mysql server located?  **"))
-        self.label_12.setText(_("Host"))
-        self.label_14.setText(_("Port"))
-        self.label_9.setText(_("** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.\n"
-                               "\n"
-                               "If you are a debian or ubuntu user, \"sudo apt-get install mysql-server\"\n"
-                               "and make a note of the root password you create during set up. "))
-        self.groupBox.setTitle(_("Database Details"))
-        self.label_2.setText(_("(mysql) User"))
-        self.label_3.setText(_("(mysql) Password"))
-        self.dbpassword_checkBox.setText(_("show"))
-        self.label_4.setText(_("Database Name"))
-        self.testDB_pushButton.setText(_("Test this Connection"))
-        self.createDemo_radioButton.setText(_("Create A Demo Database"))
-        self.existingDB_radioButton.setText(_("Use with an existing database"))
-        self.label_6.setText(_("Root mysql password"))
-        self.mainPassword_label_2.setText(_("To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.\n"
-                                            "OpenMolar does NOT store this password.\n"
-                                            "Please enter the password of the ROOT mysql user.\n"
-                                            "(note - on most mysql setups, root access is disabled unless the server is on localhost)"))
-        self.rootPassword_checkBox.setText(_("show"))
-        self.label_10.setText(_("Creating Database.... please wait"))
-        self.label.setText(_("OK.... you are all set to go!"))
-        self.back_pushButton.setText(_("Back"))
-        self.go_pushButton.setText(_("Proceed"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    MainWindow = QtGui.QMainWindow()
-    ui = Ui_MainWindow()
-    ui.setupUi(MainWindow)
-    MainWindow.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py b/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
index 83a18e9..5a1a626 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
@@ -3,8 +3,8 @@
 
 # Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/patient_finder.ui'
 #
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
+# Created: Thu May 29 10:12:39 2014
+#      by: PyQt4 UI code generator 4.10.4
 #
 # WARNING! All changes made in this file will be lost!
 
@@ -21,7 +21,7 @@ class Ui_Dialog(object):
 
     def setupUi(self, Dialog):
         Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(306, 367)
+        Dialog.resize(386, 360)
         icon = QtGui.QIcon()
         icon.addPixmap(
             QtGui.QPixmap(_fromUtf8(":/logo.png")),
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py b/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py
deleted file mode 100644
index f80431a..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/permissions.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(308, 177)
-        self.verticalLayout = QtGui.QVBoxLayout(Dialog)
-        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.label = QtGui.QLabel(Dialog)
-        self.label.setAlignment(QtCore.Qt.AlignCenter)
-        self.label.setWordWrap(True)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.verticalLayout.addWidget(self.label)
-        self.lineEdit = QtGui.QLineEdit(Dialog)
-        self.lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
-        self.verticalLayout.addWidget(self.lineEdit)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
-        self.buttonBox.setCenterButtons(True)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.verticalLayout.addWidget(self.buttonBox)
-
-        self.retranslateUi(Dialog)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Raise Permissions"))
-        self.label.setText(_("Supervisor Rights required to Perform This Action.\n"
-                             "Please enter password."))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py b/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
index fdf558f..35b2408 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
@@ -3,8 +3,8 @@
 
 # Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/record_tools.ui'
 #
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
+# Created: Mon Jun 30 12:44:27 2014
+#      by: PyQt4 UI code generator 4.11
 #
 # WARNING! All changes made in this file will be lost!
 
@@ -17,14 +17,14 @@ except AttributeError:
         return s
 
 
-class Ui_Dialog(object):
+class Ui_Form(object):
 
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(628, 521)
-        self.verticalLayout = QtGui.QVBoxLayout(Dialog)
+    def setupUi(self, Form):
+        Form.setObjectName(_fromUtf8("Form"))
+        Form.resize(497, 585)
+        self.verticalLayout = QtGui.QVBoxLayout(Form)
         self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.tabWidget = QtGui.QTabWidget(Dialog)
+        self.tabWidget = QtGui.QTabWidget(Form)
         self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
         self.tab = QtGui.QWidget()
         self.tab.setObjectName(_fromUtf8("tab"))
@@ -35,7 +35,7 @@ class Ui_Dialog(object):
         self.money_scrollArea.setObjectName(_fromUtf8("money_scrollArea"))
         self.money_scrollAreaWidgetContents = QtGui.QWidget()
         self.money_scrollAreaWidgetContents.setGeometry(
-            QtCore.QRect(0, 0, 443, 424))
+            QtCore.QRect(0, 0, 455, 503))
         self.money_scrollAreaWidgetContents.setObjectName(
             _fromUtf8("money_scrollAreaWidgetContents"))
         self.gridLayout = QtGui.QGridLayout(
@@ -147,12 +147,12 @@ class Ui_Dialog(object):
         self.label_14.setObjectName(_fromUtf8("label_14"))
         self.gridLayout.addWidget(self.label_14, 0, 0, 1, 2)
         self.money_scrollArea.setWidget(self.money_scrollAreaWidgetContents)
-        self.gridLayout_2.addWidget(self.money_scrollArea, 0, 0, 4, 1)
+        self.gridLayout_2.addWidget(self.money_scrollArea, 0, 0, 1, 2)
         self.label_13 = QtGui.QLabel(self.tab)
         self.label_13.setAlignment(QtCore.Qt.AlignCenter)
         self.label_13.setWordWrap(True)
         self.label_13.setObjectName(_fromUtf8("label_13"))
-        self.gridLayout_2.addWidget(self.label_13, 0, 1, 1, 1)
+        self.gridLayout_2.addWidget(self.label_13, 1, 0, 1, 1)
         self.total_label = QtGui.QLabel(self.tab)
         font = QtGui.QFont()
         font.setBold(True)
@@ -161,41 +161,16 @@ class Ui_Dialog(object):
         self.total_label.setAlignment(QtCore.Qt.AlignCenter)
         self.total_label.setObjectName(_fromUtf8("total_label"))
         self.gridLayout_2.addWidget(self.total_label, 1, 1, 1, 1)
-        self.money_pushButton = QtGui.QPushButton(self.tab)
-        icon = QtGui.QIcon()
-        icon.addPixmap(
-            QtGui.QPixmap(_fromUtf8(":/button_ok.png")),
-            QtGui.QIcon.Normal,
-            QtGui.QIcon.Off)
-        self.money_pushButton.setIcon(icon)
-        self.money_pushButton.setObjectName(_fromUtf8("money_pushButton"))
-        self.gridLayout_2.addWidget(self.money_pushButton, 2, 1, 1, 1)
-        spacerItem1 = QtGui.QSpacerItem(
-            20,
-            337,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_2.addItem(spacerItem1, 3, 1, 1, 1)
         self.tabWidget.addTab(self.tab, _fromUtf8(""))
         self.tab_2 = QtGui.QWidget()
         self.tab_2.setObjectName(_fromUtf8("tab_2"))
         self.gridLayout_4 = QtGui.QGridLayout(self.tab_2)
         self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
-        self.dates_pushButton = QtGui.QPushButton(self.tab_2)
-        self.dates_pushButton.setIcon(icon)
-        self.dates_pushButton.setObjectName(_fromUtf8("dates_pushButton"))
-        self.gridLayout_4.addWidget(self.dates_pushButton, 0, 1, 1, 1)
-        spacerItem2 = QtGui.QSpacerItem(
-            82,
-            388,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_4.addItem(spacerItem2, 1, 1, 1, 1)
         self.scrollArea = QtGui.QScrollArea(self.tab_2)
         self.scrollArea.setWidgetResizable(True)
         self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
         self.scrollAreaWidgetContents = QtGui.QWidget()
-        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 345, 263))
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 455, 520))
         self.scrollAreaWidgetContents.setObjectName(
             _fromUtf8("scrollAreaWidgetContents"))
         self.gridLayout_3 = QtGui.QGridLayout(self.scrollAreaWidgetContents)
@@ -293,247 +268,15 @@ class Ui_Dialog(object):
             _fromUtf8("billdate_pushButton"))
         self.horizontalLayout_7.addWidget(self.billdate_pushButton)
         self.gridLayout_3.addLayout(self.horizontalLayout_7, 6, 1, 1, 1)
-        spacerItem3 = QtGui.QSpacerItem(
+        spacerItem1 = QtGui.QSpacerItem(
             20,
             40,
             QtGui.QSizePolicy.Minimum,
             QtGui.QSizePolicy.Expanding)
-        self.gridLayout_3.addItem(spacerItem3, 7, 0, 1, 1)
+        self.gridLayout_3.addItem(spacerItem1, 7, 0, 1, 1)
         self.scrollArea.setWidget(self.scrollAreaWidgetContents)
         self.gridLayout_4.addWidget(self.scrollArea, 0, 0, 2, 1)
         self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
-        self.tab_3 = QtGui.QWidget()
-        self.tab_3.setObjectName(_fromUtf8("tab_3"))
-        self.gridLayout_11 = QtGui.QGridLayout(self.tab_3)
-        self.gridLayout_11.setObjectName(_fromUtf8("gridLayout_11"))
-        self.scrollArea_2 = QtGui.QScrollArea(self.tab_3)
-        self.scrollArea_2.setWidgetResizable(True)
-        self.scrollArea_2.setObjectName(_fromUtf8("scrollArea_2"))
-        self.scrollAreaWidgetContents_2 = QtGui.QWidget()
-        self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 36, 28))
-        self.scrollAreaWidgetContents_2.setObjectName(
-            _fromUtf8("scrollAreaWidgetContents_2"))
-        self.verticalLayout_2 = QtGui.QVBoxLayout(
-            self.scrollAreaWidgetContents_2)
-        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
-        self.chartplan_frame = QtGui.QFrame(self.scrollAreaWidgetContents_2)
-        self.chartplan_frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.chartplan_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.chartplan_frame.setObjectName(_fromUtf8("chartplan_frame"))
-        self.verticalLayout_2.addWidget(self.chartplan_frame)
-        self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
-        self.gridLayout_11.addWidget(self.scrollArea_2, 0, 0, 2, 3)
-        self.plan_pushButton = QtGui.QPushButton(self.tab_3)
-        self.plan_pushButton.setIcon(icon)
-        self.plan_pushButton.setObjectName(_fromUtf8("plan_pushButton"))
-        self.gridLayout_11.addWidget(self.plan_pushButton, 0, 3, 1, 1)
-        spacerItem4 = QtGui.QSpacerItem(
-            82,
-            388,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_11.addItem(spacerItem4, 1, 3, 2, 1)
-        self.gridLayout_9 = QtGui.QGridLayout()
-        self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
-        self.label_22 = QtGui.QLabel(self.tab_3)
-        self.label_22.setObjectName(_fromUtf8("label_22"))
-        self.gridLayout_9.addWidget(self.label_22, 0, 0, 1, 2)
-        self.xraypl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.xraypl_lineEdit.setMaxLength(56)
-        self.xraypl_lineEdit.setObjectName(_fromUtf8("xraypl_lineEdit"))
-        self.gridLayout_9.addWidget(self.xraypl_lineEdit, 0, 2, 1, 1)
-        self.label_23 = QtGui.QLabel(self.tab_3)
-        self.label_23.setObjectName(_fromUtf8("label_23"))
-        self.gridLayout_9.addWidget(self.label_23, 1, 0, 1, 2)
-        self.periopl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.periopl_lineEdit.setMaxLength(56)
-        self.periopl_lineEdit.setObjectName(_fromUtf8("periopl_lineEdit"))
-        self.gridLayout_9.addWidget(self.periopl_lineEdit, 1, 2, 1, 1)
-        self.label_47 = QtGui.QLabel(self.tab_3)
-        self.label_47.setObjectName(_fromUtf8("label_47"))
-        self.gridLayout_9.addWidget(self.label_47, 2, 0, 1, 2)
-        self.anaespl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.anaespl_lineEdit.setMaxLength(56)
-        self.anaespl_lineEdit.setObjectName(_fromUtf8("anaespl_lineEdit"))
-        self.gridLayout_9.addWidget(self.anaespl_lineEdit, 2, 2, 1, 1)
-        self.label_48 = QtGui.QLabel(self.tab_3)
-        self.label_48.setObjectName(_fromUtf8("label_48"))
-        self.gridLayout_9.addWidget(self.label_48, 3, 0, 1, 2)
-        self.otherpl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.otherpl_lineEdit.setMaxLength(56)
-        self.otherpl_lineEdit.setObjectName(_fromUtf8("otherpl_lineEdit"))
-        self.gridLayout_9.addWidget(self.otherpl_lineEdit, 3, 2, 1, 1)
-        self.label_49 = QtGui.QLabel(self.tab_3)
-        self.label_49.setObjectName(_fromUtf8("label_49"))
-        self.gridLayout_9.addWidget(self.label_49, 4, 0, 1, 2)
-        self.custompl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.custompl_lineEdit.setMaxLength(56)
-        self.custompl_lineEdit.setObjectName(_fromUtf8("custompl_lineEdit"))
-        self.gridLayout_9.addWidget(self.custompl_lineEdit, 4, 2, 1, 1)
-        self.gridLayout_11.addLayout(self.gridLayout_9, 2, 0, 1, 1)
-        self.line_2 = QtGui.QFrame(self.tab_3)
-        self.line_2.setFrameShape(QtGui.QFrame.VLine)
-        self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
-        self.line_2.setObjectName(_fromUtf8("line_2"))
-        self.gridLayout_11.addWidget(self.line_2, 2, 1, 1, 1)
-        self.gridLayout_10 = QtGui.QGridLayout()
-        self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10"))
-        self.label_51 = QtGui.QLabel(self.tab_3)
-        self.label_51.setObjectName(_fromUtf8("label_51"))
-        self.gridLayout_10.addWidget(self.label_51, 0, 0, 1, 3)
-        self.label_52 = QtGui.QLabel(self.tab_3)
-        self.label_52.setObjectName(_fromUtf8("label_52"))
-        self.gridLayout_10.addWidget(self.label_52, 1, 0, 1, 2)
-        self.label_53 = QtGui.QLabel(self.tab_3)
-        self.label_53.setObjectName(_fromUtf8("label_53"))
-        self.gridLayout_10.addWidget(self.label_53, 2, 0, 1, 2)
-        self.line = QtGui.QFrame(self.tab_3)
-        self.line.setFrameShape(QtGui.QFrame.HLine)
-        self.line.setFrameShadow(QtGui.QFrame.Sunken)
-        self.line.setObjectName(_fromUtf8("line"))
-        self.gridLayout_10.addWidget(self.line, 3, 0, 1, 3)
-        self.label_54 = QtGui.QLabel(self.tab_3)
-        self.label_54.setObjectName(_fromUtf8("label_54"))
-        self.gridLayout_10.addWidget(self.label_54, 4, 0, 1, 2)
-        self.odupl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.odupl_lineEdit.setMaxLength(56)
-        self.odupl_lineEdit.setObjectName(_fromUtf8("odupl_lineEdit"))
-        self.gridLayout_10.addWidget(self.odupl_lineEdit, 4, 2, 1, 1)
-        self.label_55 = QtGui.QLabel(self.tab_3)
-        self.label_55.setObjectName(_fromUtf8("label_55"))
-        self.gridLayout_10.addWidget(self.label_55, 5, 0, 1, 2)
-        self.odlpl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.odlpl_lineEdit.setMaxLength(56)
-        self.odlpl_lineEdit.setObjectName(_fromUtf8("odlpl_lineEdit"))
-        self.gridLayout_10.addWidget(self.odlpl_lineEdit, 5, 2, 1, 1)
-        self.ndupl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.ndupl_lineEdit.setMaxLength(56)
-        self.ndupl_lineEdit.setObjectName(_fromUtf8("ndupl_lineEdit"))
-        self.gridLayout_10.addWidget(self.ndupl_lineEdit, 1, 2, 1, 1)
-        self.ndlpl_lineEdit = QtGui.QLineEdit(self.tab_3)
-        self.ndlpl_lineEdit.setMaxLength(56)
-        self.ndlpl_lineEdit.setObjectName(_fromUtf8("ndlpl_lineEdit"))
-        self.gridLayout_10.addWidget(self.ndlpl_lineEdit, 2, 2, 1, 1)
-        self.gridLayout_11.addLayout(self.gridLayout_10, 2, 2, 1, 1)
-        self.tabWidget.addTab(self.tab_3, _fromUtf8(""))
-        self.tab_4 = QtGui.QWidget()
-        self.tab_4.setObjectName(_fromUtf8("tab_4"))
-        self.gridLayout_5 = QtGui.QGridLayout(self.tab_4)
-        self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
-        self.scrollArea_3 = QtGui.QScrollArea(self.tab_4)
-        self.scrollArea_3.setWidgetResizable(True)
-        self.scrollArea_3.setObjectName(_fromUtf8("scrollArea_3"))
-        self.scrollAreaWidgetContents_3 = QtGui.QWidget()
-        self.scrollAreaWidgetContents_3.setGeometry(
-            QtCore.QRect(0, 0, 461, 225))
-        self.scrollAreaWidgetContents_3.setObjectName(
-            _fromUtf8("scrollAreaWidgetContents_3"))
-        self.verticalLayout_3 = QtGui.QVBoxLayout(
-            self.scrollAreaWidgetContents_3)
-        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
-        self.chartcompleted_frame = QtGui.QFrame(
-            self.scrollAreaWidgetContents_3)
-        self.chartcompleted_frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.chartcompleted_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.chartcompleted_frame.setObjectName(
-            _fromUtf8("chartcompleted_frame"))
-        self.verticalLayout_3.addWidget(self.chartcompleted_frame)
-        self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)
-        self.gridLayout_5.addWidget(self.scrollArea_3, 0, 0, 2, 3)
-        self.completed_pushButton = QtGui.QPushButton(self.tab_4)
-        self.completed_pushButton.setIcon(icon)
-        self.completed_pushButton.setObjectName(
-            _fromUtf8("completed_pushButton"))
-        self.gridLayout_5.addWidget(self.completed_pushButton, 0, 3, 1, 1)
-        spacerItem5 = QtGui.QSpacerItem(
-            82,
-            388,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_5.addItem(spacerItem5, 1, 3, 2, 1)
-        self.gridLayout_12 = QtGui.QGridLayout()
-        self.gridLayout_12.setObjectName(_fromUtf8("gridLayout_12"))
-        self.label_24 = QtGui.QLabel(self.tab_4)
-        self.label_24.setObjectName(_fromUtf8("label_24"))
-        self.gridLayout_12.addWidget(self.label_24, 0, 0, 1, 2)
-        self.xraycmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.xraycmp_lineEdit.setMaxLength(56)
-        self.xraycmp_lineEdit.setObjectName(_fromUtf8("xraycmp_lineEdit"))
-        self.gridLayout_12.addWidget(self.xraycmp_lineEdit, 0, 2, 1, 1)
-        self.label_25 = QtGui.QLabel(self.tab_4)
-        self.label_25.setObjectName(_fromUtf8("label_25"))
-        self.gridLayout_12.addWidget(self.label_25, 1, 0, 1, 2)
-        self.periocmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.periocmp_lineEdit.setMaxLength(56)
-        self.periocmp_lineEdit.setObjectName(_fromUtf8("periocmp_lineEdit"))
-        self.gridLayout_12.addWidget(self.periocmp_lineEdit, 1, 2, 1, 1)
-        self.label_50 = QtGui.QLabel(self.tab_4)
-        self.label_50.setObjectName(_fromUtf8("label_50"))
-        self.gridLayout_12.addWidget(self.label_50, 2, 0, 1, 2)
-        self.anaescmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.anaescmp_lineEdit.setMaxLength(56)
-        self.anaescmp_lineEdit.setObjectName(_fromUtf8("anaescmp_lineEdit"))
-        self.gridLayout_12.addWidget(self.anaescmp_lineEdit, 2, 2, 1, 1)
-        self.label_56 = QtGui.QLabel(self.tab_4)
-        self.label_56.setObjectName(_fromUtf8("label_56"))
-        self.gridLayout_12.addWidget(self.label_56, 3, 0, 1, 2)
-        self.othercmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.othercmp_lineEdit.setMaxLength(56)
-        self.othercmp_lineEdit.setObjectName(_fromUtf8("othercmp_lineEdit"))
-        self.gridLayout_12.addWidget(self.othercmp_lineEdit, 3, 2, 1, 1)
-        self.label_57 = QtGui.QLabel(self.tab_4)
-        self.label_57.setObjectName(_fromUtf8("label_57"))
-        self.gridLayout_12.addWidget(self.label_57, 4, 0, 1, 2)
-        self.customcmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.customcmp_lineEdit.setMaxLength(56)
-        self.customcmp_lineEdit.setObjectName(_fromUtf8("customcmp_lineEdit"))
-        self.gridLayout_12.addWidget(self.customcmp_lineEdit, 4, 2, 1, 1)
-        self.gridLayout_5.addLayout(self.gridLayout_12, 2, 0, 1, 1)
-        self.line_3 = QtGui.QFrame(self.tab_4)
-        self.line_3.setFrameShape(QtGui.QFrame.VLine)
-        self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
-        self.line_3.setObjectName(_fromUtf8("line_3"))
-        self.gridLayout_5.addWidget(self.line_3, 2, 1, 1, 1)
-        self.gridLayout_13 = QtGui.QGridLayout()
-        self.gridLayout_13.setObjectName(_fromUtf8("gridLayout_13"))
-        self.label_58 = QtGui.QLabel(self.tab_4)
-        self.label_58.setObjectName(_fromUtf8("label_58"))
-        self.gridLayout_13.addWidget(self.label_58, 0, 0, 1, 3)
-        self.label_59 = QtGui.QLabel(self.tab_4)
-        self.label_59.setObjectName(_fromUtf8("label_59"))
-        self.gridLayout_13.addWidget(self.label_59, 1, 0, 1, 2)
-        self.label_60 = QtGui.QLabel(self.tab_4)
-        self.label_60.setObjectName(_fromUtf8("label_60"))
-        self.gridLayout_13.addWidget(self.label_60, 2, 0, 1, 2)
-        self.line_4 = QtGui.QFrame(self.tab_4)
-        self.line_4.setFrameShape(QtGui.QFrame.HLine)
-        self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
-        self.line_4.setObjectName(_fromUtf8("line_4"))
-        self.gridLayout_13.addWidget(self.line_4, 3, 0, 1, 3)
-        self.label_61 = QtGui.QLabel(self.tab_4)
-        self.label_61.setObjectName(_fromUtf8("label_61"))
-        self.gridLayout_13.addWidget(self.label_61, 4, 0, 1, 2)
-        self.oducmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.oducmp_lineEdit.setMaxLength(56)
-        self.oducmp_lineEdit.setObjectName(_fromUtf8("oducmp_lineEdit"))
-        self.gridLayout_13.addWidget(self.oducmp_lineEdit, 4, 2, 1, 1)
-        self.label_62 = QtGui.QLabel(self.tab_4)
-        self.label_62.setObjectName(_fromUtf8("label_62"))
-        self.gridLayout_13.addWidget(self.label_62, 5, 0, 1, 2)
-        self.odlcmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.odlcmp_lineEdit.setMaxLength(56)
-        self.odlcmp_lineEdit.setObjectName(_fromUtf8("odlcmp_lineEdit"))
-        self.gridLayout_13.addWidget(self.odlcmp_lineEdit, 5, 2, 1, 1)
-        self.nducmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.nducmp_lineEdit.setMaxLength(56)
-        self.nducmp_lineEdit.setObjectName(_fromUtf8("nducmp_lineEdit"))
-        self.gridLayout_13.addWidget(self.nducmp_lineEdit, 1, 2, 1, 1)
-        self.ndlcmp_lineEdit = QtGui.QLineEdit(self.tab_4)
-        self.ndlcmp_lineEdit.setMaxLength(56)
-        self.ndlcmp_lineEdit.setObjectName(_fromUtf8("ndlcmp_lineEdit"))
-        self.gridLayout_13.addWidget(self.ndlcmp_lineEdit, 2, 2, 1, 1)
-        self.gridLayout_5.addLayout(self.gridLayout_13, 2, 2, 1, 1)
-        self.tabWidget.addTab(self.tab_4, _fromUtf8(""))
         self.tab_5 = QtGui.QWidget()
         self.tab_5.setObjectName(_fromUtf8("tab_5"))
         self.gridLayout_6 = QtGui.QGridLayout(self.tab_5)
@@ -548,41 +291,18 @@ class Ui_Dialog(object):
             _fromUtf8("hidden_notes_tableWidget"))
         self.hidden_notes_tableWidget.setColumnCount(0)
         self.hidden_notes_tableWidget.setRowCount(0)
+        self.hidden_notes_tableWidget.verticalHeader().setVisible(False)
         self.verticalLayout_4.addWidget(self.hidden_notes_tableWidget)
         self.gridLayout_6.addLayout(self.verticalLayout_4, 0, 0, 2, 1)
-        self.hidden_notes_pushButton = QtGui.QPushButton(self.tab_5)
-        self.hidden_notes_pushButton.setIcon(icon)
-        self.hidden_notes_pushButton.setObjectName(
-            _fromUtf8("hidden_notes_pushButton"))
-        self.gridLayout_6.addWidget(self.hidden_notes_pushButton, 0, 1, 1, 1)
-        spacerItem6 = QtGui.QSpacerItem(
-            20,
-            377,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_6.addItem(spacerItem6, 1, 1, 1, 1)
         self.tabWidget.addTab(self.tab_5, _fromUtf8(""))
         self.verticalLayout.addWidget(self.tabWidget)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.verticalLayout.addWidget(self.buttonBox)
 
-        self.retranslateUi(Dialog)
+        self.retranslateUi(Form)
         self.tabWidget.setCurrentIndex(0)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
+        QtCore.QMetaObject.connectSlotsByName(Form)
 
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Advanced Record Alteration"))
+    def retranslateUi(self, Form):
+        Form.setWindowTitle(_("Form"))
         self.label.setText(_("NHS current fees (money0)"))
         self.label_2.setText(_("NHS payments (money2)"))
         self.label_5.setText(_("NHS estimated (money4)"))
@@ -594,15 +314,13 @@ class Ui_Dialog(object):
         self.label_9.setText(_("credit (money8)"))
         self.label_10.setText(_("debt (money9)"))
         self.label_11.setText(_("debt2 (money10)"))
-        self.label_12.setText(_("money 11 (always 0!)"))
+        self.label_12.setText(_("money 11"))
         self.label_3.setText(_("private current fees (money1) "))
         self.label_4.setText(_("private payments (money3)"))
         self.label_14.setText(_("ALL AMOUNTS ARE IN PENCE (cents)"))
-        self.label_13.setText(_("Outstanding <br />amount"))
+        self.label_13.setText(_("Outstanding amount"))
         self.total_label.setText(_("0.00"))
-        self.money_pushButton.setText(_("Apply Changes"))
         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("Money"))
-        self.dates_pushButton.setText(_("Apply Changes"))
         self.label_15.setText(_("Last CE (pd5)"))
         self.pd5_pushButton.setText(_("Add Date"))
         self.label_16.setText(_("Last ECE (pd6)"))
@@ -620,49 +338,19 @@ class Ui_Dialog(object):
         self.tabWidget.setTabText(
             self.tabWidget.indexOf(self.tab_2),
             _("Dates"))
-        self.plan_pushButton.setText(_("Apply Changes"))
-        self.label_22.setText(_("Xray"))
-        self.label_23.setText(_("Perio"))
-        self.label_47.setText(_("anaesthetics"))
-        self.label_48.setText(_("other"))
-        self.label_49.setText(_("custom"))
-        self.label_51.setText(_("Dentures"))
-        self.label_52.setText(_("new upper"))
-        self.label_53.setText(_("new lower"))
-        self.label_54.setText(_("repair upper"))
-        self.label_55.setText(_("repair lower"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_3),
-            _("Treatment Plan"))
-        self.completed_pushButton.setText(_("Apply Changes"))
-        self.label_24.setText(_("Xray"))
-        self.label_25.setText(_("Perio"))
-        self.label_50.setText(_("anaesthetics"))
-        self.label_56.setText(_("other"))
-        self.label_57.setText(_("custom"))
-        self.label_58.setText(_("Dentures"))
-        self.label_59.setText(_("new upper"))
-        self.label_60.setText(_("new lower"))
-        self.label_61.setText(_("repair upper"))
-        self.label_62.setText(_("repair lower"))
-        self.tabWidget.setTabText(
-            self.tabWidget.indexOf(self.tab_4),
-            _("Completed Treatment"))
         self.label_26.setText(_("Hidden Notes"))
-        self.hidden_notes_pushButton.setText(_("Apply Changes"))
         self.tabWidget.setTabText(
             self.tabWidget.indexOf(self.tab_5),
             _("Miscellaneous"))
 
-from openmolar.qt4gui import resources_rc
 
 if __name__ == "__main__":
     import gettext
     gettext.install("openmolar")
     import sys
     app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
+    Form = QtGui.QWidget()
+    ui = Ui_Form()
+    ui.setupUi(Form)
+    Form.show()
     sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py b/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py
deleted file mode 100644
index d21d7ed..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/select_patient.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.resize(1014, 398)
-        self.vboxlayout = QtGui.QVBoxLayout(Dialog)
-        self.vboxlayout.setObjectName(_fromUtf8("vboxlayout"))
-        self.tableWidget = QtGui.QTableWidget(Dialog)
-        self.tableWidget.setAlternatingRowColors(True)
-        self.tableWidget.setSelectionBehavior(
-            QtGui.QAbstractItemView.SelectRows)
-        self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
-        self.tableWidget.setColumnCount(0)
-        self.tableWidget.setRowCount(0)
-        self.vboxlayout.addWidget(self.tableWidget)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.vboxlayout.addWidget(self.buttonBox)
-
-        self.retranslateUi(Dialog)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("Make a Selection"))
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py b/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py
deleted file mode 100644
index b3f2aaa..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py
+++ /dev/null
@@ -1,186 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/startscreen.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Dialog(object):
-
-    def setupUi(self, Dialog):
-        Dialog.setObjectName(_fromUtf8("Dialog"))
-        Dialog.setWindowModality(QtCore.Qt.WindowModal)
-        Dialog.resize(276, 343)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
-        Dialog.setSizePolicy(sizePolicy)
-        Dialog.setMinimumSize(QtCore.QSize(200, 200))
-        icon = QtGui.QIcon()
-        icon.addPixmap(
-            QtGui.QPixmap(_fromUtf8(":/openmolar.svg")),
-            QtGui.QIcon.Normal,
-            QtGui.QIcon.Off)
-        Dialog.setWindowIcon(icon)
-        self.gridLayout_2 = QtGui.QGridLayout(Dialog)
-        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
-        self.horizontalLayout = QtGui.QHBoxLayout()
-        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        self.label_3 = QtGui.QLabel(Dialog)
-        self.label_3.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
-        self.label_3.setWordWrap(True)
-        self.label_3.setObjectName(_fromUtf8("label_3"))
-        self.horizontalLayout.addWidget(self.label_3)
-        self.password_lineEdit = QtGui.QLineEdit(Dialog)
-        self.password_lineEdit.setMinimumSize(QtCore.QSize(80, 0))
-        self.password_lineEdit.setMaximumSize(QtCore.QSize(71, 16777215))
-        self.password_lineEdit.setMaxLength(10)
-        self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
-        self.password_lineEdit.setObjectName(_fromUtf8("password_lineEdit"))
-        self.horizontalLayout.addWidget(self.password_lineEdit)
-        self.gridLayout_2.addLayout(self.horizontalLayout, 0, 0, 1, 2)
-        self.line = QtGui.QFrame(Dialog)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.line.sizePolicy().hasHeightForWidth())
-        self.line.setSizePolicy(sizePolicy)
-        self.line.setMinimumSize(QtCore.QSize(0, 16))
-        self.line.setFrameShape(QtGui.QFrame.HLine)
-        self.line.setFrameShadow(QtGui.QFrame.Sunken)
-        self.line.setObjectName(_fromUtf8("line"))
-        self.gridLayout_2.addWidget(self.line, 1, 0, 1, 2)
-        self.gridLayout = QtGui.QGridLayout()
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.label = QtGui.QLabel(Dialog)
-        self.label.setLayoutDirection(QtCore.Qt.LeftToRight)
-        self.label.setAlignment(QtCore.Qt.AlignCenter)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
-        self.user1_lineEdit = QtGui.QLineEdit(Dialog)
-        self.user1_lineEdit.setMaximumSize(QtCore.QSize(40, 16777215))
-        self.user1_lineEdit.setText(_fromUtf8(""))
-        self.user1_lineEdit.setMaxLength(6)
-        self.user1_lineEdit.setObjectName(_fromUtf8("user1_lineEdit"))
-        self.gridLayout.addWidget(self.user1_lineEdit, 0, 1, 1, 1)
-        self.label_2 = QtGui.QLabel(Dialog)
-        self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight)
-        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
-        self.label_2.setObjectName(_fromUtf8("label_2"))
-        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
-        self.user2_lineEdit = QtGui.QLineEdit(Dialog)
-        self.user2_lineEdit.setMaximumSize(QtCore.QSize(40, 16777215))
-        self.user2_lineEdit.setMaxLength(6)
-        self.user2_lineEdit.setObjectName(_fromUtf8("user2_lineEdit"))
-        self.gridLayout.addWidget(self.user2_lineEdit, 1, 1, 1, 1)
-        self.surgery_radioButton = QtGui.QRadioButton(Dialog)
-        self.surgery_radioButton.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.surgery_radioButton.setChecked(True)
-        self.surgery_radioButton.setObjectName(
-            _fromUtf8("surgery_radioButton"))
-        self.gridLayout.addWidget(self.surgery_radioButton, 2, 0, 1, 2)
-        self.reception_radioButton = QtGui.QRadioButton(Dialog)
-        self.reception_radioButton.setLayoutDirection(QtCore.Qt.RightToLeft)
-        self.reception_radioButton.setObjectName(
-            _fromUtf8("reception_radioButton"))
-        self.gridLayout.addWidget(self.reception_radioButton, 3, 0, 1, 2)
-        self.gridLayout_2.addLayout(self.gridLayout, 2, 0, 1, 2)
-        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
-        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(
-            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
-        self.buttonBox.setCenterButtons(True)
-        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
-        self.gridLayout_2.addWidget(self.buttonBox, 4, 0, 1, 2)
-        self.advanced_frame = QtGui.QFrame(Dialog)
-        self.advanced_frame.setMinimumSize(QtCore.QSize(0, 40))
-        self.advanced_frame.setFrameShape(QtGui.QFrame.NoFrame)
-        self.advanced_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.advanced_frame.setObjectName(_fromUtf8("advanced_frame"))
-        self.gridLayout_3 = QtGui.QGridLayout(self.advanced_frame)
-        self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
-        self.line_2 = QtGui.QFrame(self.advanced_frame)
-        self.line_2.setFrameShape(QtGui.QFrame.HLine)
-        self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
-        self.line_2.setObjectName(_fromUtf8("line_2"))
-        self.gridLayout_3.addWidget(self.line_2, 0, 0, 1, 2)
-        self.chosenServer_label = QtGui.QLabel(self.advanced_frame)
-        self.chosenServer_label.setWordWrap(True)
-        self.chosenServer_label.setObjectName(_fromUtf8("chosenServer_label"))
-        self.gridLayout_3.addWidget(self.chosenServer_label, 1, 0, 2, 1)
-        self.advanced_toolButton = QtGui.QToolButton(self.advanced_frame)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.advanced_toolButton.sizePolicy().hasHeightForWidth())
-        self.advanced_toolButton.setSizePolicy(sizePolicy)
-        self.advanced_toolButton.setPopupMode(QtGui.QToolButton.InstantPopup)
-        self.advanced_toolButton.setToolButtonStyle(
-            QtCore.Qt.ToolButtonTextOnly)
-        self.advanced_toolButton.setArrowType(QtCore.Qt.DownArrow)
-        self.advanced_toolButton.setObjectName(
-            _fromUtf8("advanced_toolButton"))
-        self.gridLayout_3.addWidget(self.advanced_toolButton, 2, 1, 1, 1)
-        self.gridLayout_2.addWidget(self.advanced_frame, 6, 0, 1, 2)
-        spacerItem = QtGui.QSpacerItem(
-            20,
-            40,
-            QtGui.QSizePolicy.Minimum,
-            QtGui.QSizePolicy.Expanding)
-        self.gridLayout_2.addItem(spacerItem, 3, 0, 1, 2)
-
-        self.retranslateUi(Dialog)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("accepted()")),
-            Dialog.accept)
-        QtCore.QObject.connect(
-            self.buttonBox,
-            QtCore.SIGNAL(_fromUtf8("rejected()")),
-            Dialog.reject)
-        QtCore.QMetaObject.connectSlotsByName(Dialog)
-
-    def retranslateUi(self, Dialog):
-        Dialog.setWindowTitle(_("openMolar"))
-        self.label_3.setText(_("System Password"))
-        self.label.setText(_("User 1(required)"))
-        self.label_2.setText(_("User 2 (optional)"))
-        self.surgery_radioButton.setText(_("Surgery Machine"))
-        self.reception_radioButton.setText(_("Reception Machine"))
-        self.chosenServer_label.setText(_("TextLabel"))
-        self.advanced_toolButton.setText(_("change"))
-
-from openmolar.qt4gui import resources_rc
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    ui = Ui_Dialog()
-    ui.setupUi(Dialog)
-    Dialog.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py b/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py
deleted file mode 100644
index 3ff2dae..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py
+++ /dev/null
@@ -1,183 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/toothPerioProps.ui'
-#
-# Created: Wed Nov  6 23:05:24 2013
-#      by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-
-class Ui_Form(object):
-
-    def setupUi(self, Form):
-        Form.setObjectName(_fromUtf8("Form"))
-        Form.resize(499, 148)
-        Form.setMinimumSize(QtCore.QSize(0, 120))
-        Form.setMaximumSize(QtCore.QSize(16777215, 517))
-        self.gridLayout = QtGui.QGridLayout(Form)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.tooth_label = QtGui.QLabel(Form)
-        self.tooth_label.setMaximumSize(QtCore.QSize(16777215, 28))
-        font = QtGui.QFont()
-        font.setPointSize(14)
-        self.tooth_label.setFont(font)
-        self.tooth_label.setAlignment(QtCore.Qt.AlignCenter)
-        self.tooth_label.setObjectName(_fromUtf8("tooth_label"))
-        self.gridLayout.addWidget(self.tooth_label, 0, 0, 1, 1)
-        self.comboBox = QtGui.QComboBox(Form)
-        self.comboBox.setObjectName(_fromUtf8("comboBox"))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.gridLayout.addWidget(self.comboBox, 0, 3, 1, 2)
-        self.orig_frame = QtGui.QFrame(Form)
-        self.orig_frame.setMinimumSize(QtCore.QSize(100, 100))
-        self.orig_frame.setMaximumSize(QtCore.QSize(16777215, 100))
-        self.orig_frame.setFrameShape(QtGui.QFrame.NoFrame)
-        self.orig_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.orig_frame.setObjectName(_fromUtf8("orig_frame"))
-        self.gridLayout.addWidget(self.orig_frame, 1, 0, 2, 1)
-        self.new_frame = QtGui.QFrame(Form)
-        self.new_frame.setMinimumSize(QtCore.QSize(100, 100))
-        self.new_frame.setMaximumSize(QtCore.QSize(16777215, 100))
-        self.new_frame.setFrameShape(QtGui.QFrame.NoFrame)
-        self.new_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.new_frame.setObjectName(_fromUtf8("new_frame"))
-        self.gridLayout.addWidget(self.new_frame, 1, 1, 2, 1)
-        self.copy_pushButton = QtGui.QPushButton(Form)
-        self.copy_pushButton.setMaximumSize(QtCore.QSize(16777215, 28))
-        self.copy_pushButton.setObjectName(_fromUtf8("copy_pushButton"))
-        self.gridLayout.addWidget(self.copy_pushButton, 1, 2, 1, 1)
-        self.cp_pushButton = QtGui.QPushButton(Form)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.cp_pushButton.sizePolicy().hasHeightForWidth())
-        self.cp_pushButton.setSizePolicy(sizePolicy)
-        self.cp_pushButton.setMinimumSize(QtCore.QSize(0, 20))
-        self.cp_pushButton.setMaximumSize(QtCore.QSize(40, 28))
-        self.cp_pushButton.setObjectName(_fromUtf8("cp_pushButton"))
-        self.gridLayout.addWidget(self.cp_pushButton, 1, 3, 1, 1)
-        self.clear_pushButton = QtGui.QPushButton(Form)
-        sizePolicy = QtGui.QSizePolicy(
-            QtGui.QSizePolicy.Preferred,
-            QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.clear_pushButton.sizePolicy(
-            ).hasHeightForWidth(
-            ))
-        self.clear_pushButton.setSizePolicy(sizePolicy)
-        self.clear_pushButton.setMinimumSize(QtCore.QSize(0, 20))
-        self.clear_pushButton.setMaximumSize(QtCore.QSize(40, 28))
-        self.clear_pushButton.setText(_fromUtf8(""))
-        icon = QtGui.QIcon()
-        icon.addPixmap(
-            QtGui.QPixmap(_fromUtf8(":/eraser.png")),
-            QtGui.QIcon.Normal,
-            QtGui.QIcon.Off)
-        self.clear_pushButton.setIcon(icon)
-        self.clear_pushButton.setObjectName(_fromUtf8("clear_pushButton"))
-        self.gridLayout.addWidget(self.clear_pushButton, 1, 4, 1, 1)
-        self.horizontalLayout = QtGui.QHBoxLayout()
-        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        self.leftTooth_pushButton = QtGui.QPushButton(Form)
-        self.leftTooth_pushButton.setMinimumSize(QtCore.QSize(24, 24))
-        self.leftTooth_pushButton.setMaximumSize(QtCore.QSize(24, 24))
-        self.leftTooth_pushButton.setText(_fromUtf8(""))
-        icon1 = QtGui.QIcon()
-        icon1.addPixmap(
-            QtGui.QPixmap(_fromUtf8(":/back.png")),
-            QtGui.QIcon.Normal,
-            QtGui.QIcon.Off)
-        self.leftTooth_pushButton.setIcon(icon1)
-        self.leftTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
-        self.leftTooth_pushButton.setObjectName(
-            _fromUtf8("leftTooth_pushButton"))
-        self.horizontalLayout.addWidget(self.leftTooth_pushButton)
-        self.le_frame = QtGui.QFrame(Form)
-        self.le_frame.setMaximumSize(QtCore.QSize(16777215, 16777215))
-        self.le_frame.setFrameShape(QtGui.QFrame.StyledPanel)
-        self.le_frame.setFrameShadow(QtGui.QFrame.Raised)
-        self.le_frame.setObjectName(_fromUtf8("le_frame"))
-        self.horizontalLayout.addWidget(self.le_frame)
-        self.rightTooth_pushButton = QtGui.QPushButton(Form)
-        self.rightTooth_pushButton.setMinimumSize(QtCore.QSize(24, 24))
-        self.rightTooth_pushButton.setMaximumSize(QtCore.QSize(24, 24))
-        self.rightTooth_pushButton.setText(_fromUtf8(""))
-        icon2 = QtGui.QIcon()
-        icon2.addPixmap(
-            QtGui.QPixmap(_fromUtf8(":/forward.png")),
-            QtGui.QIcon.Normal,
-            QtGui.QIcon.Off)
-        self.rightTooth_pushButton.setIcon(icon2)
-        self.rightTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
-        self.rightTooth_pushButton.setObjectName(
-            _fromUtf8("rightTooth_pushButton"))
-        self.horizontalLayout.addWidget(self.rightTooth_pushButton)
-        self.gridLayout.addLayout(self.horizontalLayout, 2, 2, 1, 2)
-        self.mobilitycomboBox = QtGui.QComboBox(Form)
-        self.mobilitycomboBox.setMaximumSize(QtCore.QSize(16777215, 28))
-        self.mobilitycomboBox.setObjectName(_fromUtf8("mobilitycomboBox"))
-        self.mobilitycomboBox.addItem(_fromUtf8(""))
-        self.mobilitycomboBox.addItem(_fromUtf8(""))
-        self.mobilitycomboBox.addItem(_fromUtf8(""))
-        self.mobilitycomboBox.addItem(_fromUtf8(""))
-        self.gridLayout.addWidget(self.mobilitycomboBox, 2, 4, 1, 1)
-
-        self.retranslateUi(Form)
-        QtCore.QMetaObject.connectSlotsByName(Form)
-
-    def retranslateUi(self, Form):
-        Form.setWindowTitle(_("Form"))
-        self.tooth_label.setText(_("ToothId"))
-        self.comboBox.setItemText(0, _("Pocketing"))
-        self.comboBox.setItemText(1, _("Bleeding"))
-        self.comboBox.setItemText(2, _("Plaque"))
-        self.comboBox.setItemText(3, _("Recession"))
-        self.comboBox.setItemText(4, _("Furcation"))
-        self.comboBox.setItemText(5, _("Suppuration"))
-        self.comboBox.setItemText(6, _("Mobility"))
-        self.comboBox.setItemText(7, _("Other"))
-        self.copy_pushButton.setText(_("Copy &All"))
-        self.cp_pushButton.setToolTip(_("delete tooth data"))
-        self.cp_pushButton.setText(_("Cp"))
-        self.clear_pushButton.setToolTip(_("delete tooth data"))
-        self.leftTooth_pushButton.setToolTip(_("Apply and move Back a tooth"))
-        self.rightTooth_pushButton.setToolTip(_("Apply & Move to Next Tooth"))
-        self.mobilitycomboBox.setItemText(0, _("-"))
-        self.mobilitycomboBox.setItemText(1, _("I"))
-        self.mobilitycomboBox.setItemText(2, _("II"))
-        self.mobilitycomboBox.setItemText(3, _("III"))
-
-from openmolar.qt4gui import resources_rc
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("openmolar")
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Form = QtGui.QWidget()
-    ui = Ui_Form()
-    ui.setupUi(Form)
-    Form.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/appointmentwidget.py b/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
index c0f5f46..756275e 100644
--- a/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
+++ b/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
@@ -135,7 +135,7 @@ class AppointmentWidget(QtGui.QFrame):
         self.setOutOfOffice(False)
 
         self.setMinimumSize(self.minimumSizeHint())
-        self.setMaximumSize(self.maximumSizeHint())
+        # self.setMaximumSize(self.maximumSizeHint())
         self.signals()
 
     def setOutOfOffice(self, val):
diff --git a/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py b/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
index 6d60cbc..cc2b35d 100755
--- a/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
+++ b/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
@@ -22,15 +22,23 @@
 # #                                                                          # #
 # ############################################################################ #
 
+from functools import partial
+import logging
+
 from PyQt4 import QtGui, QtCore
 from openmolar.settings import localsettings
 
+LOGGER = logging.getLogger("openmolar")
+
 
 class control(QtGui.QLabel):
 
     '''
     a custom label for the top of the appointment overview widgets
     '''
+    dayview_signal = QtCore.pyqtSignal(object)
+    edit_hours_signal = QtCore.pyqtSignal(object)
+    edit_memo_signal = QtCore.pyqtSignal(object)
 
     def __init__(self, parent=None):
         super(control, self).__init__(parent)
@@ -39,6 +47,8 @@ class control(QtGui.QLabel):
         self.setWordWrap(True)
         self.date = QtCore.QDate(1900, 1, 1)
 
+        self.recent_double_click = False
+
     def setDate(self, arg):
         '''
         takes a QDate
@@ -61,10 +71,7 @@ class control(QtGui.QLabel):
             str = "<center><b>%s</b><br />%s</center>" % (day, self.memo)
         else:
             str = "<center><b>%s</b></center>" % day
-
         self.setText(str)
-        self.setToolTip('''<center>Left click to go to<br />%s<br />
-        <br />Right click for admin options</center>''' % day)
 
     def mouseMoveEvent(self, e):
         self.setStyleSheet("background:white")
@@ -72,29 +79,60 @@ class control(QtGui.QLabel):
     def leaveEvent(self, e):
         self.setStyleSheet("")
 
-    def mousePressEvent(self, e):
-        but = e.button()
-        if but == 1:
-            self.emit(QtCore.SIGNAL("clicked"), self.date)
-        elif but == 2:
-            self.emit(QtCore.SIGNAL("right-clicked"), self.date)
-        else:
-            print "unknown mousePressEvent", but
+    def mousePressEvent(self, event):
+        QtCore.QTimer.singleShot(200,
+                                 partial(self.raise_context_menu, event.globalPos()))
+
+    def raise_context_menu(self, point):
+        if not self.recent_double_click:
+            menu = QtGui.QMenu(self)
+            action = menu.addAction(_("Switch to day view of this date"))
+            action.triggered.connect(self.call_day_view)
+            menu.setDefaultAction(action)
+            menu.addSeparator()
+            action = menu.addAction(_("Edit Memos"))
+            action.triggered.connect(self.call_edit_memo)
+            action = menu.addAction(_("Edit Clinician Hours"))
+            action.triggered.connect(self.call_edit_hours)
+            menu.exec_(point)
+
+    def mouseDoubleClickEvent(self, event):
+        LOGGER.debug("doubleclick")
+        self.recent_double_click = True
+        self.call_day_view()
+        QtCore.QTimer.singleShot(500, self.reset_double_click)
+
+    def reset_double_click(self):
+        self.recent_double_click = False
+
+    def call_day_view(self):
+        LOGGER.debug("Call for Day View")
+        self.dayview_signal.emit(self.date)
+
+    def call_edit_hours(self):
+        self.edit_hours_signal.emit(self.date)
+
+    def call_edit_memo(self):
+        self.edit_memo_signal.emit(self.date.toPyDate())
+
+
+class _TestBook(QtGui.QWidget):
+
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.control = control()
+        self.control.setDate(QtCore.QDate.currentDate().addDays(3))
+        layout = QtGui.QVBoxLayout(self)
+        layout.addWidget(self.control)
+        layout.addWidget(QtGui.QTextEdit())
+
+    def sizeHint(self):
+        return QtCore.QSize(100, 400)
 
 if __name__ == "__main__":
-    def test(a):
-        print "left click", a.toString()
-
-    def test2(a):
-        print "right click", a.toString()
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Form = QtGui.QWidget()
-    ui = control(Form)
-    ui.setDate(QtCore.QDate.currentDate())
-    QtCore.QObject.connect(ui, QtCore.SIGNAL("clicked"), test)
-    QtCore.QObject.connect(ui, QtCore.SIGNAL("right-clicked"), test2)
-
-    Form.show()
-
-    sys.exit(app.exec_())
+    LOGGER.setLevel(logging.DEBUG)
+
+    app = QtGui.QApplication([])
+    widg = _TestBook()
+    widg.show()
+    app.exec_()
diff --git a/src/openmolar/qt4gui/customwidgets/calendars.py b/src/openmolar/qt4gui/customwidgets/calendars.py
index d3cc857..a42f456 100644
--- a/src/openmolar/qt4gui/customwidgets/calendars.py
+++ b/src/openmolar/qt4gui/customwidgets/calendars.py
@@ -25,14 +25,12 @@
 from __future__ import division
 import calendar
 import datetime
+from functools import partial
 import sys
 
 from PyQt4 import QtGui, QtCore
 from openmolar.settings import localsettings
 
-from openmolar.qt4gui.compiled_uis import Ui_memo_item
-from openmolar.qt4gui.compiled_uis import Ui_editmemos
-
 CENTRE = QtGui.QTextOption(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
 RIGHT = QtGui.QTextOption(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
 LEFT = QtGui.QTextOption(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
@@ -128,99 +126,23 @@ class weekCalendar(controlCalendar):
             painter.fillRect(rect, self.color)
 
 
-class calDialogs():
+class monthCalendar(QtGui.QWidget):
 
     '''
-    a sub class for month and year calendars
+    A month calendar
     '''
-
-    def __init__(self):
-        pass
-
-    def publicHolidayEnter(parent):
-        '''
-        enter/modify the stored public holiday field
-        '''
-        d = parent.selectedDate
-        print "edit pub hol for", d
-        datekey = "%d%02d" % (d.month, d.day)
-        current = parent.headingdata.get(datekey, "")
-        new, result = QtGui.QInputDialog.getText(parent, _("Public Holidays"),
-                                                 _("Enter the information for ") + localsettings.longDate(
-                                                     d),
-                                                 QtGui.QLineEdit.Normal, current)
-        if result and current != str(new.toAscii()):
-            parent.emit(QtCore.SIGNAL("add_pub_hol"), str(new.toAscii()))
-
-    def raisememoDialog(parent):
-        '''
-        allow user to input a memo
-        '''
-        Dialog = QtGui.QDialog(parent)
-        dl = Ui_editmemos.Ui_Dialog()
-        dl.setupUi(Dialog)
-        d = parent.selectedDate
-        header_text = "%s" % localsettings.longDate(d)
-        datekey = "%d%02d" % (d.month, d.day)
-        if datekey in parent.headingdata:
-            header_text += "<br>%s" % parent.headingdata[datekey]
-
-        dl.label.setText(header_text)
-        dl.layout = QtGui.QVBoxLayout(dl.scrollArea)
-        dl.layout.setSpacing(0)
-        key = "%d%02d" % (parent.selectedDate.month, parent.selectedDate.day)
-
-        memoDict = {}
-        if key in parent.data:
-            memoDict = parent.data[key]
-
-        memowidget_dict = {}
-        for dentix in parent.dents:
-            if dentix in memoDict:
-                memo = memoDict[dentix].memo
-            else:
-                memo = ""
-
-            if dentix == 0:
-                dl.lineEdit.setText(memo)
-                memowidget_dict[0] = dl.lineEdit
-            else:
-                widg = QtGui.QWidget()
-                memoitem = Ui_memo_item.Ui_Form()
-                memoitem.setupUi(widg)
-                memoitem.label.setText(
-                    localsettings.apptix_reverse.get(dentix, "??"))
-
-                memoitem.lineEdit.setText(memo)
-
-                dl.layout.addWidget(widg)
-
-                memowidget_dict[dentix] = memoitem.lineEdit
-
-        spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Minimum,
-                                       QtGui.QSizePolicy.Expanding)
-        dl.layout.addItem(spacerItem)
-
-        if Dialog.exec_():
-            retarg = []
-            memo = str(dl.lineEdit.text().toAscii())
-            for dent in parent.dents:
-                memo = str(memowidget_dict[dent].text().toAscii())
-                if memo != memoDict.get(dent, ""):
-                    retarg.append((dent, memo),)
-            # print retarg
-            parent.emit(QtCore.SIGNAL("add_memo"), tuple(retarg))
-
-
-class monthCalendar(QtGui.QWidget, calDialogs):
+    memo_dialog_signal = QtCore.pyqtSignal(object)
+    public_holiday_signal = QtCore.pyqtSignal(object)
+    selected_date_signal = QtCore.pyqtSignal(object)
 
     def __init__(self, parent=None):
         '''
         initiate the widget
         '''
         super(monthCalendar, self).__init__(parent)
-        self.setSizePolicy(QtGui.QSizePolicy(
-                           QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
+        self.setSizePolicy(
+            QtGui.QSizePolicy(
+                QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
         self.parent = parent
         self.rowNo = 1
         self.colNo = 1
@@ -373,7 +295,19 @@ class monthCalendar(QtGui.QWidget, calDialogs):
         d = self.getDateFromPosition(event.x(), event.y())
         if d and d != self.selectedDate:
             self.setSelectedDate(d)
-            self.emit(QtCore.SIGNAL("selectedDate"), d)
+            self.selected_date_signal.emit(d)
+        else:
+            menu = QtGui.QMenu(self)
+            action = menu.addAction(_("Edit day memos"))
+            action2 = menu.addAction(_("Edit Public Holiday information"))
+
+            action.triggered.connect(
+                partial(self.memo_dialog_signal.emit, self.selectedDate))
+            action2.triggered.connect(
+                partial(self.public_holiday_signal.emit, self.selectedDate))
+
+            menu.setDefaultAction(action)
+            menu.exec_(event.globalPos())
 
     def mouseDoubleClickEvent(self, event):
         '''
@@ -382,9 +316,9 @@ class monthCalendar(QtGui.QWidget, calDialogs):
         d = self.getDateFromPosition(event.x(), event.y())
         if d and d != self.selectedDate:
             self.setSelectedDate(d)
-            self.emit(QtCore.SIGNAL("selectedDate"), d)
+            self.selected_date_signal.emit(d)
         if d:
-            self.raisememoDialog()
+            self.memo_dialog_signal.emit(d)
 
     def leaveEvent(self, event):
         '''
@@ -559,11 +493,14 @@ class monthCalendar(QtGui.QWidget, calDialogs):
                          self.bankHolColwidth + self.vheaderwidth, self.height())
 
 
-class yearCalendar(QtGui.QWidget, calDialogs):
+class yearCalendar(QtGui.QWidget):
 
     '''
     a pyqt4 custom widget to show a year calendar
     '''
+    memo_dialog_signal = QtCore.pyqtSignal(object)
+    public_holiday_signal = QtCore.pyqtSignal(object)
+    selected_date_signal = QtCore.pyqtSignal(object)
 
     def __init__(self, parent=None):
         '''
@@ -683,30 +620,6 @@ class yearCalendar(QtGui.QWidget, calDialogs):
         if d != self.highlightedDate:
             self.highlightedDate = d
             self.update()
-        advisory = ""
-        if d:
-            datekey = "%d%02d" % (d.month, d.day)
-            if datekey in self.headingdata:
-                advisory += "<h3>%s</h3><hr />" % self.headingdata[datekey]
-            if datekey in self.data:
-                for ix in self.data[datekey].keys():
-                    dent = self.data[datekey].get(ix)
-                    if dent:
-                        if ix == 0:
-                            advisory += "<h3>%s</h3>" % dent.memo
-                        else:
-                            if not dent.flag:
-                                if dent.memo:
-                                    advisory += "%s\t\t%s <br />" % (
-                                        dent.initials, dent.memo)
-                            else:
-                                times = "%s - %s" % (dent.start, dent.end)
-                                advisory += "%s\t%s\t%s <br />" % (
-                                    dent.initials, times, dent.memo)
-            if advisory.endswith(" <br />"):
-                advisory = advisory.rstrip(" <br />")
-
-        QtGui.QToolTip.showText(event.globalPos(), advisory)
 
     def mousePressEvent(self, event):
         '''
@@ -716,20 +629,19 @@ class yearCalendar(QtGui.QWidget, calDialogs):
         if d:
             if d != self.selectedDate:
                 self.setSelectedDate(d)
-                self.emit(QtCore.SIGNAL("selectedDate"), d)
-            if event.button() == 2:
+                self.selected_date_signal.emit(d)
+            else:
                 menu = QtGui.QMenu(self)
-                menu.addAction(_("Edit day memos"))
-                menu.addAction(_("Edit Public Holiday information"))
-                self.rightClickMenuResult(menu.exec_(event.globalPos()))
-
-    def rightClickMenuResult(self, result):
-        if not result:
-            return
-        if result.text() == _("Edit day memos"):
-            self.raisememoDialog()
-        elif result.text() == _("Edit Public Holiday information"):
-            self.publicHolidayEnter()
+                action = menu.addAction(_("Edit day memos"))
+                action2 = menu.addAction(_("Edit Public Holiday information"))
+
+                action.triggered.connect(
+                    partial(self.memo_dialog_signal.emit, self.selectedDate))
+                action2.triggered.connect(
+                    partial(self.public_holiday_signal.emit, self.selectedDate))
+
+                menu.setDefaultAction(action)
+                menu.exec_(event.globalPos())
 
     def getDayData(self):
         '''
@@ -752,9 +664,9 @@ class yearCalendar(QtGui.QWidget, calDialogs):
         d = self.getDateFromPosition(event.x(), event.y())
         if d and d != self.selectedDate:
             self.setSelectedDate(d)
-            self.emit(QtCore.SIGNAL("selectedDate"), d)
+            self.selected_date_signal.emit(d)
         if d:
-            self.raisememoDialog()
+            self.memo_dialog_signal.emit(self.selectedDate)
 
     def leaveEvent(self, event):
         '''
diff --git a/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py b/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
index 5667719..30b899c 100644
--- a/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
+++ b/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
@@ -27,11 +27,11 @@ from PyQt4 import QtGui, QtCore
 
 class dentHygSelector(QtGui.QTreeWidget):
 
-    def __init__(self, dents, hygs):
+    def __init__(self):
         QtGui.QTreeWidget.__init__(self)
         self.setHeaderHidden(True)
-        self.dents = dents
-        self.hygs = hygs
+        self.dents = []
+        self.hygs = []
         self.root = QtGui.QTreeWidgetItem(self, ["All Clinicians"])
         self.root.setCheckState(0, QtCore.Qt.Checked)
 
@@ -42,22 +42,25 @@ class dentHygSelector(QtGui.QTreeWidget):
         self.hyg_root.setCheckState(0, QtCore.Qt.Checked)
 
         self.dent_cbs = {}
+        self.hyg_cbs = {}
+
+        self.expandAll()
+        self.signals(True)
+
+    def set_dents(self, dents):
+        self.dents = dents
         for dent in self.dents:
             i = QtGui.QTreeWidgetItem(self.dent_root, [dent])
             i.setCheckState(0, QtCore.Qt.Checked)
             self.dent_cbs[dent] = i
 
-        self.hyg_cbs = {}
+    def set_hygs(self, hygs):
+        self.hygs = hygs
         for hyg in self.hygs:
             i = QtGui.QTreeWidgetItem(self.hyg_root, [hyg])
             i.setCheckState(0, QtCore.Qt.Checked)
             self.hyg_cbs[hyg] = i
 
-        self.expandAll()
-        self.selectedDents = dents
-        self.selectedHygs = hygs
-        self.signals(True)
-
     def signals(self, connect):
         if connect:
             self.connect(self,
@@ -88,21 +91,14 @@ class dentHygSelector(QtGui.QTreeWidget):
         elif item == self.hyg_root:
             self.checkAll(self.hyg_root.checkState(0), ignoreDents=True)
 
-        self.selectedDents = []
-        self.selectedHygs = []
-
         allDentsChecked = QtCore.Qt.Checked
         for dent in self.dent_cbs:
-            if self.dent_cbs[dent].checkState(0):
-                self.selectedDents.append(dent)
-            else:
+            if not self.dent_cbs[dent].checkState(0):
                 allDentsChecked = QtCore.Qt.Unchecked
 
         allHygsChecked = QtCore.Qt.Checked
         for hyg in self.hyg_cbs:
-            if self.hyg_cbs[hyg].checkState(0):
-                self.selectedHygs.append(hyg)
-            else:
+            if not self.hyg_cbs[hyg].checkState(0):
                 allHygsChecked = QtCore.Qt.Unchecked
 
         self.dent_root.setCheckState(0, allDentsChecked)
@@ -118,22 +114,35 @@ class dentHygSelector(QtGui.QTreeWidget):
         self.signals(True)
         self.emit(QtCore.SIGNAL("selectionChanged"))
 
-    def getSelectedDents(self):
-        return self.selectedDents
-
-    def getSelectedHygs(self):
-        return self.selectedHygs
-
-    def getSelectedClinicians(self):
-        return self.selectedDents + self.selectedHygs
+    @property
+    def selectedDents(self):
+        for initials, cb in self.dent_cbs.iteritems():
+            if cb.checkState(0):
+                yield initials
+
+    @property
+    def selectedHygs(self):
+        for initials, cb in self.hyg_cbs.iteritems():
+            if cb.checkState(0):
+                yield initials
+
+    @property
+    def selectedClinicians(self):
+        for clinician in self.selectedDents:
+            yield clinician
+        for clinician in self.selectedHygs:
+            yield clinician
 
     def allChecked(self):
         return self.root.checkState(0) == QtCore.Qt.Checked
 
 if __name__ == "__main__":
     app = QtGui.QApplication([])
-    dents = ["Neil", "Bea", "Helen", "Andy"]
+    dents = ["Neil", "Bea", "Helen"]
     hygs = ["Rosie", "Sally", "Ariana"]
-    w = dentHygSelector(dents, hygs)
+    w = dentHygSelector()
+    w.set_dents(dents)
+    w.set_hygs(hygs)
     w.show()
     app.exec_()
+    print list(w.selectedClinicians)
diff --git a/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py b/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
index a295041..43589c0 100644
--- a/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
+++ b/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
@@ -23,9 +23,10 @@
 # ############################################################################ #
 
 import logging
-
+import re
 from PyQt4 import QtGui, QtCore
 
+from openmolar.settings import localsettings
 from openmolar.qt4gui.customwidgets.chainLabel import ChainLabel
 from openmolar.qt4gui.customwidgets.confirming_check_box import ConfirmingCheckBox
 
@@ -33,10 +34,6 @@ from openmolar.qt4gui.customwidgets.confirming_check_box import ConfirmingCheckB
 LOGGER = logging.getLogger("openmolar")
 
 
-def decimalise(pence):
-    return "%d.%02d" % (pence // 100, pence % 100)
-
-
 class EstimateItemWidget(QtGui.QWidget):
 
     '''
@@ -238,6 +235,13 @@ class EstimateItemWidget(QtGui.QWidget):
         self.completed_checkBox.new_state_signal.connect(
             self.completed_state_changed)
 
+        for le in (self.description_lineEdit,
+                   self.cset_lineEdit,
+                   self.fee_lineEdit,
+                   self.ptFee_lineEdit
+                   ):
+            le.editingFinished.connect(self.edited_signal.emit)
+
     def update_cset(self, arg):
         '''
         csetype has been altered, alter ALL underying data
@@ -246,13 +250,16 @@ class EstimateItemWidget(QtGui.QWidget):
         for item in self.est_items:
             item.csetype = str(arg)
 
-    def update_descr(self, arg):
+    def update_descr(self, description):
         '''
         description has been altered, alter ALL underying data
         (for multiple items)
+        jump through hoops here in case user enters a UK pound sign!
         '''
+        description = str(description.toAscii()
+                          ).decode("ascii", "replace").replace('"', '\"')
         for item in self.est_items:
-            item.description = str(arg.toAscii()).replace('"', '\"')
+            item.description = description
 
     def update_Fee(self, arg, userPerforming=True):
         '''
@@ -261,7 +268,7 @@ class EstimateItemWidget(QtGui.QWidget):
         of items.
         '''
         try:
-            newVal = int(float(arg) * 100)
+            newVal = localsettings.pencify(arg)
             if self.feesLinked and userPerforming:
                 self.ptFee_lineEdit.setText(arg)
                 self.update_ptFee(arg, False)
@@ -279,7 +286,7 @@ class EstimateItemWidget(QtGui.QWidget):
         of items.
         '''
         try:
-            newVal = int(float(arg) * 100)
+            newVal = localsettings.pencify(arg)
             if self.feesLinked and userPerforming:
                 self.fee_lineEdit.setText(arg)
                 self.update_Fee(arg, False)
@@ -326,13 +333,13 @@ class EstimateItemWidget(QtGui.QWidget):
         '''
         update the fee lineedit
         '''
-        self.fee_lineEdit.setText(decimalise(fee))
+        self.fee_lineEdit.setText(localsettings.decimalise(fee))
 
     def setPtFee(self, fee):
         '''
         update the fee lineedit
         '''
-        self.ptFee_lineEdit.setText(decimalise(fee))
+        self.ptFee_lineEdit.setText(localsettings.decimalise(fee))
 
     def setCompleted(self, arg):
         '''
@@ -414,12 +421,24 @@ class EstimateItemWidget(QtGui.QWidget):
         perform logic here first to see if he/she is allowed to do this
         '''
         LOGGER.debug("EstimateItemWidget.check_first")
+
+        if localsettings.clinicianNo == 0:
+            QtGui.QMessageBox.warning(
+                self,
+                _("Not Allowed"),
+                _("You have no clinician login. "
+                  "Treatments cannot be completed by you!"))
+            return
+
         if self.est_items[0].is_exam:
-            if QtGui.QMessageBox.question(self, _("confirm"),
-                                          _(
-                                          "Delete examination from this treatment plan and estimate?"),
-                                          QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
-                                          QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
+            if QtGui.QMessageBox.question(
+                self,
+                _("confirm"),
+                _("Delete examination from this "
+                  "treatment plan and estimate?"),
+                QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+                QtGui.QMessageBox.Cancel
+            ) == QtGui.QMessageBox.Ok:
                 self.deleteItem()
             return
 
diff --git a/src/openmolar/qt4gui/customwidgets/estimate_widget.py b/src/openmolar/qt4gui/customwidgets/estimate_widget.py
index d31ce03..f83b82e 100644
--- a/src/openmolar/qt4gui/customwidgets/estimate_widget.py
+++ b/src/openmolar/qt4gui/customwidgets/estimate_widget.py
@@ -31,7 +31,8 @@ import logging
 
 from PyQt4 import QtGui, QtCore
 
-from estimate_item_widget import decimalise, EstimateItemWidget
+from openmolar.settings import localsettings
+from estimate_item_widget import EstimateItemWidget
 
 from openmolar.qt4gui.fees import manipulate_plan
 
@@ -48,6 +49,8 @@ class EstimateWidget(QtGui.QWidget):
     '''
     separate_codes = set([])
     updated_fees_signal = QtCore.pyqtSignal()
+    delete_estimate_item = QtCore.pyqtSignal(object)
+    edited_signal = QtCore.pyqtSignal()
 
     def __init__(self, parent=None):
         QtGui.QWidget.__init__(self, parent)
@@ -98,15 +101,14 @@ class EstimateWidget(QtGui.QWidget):
         self.interim_fees_total_le = QtGui.QLineEdit()
         self.interim_charges_total_le = QtGui.QLineEdit()
 
-        for le in (
-            self.planned_fees_total_le,
-            self.completed_fees_total_le,
-            self.fees_total_le,
-            self.charges_total_le,
-            self.planned_charges_total_le,
-            self.completed_charges_total_le,
-            self.interim_fees_total_le,
-                self.interim_charges_total_le):
+        for le in (self.planned_fees_total_le,
+                   self.completed_fees_total_le,
+                   self.fees_total_le,
+                   self.charges_total_le,
+                   self.planned_charges_total_le,
+                   self.completed_charges_total_le,
+                   self.interim_fees_total_le,
+                   self.interim_charges_total_le):
             le.setFixedWidth(EstimateItemWidget.MONEY_WIDTH)
             le.setAlignment(QtCore.Qt.AlignRight)
 
@@ -183,16 +185,20 @@ class EstimateWidget(QtGui.QWidget):
             total += est.fee
             ptTotal += est.ptfee
 
-        self.fees_total_le.setText(decimalise(total))
-        self.charges_total_le.setText(decimalise(ptTotal))
-        self.planned_fees_total_le.setText(decimalise(plan_total))
-        self.planned_charges_total_le.setText(decimalise(pt_plan_total))
-        self.completed_fees_total_le.setText(decimalise(comp_total))
-        self.completed_charges_total_le.setText(decimalise(pt_cmp_total))
-
-        self.interim_fees_total_le.setText(decimalise(interim_total))
+        self.fees_total_le.setText(localsettings.decimalise(total))
+        self.charges_total_le.setText(localsettings.decimalise(ptTotal))
+        self.planned_fees_total_le.setText(
+            localsettings.decimalise(plan_total))
+        self.planned_charges_total_le.setText(
+            localsettings.decimalise(pt_plan_total))
+        self.completed_fees_total_le.setText(
+            localsettings.decimalise(comp_total))
+        self.completed_charges_total_le.setText(
+            localsettings.decimalise(pt_cmp_total))
+        self.interim_fees_total_le.setText(
+            localsettings.decimalise(interim_total))
         self.interim_charges_total_le.setText(
-            decimalise(pt_interim_total))
+            localsettings.decimalise(pt_interim_total))
 
         interim_in_use = interim_total != 0 and pt_interim_total != 0
         if interim_in_use:
@@ -203,6 +209,7 @@ class EstimateWidget(QtGui.QWidget):
             widg.setVisible(interim_in_use)
 
         self.updated_fees_signal.emit()
+        self.edited_signal.emit()
 
     def set_expand_mode(self, expand=False):
         self.expandAll = expand
@@ -246,6 +253,7 @@ class EstimateWidget(QtGui.QWidget):
             LOGGER.warning("called when patient is None!")
             return
         self.setEstimate(self.pt.estimates)
+        self.edited_signal.emit()
 
     def setEstimate(self, ests):
         '''
@@ -358,29 +366,15 @@ class EstimateWidget(QtGui.QWidget):
         self.set_expand_mode(self.expandAll)
         # self.updateTotals()
 
-    def deleteItemWidget(self, item_widget, confirm_first=True):
+    def deleteItemWidget(self, item_widget):
         '''
         deletes a widget when delete button pressed.
         such an item will ALWAYS have only one treatment.
         '''
         LOGGER.debug("EstimateWidget.deleteItemWidget")
-
-        if not confirm_first:
-            message = u"<p>%s %s %s<br />%s?</p>" % (
-                _("Delete"),
-                item_widget.number_label.text(),
-                item_widget.description_lineEdit.text(),
-                _("from treatment plan and estimate")
-            )
-
-            if QtGui.QMessageBox.question(self, "confirm",
-                                          message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                          QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
-                return False
-
         assert len(item_widget.est_items) == 1, "bad est item passed"
         est = item_widget.est_items[0]
-        self.emit(QtCore.SIGNAL("deleteItem"), est)
+        self.delete_estimate_item.emit(est)
         self.resetEstimate()
 
     def expandItems(self):
@@ -548,3 +542,4 @@ if __name__ == "__main__":
 
     form.show()
     app.exec_()
+    print pt.estimates
diff --git a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py b/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
index c522f34..534002a 100644
--- a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
+++ b/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
@@ -31,25 +31,29 @@ class FiveMinuteTimeEdit(QtGui.QTimeEdit):
     A custom timeEdit which enforces only 5 minutes
     NB - connect to slot "verifiedTime"
     '''
+    time_changed_signal = QtCore.pyqtSignal(object)
 
     def __init__(self, parent=None):
         super(FiveMinuteTimeEdit, self).__init__(parent)
         self.setDisplayFormat("hh:mm")
-        QtCore.QObject.connect(self,
-                               QtCore.SIGNAL("timeChanged (const QTime&)"), self.timeChanged)
+        self.timeChanged.connect(self.time_changed)
 
     def stepBy(self, steps):
+        '''
+        re-implement the stepBy function
+        isn't foolproof - 55 minutes + 5 steps == 59 :(
+        '''
         if self.currentSection() == self.MinuteSection:
             QtGui.QTimeEdit.stepBy(self, steps * 5)
         else:
             QtGui.QTimeEdit.stepBy(self, steps)
 
-    def timeChanged(self, t):
+    def time_changed(self, t):
         min = self.time().minute()
         if min % 5 != 0:
             min -= min % 5
             self.setTime(QtCore.QTime(self.time().hour(), min))
-        self.emit(QtCore.SIGNAL("verifiedTime"), self.time())
+        self.time_changed_signal.emit(self.time())
 
 if __name__ == "__main__":
     def test(t):
@@ -58,7 +62,6 @@ if __name__ == "__main__":
     import sys
     app = QtGui.QApplication([])
     te = FiveMinuteTimeEdit()
-    QtCore.QObject.connect(te,
-                           QtCore.SIGNAL("verifiedTime"), test)
+    te.time_changed_signal.connect(test)
     te.show()
     sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/perioChartWidget.py b/src/openmolar/qt4gui/customwidgets/perioChartWidget.py
deleted file mode 100644
index fc87232..0000000
--- a/src/openmolar/qt4gui/customwidgets/perioChartWidget.py
+++ /dev/null
@@ -1,247 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from __future__ import division
-from PyQt4 import QtGui, QtCore
-from openmolar.qt4gui import colours
-
-
-class chartWidget(QtGui.QWidget):
-
-    '''a custom widget to show a standard UK dental chart
-    - allows for user navigation with mouse and/or keyboard
-    '''
-
-    def __init__(self, parent=None):
-        super(chartWidget, self).__init__(parent)
-        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.
-                                             Expanding))
-        self.grid = (8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8)
-        self.setMinimumSize(self.minimumSizeHint())
-        self.showLeftRight = True
-        self.showSelected = True
-        self.selected = [-1, -1]
-        self.props = {}
-        self.type = ""
-
-    def sizeHint(self):
-        return QtCore.QSize(500, 100)
-
-    def minimumSizeHint(self):
-        return QtCore.QSize(500, 100)
-
-    def setShowLeftRight(self, arg):
-        self.showLeftRight = arg
-
-    def setShowSelected(self, arg):
-        self.showSelected = arg
-
-    def setSelected(self, x, y):
-            self.selected = [x, y]
-            self.repaint()
-            self.emit(
-                QtCore.SIGNAL("toothSelected"),
-                self.grid[y][x])  # emit a signal that the user has selected a tooth
-
-    def setProps(self, tooth, arg):
-        if self.type == "Furcation":
-            self.props[tooth] = (arg[0], 127, arg[1], arg[2], 127, arg[3])
-        elif self.type == "Mobility":
-            self.props[tooth] = (127, arg, 127, 127, 127, 127)
-        else:
-            self.props[tooth] = arg
-
-    def mousePressEvent(self, event):
-        '''overrides QWidget's mouse event'''
-        xOffset = self.width() / 16
-        yOffset = self.height() / 2
-        x = int(event.x() // xOffset)
-        if event.y() < yOffset:
-            y = 0
-        else:
-            y = 1
-        self.setSelected(x, y)
-
-    def keyPressEvent(self, event):
-        '''overrudes QWidget's keypressEvent'''
-
-        if event.key() == QtCore.Qt.Key_Left:
-            self.selected[
-                0] = 15 if self.selected[
-                0] == 0 else self.selected[
-                0] - 1
-        elif event.key() == QtCore.Qt.Key_Right:
-            self.selected[
-                0] = 0 if self.selected[
-                0] == 15 else self.selected[
-                0] + 1
-        elif event.key() == QtCore.Qt.Key_Up:
-            self.selected[
-                1] = 1 if self.selected[
-                1] == 0 else self.selected[
-                1] - 1
-        elif event.key() == QtCore.Qt.Key_Down:
-            self.selected[
-                1] = 0 if self.selected[
-                1] == 1 else self.selected[
-                1] + 1
-        event.handled = True
-        self.repaint()
-
-    def paintEvent(self, event=None):
-        '''override the paint event so that we can draw our grid'''
-        painter = QtGui.QPainter(self)
-        painter.save()
-        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
-        midline = self.width() / 100
-        painter.setPen(QtGui.QPen(QtCore.Qt.blue, 1))
-                       #red pen
-        sansFont = QtGui.QFont("Courier", 7)
-        painter.setFont(sansFont)
-        fm = QtGui.QFontMetrics(sansFont)
-        leftpad = fm.width("R ")
-        rightpad = fm.width(" L")
-        xOffset = (self.width() - midline - leftpad - rightpad) / \
-            16  # cell width
-
-        thirdx = xOffset / 3
-        thirdy = self.height() / 6
-
-        attributeWidth = fm.width("13")
-        attributeHeight = fm.height()
-        painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
-                       #red pen
-        textRect = QtCore.QRectF(0, 0, self.width(), self.height())
-        painter.drawText(
-            textRect,
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter,
-            (QtCore.QString("L")))
-        painter.drawText(
-            textRect,
-            QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter,
-            (QtCore.QString("R")))
-        quadrants = ("ur", "ul", "ll", "lr")
-        quadrant = -1
-        for y in range(2):
-            lowerlimit = self.height() / 2
-            if y == 0:  # upper teeth
-                quadrant += 1
-                upperlimit = 0
-            else:
-                upperlimit = self.height() / 2
-            for x in range(16):
-                if x == 8:
-                    midx = midline
-                    quadrant += 1
-                elif x == 0:
-                    midx = 0
-                id = quadrants[quadrant] + str(self.grid[x])
-                rect = QtCore.QRectF(
-                    x *
-                    xOffset +
-                    midx +
-                    leftpad,
-                    upperlimit,
-                    xOffset,
-                    lowerlimit)
-                self.tooth(painter, rect, id[2])
-                painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
-                               #red pen
-                for i in range(3):
-                    ypos = thirdy / 2
-                    if i == 1:
-                        ypos = 0
-                    # draw "buccal" attribs (assuming URQ)
-                    if id in self.props:
-                        buccalRect = rect.adjusted(
-                            i * thirdx,
-                            ypos,
-                            (i - 2) * thirdx,
-                            -2 * thirdy)
-                        palatalRect = rect.adjusted(
-                            i * thirdx,
-                            2 * thirdy,
-                            (i - 2) * thirdx,
-                            -ypos)
-                        buccal = True
-                        for attrect in (buccalRect, palatalRect):
-                            if buccal:
-                                number = self.props[id][i]
-                            else:
-                                number = self.props[id][i + 3]
-                            if number != 127:
-                                if self.type == "Bleeding" or self.type == "Plaque":
-                                    text = ("N", "Y", "D")[number]
-                                            # plaque is "yes" or "no", but
-                                            # bleeding 2= delayed
-                                elif self.type == "Mobility":
-                                    text = ("", "I", "II", "III")[number]
-                                            # plaque is "yes" or "no", but
-                                            # bleeding 2= delayed
-                                else:
-                                    text = str(number)
-                                painter.drawText(
-                                    attrect,
-                                    QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter,
-                                    (QtCore.QString(text)))
-                            buccal = False
-        painter.setPen(QtCore.Qt.red)
-        painter.drawLine(
-            leftpad,
-            self.height() / 2,
-            self.width() - rightpad,
-            self.height() / 2)
-                         #big horizontal dissection of entire widget
-        painter.drawLine(self.width() / 2, 0, self.width() / 2, self.height())
-                         #vertical dissection of entire widget
-
-        painter.restore()
-
-    def tooth(self, painter, rect, id):
-        painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-                       #red pen
-        painter.drawRect(rect)
-        painter.setPen(QtGui.QPen(QtCore.Qt.blue, 1))
-                       #red pen
-
-        painter.drawText(
-            rect,
-            QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter,
-            (QtCore.QString(str(id))))
-
-if __name__ == "__main__":
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    form = chartWidget()
-    # perioData[tooth]=(recession,pocketing,plaque,bleeding,other,suppuration,furcation,mobility)
-
-    form.props = {
-        'lr1': (7, 2, 5, 7, 2, 5), 'lr3': (9, 6, 9, 9, 3, 9), 'lr2': (9, 3, 9, 9, 3, 9), 'lr5': (2, 2, 2, 2, 1, 2), 'lr4':
-        (5, 2, 7, 5, 2, 7), 'lr7': (4, 2, 2, 4, 2, 2), 'lr6': (127, 127, 127, 127, 127, 127), 'lr8': (6, 6, 6, 6, 2, 6),
-        'ul8': (9, 3, 3, 9, 6, 3), 'ul2': (6, 8, 9, 6, 1, 9), 'ul3': (9, 5, 9, 9, 9, 9), 'ul1': (1, 1, 1, 1, 6, 1), 'ul6': (
-            127, 127, 127, 127, 127, 127), 'ul7': (3, 1, 9, 3, 1, 9), 'ul4': (9, 2, 9, 9, 3, 9), 'ul5': (3, 1, 9, 3, 1, 9),
-        'ur4': (7, 1, 4, 7, 1, 4), 'ur5': (7, 1, 4, 7, 4, 4), 'ur6': (127, 127, 127, 127, 127, 127), 'ur7': (9, 5, 6, 9, 7, 6), 'ur1': (9, 2, 4, 9, 1, 4), 'ur2': (9, 1, 9, 9, 8, 9), 'ur3': (8, 1, 8, 8, 1, 8), 'ur8': (8, 1, 9, 8, 6, 9), 'll8': (127, 127, 127, 127, 127, 127), 'll3': (9, 3, 9, 9, 2, 9), 'll2': (6, 6, 9, 6, 1, 9), 'll1': (8, 3, 7, 8, 4, 7), 'll7': (6, 1, 1, 6, 1, 1), 'll6': (127, 127, 127, 127, 127, 127), 'll5': (6, 5, 3, 6, 3, 3), 'll4': (9, 6, 6, 9, 1, 6)}
-
-    form.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/toothProps.py b/src/openmolar/qt4gui/customwidgets/toothProps.py
index 5ab2bdd..913915a 100644
--- a/src/openmolar/qt4gui/customwidgets/toothProps.py
+++ b/src/openmolar/qt4gui/customwidgets/toothProps.py
@@ -49,6 +49,8 @@ class chartLineEdit(QtGui.QLineEdit):
     and is self aware when verification is needed
     override the keypress event for up and down arrow keys.
     '''
+    changed_properties_signal = QtCore.pyqtSignal(object)
+    deleted_comments_signal = QtCore.pyqtSignal()
 
     def __init__(self, parent=None):
         QtGui.QLineEdit.__init__(self, parent)
@@ -89,7 +91,7 @@ class chartLineEdit(QtGui.QLineEdit):
             if not re.match("..* $", props):
                 if props != "":
                     props = props + " "
-            self.emit(QtCore.SIGNAL("Changed_Properties"), props)
+            self.changed_properties_signal.emit(props)
 
     def additional(self, checkedAlready=False):
         '''
@@ -156,7 +158,7 @@ class chartLineEdit(QtGui.QLineEdit):
                 deleted = True
         if deleted:
             self.updateFromPropList(snapshotPropList)
-            self.emit(QtCore.SIGNAL("DeletedComments"))
+            self.deleted_comments_signal.emit()
 
     def addItem(self, item):
         if not item in ("", " "):
@@ -225,28 +227,35 @@ class chartLineEdit(QtGui.QLineEdit):
 
     def keyPressEvent(self, event):
         '''
-        overrides QWidget's keypressEvent
+        overrides QWidget's keypressEvent.
+        Catch special keys, and disable lower case
         '''
         if event.key() == QtCore.Qt.Key_Up:
             self.specialKeyPressed("up")
-        elif event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Down):
+            return
+        if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Down):
             self.specialKeyPressed("down")
-        elif event.key() == QtCore.Qt.Key_Space:
-            QtGui.QLineEdit.keyPressEvent(self, event)
+            return
+        if event.text().toAscii() == "!" and not self.om_gui.is_Static:
+            # don't allow comments if not in static:
+            return
+
+        if event.key() == QtCore.Qt.Key_Space:
             self.specialKeyPressed("space")
-        else:
-            inputT = event.text().toAscii()
-            if re.match("[a-z]", inputT):
-                #-- catch and overwrite any lower case
-                event = QtGui.QKeyEvent(event.type(), event.key(),
-                                        event.modifiers(), event.text().toUpper())
-            if not (inputT == "!" and not self.om_gui.is_Static):
-                # don't allow comments if not in static
-                QtGui.QLineEdit.keyPressEvent(self, event)
+        elif 65 <= event.key() <= 90:
+            event = QtGui.QKeyEvent(
+                event.type(),
+                event.key(),
+                event.modifiers(),
+                event.text().toUpper()
+            )
+
+        QtGui.QLineEdit.keyPressEvent(self, event)
 
 
 class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
     static_chosen = QtCore.pyqtSignal(object)
+    next_tooth_signal = QtCore.pyqtSignal(object)
 
     def __init__(self, parent=None):
         QtGui.QWidget.__init__(self, parent)
@@ -549,12 +558,12 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
     def prevTooth(self):
         if self.lineEdit.verifyProps():
             self.lineEdit.finishedEdit()
-            self.emit(QtCore.SIGNAL("NextTooth"), ("up"))
+            self.next_tooth_signal.emit("up")
 
     def nextTooth(self):
         if self.lineEdit.verifyProps():
             self.lineEdit.finishedEdit()
-            self.emit(QtCore.SIGNAL("NextTooth"), ("down"))
+            self.next_tooth_signal.emit("down")
 
     def static_input(self, value):
         self.lineEdit.addItem(value)
diff --git a/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py b/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
index 9fafce4..a72efca 100644
--- a/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
+++ b/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
@@ -39,9 +39,10 @@ class UpperCaseLineEdit(QtGui.QLineEdit):
         convert the text to upper case, and pass the signal on to the
         base widget
         '''
+        if 65 <= event.key() <= 90:
+            event = QtGui.QKeyEvent(event.type(), event.key(),
+                                    event.modifiers(), event.text().toUpper())
         QtGui.QLineEdit.keyPressEvent(self, event)
-        self.setText(self.text())
-        self.textEdited.emit(self.text())
 
 if __name__ == "__main__":
     app = QtGui.QApplication([])
diff --git a/build_scripts/update_messages.py b/src/openmolar/qt4gui/customwidgets/warning_label.py
old mode 100755
new mode 100644
similarity index 69%
rename from build_scripts/update_messages.py
rename to src/openmolar/qt4gui/customwidgets/warning_label.py
index 19b3b5c..0eb7372
--- a/build_scripts/update_messages.py
+++ b/src/openmolar/qt4gui/customwidgets/warning_label.py
@@ -22,32 +22,34 @@
 # #                                                                          # #
 # ############################################################################ #
 
-'''
-get all translatable strings into a single messages.pot
-requires pygettext available on the command line - i.e. NOT windows friendly.
-'''
+from PyQt4 import QtGui, QtCore
 
-import os
-import subprocess
-from get_git_branch import module_path
 
-def source_files():
+class WarningLabel(QtGui.QWidget):
 
-    for root, dir_, files in os.walk(module_path):
-        for file_ in files:
-            if file_.endswith('.py'):
-                yield os.path.abspath(os.path.join(root, file_))
+    def __init__(self, text, parent=None):
+        QtGui.QWidget.__init__(self, parent)
 
+        icon = QtGui.QIcon(":/openmolar.svg")
 
-def main():
-    files = list(source_files())
-    print "%d py files found" % len(files)
-    outdir = os.path.join(module_path, "openmolar", "locale")
-    print "using pygettext to create messages.pot in directory %s"% outdir
-    pr = subprocess.Popen(["pygettext", "-p", outdir] + files)
-    pr.wait()
-    print "ALL DONE!"
+        icon_label = QtGui.QLabel()
+        icon_label.setPixmap(icon.pixmap(48, 48))
 
-if __name__ == "__main__":
+        self.label = QtGui.QLabel(text)
+        self.label.setAlignment(QtCore.Qt.AlignCenter)
+        self.label.setWordWrap(True)
+
+        layout = QtGui.QHBoxLayout(self)
+        layout.addWidget(icon_label)
+        layout.addWidget(self.label)
+        layout.setStretch(1, 9)
 
-    main()
+    def setText(self, message):
+        self.label.setText(message)
+
+if __name__ == "__main__":
+    app = QtGui.QApplication([])
+    from openmolar.qt4gui import resources_rc
+    wl = WarningLabel("hello world!")
+    wl.show()
+    app.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/__init__.py b/src/openmolar/qt4gui/dialogs/__init__.py
index 3af96a9..c701215 100755
--- a/src/openmolar/qt4gui/dialogs/__init__.py
+++ b/src/openmolar/qt4gui/dialogs/__init__.py
@@ -21,57 +21,3 @@
 # # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
 # #                                                                          # #
 # ############################################################################ #
-
-from openmolar.qt4gui.dialogs import saveMemo
-from openmolar.qt4gui.dialogs import permissions
-from openmolar.qt4gui.dialogs import select_language
-
-from openmolar.qt4gui.dialogs.newBPE import BPE_Dialog
-from openmolar.qt4gui.dialogs.assistant_select_dialog import AssistantSelectDialog
-from openmolar.qt4gui.dialogs.clinician_select_dialog import ClinicianSelectDialog
-from openmolar.qt4gui.dialogs.duplicate_receipt_dialog import DuplicateReceiptDialog
-from openmolar.qt4gui.dialogs.save_discard_cancel import SaveDiscardCancelDialog
-from openmolar.qt4gui.dialogs.med_notes_dialog import MedNotesDialog
-from openmolar.qt4gui.dialogs.choose_tooth_dialog import ChooseToothDialog
-from openmolar.qt4gui.dialogs.exam_wizard import ExamWizard
-from openmolar.qt4gui.dialogs.hygTreatWizard import HygTreatWizard
-from openmolar.qt4gui.dialogs.recall_dialog import RecallDialog
-from openmolar.qt4gui.dialogs.child_smile_dialog import ChildSmileDialog
-from openmolar.qt4gui.dialogs.alter_todays_notes import AlterTodaysNotesDialog
-from openmolar.qt4gui.dialogs.find_patient_dialog import FindPatientDialog
-from openmolar.qt4gui.dialogs.family_manage_dialog import LoadRelativesDialog
-from openmolar.qt4gui.dialogs.auto_address_dialog import AutoAddressDialog
-from openmolar.qt4gui.dialogs.family_manage_dialog import FamilyManageDialog
-from openmolar.qt4gui.dialogs.nhs_forms_config_dialog import NHSFormsConfigDialog
-from openmolar.qt4gui.dialogs.advanced_tx_planning_dialog import AdvancedTxPlanningDialog
-from openmolar.qt4gui.dialogs.document_dialog import DocumentDialog
-from openmolar.qt4gui.dialogs.account_severity_dialog import AccountSeverityDialog
-from openmolar.qt4gui.dialogs.daybook_item_dialog import DaybookItemDialog
-from openmolar.qt4gui.dialogs.daybook_edit_dialog import DaybookEditDialog
-
-__all__ = ['AccountSeverityDialog',
-           'AdvancedTxPlanningDialog',
-           'AlterTodaysNotesDialog',
-           'AssistantSelectDialog',
-           'AutoAddressDialog',
-           'BPE_Dialog',
-           'ChildSmileDialog',
-           'ChooseToothDialog',
-           'ClinicianSelectDialog',
-           'DaybookItemDialog',
-           'DaybookEditDialog',
-           'DocumentDialog',
-           'DuplicateReceiptDialog',
-           'ExamWizard',
-           'FamilyManageDialog',
-           'FindPatientDialog',
-           'HygTreatWizard',
-           'LoadRelativesDialog',
-           'MedNotesDialog',
-           'NHSFormsConfigDialog',
-           'RecallDialog',
-           'SaveDiscardCancelDialog',
-           ]
-
-if __name__ == "__main__":
-    print "All imports suceeded!"
diff --git a/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py b/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py
new file mode 100644
index 0000000..bc5cd93
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py
@@ -0,0 +1,206 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+from collections import namedtuple
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.customwidgets.upper_case_line_edit \
+    import UpperCaseLineEdit
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+from openmolar.qt4gui.dialogs.add_user_dialog import AddUserDialog
+
+from openmolar.dbtools import db_settings
+
+LOGGER = logging.getLogger("openmolar")
+
+NewClinician = namedtuple('NewClinician',
+    ('initials', 'name', 'formal_name', 'qualifications',
+    'type', 'speciality', 'data', 'start_date', 'end_date', "new_diary")
+    )
+
+
+class AddClinicianDialog(ExtendableDialog):
+
+    def __init__(self, ftr=False, parent=None):
+        ExtendableDialog.__init__(self, parent)
+        self.setWindowTitle(_("Add User Dialog"))
+
+        self.top_label = WarningLabel(_('Add a new clinician to the system?'))
+
+        self.user_id_comboBox = QtGui.QComboBox()
+        but = QtGui.QPushButton(_("Add New Login"))
+
+        self.name_lineedit = QtGui.QLineEdit()
+        self.f_name_lineedit = QtGui.QLineEdit()
+        self.quals_lineedit = QtGui.QLineEdit()
+        self.type_comboBox = QtGui.QComboBox()
+        self.type_comboBox.addItems([
+            _("Dentist"),
+            _("Hygienist"),
+            _("Therapist")
+            ])
+        self.speciality_lineedit = QtGui.QLineEdit()
+        self.date_edit = QtGui.QDateEdit()
+        self.date_edit.setDate(localsettings.currentDay())
+        self.data_lineedit = QtGui.QLineEdit()
+        self.new_diary_checkbox = QtGui.QCheckBox(
+            _("Create a new diary for this clinician "
+            "(uncheck to map to an existing diary)"))
+        self.new_diary_checkbox.setChecked(True)
+
+        row1 = QtGui.QWidget()
+        layout = QtGui.QHBoxLayout(row1)
+        layout.setMargin(0)
+        layout.addWidget(self.user_id_comboBox)
+        layout.addWidget(but)
+
+        frame = QtGui.QFrame(self)
+        layout = QtGui.QFormLayout(frame)
+        layout.addRow(_("Initials/Nickname (must be an existing Login)"),
+            row1)
+        layout.addRow(_("Name eg. Fred Smith"), self.name_lineedit)
+        layout.addRow(_("Formal Name eg. Dr.F. Smith"), self.f_name_lineedit)
+        layout.addRow(_("Qualifications"), self.quals_lineedit)
+        layout.addRow(_("Speciality"), self.speciality_lineedit)
+        layout.addRow(_("Clinician Type"), self.type_comboBox)
+        layout.addRow(_("Start Date"), self.date_edit)
+        layout.addRow(_("Additional Data"), self.data_lineedit)
+        layout.addRow(self.new_diary_checkbox)
+        self.insertWidget(self.top_label)
+        self.insertWidget(frame)
+
+        for le in (self.name_lineedit, self.f_name_lineedit):
+            le.textChanged.connect(self._check_enable)
+        self.name_lineedit.setFocus()
+
+        list_widget = QtGui.QListWidget()
+        list_widget.addItems([str(val) for val in sorted(localsettings.dentDict.values())])
+        self.add_advanced_widget(list_widget)
+        self.set_advanced_but_text(_("view existing dentists"))
+
+        self.load_logins()
+        but.clicked.connect(self.add_user)
+
+    def sizeHint(self):
+        return QtCore.QSize(500, 400)
+
+    def _check_enable(self, *args):
+        self.enableApply(self.initials != ""
+            and self.name != "" and self.full_name != "")
+
+    def load_logins(self, chosen=None):
+        poss_inits = localsettings.allowed_logins
+        for val in localsettings.ops.values() + ["rec"]:
+            try:
+                poss_inits.remove(val)
+            except ValueError:
+                print "couldn't remove %s" % val
+                pass
+        self.user_id_comboBox.clear()
+        self.user_id_comboBox.addItems(poss_inits)
+        if chosen:
+            try:
+                index = poss_inits.index(chosen)
+            except ValueError:
+                index = -1
+            self.user_id_comboBox.setCurrentIndex(index)
+
+    def add_user(self):
+        dl = AddUserDialog(self.parent())
+        if dl.exec_():
+            self.load_logins(dl.username)
+
+    @property
+    def initials(self):
+        return unicode(self.user_id_comboBox.currentText().toUtf8())
+
+    @property
+    def name(self):
+        return unicode(self.name_lineedit.text().toUtf8())
+
+    @property
+    def full_name(self):
+        return unicode(self.f_name_lineedit.text().toUtf8())
+
+    @property
+    def qualifications(self):
+        return unicode(self.quals_lineedit.text().toUtf8())
+
+    @property
+    def speciality(self):
+        return unicode(self.speciality_lineedit.text().toUtf8())
+
+    @property
+    def type(self):
+        return self.type_comboBox.currentIndex() + 1
+
+    @property
+    def data(self):
+        return unicode(self.data_lineedit.text().toUtf8())
+
+    @property
+    def start_date(self):
+        return self.date_edit.date().toPyDate()
+
+    @property
+    def end_date(self):
+        return None
+
+    @property
+    def new_diary(self):
+        return self.new_diary_checkbox.isChecked()
+
+    def apply(self):
+        new_clinician = NewClinician(self.initials,
+                                     self.name,
+                                    self.full_name,
+                                    self.qualifications,
+                                    self.type,
+                                    self.speciality,
+                                    self.data,
+                                    self.start_date,
+                                    self.end_date,
+                                    self.new_diary,
+                                    )
+        LOGGER.info(new_clinician)
+        return db_settings.insert_clinician(new_clinician)
+
+    def exec_(self):
+        if ExtendableDialog.exec_(self):
+            return self.apply()
+        return False
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+    localsettings.initiateUsers()
+    localsettings.initiate()
+
+    dl = AddClinicianDialog(True)
+    if dl.exec_():
+        print "clinician added to database successfully"
diff --git a/src/openmolar/qt4gui/dialogs/add_user_dialog.py b/src/openmolar/qt4gui/dialogs/add_user_dialog.py
new file mode 100644
index 0000000..4b39e3e
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/add_user_dialog.py
@@ -0,0 +1,100 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.customwidgets.upper_case_line_edit \
+    import UpperCaseLineEdit
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+from openmolar.dbtools import db_settings
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AddUserDialog(ExtendableDialog):
+
+    def __init__(self, parent=None):
+        ExtendableDialog.__init__(self, parent)
+        self.setWindowTitle(_("Add User Dialog"))
+
+        self.top_label = WarningLabel("%s<br />%s<hr />%s" % (
+            _('Add a new user to the system?'),
+            _("This is done using initials or a short nickname."),
+            _("Must be unique and Maximum allowed in 5 characters")))
+
+        self.line_edit = UpperCaseLineEdit()
+
+        frame = QtGui.QFrame(self)
+        layout = QtGui.QFormLayout(frame)
+        layout.addRow(_("User Initials or nickname"), self.line_edit)
+
+        self.insertWidget(self.top_label)
+        self.insertWidget(frame)
+
+        self.line_edit.textChanged.connect(self._check_enable)
+        self.line_edit.setFocus()
+
+        list_widget = QtGui.QListWidget()
+        list_widget.addItems(sorted(localsettings.allowed_logins))
+        self.add_advanced_widget(list_widget)
+        self.set_advanced_but_text(_("view existing users"))
+
+    def _check_enable(self, *args):
+        input_ = self.username
+        if input_ in localsettings.allowed_logins:
+            QtGui.QMessageBox.warning(self,
+                                      _("error"),
+                                      _("Initials/nickname mut be unique"),
+                                      )
+            self.enableApply(False)
+        else:
+            self.enableApply(input_ != "")
+
+    @property
+    def username(self):
+        return unicode(self.line_edit.text().toUtf8())
+
+    def apply(self):
+        if db_settings.insert_login(self.username):
+            localsettings.initiateUsers()
+            return True
+
+    def exec_(self):
+        if ExtendableDialog.exec_(self):
+            return self.apply()
+        return False
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+    localsettings.initiateUsers()
+
+    dl = AddUserDialog()
+    if dl.exec_():
+        print dl.username
diff --git a/src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py b/src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py
new file mode 100644
index 0000000..95b5fcf
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py
@@ -0,0 +1,290 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.compiled_uis import Ui_record_tools
+
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AdvancedRecordManagementDialog(BaseDialog):
+
+    def __init__(self, pt, parent):
+        BaseDialog.__init__(self, parent, remove_stretch=True)
+        self.pt = pt
+        self.om_gui = parent
+        widget = QtGui.QWidget(self)
+        self.ui = Ui_record_tools.Ui_Form()
+        self.ui.setupUi(widget)
+
+        self.insertWidget(widget)
+
+        self.ui.tabWidget.setCurrentIndex(0)
+        self.initialMoney()
+        self.initialDates()
+        self.initialHidden_notes()
+        self.signals()
+
+        self.setMinimumSize(self.sizeHint())
+
+        self.DATE_ATTRIBUTES = (
+            self.pt.pd5,
+            self.pt.pd6,
+            self.pt.pd7,
+            self.pt.pd8,
+            self.pt.pd9,
+            self.pt.pd10,
+            self.pt.billdate)
+
+        self.check_before_reject_if_dirty = True
+
+    def sizeHint(self):
+        return QtCore.QSize(600, 600)
+
+    def initialMoney(self):
+        '''
+        loads the money at startup
+        '''
+        self.ui.total_label.setText(localsettings.formatMoney(
+                                    self.pt.fees))
+
+        self.ui.money0_spinBox.setValue(self.pt.money0)
+        self.ui.money1_spinBox.setValue(self.pt.money1)
+        self.ui.money2_spinBox.setValue(self.pt.money2)
+        self.ui.money3_spinBox.setValue(self.pt.money3)
+        self.ui.money4_spinBox.setValue(self.pt.money4)
+        self.ui.money5_spinBox.setValue(self.pt.money5)
+        self.ui.money6_spinBox.setValue(self.pt.money6)
+        self.ui.money7_spinBox.setValue(self.pt.money7)
+        self.ui.money8_spinBox.setValue(self.pt.money8)
+        self.ui.money9_spinBox.setValue(self.pt.money9)
+        self.ui.money10_spinBox.setValue(self.pt.money10)
+        self.ui.money11_spinBox.setValue(self.pt.money11)
+
+    def updateMoneyTotal(self, arg=0):
+        '''
+        updates the money label
+        '''
+        fees = (self.ui.money0_spinBox.value() +
+                self.ui.money1_spinBox.value() +
+                self.ui.money9_spinBox.value() +
+                self.ui.money10_spinBox.value() +
+                self.ui.money11_spinBox.value() -
+                self.ui.money2_spinBox.value() -
+                self.ui.money3_spinBox.value() -
+                self.ui.money8_spinBox.value()
+                )
+
+        self.ui.total_label.setText(localsettings.formatMoney(fees))
+        self._check_enable()
+
+    def changeMoney(self):
+        '''
+        modify the money fields on a patient record
+        '''
+        self.pt.money0 = self.ui.money0_spinBox.value()
+        self.pt.money1 = self.ui.money1_spinBox.value()
+        self.pt.money2 = self.ui.money2_spinBox.value()
+        self.pt.money3 = self.ui.money3_spinBox.value()
+        self.pt.money4 = self.ui.money4_spinBox.value()
+        self.pt.money5 = self.ui.money5_spinBox.value()
+        self.pt.money6 = self.ui.money6_spinBox.value()
+        self.pt.money7 = self.ui.money7_spinBox.value()
+        self.pt.money8 = self.ui.money8_spinBox.value()
+        self.pt.money9 = self.ui.money9_spinBox.value()
+        self.pt.money10 = self.ui.money10_spinBox.value()
+        self.pt.money11 = self.ui.money11_spinBox.value()
+
+    @property
+    def has_money_changes(self):
+        return (
+            self.pt.money0 != self.ui.money0_spinBox.value() or
+            self.pt.money1 != self.ui.money1_spinBox.value() or
+            self.pt.money2 != self.ui.money2_spinBox.value() or
+            self.pt.money3 != self.ui.money3_spinBox.value() or
+            self.pt.money4 != self.ui.money4_spinBox.value() or
+            self.pt.money5 != self.ui.money5_spinBox.value() or
+            self.pt.money6 != self.ui.money6_spinBox.value() or
+            self.pt.money7 != self.ui.money7_spinBox.value() or
+            self.pt.money8 != self.ui.money8_spinBox.value() or
+            self.pt.money9 != self.ui.money9_spinBox.value() or
+            self.pt.money10 != self.ui.money10_spinBox.value() or
+            self.pt.money11 != self.ui.money11_spinBox.value()
+        )
+
+    def initialDates(self):
+        '''
+        modify Date fields
+        '''
+        def initialise(date_, de, but):
+            try:
+                de.setDate(date_)
+                but.hide()
+            except TypeError:
+                de.hide()
+                but.clicked.connect(de.show)
+                but.clicked.connect(but.hide)
+            finally:
+                but.clicked.connect(self._check_enable)
+                de.dateChanged.connect(self._check_enable)
+
+        initialise(self.pt.pd5, self.ui.pd5_dateEdit, self.ui.pd5_pushButton)
+        initialise(self.pt.pd6, self.ui.pd6_dateEdit, self.ui.pd6_pushButton)
+        initialise(self.pt.pd7, self.ui.pd7_dateEdit, self.ui.pd7_pushButton)
+        initialise(self.pt.pd8, self.ui.pd8_dateEdit, self.ui.pd8_pushButton)
+        initialise(self.pt.pd9, self.ui.pd9_dateEdit, self.ui.pd9_pushButton)
+        initialise(self.pt.pd10, self.ui.pd10_dateEdit,
+                   self.ui.pd10_pushButton)
+        initialise(self.pt.billdate, self.ui.billdate_dateEdit,
+                   self.ui.billdate_pushButton)
+
+    @property
+    def new_dates(self):
+        for de in (self.ui.pd5_dateEdit,
+                   self.ui.pd6_dateEdit,
+                   self.ui.pd7_dateEdit,
+                   self.ui.pd8_dateEdit,
+                   self.ui.pd9_dateEdit,
+                   self.ui.pd10_dateEdit,
+                   self.ui.billdate_dateEdit
+                   ):
+            yield de.date().toPyDate() if de.isVisible() else None
+
+    def changeDates(self):
+        '''
+        apply date changes
+        '''
+        for i, date_ in enumerate(self.new_dates):
+            if date_:
+                self.DATE_ATTRIBUTES[i] = date_
+        self._check_enable()
+
+    @property
+    def has_date_changes(self):
+        changed = False
+        for i, date_ in enumerate(self.new_dates):
+            if date_ and self.DATE_ATTRIBUTES[i] != date_:
+                LOGGER.debug("user has changed date from %s to %s",
+                             self.DATE_ATTRIBUTES[i], date_)
+                changed = True
+        return changed
+
+    def initialHidden_notes(self):
+        '''
+        load the patients hidden notes
+        '''
+        self.ui.hidden_notes_tableWidget.clear()
+        self.ui.hidden_notes_tableWidget.setColumnCount(2)
+        self.ui.hidden_notes_tableWidget.setRowCount(
+            len(self.pt.HIDDENNOTES))
+        header = self.ui.hidden_notes_tableWidget.horizontalHeader()
+        self.ui.hidden_notes_tableWidget.setHorizontalHeaderLabels(
+            [_("type"), _("note")])
+        header.setStretchLastSection(True)
+        for row_no, (ntype, note) in enumerate(self.pt.HIDDENNOTES):
+            ntype_item = QtGui.QTableWidgetItem(ntype)
+            self.ui.hidden_notes_tableWidget.setItem(row_no, 0, ntype_item)
+
+            note_item = QtGui.QTableWidgetItem(note)
+            self.ui.hidden_notes_tableWidget.setItem(row_no, 1, note_item)
+
+        self.ui.hidden_notes_tableWidget.itemChanged.connect(
+            self._check_enable)
+
+    @property
+    def new_hidden_notes(self):
+        '''
+        apply new notes
+        '''
+        HN = []
+        for row_no in range(self.ui.hidden_notes_tableWidget.rowCount()):
+            ntype = self.ui.hidden_notes_tableWidget.item(row_no, 0).text()
+            note = self.ui.hidden_notes_tableWidget.item(row_no, 1).text()
+
+            HN.append((ntype, note))
+        return HN
+
+    def changeHidden_notes(self):
+        '''
+        apply new notes
+        '''
+        self.pt.HIDDENNOTES = self.new_hidden_notes
+        self._check_enable()
+
+    @property
+    def has_hidden_note_changes(self):
+        return self.new_hidden_notes != self.pt.HIDDENNOTES
+
+    def signals(self):
+        '''
+        connect signals
+        '''
+        for widg in self.ui.money_scrollAreaWidgetContents.children():
+            if isinstance(widg, QtGui.QSpinBox):
+                widg.valueChanged.connect(self.updateMoneyTotal)
+
+    def reject(self):
+        self.dirty = self.has_changes
+        BaseDialog.reject(self)
+
+    @property
+    def has_changes(self):
+        LOGGER.debug("checking for changes")
+        return (self.has_money_changes or
+                self.has_date_changes or
+                self.has_hidden_note_changes)
+
+    def _check_enable(self):
+        self.enableApply(self.has_changes)
+
+    def apply(self):
+        LOGGER.warning("advanced record management dialog applying changes")
+        self.changeMoney()
+        self.changeDates()
+        self.changeHidden_notes()
+
+if __name__ == "__main__":
+    localsettings.initiate()
+    localsettings.loadFeeTables()
+    LOGGER.setLevel(logging.DEBUG)
+
+    from openmolar.dbtools.patient_class import patient
+    pt = patient(1)
+
+    app = QtGui.QApplication([])
+    pt.HIDDENNOTES = [
+        ('COURSE OPENED', '= = = = = '),
+        ('TC: EXAM', 'CE')
+    ]
+
+    dl = AdvancedRecordManagementDialog(pt, None)
+    if dl.exec_():
+        dl.apply()
diff --git a/src/openmolar/qt4gui/dialogs/alterAday.py b/src/openmolar/qt4gui/dialogs/alterAday.py
index faef87a..6041d23 100644
--- a/src/openmolar/qt4gui/dialogs/alterAday.py
+++ b/src/openmolar/qt4gui/dialogs/alterAday.py
@@ -30,10 +30,10 @@ from openmolar.settings import localsettings
 from openmolar.dbtools import appointments
 
 
-class adayData():
+class adayData(object):
 
     '''
-    a custom data structure to stor data
+    a custom data structure to store data
     '''
 
     def __init__(self, dent):
diff --git a/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py b/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
index 8e5ee56..c5dc352 100644
--- a/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
@@ -29,9 +29,6 @@ from openmolar.connect import connect
 from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
 from openmolar.qt4gui.dialogs import permissions
 
-from openmolar.dbtools.cashbook import cashbookCodesDict
-
-
 QUERY = '''select cbdate, ref, descr, code, dntid, amt from cashbook
 where id = %s'''
 
@@ -64,7 +61,7 @@ class AlterCashbookDialog(ExtendableDialog):
         self.amount_sb = QtGui.QDoubleSpinBox()
         self.amount_sb.setRange(0, 10000)
 
-        self.codestrings = cashbookCodesDict.values()
+        self.codestrings = localsettings.cashbookCodesDict.values()
         self.code_cb.addItems(self.codestrings)
 
         form_layout.addRow(_("Patient Number"), self.serialno_le)
@@ -126,7 +123,7 @@ class AlterCashbookDialog(ExtendableDialog):
             pos = -1
         self.dentist_cb.setCurrentIndex(pos)
 
-        code_str = cashbookCodesDict.get(code)
+        code_str = localsettings.cashbookCodesDict.get(code)
         self.code_cb.setCurrentIndex(self.codestrings.index(code_str))
 
         pounds = amt // 100
@@ -140,7 +137,7 @@ class AlterCashbookDialog(ExtendableDialog):
         date_ = self.date_edit.date().toPyDate()
         ref = str(self.serialno_le.text().toAscii())
         descr = str(self.patient_le.text().toAscii())
-        for key, value in cashbookCodesDict.viewitems():
+        for key, value in localsettings.cashbookCodesDict.viewitems():
             if self.code_cb.currentText() == value:
                 code = key
                 break
diff --git a/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py b/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
index dccad6c..4dd331a 100644
--- a/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
@@ -202,15 +202,18 @@ class PageThree(_OptionPage):
 
     def __init__(self, parent=None):
         _OptionPage.__init__(self, parent)
+        self.dl = parent
         self.label.setText(_(
                            "Please select teeth to be added to this denture"))
         self.chartwidg = SimpleChartWidg(self, auto_ctrl_key=True)
-        if parent.is_upper_input:
+        layout = QtGui.QVBoxLayout(self.frame)
+        layout.addWidget(self.chartwidg)
+
+    def showEvent(self, event=None):
+        if self.dl.is_upper_input:
             self.chartwidg.disable_lowers()
         else:
             self.chartwidg.disable_uppers()
-        layout = QtGui.QVBoxLayout(self.frame)
-        layout.addWidget(self.chartwidg)
 
     @property
     def is_completed(self):
diff --git a/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py b/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py
new file mode 100644
index 0000000..7bf9787
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py
@@ -0,0 +1,252 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+from __future__ import division
+
+from functools import partial
+from PyQt4 import QtGui, QtCore
+
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+from openmolar.qt4gui.customwidgets.fiveminutetimeedit import FiveMinuteTimeEdit
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+
+from openmolar.settings import localsettings
+from openmolar.dbtools import appointments
+
+
+class InsertBlocksDialog(BaseDialog):
+    REASONS = [_("Lunch"), _("Emergency"), _("Staff Meeting"), ("Other")]
+    CHOSEN_REASON = 0
+    CLINICIAN_DICT = {}
+    DAY_DICT = {}
+    START_DATE = None
+    END_DATE = None
+    TIME = None
+    DURATION = None
+
+    def __init__(self, parent=None):
+        BaseDialog.__init__(self, parent)
+        label = WarningLabel(_("Insert a number of blocks to various books"))
+        clinicians_groupbox = QtGui.QGroupBox(self)
+        clinicians_groupbox.setTitle(_("Clinicians"))
+        layout = QtGui.QHBoxLayout(clinicians_groupbox)
+        for initials in (localsettings.activedents + localsettings.activehygs):
+            cb = QtGui.QCheckBox(initials)
+            layout.addWidget(cb)
+            try:
+                cb.setChecked(self.CLINICIAN_DICT[initials])
+            except KeyError:
+                self.CLINICIAN_DICT[initials] = False
+            cb.toggled.connect(partial(self.update_clinician_dict, initials))
+
+        days_groupbox = QtGui.QGroupBox(self)
+        days_groupbox.setTitle(_("Days to Apply"))
+        g_layout = QtGui.QGridLayout(days_groupbox)
+        for day in range(7):
+            cb = QtGui.QCheckBox(localsettings.DAYNAMES[day])
+            row = 0 if day < 4 else 1
+            g_layout.addWidget(cb, row, day % 4)
+            try:
+                cb.setChecked(self.DAY_DICT[day])
+            except KeyError:
+                self.DAY_DICT[day] = False
+            cb.toggled.connect(partial(self.update_day_dict, day))
+
+        if self.START_DATE is None:
+            self.START_DATE = QtCore.QDate.currentDate()
+        self.start_dateedit = QtGui.QDateEdit()
+        self.start_dateedit.setDate(self.START_DATE)
+        self.start_dateedit.setCalendarPopup(True)
+        self.start_dateedit.dateChanged.connect(self.new_start_date)
+
+        if self.END_DATE is None:
+            self.END_DATE = localsettings.BOOKEND
+        self.end_dateedit = QtGui.QDateEdit()
+        self.end_dateedit.setCalendarPopup(True)
+        self.end_dateedit.setDate(self.END_DATE)
+        self.end_dateedit.dateChanged.connect(self.new_end_date)
+
+        if self.TIME is None:
+            self.TIME = QtCore.QTime(13, 0, 0)
+        self.time_edit = FiveMinuteTimeEdit()
+        self.time_edit.setTime(self.TIME)
+        self.time_edit.time_changed_signal.connect(self.new_time)
+
+        self.duration_spinbox = QtGui.QSpinBox()
+        self.duration_spinbox.setMaximum(300)
+        self.duration_spinbox.setSingleStep(5)
+        self.duration_spinbox.setSuffix(" " + _("Minutes"))
+        self.duration_spinbox.setValue(60)
+
+        self.combo_box = QtGui.QComboBox()
+
+        frame = QtGui.QFrame()
+        layout = QtGui.QFormLayout(frame)
+        layout.addRow(_("Start Date"), self.start_dateedit)
+        layout.addRow(_("End Date"), self.end_dateedit)
+        layout.addRow(_("What time does this recurr?"), self.time_edit)
+        layout.addRow(_("Duration"), self.duration_spinbox)
+        layout.addRow(_("What is this block for?"), self.combo_box)
+
+        self.insertWidget(label)
+        self.insertWidget(clinicians_groupbox)
+        self.insertWidget(days_groupbox)
+        self.insertWidget(frame)
+        self.load_combo_box()
+
+        self.enableApply(True)
+
+    def load_combo_box(self, reload=False):
+        if reload:
+            self.combo_box.currentIndexChanged.disconnect(self.check_reason)
+            self.combo_box.clear()
+        self.combo_box.addItems(self.REASONS)
+        self.combo_box.currentIndexChanged.connect(self.check_reason)
+        self.combo_box.setCurrentIndex(self.CHOSEN_REASON)
+
+    def update_clinician_dict(self, initials, bool_):
+        self.CLINICIAN_DICT[initials] = bool_
+
+    def update_day_dict(self, day, bool_):
+        self.DAY_DICT[day] = bool_
+
+    def check_reason(self, i):
+        if self.combo_box.currentText() == _("Other"):
+            reason, result = QtGui.QInputDialog.getText(
+                self,
+                _("reason"),
+                _("Please enter the text to use for this block"))
+            if not result:
+                self.combo_box.setCurrentIndex(0)
+                return
+            self.REASONS.insert(i, reason)
+            self.load_combo_box(True)
+            self.combo_box.setCurrentIndex(i)
+        else:
+            InsertBlocksDialog.CHOSEN_REASON = i
+            return
+
+    def new_start_date(self, date_):
+        InsertBlocksDialog.START_DATE = date_
+
+    def new_end_date(self, date_):
+        InsertBlocksDialog.END_DATE = date_
+
+    def new_time(self, time_):
+        InsertBlocksDialog.TIME = time_
+
+    @property
+    def chosen_days(self):
+        for day, checked in self.DAY_DICT.iteritems():
+            if checked:
+                yield day+1
+
+    @property
+    def chosen_clinicians(self):
+        for clinician, checked in self.CLINICIAN_DICT.iteritems():
+            if checked:
+                yield clinician
+
+    @property
+    def block_text(self):
+        return unicode(self.combo_box.currentText())
+
+    @property
+    def is_valid_input(self):
+        valid = True
+        warnings = []
+        if self.start_dateedit.date() > self.end_dateedit.date():
+            valid = False
+            warnings.append(_("End Date is greater than Start Date"))
+        if self.duration_spinbox.value() == 0:
+            valid = False
+            warnings.append(_("Block has zero duration"))
+        if not list(self.chosen_days):
+            valid = False
+            warnings.append(_("You have no days selected"))
+        if not list(self.chosen_clinicians):
+            valid = False
+            warnings.append(_("You have no clinicians (ie.books) selected"))
+        return valid, warnings
+
+    def apply(self):
+        '''
+        user has entered a good sequence, so write it to the DB now
+        '''
+        sdate = self.start_dateedit.date()
+        fdate = self.end_dateedit.date()
+        n_days = sdate.daysTo(fdate)
+
+        start = localsettings.humanTimetoWystime(
+            self.time_edit.time().toString("h:mm"))
+        end = localsettings.minutesPastMidnighttoWystime(
+            localsettings.minutesPastMidnight(start) +
+            self.duration_spinbox.value())
+
+        #print sdate, fdate, n_days, start, end
+
+        p_dl = QtGui.QProgressDialog(self)
+        p_dl.show()
+        days = list(self.chosen_days)
+        n_attempts, n_inserted = 0, 0
+        for clinician in self.chosen_clinicians:
+            p_dl.setLabelText("%s %s" % (_("applying changes for"), clinician))
+            dt = sdate
+            while dt <= fdate:
+                progress = int(100 * (n_days - dt.daysTo(fdate)) / n_days)
+                p_dl.setValue(progress)
+                if dt.dayOfWeek() in days:
+                    n_attempts += 1
+                    n_inserted += appointments.make_appt(dt.toPyDate(),
+                                           localsettings.apptix[clinician],
+                                           start, end, self.block_text,
+                                           0, "", "", "", "", -128, 0, 0, 0)
+                dt = dt.addDays(1)
+
+        message = "%d/%d %s" % (
+                n_inserted, n_attempts, _("Appointment(s) inserted"))
+
+        if n_inserted != n_attempts:
+            message += "<hr />%s" % _(
+            "Some were rejected by the database as they clashed"
+            " with existing appointments or blocks")
+        QtGui.QMessageBox.information(self, _("Information"), message)
+
+    def exec_(self):
+        while BaseDialog.exec_(self):
+            result, warnings = self.is_valid_input
+            if result:
+                self.accept()
+                return True
+            else:
+                QtGui.QMessageBox.warning(self, _("Bad Input"),
+                "<ul><li>%s</li></ul>" % "</li><li>".join(warnings))
+        self.reject()
+
+if __name__ == "__main__":
+    localsettings.initiate()
+    app = QtGui.QApplication([])
+    dl = InsertBlocksDialog()
+    if dl.exec_():
+        dl.apply()
diff --git a/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py b/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py
new file mode 100644
index 0000000..938116a
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py
@@ -0,0 +1,155 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+
+from openmolar.dbtools import appointments
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AppointmentsMemoDialog(ExtendableDialog):
+
+    def __init__(self, date_, parent=None):
+        ExtendableDialog.__init__(self, parent, remove_stretch=True)
+        self.date = date_
+        label = WarningLabel(
+            "%s %s" % (_("Edit Memos for"),
+                       localsettings.longDate(date_))
+        )
+
+        self.bank_hol_label = QtGui.QLabel("")
+        font = self.font()
+        font.setBold(True)
+        font.setItalic(True)
+        self.bank_hol_label.setFont(font)
+        self.bank_hol_label.setAlignment(QtCore.Qt.AlignCenter)
+        self.bank_hol_label.hide()
+
+        self.global_lineedit = QtGui.QLineEdit()
+
+        frame = QtGui.QFrame()
+        form_layout = QtGui.QFormLayout(frame)
+        form_layout.addRow(_("Global Memo"), self.global_lineedit)
+
+        frame2 = QtGui.QFrame()
+        form_layout = QtGui.QFormLayout(frame2)
+
+        self.le_dict = {}
+        for apptix in localsettings.activedent_ixs + localsettings.activehyg_ixs:
+            le = QtGui.QLineEdit()
+            form_layout.addRow(localsettings.apptix_reverse.get(apptix), le)
+            self.le_dict[apptix] = le
+
+        scroll_area = QtGui.QScrollArea()
+        scroll_area.setWidget(frame2)
+        scroll_area.setWidgetResizable(True)
+
+        clinician_groupbox = QtGui.QGroupBox()
+        clinician_groupbox.setTitle(_("Clinician Memos"))
+        layout = QtGui.QVBoxLayout(clinician_groupbox)
+        layout.addWidget(scroll_area)
+
+        self.public_holiday_le = QtGui.QLineEdit()
+        public_holiday_widget = QtGui.QFrame()
+        form_layout = QtGui.QFormLayout(public_holiday_widget)
+        form_layout.addRow(_("Public Holiday Text"), self.public_holiday_le)
+        self.add_advanced_widget(public_holiday_widget)
+        self.set_advanced_but_text(_("Edit Public Holiday Text"))
+
+        self.insertWidget(label)
+        self.insertWidget(self.bank_hol_label)
+        self.insertWidget(frame)
+        self.insertWidget(clinician_groupbox)
+
+        self.setMinimumSize(self.sizeHint())
+        self.check_before_reject_if_dirty = True
+        QtCore.QTimer.singleShot(100, self.load_values)
+
+    def sizeHint(self):
+        return QtCore.QSize(400, 450)
+
+    def load_values(self):
+        self.orig_pub_holiday = appointments.getBankHol(self.date)
+        self.bank_hol_label.setText(self.orig_pub_holiday)
+        self.public_holiday_le.setText(self.orig_pub_holiday)
+        self.bank_hol_label.setVisible(self.orig_pub_holiday != "")
+
+        self.memo_dict = appointments.getMemos(self.date)
+        for apptix, memo in self.memo_dict.iteritems():
+            if apptix == 0:
+                self.global_lineedit.setText(memo)
+                continue
+            try:
+                self.le_dict[apptix].setText(memo)
+            except KeyError:
+                LOGGER.warning("couldn't display memo for apptix %s", apptix)
+        self.enableApply(True)
+
+    def reject(self):
+        self.dirty = self._dirty
+        ExtendableDialog.reject(self)
+
+    @property
+    def _dirty(self):
+        return (self.public_holiday_text != self.orig_pub_holiday or
+                list(self.changed_memos) != [])
+
+    @property
+    def public_holiday_text(self):
+        return unicode(self.public_holiday_le.text().toUtf8())
+
+    @property
+    def changed_memos(self):
+        new_memo = unicode(self.global_lineedit.text().toUtf8())
+        if new_memo != self.memo_dict.get(0, ""):
+            yield (0, new_memo)
+        for apptix, le in self.le_dict.iteritems():
+            memo = self.memo_dict.get(apptix, "")
+            new_memo = unicode(le.text().toUtf8())
+            if new_memo != memo:
+                yield (apptix, new_memo)
+
+    def apply(self):
+        if self.public_holiday_text != self.orig_pub_holiday:
+            appointments.setPubHol(self.date, self.public_holiday_text)
+
+        new_memos = list(self.changed_memos)
+        if new_memos:
+            appointments.setMemos(self.date, new_memos)
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    localsettings.initiate()
+    app = QtGui.QApplication([])
+    dl = AppointmentsMemoDialog(QtCore.QDate.currentDate().toPyDate())
+    if dl.exec_():
+        dl.apply()
diff --git a/src/openmolar/qt4gui/dialogs/apptOpenDay.py b/src/openmolar/qt4gui/dialogs/apptOpenDay.py
deleted file mode 100644
index 17581ae..0000000
--- a/src/openmolar/qt4gui/dialogs/apptOpenDay.py
+++ /dev/null
@@ -1,235 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from PyQt4 import QtGui, QtCore
-from openmolar.qt4gui.compiled_uis import Ui_apptOpenDay
-from openmolar.settings import localsettings
-from openmolar.dbtools import appointments
-
-
-class apptDialog(Ui_apptOpenDay.Ui_Dialog):
-
-    def __init__(self, dialog, parent=None):
-        self.setupUi(dialog)
-        self.dialog = dialog
-        self.comboBox.addItems(
-            localsettings.activedents + localsettings.activehygs)
-
-        self.comboBox.setCurrentIndex(-1)
-        self.minTime = self.getMinTime()
-        self.maxTime = self.getMaxTime()
-        self.setTimeLimits()
-        self.dateEdit.setDate(QtCore.QDate.currentDate())
-        self.init_es1("11:00", "11:40")
-        self.init_es2("16:00", "16:40")
-        self.init_lunch("13:00", "14:00")
-
-    def getMinTime(self):
-        return QtCore.QTime.fromString("08:30", "hh:mm")
-
-    def getMaxTime(self):
-        return QtCore.QTime.fromString("18:00", "hh:mm")
-
-    def setTimeLimits(self):
-        '''
-        set the boundary values for the time widgets
-        '''
-        for widg in (
-            self.dayStart_timeEdit,
-            self.dayFinish_timeEdit,
-            self.es1Start_timeEdit,
-            self.es1Finish_timeEdit,
-            self.es2Start_timeEdit,
-            self.es2Finish_timeEdit,
-            self.lunchStart_timeEdit,
-            self.lunchFinish_timeEdit,
-        ):
-            widg.setMinimumTime(self.minTime)
-            widg.setMaximumTime(self.maxTime)
-        self.day_limits()
-
-    def day_limits(self, start=None, finish=None):
-        '''
-        set day start and finish
-        '''
-        if start is None:
-            self.dayStart_timeEdit.setTime(self.minTime)
-        else:
-            self.dayStart_timeEdit.setTime(
-                QtCore.QTime.fromString(start, "hh:mm"))
-
-        if finish is None:
-            self.dayFinish_timeEdit.setTime(self.maxTime)
-        else:
-            self.dayFinish_timeEdit.setTime(
-                QtCore.QTime.fromString(finish, "hh:mm"))
-
-    def init_es1(self, start, finish):
-        self.es1_checkBox.setChecked(True)
-        self.es1Start_timeEdit.setTime(
-            QtCore.QTime.fromString(start, "hh:mm"))
-
-        self.es1Finish_timeEdit.setTime(
-            QtCore.QTime.fromString(finish, "hh:mm"))
-
-    def init_es2(self, start, finish):
-        self.es2_checkBox.setChecked(True)
-        self.es2Start_timeEdit.setTime(
-            QtCore.QTime.fromString(start, "hh:mm"))
-
-        self.es2Finish_timeEdit.setTime(
-            QtCore.QTime.fromString(finish, "hh:mm"))
-
-    def init_lunch(self, start, finish):
-        self.lunch_checkBox.setChecked(True)
-        self.lunchStart_timeEdit.setTime(
-            QtCore.QTime.fromString(start, "hh:mm"))
-
-        self.lunchFinish_timeEdit.setTime(
-            QtCore.QTime.fromString(finish, "hh:mm"))
-
-    def checkDate(self):
-        if self.dateEdit.date() >= QtCore.QDate.currentDate():
-            return True
-        else:
-            print 'date chosen is in the past!'
-
-    def checkDent(self):
-        self.chosenDent = localsettings.apptix.get(
-            str(self.comboBox.currentText()))
-        if self.chosenDent is not None:
-            return True
-
-    def checkTimes(self):
-        result = True
-        #-- does the day end before it starts?
-        result = result and \
-            self.dayStart_timeEdit.time() < self.dayFinish_timeEdit.time()
-
-        #-- is es1 ok?
-        if self.es1_checkBox.isChecked():
-            result = result and \
-                self.dayStart_timeEdit.time() <= self.es1Start_timeEdit.time()
-
-            if self.lunch_checkBox.isChecked():
-                result = result and \
-                    self.es1Finish_timeEdit.time(
-                    ) <= self.lunchStart_timeEdit.time()
-
-            elif self.es2_checkBox.isChecked():
-                result = result and \
-                    self.es1Finish_timeEdit.time(
-                    ) <= self.es2Start_timeEdit.time()
-            else:
-                result = result and \
-                    self.es1Finish_timeEdit.time(
-                    ) <= self.dayFinish_timeEdit.time()
-
-        #-- is lunch ok?
-        if self.lunch_checkBox.isChecked():
-            result = result and \
-                self.dayStart_timeEdit.time(
-                ) <= self.lunchStart_timeEdit.time()
-
-            result = result and \
-                self.lunchStart_timeEdit.time(
-                ) < self.lunchFinish_timeEdit.time()
-
-            if self.es2_checkBox.isChecked():
-                result = result and \
-                    self.lunchFinish_timeEdit.time(
-                    ) <= self.es2Start_timeEdit.time(
-                    )
-            else:
-                result = result and \
-                    self.lunchFinish_timeEdit.time(
-                    ) <= self.dayFinish_timeEdit.time(
-                    )
-
-        #-- is es2 ok?
-        if self.es2_checkBox.isChecked():
-            result = result and \
-                self.dayStart_timeEdit.time() <= self.es2Start_timeEdit.time()
-
-            result = result and \
-                self.es2Start_timeEdit.time() < self.es2Finish_timeEdit.time()
-
-            result = result and \
-                self.es2Finish_timeEdit.time(
-                ) <= self.dayFinish_timeEdit.time(
-                )
-
-        return result
-
-    def writeToDB(self):
-        '''
-        user has entered a good sequence, so write it to the DB now
-        '''
-        print "writing to DB"
-        day = appointments.DentistDay(self.chosenDent)
-        day.date = self.dateEdit.date().toPyDate()
-        day.start = int(self.dayStart_timeEdit.time().toString("hmm"))
-        day.end = int(self.dayFinish_timeEdit.time().toString("hmm"))
-        day.memo = str(self.memo_lineEdit.text())
-
-        # QtGui.QMessageBox.information(self.dialog,"sorry","this method is deprecated")
-        # return
-#
-        result = appointments.alterDay(day)
-        if result:
-            return True
-        else:
-            QtGui.QMessageBox.information(self.dialog, "error",
-                                          result.message)
-
-    def exec_(self):
-        while True:
-            if not self.dialog.exec_():
-                return False
-            else:
-                result = True
-                if not self.checkTimes():
-                    result = False
-                    QtGui.QMessageBox.information(self.dialog,
-                                                  "Error", "Incorrect Time sequence - Please Try Again")
-                if not self.checkDent():
-                    result = False
-                    QtGui.QMessageBox.information(self.dialog,
-                                                  "Error", "Dentist not understood - Please Try Again")
-                if not self.checkDate():
-                    result = False
-                    QtGui.QMessageBox.information(self.dialog,
-                                                  "Error", "Date is in the past - Please Try Again")
-                if result:
-                    return self.writeToDB()
-
-
-if __name__ == "__main__":
-    localsettings.initiate()
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    dl = apptDialog(Dialog)
-    if dl.exec_():
-        print "accepted"
diff --git a/src/openmolar/qt4gui/dialogs/base_dialogs.py b/src/openmolar/qt4gui/dialogs/base_dialogs.py
index cebda35..a8e2843 100644
--- a/src/openmolar/qt4gui/dialogs/base_dialogs.py
+++ b/src/openmolar/qt4gui/dialogs/base_dialogs.py
@@ -42,6 +42,7 @@ class BaseDialog(QtGui.QDialog):
 
     def __init__(self, parent=None, remove_stretch=False):
         QtGui.QDialog.__init__(self, parent)
+        self.setWindowTitle("OpenMolar")
 
         self.button_box = QtGui.QDialogButtonBox(self)
         self.button_box.setOrientation(QtCore.Qt.Horizontal)
@@ -61,14 +62,16 @@ class BaseDialog(QtGui.QDialog):
         self.dirty = False
         self.enableApply(False)
 
-        self.spacer = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Expanding,
-                                        QtGui.QSizePolicy.Expanding)
-        self.layout_.addItem(self.spacer)
+        if not remove_stretch:
+            self.spacer = QtGui.QSpacerItem(
+                0, 50, QtGui.QSizePolicy.Expanding,
+                QtGui.QSizePolicy.Expanding)
+            self.layout_.addItem(self.spacer)
+            self.insertpoint_offset = 2
+        else:
+            self.spacer = None
+            self.insertpoint_offset = 1
         self.layout_.addWidget(self.button_box)
-        self.insertpoint_offset = 2
-
-        if remove_stretch:
-            self.remove_spacer()
 
     def sizeHint(self):
         '''
@@ -87,8 +90,13 @@ class BaseDialog(QtGui.QDialog):
         If this is called, then the spacer added at init is removed.
         sometimes the spacer mucks up dialogs
         '''
-        self.layout_.removeItem(self.spacer)
-        self.insertpoint_offset = 1
+        if self.spacer is not None:
+            self.layout_.removeItem(self.spacer)
+            self.insertpoint_offset = 1
+
+    @property
+    def abandon_message(self):
+        return _("Abandon Changes?")
 
     def set_check_on_cancel(self, check):
         '''
@@ -127,13 +135,17 @@ class BaseDialog(QtGui.QDialog):
         if role == QtGui.QDialogButtonBox.ApplyRole:
             self.accept()
         else:
-            if not self.check_before_reject_if_dirty:
-                self.reject()
-            if (not self.dirty or QtGui.QMessageBox.question(self,
-               _("Confirm"), _("Abandon Changes?"),
-                QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel,
-                    QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Yes):
-                self.reject()
+            self.reject()
+
+    def reject(self):
+        if not (self.check_before_reject_if_dirty and self.dirty):
+            QtGui.QDialog.reject(self)
+        else:
+            if QtGui.QMessageBox.question(self,
+               _("Confirm"), self.abandon_message,
+                QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                    QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+                QtGui.QDialog.reject(self)
 
     def enableApply(self, enable=True):
         '''
diff --git a/src/openmolar/qt4gui/dialogs/block_wizard.py b/src/openmolar/qt4gui/dialogs/block_wizard.py
deleted file mode 100644
index b4c402e..0000000
--- a/src/openmolar/qt4gui/dialogs/block_wizard.py
+++ /dev/null
@@ -1,137 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from PyQt4 import QtGui, QtCore
-from openmolar.qt4gui.compiled_uis import Ui_block_wizard
-from openmolar.qt4gui.customwidgets import fiveminutetimeedit
-
-from openmolar.settings import localsettings
-from openmolar.dbtools import appointments
-
-
-class blocker(Ui_block_wizard.Ui_Dialog):
-
-    def __init__(self, dialog, parent=None):
-        self.setupUi(dialog)
-        self.progressBar.hide()
-        self.dialog = dialog
-        self.clinicianDict = self.addClinicians()
-        self.dayDict = self.addDays()
-        self.addTimeEdit()
-        self.start_dateEdit.setDate(QtCore.QDate.currentDate())
-        self.end_dateEdit.setDate(localsettings.bookEnd)
-        self.lineEdit.setText(_("emergency"))
-        QtCore.QObject.connect(self.buttonBox,
-                               QtCore.SIGNAL("clicked(QAbstractButton*)"), self.writeToDB)
-
-    def addClinicians(self):
-        '''
-        assemble some checkboxes to put into the gui
-        '''
-        retarg = {}
-        vbox = QtGui.QHBoxLayout()
-        for clinician in (localsettings.activedents
-                          + localsettings.activehygs):
-            cb = QtGui.QCheckBox(clinician)
-            vbox.addWidget(cb)
-            retarg[clinician] = cb
-        self.clinicians_groupBox.setLayout(vbox)
-        return retarg
-
-    def addDays(self):
-        '''
-        assemble some checkboxes to put into the gui
-        '''
-        retarg = {}
-        vbox = QtGui.QGridLayout()
-        for day in range(7):
-            cb = QtGui.QCheckBox(localsettings.DAYNAMES[day])
-            if day < 4:
-                row = 0
-            else:
-                row = 1
-            vbox.addWidget(cb, row, day % 4)
-            retarg[day] = cb
-        self.day_groupBox.setLayout(vbox)
-        return retarg
-
-    def addTimeEdit(self):
-        '''
-        adds a custom widget which enforces a five minute time
-        '''
-        vlayout = QtGui.QVBoxLayout(self.time_frame)
-        vlayout.setMargin(0)
-        self.start_timeEdit = fiveminutetimeedit.FiveMinuteTimeEdit()
-        vlayout.addWidget(self.start_timeEdit)
-        self.start_timeEdit.setTime(QtCore.QTime(12, 0, 0))
-
-    def writeToDB(self, arg):
-        '''
-        user has entered a good sequence, so write it to the DB now
-        '''
-        if self.buttonBox.buttonRole(arg) == (
-                QtGui.QDialogButtonBox.RejectRole):
-            self.dialog.reject()
-            return
-        sdate = self.start_dateEdit.date()
-        fdate = self.end_dateEdit.date()
-
-        total = sdate.daysTo(fdate)
-
-        start = localsettings.humanTimetoWystime(
-            self.start_timeEdit.time().toString("h:mm"))
-        end = localsettings.minutesPastMidnighttoWystime(
-            localsettings.minutesPastMidnight(start) + self.spinBox.value())
-
-        self.progressBar.show()
-        for clinician in self.clinicianDict.keys():
-            if self.clinicianDict[clinician].isChecked():
-                self.progress_label.setText("%s %s" % (
-                                            _("applying changes for"), clinician))
-
-                dt = sdate
-
-                while dt <= fdate:
-                    progress = int(100 * (total - dt.daysTo(fdate)) / total)
-                    if self.progressBar.value() != progress:
-                        self.progressBar.setValue(progress)
-                    if self.dayDict[dt.dayOfWeek() - 1].isChecked():
-                        appointments.make_appt(dt.toPyDate(),
-                                               localsettings.apptix[clinician],
-                                               start, end, self.lineEdit.text(
-                                               ).toAscii(),
-                                               0, "", "", "", "", -128, 0, 0, 0)
-
-                    dt = dt.addDays(1)
-
-        self.dialog.accept()
-
-if __name__ == "__main__":
-
-    localsettings.initiate()
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Dialog = QtGui.QDialog()
-    dl = blocker(Dialog)
-    Dialog.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/blockslot.py b/src/openmolar/qt4gui/dialogs/blockslot.py
index c06dde3..0df1ca8 100644
--- a/src/openmolar/qt4gui/dialogs/blockslot.py
+++ b/src/openmolar/qt4gui/dialogs/blockslot.py
@@ -60,20 +60,12 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
         self.block = True
         self.tabWidget.setCurrentIndex(0)
 
-        QtCore.QObject.connect(self.changePt_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.changePt)
-
-        QtCore.QObject.connect(self.start_timeEdit,
-                               QtCore.SIGNAL("verifiedTime"), self.changedTimes)
-
-        QtCore.QObject.connect(self.finish_timeEdit,
-                               QtCore.SIGNAL("verifiedTime"), self.changedTimes)
-
-        QtCore.QObject.connect(self.appointment_timeEdit,
-                               QtCore.SIGNAL("verifiedTime"), self.changedStart)
-
-        QtCore.QObject.connect(self.length_spinBox,
-                               QtCore.SIGNAL("valueChanged (int)"), self.changedLength)
+        self.changePt_pushButton.clicked.connect(self.changePt)
+        self.start_timeEdit.time_changed_signal.connect(self.changedTimes)
+        self.finish_timeEdit.time_changed_signal.connect(self.changedTimes)
+        self.appointment_timeEdit.time_changed_signal.connect(
+            self.changedStart)
+        self.length_spinBox.valueChanged.connect(self.changedLength)
 
         self.earliestStart = None
         self.latestFinish = None
diff --git a/src/openmolar/qt4gui/dialogs/bridge_denture.py b/src/openmolar/qt4gui/dialogs/bridge_denture.py
deleted file mode 100644
index ba44d6a..0000000
--- a/src/openmolar/qt4gui/dialogs/bridge_denture.py
+++ /dev/null
@@ -1,161 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from __future__ import division
-from PyQt4 import QtGui, QtCore
-
-
-class tooth(QtGui.QWidget):
-
-    def __init__(self, name="", parent=None):
-        super(tooth, self).__init__(parent)
-        self.name = name
-        self.setRect()
-        self.setDefaultColors()
-        self.setMouseTracking(True)
-
-    def setRect(self):
-        rect = QtCore.QRectF()
-        rect.setRect(10, 10, 20, 20)
-        self.rect = rect
-
-    def setDefaultColors(self):
-        self.boundaryColour = QtGui.QColor("blue")
-
-    def mouseMoveEvent(self, event):
-        self.boundaryColour = QtGui.QColor("red")
-        self.update()
-
-    def mousePressEvent(self, event):
-        print "clicked %s" % self.name
-
-    def leaveEvent(self, event):
-        self.setDefaultColors()
-        self.update()
-
-    def paintEvent(self, event=None):
-        painter = QtGui.QPainter(self)
-        painter.save()
-        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
-        painter.setPen(QtGui.QPen(self.boundaryColour, 2))
-                       #red pen
-        sansFont = QtGui.QFont("Sans", 8)
-        painter.setFont(sansFont)
-        painter.drawText(self.rect, QtCore.Qt.AlignCenter, (self.name[2]))
-        painter.drawRect(self.rect)
-        painter.restore()
-
-
-class labChartWidget(QtGui.QWidget):
-
-    '''a custom widget to show a standard UK dental chart
-    - allows for user navigation with mouse and/or keyboard
-    '''
-
-    def __init__(self, parent=None):
-        super(labChartWidget, self).__init__(parent)
-        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
-                                             QtGui.QSizePolicy.Expanding))
-        self.grid = (8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8)
-        self.setMinimumSize(self.minimumSizeHint())
-        self.showLeftRight = True
-        self.showSelected = True
-        self.selected = [-1, -1]
-        self.props = {}
-        self.teeth = []
-        self.addTeeth()
-
-    def sizeHint(self):
-        return QtCore.QSize(100, 200)
-
-    def minimumSizeHint(self):
-        return QtCore.QSize(200, 300)
-
-    def setShowLeftRight(self, arg):
-        self.showLeftRight = arg
-
-    def setShowSelected(self, arg):
-        self.showSelected = arg
-
-    def setSelected(self, x, y):
-            self.selected = [x, y]
-            self.repaint()
-            self.emit(
-                QtCore.SIGNAL("toothSelected"),
-                self.grid[y][x])  # emit a signal that the user has selected a tooth
-
-    def addTeeth(self):
-        for i in self.grid:
-            t = tooth("ur%s" % i, self)
-            self.teeth.append(t)
-        self.update()
-
-    def paintEvent(self, event=None):
-        '''override the paint event so that we can draw our grid'''
-
-        centrepoint = (self.width() / 2, self.height() / 2)
-
-        painter = QtGui.QPainter(self)
-        painter.save()
-        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
-        midline = self.width() / 100
-        xOffset = (self.width() - midline) / \
-            16  # cell width
-        yOffset = self.height()  / \
-            2  # cell height
-        painter.setPen(QtGui.QPen(QtCore.Qt.red, 2))
-                       #red pen
-        sansFont = QtGui.QFont("Helvetica", 8)
-        painter.setFont(sansFont)
-        fm = QtGui.QFontMetrics(sansFont)
-        leftpad = fm.width("Right ")
-        rightpad = fm.width(" Left")
-
-        painter.drawLine(leftpad, centrepoint[1],
-                         self.width() - rightpad, centrepoint[1])  # big horizontal dissection of entire widget
-
-        textRect = QtCore.QRectF(0, 0, self.width(), self.height())
-        painter.drawText(
-            textRect,
-            QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter,
-            (QtCore.QString("Left")))
-        painter.drawText(
-            textRect,
-            QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter,
-            (QtCore.QString("Right")))
-
-        for tooth in self.teeth:
-            tooth.update()
-
-        painter.restore()
-
-
-if __name__ == "__main__":
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    Form = QtGui.QWidget()
-    ui = labChartWidget(Form)
-    # Form.setEnabled(False)
-    Form.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/dialogs/close_course_dialog.py b/src/openmolar/qt4gui/dialogs/close_course_dialog.py
new file mode 100644
index 0000000..aacd8e0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/close_course_dialog.py
@@ -0,0 +1,103 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CloseCourseDialog(BaseDialog):
+
+    def __init__(self, ftr=False, parent=None):
+        BaseDialog.__init__(self, parent)
+        self.setWindowTitle(_("Close Course Dialog"))
+
+        self.patient_label = QtGui.QLabel("")
+        self.patient_label.setAlignment(QtCore.Qt.AlignCenter)
+        f = self.patient_label.font()
+        f.setBold(True)
+        self.patient_label.setFont(f)
+
+        self.tx_complete_label = WarningLabel(
+            _('You have no further treatment proposed for this patient, '
+              'yet they are deemed to be "under treatment".'))
+        self.tx_complete_label.setMaximumHeight(120)
+
+        self.date_edit = QtGui.QDateEdit()
+        self.date_edit.setDate(QtCore.QDate.currentDate())
+        self.date_edit.setMaximumDate(QtCore.QDate().currentDate())
+        self.date_edit.setCalendarPopup(True)
+
+        frame = QtGui.QFrame(self)
+        layout = QtGui.QFormLayout(frame)
+        layout.addRow(_("Suggested Completion Date"), self.date_edit)
+
+        question_label = QtGui.QLabel(
+            "<b>%s</b>" %
+            _("Close this course now?"))
+        question_label.setAlignment(QtCore.Qt.AlignCenter)
+
+        self.ftr_checkbox = QtGui.QCheckBox(_("Pt failed to return"))
+        self.ftr_checkbox.setChecked(ftr)
+
+        self.insertWidget(self.patient_label)
+        self.insertWidget(self.tx_complete_label)
+        self.insertWidget(frame)
+        self.insertWidget(question_label)
+
+        if ftr:
+            self.layout().insertStretch(4, 200)
+            self.insertWidget(self.ftr_checkbox)
+
+        self.enableApply()
+
+    def set_minimum_date(self, date_):
+        self.date_edit.setMinimumDate(date_)
+
+    def set_date(self, date_):
+        self.date_edit.setDate(date_)
+
+    @property
+    def completion_date(self):
+        return self.date_edit.date().toPyDate()
+
+    @property
+    def ftr(self):
+        return self.ftr_checkbox.isChecked()
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+
+    dl = CloseCourseDialog(True)
+    dl.patient_label.setText("test")
+    # dl.tx_complete_label.hide()
+    dl.set_minimum_date(QtCore.QDate().currentDate().addMonths(-1))
+
+    if dl.exec_():
+        print dl.completion_date, dl.ftr
diff --git a/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py b/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
index c3f8315..29c14c9 100644
--- a/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
@@ -30,8 +30,6 @@ from functools import partial
 from PyQt4 import QtCore, QtGui
 
 from openmolar.dbtools.treatment_course import CURRTRT_ROOT_ATTS
-from openmolar.qt4gui.customwidgets.upper_case_line_edit \
-    import UpperCaseLineEdit
 from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
 
 LOGGER = logging.getLogger("openmolar")
diff --git a/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py b/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py
new file mode 100644
index 0000000..0181534
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py
@@ -0,0 +1,107 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.ptModules.course_checker import get_course_checker
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CourseConsistencyDialog(ExtendableDialog):
+
+    def __init__(self, serialno, courseno, parent=None):
+        ExtendableDialog.__init__(self, parent)
+        self.serialno = serialno
+        self.courseno = courseno
+
+        header_label = QtGui.QLabel("<b>%s %s</b>" % (
+            _("Course Daybook Estimate Checker"), self.courseno))
+        header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+        self.polling_label = QtGui.QLabel(_("Polling Database"))
+
+        self.trt_widget = QtGui.QTextBrowser()
+        self.day_trt_widget = QtGui.QTextBrowser()
+
+        self.insertWidget(header_label)
+        self.insertWidget(self.polling_label)
+
+        self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+        self.add_advanced_widget(self.adv_widget)
+
+        QtCore.QTimer.singleShot(100, self.get_data)
+
+    def advise(self, message):
+        QtGui.QMessageBox.information(self, _("message"), message)
+
+    def sizeHint(self):
+        return QtCore.QSize(800, 600)
+
+    def get_data(self):
+        self.course_checker = get_course_checker(self.serialno, self.courseno)
+        html1 = self.course_checker.course.to_html()
+        html1c = self.course_checker.course.to_html(completed_only = True)
+        html2 = self.course_checker.daybook_course.to_html()
+        self.polling_label.hide()
+        self.insertWidget(QtGui.QLabel("course"))
+        self.insertWidget(self.trt_widget)
+        self.insertWidget(QtGui.QLabel("daybook course"))
+        self.insertWidget(self.day_trt_widget)
+
+        self.trt_widget.setText(html1)
+        self.day_trt_widget.setText(html2)
+
+        # for comparision puporses - dev code!!
+        #f = open("/home/neil/course.txt", "w")
+        #f.write(html1c)
+        #f.close()
+
+        #f = open("/home/neil/day_course.txt", "w")
+        #f.write(html2)
+        #f.close()
+
+        match = "<b>%s</b>" % ("match!" if html1c == html2 else "differs")
+        self.insertWidget(QtGui.QLabel(match))
+
+    def update_db(self):
+        '''
+        apply any edits (should be called if self.exec_() == True)
+        '''
+        pass
+
+if __name__ == "__main__":
+
+    app = QtGui.QApplication([])
+    LOGGER.setLevel(logging.DEBUG)
+    serialno = 14469
+    coursenos = (9568, 11394, 14016, 15946, 16161, 16433, 17677, 20644, 21411,
+                 23844, 26049, 27230, 30876, 31820, 32526, 41921, 42138, 45151)
+
+    for courseno in coursenos:
+        dl = CourseConsistencyDialog(serialno, courseno)
+        if dl.exec_():
+            dl.update_db()
diff --git a/src/openmolar/qt4gui/dialogs/course_edit_dialog.py b/src/openmolar/qt4gui/dialogs/course_edit_dialog.py
new file mode 100644
index 0000000..36cdbf0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/course_edit_dialog.py
@@ -0,0 +1,143 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.dbtools import treatment_course
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CourseEditDialog(ExtendableDialog):
+
+    def __init__(self, courseno, parent=None):
+        ExtendableDialog.__init__(self, parent)
+        self.courseno = courseno
+
+        header_label = QtGui.QLabel(
+            "<b>%s %s</b>" % (_("Edit Treatment Course"), self.courseno))
+        header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+        self.accd_date_edit = QtGui.QDateEdit()
+        self.accd_date_edit.setCalendarPopup(True)
+        self.cmpd_date_edit = QtGui.QDateEdit()
+        self.cmpd_date_edit.setCalendarPopup(True)
+        self.examd_date_edit = QtGui.QDateEdit()
+        self.examd_date_edit.setEnabled(False)
+
+        self.polling_label = QtGui.QLabel(_("Polling Database"))
+        self.insertWidget(header_label)
+
+        self.insertWidget(self.polling_label)
+
+        self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+        self.add_advanced_widget(self.adv_widget)
+
+        QtCore.QTimer.singleShot(100, self.get_data)
+
+    def advise(self, message):
+        QtGui.QMessageBox.information(self, _("message"), message)
+
+    def sizeHint(self):
+        return QtCore.QSize(400, 400)
+
+    @property
+    def accd(self):
+        return self.accd_date_edit.date().toPyDate()
+
+    @property
+    def cmpd(self):
+        if self.cmpd_db:
+            return self.cmpd_date_edit.date().toPyDate()
+        return self.accd
+
+    @property
+    def examd(self):
+        if self.examd_db:
+            self.examd_db
+        return self.accd
+
+    def get_data(self):
+        accd, cmpd, examd = treatment_course.get_course_dates(self.courseno)
+        self.polling_label.hide()
+
+        self.accd_db = accd
+        self.cmpd_db = cmpd
+        self.examd_db = examd
+
+        frame = QtGui.QFrame()
+        form_layout = QtGui.QFormLayout(frame)
+        self.insertWidget(frame)
+
+        self.accd_date_edit.setDate(accd)
+        form_layout.addRow(_("acceptance date"), self.accd_date_edit)
+        if cmpd:
+            self.cmpd_date_edit.setDate(cmpd)
+            form_layout.addRow(_("completion date"), self.cmpd_date_edit)
+            if cmpd != accd:
+                sync_but = QtGui.QPushButton(
+                    _("Set completion date to match Acceptance date"))
+                sync_but.clicked.connect(self.sync_dates)
+                self.insertWidget(sync_but)
+        else:
+            but = QtGui.QPushButton(_("Add Completion Date"))
+            form_layout.addRow(but)
+            but.clicked.connect(self.add_a_completion_date)
+        if examd:
+            self.examd_date_edit.setDate(examd)
+            form_layout.addRow(_("exam date"), self.examd_date_edit)
+        else:
+            form_layout.addRow(QtGui.QLabel(_("No Exam Date on this course")))
+        self.accd_date_edit.dateChanged.connect(self._check_applicable)
+        self.cmpd_date_edit.dateChanged.connect(self._check_applicable)
+
+    def add_a_completion_date(self):
+        self.advise("function not yet implemented")
+
+    def sync_dates(self):
+        self.cmpd_date_edit.setDate(self.accd)
+
+    def _check_applicable(self):
+        if self.accd <= self.examd <= self.cmpd:
+            self.enableApply(True)
+        else:
+            self.enableApply(False)
+            self.advise(_("Bad Date Sequence"))
+
+    def update_db(self):
+        '''
+        apply any edits (should be called if self.exec_() == True)
+        '''
+        treatment_course.update_course_dates(
+            self.accd, self.cmpd if self.cmpd_db else None, self.courseno)
+
+if __name__ == "__main__":
+
+    app = QtGui.QApplication([])
+    LOGGER.setLevel(logging.DEBUG)
+    dl = CourseEditDialog(17437)
+    if dl.exec_():
+        dl.update_db()
diff --git a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py b/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
similarity index 53%
copy from src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
copy to src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
index c522f34..4cc4fc7 100644
--- a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
+++ b/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
@@ -22,43 +22,57 @@
 # #                                                                          # #
 # ############################################################################ #
 
+import logging
+
 from PyQt4 import QtGui, QtCore
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
 
 
-class FiveMinuteTimeEdit(QtGui.QTimeEdit):
+class CourseHistoryOptionsDialog(BaseDialog):
 
-    '''
-    A custom timeEdit which enforces only 5 minutes
-    NB - connect to slot "verifiedTime"
-    '''
+    include_estimates = False
+    include_daybook = False
 
     def __init__(self, parent=None):
-        super(FiveMinuteTimeEdit, self).__init__(parent)
-        self.setDisplayFormat("hh:mm")
-        QtCore.QObject.connect(self,
-                               QtCore.SIGNAL("timeChanged (const QTime&)"), self.timeChanged)
-
-    def stepBy(self, steps):
-        if self.currentSection() == self.MinuteSection:
-            QtGui.QTimeEdit.stepBy(self, steps * 5)
-        else:
-            QtGui.QTimeEdit.stepBy(self, steps)
-
-    def timeChanged(self, t):
-        min = self.time().minute()
-        if min % 5 != 0:
-            min -= min % 5
-            self.setTime(QtCore.QTime(self.time().hour(), min))
-        self.emit(QtCore.SIGNAL("verifiedTime"), self.time())
+        BaseDialog.__init__(self, parent)
+        self.setWindowTitle(_("Options Dialog"))
+        label = QtGui.QLabel("<b>%s</b>" % _("What do you wish to show?"))
+        label.setAlignment(QtCore.Qt.AlignCenter)
 
-if __name__ == "__main__":
-    def test(t):
-        print "signal received", t
+        self.estimates_checkbox = QtGui.QCheckBox(_("Include Estimates"))
+        self.estimates_checkbox.setChecked(self.include_estimates)
+        self.estimates_checkbox.toggled.connect(self.toggle_estimates)
+
+        self.daybook_checkbox = QtGui.QCheckBox(_("Include Daybook"))
+        self.daybook_checkbox.setChecked(self.include_daybook)
+        self.daybook_checkbox.toggled.connect(self.toggle_daybook)
+
+        help_label = QtGui.QLabel(_("Leave both unchecked for courses only"))
+        help_label.setAlignment(QtCore.Qt.AlignCenter)
+
+        self.insertWidget(label)
+        self.insertWidget(self.estimates_checkbox)
+        self.insertWidget(self.daybook_checkbox)
+        self.insertWidget(help_label)
+
+        self.enableApply()
 
-    import sys
+    def sizeHint(self):
+        return QtCore.QSize(200, 150)
+
+    def toggle_estimates(self, value):
+        CourseHistoryOptionsDialog.include_estimates = value
+
+    def toggle_daybook(self, value):
+        CourseHistoryOptionsDialog.include_daybook = value
+
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
     app = QtGui.QApplication([])
-    te = FiveMinuteTimeEdit()
-    QtCore.QObject.connect(te,
-                           QtCore.SIGNAL("verifiedTime"), test)
-    te.show()
-    sys.exit(app.exec_())
+
+    dl = CourseHistoryOptionsDialog()
+    if dl.exec_():
+        print dl.include_estimates, dl.include_daybook
diff --git a/src/openmolar/qt4gui/dialogs/course_merge_dialog.py b/src/openmolar/qt4gui/dialogs/course_merge_dialog.py
new file mode 100644
index 0000000..e970b9e
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/course_merge_dialog.py
@@ -0,0 +1,180 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import copy
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.dbtools import treatment_course
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CourseMergeDialog(ExtendableDialog):
+
+    def __init__(self, serialno, courseno1, courseno2, parent=None):
+        ExtendableDialog.__init__(self, parent, remove_stretch=True)
+        assert courseno1 > courseno2, "courses in wrong order"
+        self.serialno = serialno
+        self.courseno1 = courseno1
+        self.courseno2 = courseno2
+        self._merged_course = None
+
+        header_label = QtGui.QLabel(
+            "<b>%s %s & %s</b>" % (_("Merge Treatment Courses"),
+                                       self.courseno1, self.courseno2))
+        header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+        self.polling_label = QtGui.QLabel(_("Polling Database"))
+
+        self.preview_button = QtGui.QPushButton(_("Preview Merged Course"))
+
+        self.courseno1_browser = QtGui.QTextBrowser()
+        self.courseno2_browser = QtGui.QTextBrowser()
+        self.preview_browser = QtGui.QTextBrowser()
+
+        self.splitter = QtGui.QSplitter()
+        self.splitter.setOrientation(QtCore.Qt.Vertical)
+
+        self.insertWidget(header_label)
+        self.insertWidget(self.polling_label)
+        self.insertWidget(self.splitter)
+
+        self.splitter.addWidget(self.courseno1_browser)
+        self.splitter.addWidget(self.courseno2_browser)
+        self.splitter.addWidget(self.preview_browser)
+
+        self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+        self.add_advanced_widget(self.adv_widget)
+
+        QtCore.QTimer.singleShot(100, self.get_data)
+
+    def advise(self, message):
+        QtGui.QMessageBox.information(self, _("message"), message)
+
+    def sizeHint(self):
+        return QtCore.QSize(600, 600)
+
+    def get_data(self):
+        self.tx_course1 = treatment_course.TreatmentCourse(self.serialno,
+                                                           self.courseno1)
+        self.tx_course2 = treatment_course.TreatmentCourse(self.serialno,
+                                                           self.courseno2)
+        self.polling_label.hide()
+        course1_html = self.tx_course1.to_html()
+        course2_html = self.tx_course2.to_html()
+        self.courseno1_browser.setHtml(course1_html)
+        self.courseno2_browser.setHtml(course2_html)
+        if self.tx_course1.examt and self.tx_course2.examt:
+            message = _("Courses can't be merged, both have examinations")
+        else:
+            message = "<h2>%s</h2>%s" % (_("Merged Course Preview"),
+                                         self.merged_course.to_html()
+                                         )
+        self.preview_browser.setText(message)
+        sizes = [(course1_html.count("<tr>") + 1) * 300,
+                 (course1_html.count("<tr>") + 1) * 300,
+                 (message.count("<tr>") + 1) * 300]
+        self.splitter.setSizes(sizes)
+        LOGGER.debug(sizes)
+
+        self.enableApply(self._merged_course is not None)
+
+    @property
+    def _merge_atts(self):
+        exclusions = ("courseno", "accd", "cmpd", "examd", "examt")
+        for att in treatment_course.CURRTRT_ATTS:
+            if att not in exclusions:
+                yield att
+
+    @property
+    def merged_course(self):
+        if self._merged_course is None:
+            new_course = copy.deepcopy(self.tx_course2)
+            if self.tx_course1.accd < new_course.accd:
+                new_course.accd = self.tx_course1.accd
+            if (new_course.cmpd is not None or
+               self.tx_course1.cmpd > new_course.cmpd):
+                new_course.cmpd = self.tx_course1.cmpd
+            if (new_course.examd is None or
+               (self.tx_course1.examd and
+                    self.tx_course1.examd < new_course.examd)):
+                new_course.examd = self.tx_course1.examd
+            if self.tx_course1.examt > new_course.examt:
+                new_course.examt = self.tx_course1.examt
+            for att in self._merge_atts:
+                value1 = new_course.__dict__[att]
+                value2 = self.tx_course1.__dict__[att]
+                if value1 in (None, ""):
+                    new_course.__dict__[att] = value2
+                elif value2 in (None, ""):
+                    pass
+                else:
+                    new_course.__dict__[att] += value2
+            self._merged_course = new_course
+        return self._merged_course
+
+    def list_hashes(self):
+        for tx_course in self.tx_course1, self.tx_course2, self.merged_course:
+            print "TX_HASHES for course %s" % tx_course.courseno
+            for tx_hash in tx_course.tx_hashes:
+                print tx_hash
+
+    def update_db(self):
+        '''
+        apply any edits (should be called if self.exec_() == True)
+        to merge 2 courses, all treatments have to be combined, and placed
+        into the oldest course.
+        the newestimates table has to have the coursenumber adjusted.
+        NOTE - old tx_hashes will not longer be generatable
+        by the TreatmentCourseClass
+        '''
+        trtchanges = ""
+        trtvalues = []
+        for trt_att in treatment_course.CURRTRT_ATTS:
+            if trt_att == "courseno":
+                continue
+            value = self.merged_course.__dict__[trt_att]
+            existing = self.tx_course2.__dict__[trt_att]
+            if value != existing:
+                trtchanges += '%s = %%s ,' % trt_att
+                trtvalues.append(value)
+        self.list_hashes()
+        if treatment_course.update_course(trtchanges.rstrip(","),
+                                          trtvalues,
+                                          self.serialno,
+                                          self.courseno2
+                                          ):
+            treatment_course.update_estimate_courseno(self.courseno1,
+                                                      self.courseno2)
+            treatment_course.delete_course(self.serialno, self.courseno1)
+
+if __name__ == "__main__":
+
+    app = QtGui.QApplication([])
+    LOGGER.setLevel(logging.DEBUG)
+    dl = CourseMergeDialog(12647, 6879, 2385)
+    if dl.exec_():
+        dl.update_db()
diff --git a/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py b/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
index a367656..4170fad 100644
--- a/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
@@ -51,6 +51,7 @@ class DaybookEditDialog(ExtendableDialog):
             self.line_edits[key] = QtGui.QLineEdit()
 
         self.chart_edit = QtGui.QTextEdit()
+        self.chart_edit.setWordWrapMode(QtGui.QTextOption.NoWrap)
 
         form.addRow(_("Diagnosis"), self.line_edits[KEYS[0]])
         form.addRow(_("Perio"), self.line_edits[KEYS[1]])
diff --git a/src/openmolar/qt4gui/dialogs/denture_dialog.py b/src/openmolar/qt4gui/dialogs/denture_dialog.py
index 7012189..f1b5405 100644
--- a/src/openmolar/qt4gui/dialogs/denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/denture_dialog.py
@@ -48,7 +48,7 @@ class DentureDialog(BaseDialog):
         frame = QtGui.QFrame()
         layout = QtGui.QHBoxLayout(frame)
 
-        new_but = QtGui.QPushButton(_("Plan a New Denture"))
+        new_but = QtGui.QPushButton(_("Plan New Denture(s)"))
         new_but.setMinimumSize(QtCore.QSize(150, 150))
         alt_but = QtGui.QPushButton(_("Alter an Existing Denture"))
         alt_but.setMinimumSize(QtCore.QSize(150, 150))
diff --git a/src/openmolar/qt4gui/dialogs/__init__.py b/src/openmolar/qt4gui/dialogs/dialog_collection.py
old mode 100755
new mode 100644
similarity index 69%
copy from src/openmolar/qt4gui/dialogs/__init__.py
copy to src/openmolar/qt4gui/dialogs/dialog_collection.py
index 3af96a9..ad52134
--- a/src/openmolar/qt4gui/dialogs/__init__.py
+++ b/src/openmolar/qt4gui/dialogs/dialog_collection.py
@@ -22,8 +22,12 @@
 # #                                                                          # #
 # ############################################################################ #
 
+'''
+This is a convenience module so that maingui can simply import *
+'''
+
 from openmolar.qt4gui.dialogs import saveMemo
-from openmolar.qt4gui.dialogs import permissions
+# from openmolar.qt4gui.dialogs import permissions
 from openmolar.qt4gui.dialogs import select_language
 
 from openmolar.qt4gui.dialogs.newBPE import BPE_Dialog
@@ -48,8 +52,26 @@ from openmolar.qt4gui.dialogs.document_dialog import DocumentDialog
 from openmolar.qt4gui.dialogs.account_severity_dialog import AccountSeverityDialog
 from openmolar.qt4gui.dialogs.daybook_item_dialog import DaybookItemDialog
 from openmolar.qt4gui.dialogs.daybook_edit_dialog import DaybookEditDialog
+from openmolar.qt4gui.dialogs.course_edit_dialog import CourseEditDialog
+from openmolar.qt4gui.dialogs.course_merge_dialog import CourseMergeDialog
+from openmolar.qt4gui.dialogs.estimate_edit_dialog import EstimateEditDialog
+from openmolar.qt4gui.dialogs.course_history_options_dialog import CourseHistoryOptionsDialog
+from openmolar.qt4gui.dialogs.course_consistency_dialog import CourseConsistencyDialog
+from openmolar.qt4gui.dialogs.edit_treatment_dialog import EditTreatmentDialog
+from openmolar.qt4gui.dialogs.login_dialog import LoginDialog
+from openmolar.qt4gui.dialogs.edit_referral_centres_dialog import EditReferralCentresDialog
+from openmolar.qt4gui.dialogs.permissions import ResetSupervisorPasswordDialog
+from openmolar.qt4gui.dialogs.first_run_dialog import FirstRunDialog
+from openmolar.qt4gui.dialogs.add_user_dialog import AddUserDialog
+from openmolar.qt4gui.dialogs.add_clinician_dialog import AddClinicianDialog
+from openmolar.qt4gui.dialogs.initial_check_dialog import InitialCheckDialog
+from openmolar.qt4gui.dialogs.edit_practice_dialog import EditPracticeDialog
+from openmolar.qt4gui.dialogs.advanced_record_management_dialog import AdvancedRecordManagementDialog
 
 __all__ = ['AccountSeverityDialog',
+           'AddClinicianDialog',
+           'AddUserDialog',
+           'AdvancedRecordManagementDialog',
            'AdvancedTxPlanningDialog',
            'AlterTodaysNotesDialog',
            'AssistantSelectDialog',
@@ -58,17 +80,29 @@ __all__ = ['AccountSeverityDialog',
            'ChildSmileDialog',
            'ChooseToothDialog',
            'ClinicianSelectDialog',
+           'CourseConsistencyDialog',
+           'CourseEditDialog',
+           'CourseMergeDialog',
+           'CourseHistoryOptionsDialog',
            'DaybookItemDialog',
            'DaybookEditDialog',
            'DocumentDialog',
            'DuplicateReceiptDialog',
+           'EditPracticeDialog',
+           'EditTreatmentDialog',
+           'EditReferralCentresDialog',
+           'EstimateEditDialog',
            'ExamWizard',
            'FamilyManageDialog',
            'FindPatientDialog',
+           'FirstRunDialog',
            'HygTreatWizard',
+           'InitialCheckDialog',
            'LoadRelativesDialog',
+           'LoginDialog',
            'MedNotesDialog',
            'NHSFormsConfigDialog',
+           'ResetSupervisorPasswordDialog',
            'RecallDialog',
            'SaveDiscardCancelDialog',
            ]
diff --git a/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py b/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
index 2cbd8c0..3fa0d64 100644
--- a/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
@@ -168,14 +168,14 @@ class DuplicateReceiptDialog(BaseDialog):
         amount = self.amount_spinbox.value()
 
         myreceipt = receiptPrint.Receipt()
-
         myreceipt.setProps(self.pt.title, self.pt.fname, self.pt.sname,
-                           self.pt.addr1, self.pt.addr2, self.pt.addr3, self.pt.town,
-                           self.pt.county, self.pt.pcde)
+                           self.pt.addr1, self.pt.addr2, self.pt.addr3,
+                           self.pt.town, self.pt.county, self.pt.pcde)
 
-        myreceipt.total = amount * 100
+        total = localsettings.pencify(str(amount))
+        myreceipt.total = total
 
-        myreceipt.receivedDict = {_("Professional Services"): amount * 100}
+        myreceipt.receivedDict = {_("Professional Services"): total}
         myreceipt.isDuplicate = True
         myreceipt.dupdate = self.dup_date_edit.date()
 
diff --git a/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py b/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py
new file mode 100644
index 0000000..5ce6cc0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py
@@ -0,0 +1,116 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+from openmolar.dbtools import db_settings
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class EditPracticeDialog(BaseDialog):
+
+    def __init__(self, parent=None):
+        BaseDialog.__init__(self, parent)
+        self.setWindowTitle(_("Edit Practice Address Dialog"))
+
+        self.top_label = WarningLabel("%s<hr />%s" % (
+            _('Edit the Practice Name and/or address.'),
+            _("This information is used on receipts and appointment slips."),
+        ))
+
+        self.practice_line_edit = QtGui.QLineEdit()
+        self.practice_line_edit.setText(localsettings.PRACTICE_NAME)
+
+        frame = QtGui.QFrame(self)
+        layout = QtGui.QFormLayout(frame)
+        layout.addRow(_("Practice Name"), self.practice_line_edit)
+
+        self.addr_line_edits = []
+        for i in range(7):
+            le = QtGui.QLineEdit()
+            self.addr_line_edits.append(le)
+            layout.addRow("%s %d" % (_("Address Line"), i + 1), le)
+
+            try:
+                le.setText(localsettings.PRACTICE_ADDRESS[i + 1])
+            except IndexError:
+                pass
+
+        self.insertWidget(self.top_label)
+        self.insertWidget(frame)
+
+        self.enableApply()
+
+    def sizeHint(self):
+        return QtCore.QSize(400, 400)
+
+    def showEvent(self, event):
+        self.practice_line_edit.setFocus()
+
+    @property
+    def practice_name(self):
+        return unicode(self.practice_line_edit.text().toUtf8()).strip(" ")
+
+    @property
+    def practice_address(self):
+        address_lines = []
+        for le in self.addr_line_edits:
+            line_ = unicode(le.text().toUtf8()).strip(" ")
+            if line_ != "":
+                address_lines.append(line_)
+        return "|".join(address_lines)
+
+    def apply(self):
+        changed = False
+        if self.practice_name != localsettings.PRACTICE_NAME:
+            changed = changed or db_settings.insert_practice_name(
+                self.practice_name)
+        if self.practice_address != localsettings.PRACTICE_ADDRESS:
+            changed = changed or db_settings.insert_practice_address(
+                self.practice_address)
+        if changed:
+            localsettings.initiate()
+            return True
+
+    def exec_(self):
+        if BaseDialog.exec_(self):
+            return self.apply()
+        return False
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+    localsettings.initiate()
+
+    dl = EditPracticeDialog()
+    dl.exec_()
+    print dl.practice_name
+    print dl.practice_address
diff --git a/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py b/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py
new file mode 100644
index 0000000..2d009ee
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py
@@ -0,0 +1,305 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.dbtools import referral
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class ListModel(QtCore.QAbstractListModel):
+
+    '''
+    A simple model to provide an index for the dialog
+    '''
+
+    def __init__(self, parent=None):
+        QtCore.QAbstractListModel.__init__(self, parent)
+        self.labels = []
+
+    def rowCount(self, parent=QtCore.QModelIndex()):
+        return len(self.labels)
+
+    def data(self, index, role):
+        if not index.isValid():
+            pass
+        elif role == QtCore.Qt.DisplayRole:
+            return self.labels[index.row()]
+        elif role == QtCore.Qt.DecorationRole:
+            return QtGui.QIcon(":icons/pencil.png")
+
+    def clear(self):
+        self.beginResetModel()
+        self.labels = []
+        self.endResetModel()
+
+    def add_item(self, label):
+        self.beginResetModel()
+        self.labels.append(label)
+        self.endResetModel()
+
+
+class EditReferralCentresDialog(BaseDialog):
+
+    def __init__(self, parent=None):
+        BaseDialog.__init__(self, parent, remove_stretch=True)
+        message = _("Edit Referral Centres")
+        self.setWindowTitle(message)
+
+        self._referral_centres = None
+        self.deleted_centres = []
+
+        header_label = QtGui.QLabel("<b>%s</b>" % message)
+
+        self.list_model = ListModel()
+
+        self.list_view = QtGui.QListView()
+        self.list_view.setModel(self.list_model)
+
+        icon = QtGui.QIcon(":/eraser.png")
+        delete_but = QtGui.QPushButton(icon, "")
+        delete_but.setToolTip(_("Delete the currently selected Centre"))
+        delete_but.setMaximumWidth(80)
+
+        icon = QtGui.QIcon(":/add_user.png")
+        add_but = QtGui.QPushButton(icon, "")
+        add_but.setToolTip(_("Add a New Centre"))
+        add_but.setMaximumWidth(80)
+
+        left_frame = QtGui.QFrame()
+        layout = QtGui.QGridLayout(left_frame)
+        layout.setMargin(0)
+        layout.addWidget(self.list_view, 0, 0, 1, 3)
+        layout.addWidget(delete_but, 1, 0)
+        layout.addWidget(add_but, 1, 1)
+        left_frame.setMaximumWidth(250)
+
+        right_frame = QtGui.QFrame()
+        layout = QtGui.QFormLayout(right_frame)
+        layout.setMargin(0)
+        self.description_line_edit = QtGui.QLineEdit()
+        self.greeting_line_edit = QtGui.QLineEdit()
+        self.text_edit = QtGui.QTextEdit()
+
+        layout.addRow(_("Description"), self.description_line_edit)
+        layout.addRow(_("Greeting"), self.greeting_line_edit)
+        layout.addRow(_("Address"), self.text_edit)
+
+        splitter = QtGui.QSplitter()
+        splitter.addWidget(left_frame)
+        splitter.addWidget(right_frame)
+        splitter.setSizes([1, 10])
+        self.insertWidget(header_label)
+        self.insertWidget(splitter)
+
+        self.list_view.pressed.connect(self.show_data)
+
+        self.cancel_but.setText(_("Close"))
+        self.apply_but.setText(_("Apply Changes"))
+
+        self.set_check_on_cancel(True)
+        self.description_line_edit.editingFinished.connect(
+            self.description_edited)
+        self.signals()
+        add_but.clicked.connect(self.add_centre)
+        delete_but.clicked.connect(self.remove_centre)
+
+        self.orig_data = []
+        QtCore.QTimer.singleShot(100, self.load_existing)
+        # self.enableApply()
+
+    def sizeHint(self):
+        return QtCore.QSize(700, 300)
+
+    def signals(self, connect=True):
+        for signal in (
+            self.description_line_edit.textChanged,
+            self.greeting_line_edit.textChanged,
+            self.text_edit.textChanged
+        ):
+            if connect:
+                signal.connect(self.update_centre)
+            else:
+                signal.disconnect(self.update_centre)
+
+    @property
+    def referral_centres(self):
+        if self._referral_centres is None:
+            self._referral_centres = []
+            for centre in referral.get_referral_centres():
+                self._referral_centres.append(centre)
+                self.orig_data.append(str(centre))
+        return self._referral_centres
+
+    def load_existing(self, row=0):
+        if self.referral_centres == []:
+            return
+        self.signals(False)
+        self.list_model.clear()
+        for ref_centre in self.referral_centres:
+            if ref_centre not in self.deleted_centres:
+                self.list_model.add_item(ref_centre.description)
+        index = self.list_model.createIndex(row, 0)
+        self.list_view.setCurrentIndex(index)
+        self.signals()
+        self.show_data(index)
+
+    def show_data(self, index):
+        self.signals(False)
+        centre = self.current_centre
+        self.description_line_edit.setText(centre.description)
+        self.greeting_line_edit.setText(centre.greeting)
+        address = "\n".join(
+            [a for a in (centre.addr1,
+                         centre.addr2,
+                         centre.addr3,
+                         centre.addr4,
+                         centre.addr5,
+                         centre.addr6,
+                         centre.addr7)]
+        )
+        self.text_edit.setText(address)
+        self.signals()
+
+    @property
+    def current_row(self):
+        return self.list_view.currentIndex().row()
+
+    @property
+    def current_centre(self):
+        i = -1
+        for ref_centre in self.referral_centres:
+            if ref_centre not in self.deleted_centres:
+                i += 1
+            if i == self.current_row:
+                return ref_centre
+
+    @property
+    def description(self):
+        '''
+        return the current description text
+        '''
+        return self.description_line_edit.text()
+
+    @property
+    def greeting(self):
+        '''
+        return the current greeting text
+        '''
+        return self.greeting_line_edit.text()
+
+    @property
+    def address(self):
+        lines = unicode(self.text_edit.toPlainText()).split("\n")
+        while len(lines) < 8:
+            lines.append("")
+        return lines
+
+    def add_centre(self):
+        LOGGER.debug("add_centre")
+        if self.referral_centres == []:
+            centre = referral.ReferralCentre(
+                hash(0),
+                _("Example Referral Centre"),
+                _("Dear Sir/Madam"), _("My Local Hospital"),
+                _("Main Street"), _("My Town"), "", "", "", "")
+        else:
+            centre = referral.ReferralCentre(
+                hash(len(self.referral_centres)),
+                _("New"), "", "", "", "", "", "", "", "")
+        self.referral_centres.append(centre)
+        rowno = len(self.referral_centres) - len(self.deleted_centres) - 1
+        self.load_existing(rowno)
+        self.check_for_changes()
+
+    def remove_centre(self):
+        if len(self.referral_centres) < 2:
+            QtGui.QMessageBox.warning(
+                self,
+                _("Warning"),
+                _("You should have at least one referral centre in the database")
+            )
+            return
+        self.deleted_centres.append(self.current_centre)
+        self.load_existing()
+        self.check_for_changes()
+
+    def update_centre(self):
+        ix = self.current_centre.ix
+        centre = referral.ReferralCentre(ix,
+                                         self.description,
+                                         self.greeting,
+                                         self.address[0],
+                                         self.address[1],
+                                         self.address[2],
+                                         self.address[3],
+                                         self.address[4],
+                                         self.address[5],
+                                         self.address[6],
+                                         )
+        self._referral_centres[self.current_row] = centre
+        self.check_for_changes()
+
+    def check_for_changes(self):
+        if self.deleted_centres or self.new_centres:
+            self.dirty = True
+        else:
+            for i, centre in enumerate(self.referral_centres):
+                if self.orig_data[i] != str(centre):
+                    self.dirty = True
+                    break
+        self.enableApply(self.dirty)
+
+    def description_edited(self):
+        rowno = self.current_row
+        self.load_existing(rowno)
+
+    def new_centres(self):
+        return self.referral_centres[len(self.orig_data):]
+
+    def updated_centres(self):
+        for i in range(len(self.orig_data)):
+            centre = self.referral_centres[i]
+            if (self.orig_data[i] != str(centre) and
+               centre not in self.deleted_centres):
+                yield centre
+
+    def exec_(self):
+        if BaseDialog.exec_(self):
+            referral.update_centres(self.updated_centres())
+            referral.insert_centres(self.new_centres())
+            referral.delete_centres(self.deleted_centres)
+            return True
+        return False
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+
+    dl = EditReferralCentresDialog()
+    dl.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py b/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py
new file mode 100644
index 0000000..49f0fc0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py
@@ -0,0 +1,141 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import re
+
+from PyQt4 import QtCore, QtGui
+
+from openmolar.dbtools import treatment_course
+
+from openmolar.qt4gui.customwidgets.upper_case_line_edit \
+    import UpperCaseLineEdit
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+class EditTreatmentDialog(ExtendableDialog):
+
+    def __init__(self, serialno, courseno, parent=None):
+        ExtendableDialog.__init__(self, parent, remove_stretch=True)
+        self.setWindowTitle(_("Edit Treatment Dialog"))
+
+        self.serialno = serialno
+        self.courseno = courseno
+
+        planning = QtGui.QMessageBox.question(self, _("Option"),
+            "%s<hr /><em>%s</em>" %(
+                _("Edit Completed items?"),
+                _("Choosing 'NO' will offer edit of planned items")
+                ),
+            QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
+            QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No
+
+
+        if planning:
+            header = _("Planned Items")
+            self.suffix = "pl"
+        else:
+            header = _("Completed Items")
+            self.suffix = "cmp"
+
+        self._treatment_course = None
+        self.widgets = {}
+        self.orig_values = {}
+
+        frame = QtGui.QFrame()
+        form_layout = QtGui.QFormLayout(frame)
+
+        header_label = QtGui.QLabel(header)
+        header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+        tooth_atts = []
+
+        for att in treatment_course.CURRTRT_ROOT_ATTS:
+            widg = UpperCaseLineEdit()
+            self.widgets[att] = widg
+            if re.match("[ul][lr][1-8]", att):
+                tooth_atts.append(att)
+            else:
+                form_layout.addRow(att, widg)
+        for att in sorted(tooth_atts):
+            form_layout.addRow(att.upper(), self.widgets[att])
+
+        scroll_area = QtGui.QScrollArea()
+        scroll_area.setWidget(frame)
+        scroll_area.setWidgetResizable(True)
+
+        self.insertWidget(header_label)
+        self.insertWidget(scroll_area)
+
+        self.add_advanced_widget(QtGui.QLabel(_("No Advanced Options")))
+        QtCore.QTimer.singleShot(100, self.load_values)
+
+    @property
+    def treatment_course(self):
+        if self._treatment_course is None:
+            self._treatment_course = treatment_course.TreatmentCourse(
+                self.serialno, self.courseno)
+        return self._treatment_course
+
+    def load_values(self):
+        for att in treatment_course.CURRTRT_ROOT_ATTS:
+            val = self.treatment_course.__dict__[att+self.suffix]
+            widg = self.widgets[att]
+            self.orig_values[att] = val
+            widg.setText(val)
+            widg.editingFinished.connect(self.check_appliable)
+
+    def new_value(self, att):
+        return str(self.widgets[att].text().toAscii()).strip(" ") + " "
+
+    def check_appliable(self):
+        for att in treatment_course.CURRTRT_ROOT_ATTS:
+            if self.new_value(att) != self.orig_values[att]:
+                self.enableApply()
+                return
+        self.enableApply(False)
+
+    def sizeHint(self):
+        return QtCore.QSize(200, 600)
+
+    def update_db(self):
+        changes = ""
+        values = []
+        for att in treatment_course.CURRTRT_ROOT_ATTS:
+            if self.new_value(att) != self.orig_values[att]:
+                changes += "%s%s=%%s ," %(att, self.suffix)
+                values.append(self.new_value(att))
+
+        treatment_course.update_course(
+            changes.rstrip(","),
+            values,
+            self.serialno,
+            self.courseno)
+
+if __name__ == "__main__":
+    from gettext import gettext as _
+
+    app = QtGui.QApplication([])
+    serialno, courseno = (14469, 45869)
+    dl = EditTreatmentDialog(serialno, courseno)
+    if dl.exec_():
+        dl.update_db()
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py b/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py
new file mode 100644
index 0000000..303c6c9
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py
@@ -0,0 +1,135 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import copy
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.dbtools import estimates
+
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+from openmolar.qt4gui.customwidgets.estimate_widget import EstimateWidget
+LOGGER = logging.getLogger("openmolar")
+
+
+class _Patient(object):
+
+    '''
+    A "duck" patient
+    '''
+
+    def __init__(self, serialno, courseno):
+        self.serialno = serialno
+        self.courseno0 = courseno
+        self.estimates = []
+
+
+class OldEstimateWidget(EstimateWidget):
+
+    '''
+    Estimate widget assumes current course, and parent being full blown gui.
+    Override some functions.
+    '''
+
+    def allow_check(self, *args):
+        return True
+
+    def tx_hash_complete(self, tx_hash):
+        pass
+
+
+class EstimateEditDialog(ExtendableDialog):
+    orig_ests = []
+
+    def __init__(self, serialno, courseno, parent=None):
+        ExtendableDialog.__init__(self, parent)
+        self.patient = _Patient(serialno, courseno)
+
+        header_label = QtGui.QLabel("<b>%s %s</b>" % (
+            _("Inspecting estimate for Course Number"), courseno))
+        header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+        self.est_widget = OldEstimateWidget(self)
+
+        self.insertWidget(header_label)
+        self.insertWidget(self.est_widget)
+
+        self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+        self.add_advanced_widget(self.adv_widget)
+        # self.remove_spacer()
+
+        self.est_widget.delete_estimate_item.connect(self.delete_item)
+        self.est_widget.edited_signal.connect(self._enable_apply)
+
+        QtCore.QTimer.singleShot(100, self.get_data)
+
+    def advise(self, message, severity=None):
+        QtGui.QMessageBox.information(self, _("message"), message)
+
+    def sizeHint(self):
+        return QtCore.QSize(400, 400)
+
+    def get_data(self):
+        ests = estimates.get_ests(
+            self.patient.serialno,
+            self.patient.courseno0)
+        self.orig_ests = copy.deepcopy(ests)
+        self.patient.estimates = ests
+        self.est_widget.setPatient(self.patient)
+
+    def delete_item(self, est):
+        assert isinstance(
+            est, estimates.Estimate), "bad object passed to delete"
+        LOGGER.debug("delete %s" % est)
+        self.patient.estimates.remove(est)
+
+    def _enable_apply(self):
+        LOGGER.debug("checking enable apply")
+        self.enableApply(self.patient.estimates != self.orig_ests)
+
+    def _clicked(self, but):
+        '''
+        overwrite BaseDialog method
+        '''
+        role = self.button_box.buttonRole(but)
+        if role == QtGui.QDialogButtonBox.ApplyRole and QtGui.QMessageBox.question(
+            self, _("Confirm"), _("Apply Changes?"),
+            QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+            QtGui.QMessageBox.Cancel
+        ) == QtGui.QMessageBox.Cancel:
+            return
+        ExtendableDialog._clicked(self, but)
+
+    def update_db(self):
+        estimates.apply_changes(
+            self.patient, self.orig_ests, self.patient.estimates)
+
+if __name__ == "__main__":
+
+    app = QtGui.QApplication([])
+    LOGGER.setLevel(logging.DEBUG)
+    dl = EstimateEditDialog(11956, 29749)
+    if dl.exec_():
+        dl.update_db()
+        print dl.patient.estimates
diff --git a/src/openmolar/qt4gui/dialogs/exam_wizard.py b/src/openmolar/qt4gui/dialogs/exam_wizard.py
index fcbcc7f..109473f 100644
--- a/src/openmolar/qt4gui/dialogs/exam_wizard.py
+++ b/src/openmolar/qt4gui/dialogs/exam_wizard.py
@@ -89,10 +89,12 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
                     _("confirming this will remove reference to"),
                     localsettings.ops.get(self.pt.dnt2))
 
-                if QtGui.QMessageBox.question(self,
-                                              "Confirm", message,
-                                              QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                              QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+                if QtGui.QMessageBox.question(
+                    self,
+                    _("Confirm"),
+                    message,
+                    QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                        QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
                     self.pt.dnt2 = 0
                     self.om_gui.updateDetails()
                     APPLIED = True
@@ -113,13 +115,18 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
                     examdent,
                     _("the registered dentist"))
 
-            if QtGui.QMessageBox.question(self,
-                                          _("Confirm"), message,
-                                          QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                          QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+            if QtGui.QMessageBox.question(
+                self,
+                _("Confirm"), message,
+                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                    QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
                 self.pt.dnt2 = localsettings.ops_reverse[examdent]
                 self.om_gui.updateDetails()
                 APPLIED = True
+            else:
+                APPLIED = False
+
+            self.om_gui.load_dentComboBoxes()
 
         return APPLIED, examdent
 
@@ -131,10 +138,11 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
             om_gui.advise("no patient selected", 1)
             return
         if self.pt.treatment_course.has_exam:
-            self.om_gui.advise(u"<p>%s</p><hr /><p>%s</p>" % (
-                               _(
-                               'You already have a completed exam on this course of treatment'),
-                               _("Unable to perform exam")), 1)
+            message = u"<p>%s</p><hr /><p>%s</p>" % (
+                _('You already have a completed exam '
+                  'on this course of treatment'),
+                _("Unable to perform exam"))
+            self.om_gui.advise(message, 1)
             return
 
         APPLIED = False
@@ -160,7 +168,7 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
 
                 self.update_recall_date()
 
-                self.pt.addHiddenNote("exam", "%s" % examtype)
+                self.pt.addHiddenNote("exam", "%s " % examtype)
 
                 dentid = localsettings.ops_reverse[examdent]
 
@@ -184,11 +192,13 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
 
     def update_recall_date(self):
         if not self.pt.appt_prefs.recall_active:
-            self.om_gui.advise(
-                _("WARNING - Not updating recall due to patients recall settings"), 1)
+            message = "%s<hr />%s" % (
+                _("WARNING"),
+                _("Not updating recall due to patient's recall settings"))
+            self.om_gui.advise(message, 1)
         else:
             date_ = localsettings.formatDate(self.pt.appt_prefs.new_recdent)
-            self.om_gui.advise("updating recall date to %s" % date_, 1)
+            self.om_gui.advise("updating recall date to %s" % date_)
             self.pt.appt_prefs.update_recdent()
 
 
@@ -200,7 +210,6 @@ if __name__ == "__main__":
     localsettings.station = "reception"
 
     from openmolar.qt4gui import maingui
-    from openmolar.dbtools import patient_class
 
     app = QtGui.QApplication([])
     mw = maingui.OpenmolarGui()
diff --git a/src/openmolar/qt4gui/dialogs/family_manage_dialog.py b/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
index 08305ff..2cfc24e 100644
--- a/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
@@ -246,7 +246,9 @@ class FamilyManageDialog(ExtendableDialog):
             pt = _DuckPatient(member)
 
             browser = QtGui.QTextBrowser()
-            browser.setText(patientDetails.header(pt))
+            details = patientDetails.header(pt)
+            details = details.replace("<h1>DECEASED</h1>", "<h4>Deceased</h4>")
+            browser.setText(details)
 
             row = (i // 4) * 2
             column = i % 4
diff --git a/src/openmolar/qt4gui/dialogs/find_patient_dialog.py b/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
index 2c3ee57..7cf041e 100644
--- a/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
@@ -22,6 +22,8 @@
 # #                                                                          # #
 # ############################################################################ #
 
+from __future__ import division
+
 import datetime
 import logging
 from PyQt4 import QtGui, QtCore
@@ -31,7 +33,7 @@ from openmolar.settings import localsettings
 from openmolar.dbtools import search
 
 from openmolar.qt4gui.compiled_uis import Ui_patient_finder
-from openmolar.qt4gui.compiled_uis import Ui_select_patient
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
 
 
 class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
@@ -55,7 +57,11 @@ class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
         self.pcde.setText(localsettings.lastsearch[5])
 
     def exec_(self):
-        if QtGui.QDialog.exec_(self):
+        if localsettings.PT_COUNT == 0:
+            QtGui.QMessageBox.warning(self.parent(), _("warning"),
+                                      _("You have no patients in your database"))
+            return False
+        if localsettings.PT_COUNT < 5 or QtGui.QDialog.exec_(self):
             dob = self.dateEdit.date().toPyDate()
             addr = str(self.addr1.text().toAscii())
             tel = str(self.tel.text().toAscii())
@@ -71,73 +77,98 @@ class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
 
             if serialno > 0:
                 self.chosen_sno = serialno
-                # self.getrecord(serialno, True)
             else:
-                candidates = search.getcandidates(dob, addr, tel, sname,
-                                                  self.snameSoundex_checkBox.checkState(
-                                                  ), fname,
-                                                  self.fnameSoundex_checkBox.checkState(), pcde)
+                candidates = search.getcandidates(
+                    dob, addr, tel, sname,
+                    self.snameSoundex_checkBox.checkState(), fname,
+                    self.fnameSoundex_checkBox.checkState(), pcde
+                )
 
-                if candidates == ():
+                if candidates == () and localsettings.PT_COUNT > 5:
                     QtGui.QMessageBox.warning(self.parent(), "warning",
                                               _("no match found"))
                     return False
                 else:
-                    if len(candidates) > 1:
+                    if localsettings.PT_COUNT < 5:
+                            candidates = search.all_patients()
+                    if len(candidates) == 1:
+                        self.chosen_sno = int(candidates[0][0])
+                    else:
                         dl = FinalChoiceDialog(candidates, self)
                         if dl.exec_():
                             self.chosen_sno = dl.chosen_sno
-                    else:
-                        self.chosen_sno = int(candidates[0][0])
-
             return True
 
         return False
 
 
-class FinalChoiceDialog(QtGui.QDialog, Ui_select_patient.Ui_Dialog):
+class FinalChoiceDialog(ExtendableDialog):
     chosen_sno = None
 
     def __init__(self, candidates, parent=None):
-        QtGui.QDialog.__init__(self, parent)
-        self.setupUi(self)
-        self.tableWidget.clear()
-        self.tableWidget.setSortingEnabled(False)
-        #--good practice to disable this while loading
-        self.tableWidget.setRowCount(len(candidates))
-        headers = ('Serialno', 'Surname', 'Forename', 'dob', 'Address1',
-                   'Address2', 'POSTCODE')
-
-        widthFraction = (0, 20, 20, 15, 30, 30, 10)
-        self.tableWidget.setColumnCount(len(headers))
-        self.tableWidget.setHorizontalHeaderLabels(headers)
-        self.tableWidget.verticalHeader().hide()
-        self.tableWidget.horizontalHeader().setStretchLastSection(True)
-        row = 0
-
-        for col in range(len(headers)):
-            self.tableWidget.setColumnWidth(col, widthFraction[col] *
-                                           (self.width() - 100) / 130)
-
-        for candidate in candidates:
-            col = 0
-            for attr in candidate:
+        ExtendableDialog.__init__(self, parent, remove_stretch=True)
+        self.table_widget = QtGui.QTableWidget()
+        self.table_widget.setAlternatingRowColors(True)
+        self.table_widget.setSelectionBehavior(
+            QtGui.QAbstractItemView.SelectRows)
+        self.insertWidget(self.table_widget)
+
+        headers = (_('Serialno'),
+                   _('Status'),
+                   _('Title'),
+                   _('Forename'),
+                   _('Surname'),
+                   _('Birth Date'),
+                   _('Address Line 1'),
+                   _('Address Line 2'),
+                   _('Town'),
+                   _('POSTCODE'),
+                   _('Tel1'),
+                   _('Tel2'),
+                   _('Mobile')
+                   )
+
+        self.table_widget.clear()
+        self.table_widget.setSortingEnabled(False)
+        self.table_widget.setRowCount(len(candidates))
+        self.table_widget.setColumnCount(len(headers))
+        self.table_widget.setHorizontalHeaderLabels(headers)
+        self.table_widget.verticalHeader().hide()
+        self.table_widget.horizontalHeader().setStretchLastSection(True)
+
+        for row, candidate in enumerate(candidates):
+            for col, attr in enumerate(candidate):
                 if isinstance(attr, datetime.date):
                     item = QtGui.QTableWidgetItem(
                         localsettings.formatDate(attr))
                 else:
                     item = QtGui.QTableWidgetItem(str(attr))
-                self.tableWidget.setItem(row, col, item)
-                col += 1
-            row += 1
-        self.tableWidget.setCurrentCell(0, 1)
+                self.table_widget.setItem(row, col, item)
+
+        self.table_widget.setCurrentCell(0, 1)
+        self.table_widget.setSortingEnabled(True)
+        self.table_widget.sortItems(4)
+
+        self.table_widget.itemDoubleClicked.connect(self.accept)
+        self.enableApply(True)
+        self.apply_but.setText(_("Load the Selected Patient"))
+        self.setMinimumWidth(
+            QtGui.QApplication.desktop().screenGeometry().width()-20)
+
+    def sizeHint(self):
+        return QtCore.QSize(self.minimumWidth(), 400)
 
-        self.tableWidget.itemDoubleClicked.connect(self.accept)
+    def resizeEvent(self, event):
+        widths = (0, 12, 12, 15, 15, 15, 25, 20, 20, 15, 10, 10, 10)
+        sum_widths = sum(widths) + 10  # allow for vertical scrollbar
+        for col in range(self.table_widget.columnCount()):
+            col_width = widths[col] * self.width() / sum_widths
+            self.table_widget.setColumnWidth(col, col_width)
 
     def exec_(self):
         if QtGui.QDialog.exec_(self):
-            row = self.tableWidget.currentRow()
-            result = self.tableWidget.item(row, 0).text()
+            row = self.table_widget.currentRow()
+            result = self.table_widget.item(row, 0).text()
             self.chosen_sno = int(result)
             return True
         return False
diff --git a/src/openmolar/qt4gui/dialogs/first_run_dialog.py b/src/openmolar/qt4gui/dialogs/first_run_dialog.py
new file mode 100644
index 0000000..f8f6d05
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/first_run_dialog.py
@@ -0,0 +1,789 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import base64
+import hashlib
+import logging
+import os
+import MySQLdb
+
+from xml.dom import minidom
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+XML_TEMPLATE = '''<?xml version="1.1" ?>
+<settings>
+<system_password> </system_password>
+<connection name="existing_database">
+    <version>1.1</version>
+    <server>
+        <location> </location>
+        <port> </port>
+    </server>
+    <database>
+        <dbname> </dbname>
+        <user> </user>
+    <password> </password>
+    </database>
+</connection>
+</settings>'''
+
+HOST = "localhost"
+PORT = 3306
+DB_USER = "openmolar"
+DB_PASS = "password"
+DB_NAME = "openmolar"
+
+
+class _InputPage(QtGui.QWidget):
+
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.dialog = parent
+        self.label = QtGui.QLabel("text")
+        self.label.setWordWrap(True)
+        self.frame = QtGui.QFrame()
+
+        layout = QtGui.QVBoxLayout(self)
+        layout.addWidget(self.label)
+        layout.addStretch(30)
+        layout.addWidget(self.frame)
+        layout.addStretch(100)
+
+    def sizeHint(self):
+        return QtCore.QSize(400, 400)
+
+    @property
+    def is_completed(self):
+        '''
+        should be overwritten!
+        '''
+        return True
+
+    @property
+    def error_message(self):
+        '''
+        should be overwritten!
+        '''
+        return "input error! - try again"
+
+
+class PageZero(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        message = "%s<ul><li>%s</li><li>%s</li><li>%s</li><li>%s</li></ul>" % (
+            _("This Dialog will help you"),
+            _("secure openmolar with a password"),
+            _("note the location of your mysql/mariadb server"),
+            _("install a blank database schema if required."),
+            _("save a settings file so you do not have to endure this again!")
+        )
+        self.label.setText(message)
+
+        message2 = _("Click Next to continue, or Quit to leave OpenMolar now.")
+        label = QtGui.QLabel(message2)
+        layout = QtGui.QVBoxLayout(self.frame)
+        layout.addWidget(label)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b><hr />%s" % (
+            _("This appears to be your first running of OpenMolar."),
+            _("We need to save a few settings to continue.")
+        )
+
+
+class PageOne(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        message = "%s<br />%s<br /><br /><em>%s</em>" % (
+            _("You may wish to enter a password which will hereafter be required"
+              " to login to the OpenMolar application"),
+            _("This password will help prevent an unauthorised person"
+              " accessing any sensitive data."),
+            _("If your data is simply demonstration data, "
+              "this can be left blank"))
+        self.label.setText(message)
+
+        layout = QtGui.QFormLayout(self.frame)
+        self.line_edit1 = QtGui.QLineEdit()
+        self.line_edit2 = QtGui.QLineEdit()
+
+        self.show_cb = QtGui.QCheckBox(_("Show Passwords"))
+        layout.addRow(_("Password"), self.line_edit1)
+        layout.addRow(_("Confirm Password"), self.line_edit2)
+        layout.addRow("", self.show_cb)
+
+        self.show_passwords()
+
+        self.show_cb.toggled.connect(self.show_passwords)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b>" % _("Step 1 - Set a password for OpenMolar")
+
+    def showEvent(self, event):
+        self.line_edit1.setFocus()
+
+    def show_passwords(self, show=False):
+        if show:
+            e_mode = QtGui.QLineEdit.Normal
+        else:
+            e_mode = QtGui.QLineEdit.Password
+        self.line_edit1.setEchoMode(e_mode)
+        self.line_edit2.setEchoMode(e_mode)
+
+    @property
+    def is_completed(self):
+        return self.line_edit1.text() == self.line_edit2.text()
+
+    @property
+    def error_message(self):
+        return _("Passwords don't match!")
+
+
+class PageTwo(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        message = "%s<br />%s<br />%s" % (
+            _("OpenMolar is simply a database client."),
+            _("It requires a database server such as MySQL or MariaDB."),
+            _("Please enter the hostname and port number "
+              "where your server can be reached.")
+        )
+
+        message1 = "** %s\n\n (%s)" % (
+            _("If you do not have a mysql/mariadb server on your computer"
+              " or local network, please quit this setup, "
+              "and install one now!"),
+            _(
+                "Make a note of the root password you create during this set up.")
+        )
+        self.label.setText(message)
+
+        frame1 = QtGui.QFrame()
+
+        layout = QtGui.QFormLayout(frame1)
+        self.line_edit1 = QtGui.QLineEdit()
+        self.line_edit1.setText(HOST)
+        self.line_edit2 = QtGui.QLineEdit()
+        self.line_edit2.setText(str(PORT))
+
+        layout.addRow(_("Host"), self.line_edit1)
+        layout.addRow(_("Port"), self.line_edit2)
+
+        layout = QtGui.QVBoxLayout(self.frame)
+        layout.addWidget(frame1)
+        layout.addStretch(100)
+        label = QtGui.QLabel(message1)
+        layout.addWidget(label)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b>" % _("Step 2 - Where is your database server?")
+
+    def showEvent(self, event):
+        self.line_edit1.setFocus()
+
+    @property
+    def port(self):
+        try:
+            return int(self.line_edit2.text().toAscii())
+        except ValueError:
+            pass
+        return None
+
+    @property
+    def is_completed(self):
+        for le in (self.line_edit1, self.line_edit2):
+            if le.text() == "":
+                return False
+        return self.port is not None
+
+    @property
+    def error_message(self):
+        message = "%s<ul>" % _("The Following errors were found")
+        if self.line_edit1.text() == "":
+            message += "<li>%s</li>" % _("Host Field is Blank")
+        if self.line_edit2.text() == "":
+            message += "<li>%s</li>" % _("Port Field is Blank")
+        elif self.port is None:
+            message += "<li>%s</li>" % _(
+                "Port Field must be a number. Default is 3306")
+
+        return message + "</ul>"
+
+
+class PageThree(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        message1 = "%s<hr />%s" % (
+            _("Do you already have an openmolar database on this server?"),
+            _("If not, you should lay out one now.")
+        )
+        self.label.setText(message1)
+
+        layout = QtGui.QVBoxLayout(self.frame)
+        self.radio_button1 = QtGui.QRadioButton(
+            _("Create a database user and install a blank (demo) Database"))
+        self.radio_button2 = QtGui.QRadioButton(
+            _("Use an existing database"))
+
+        self.radio_button1.setChecked(True)
+        layout.addWidget(self.radio_button1)
+        layout.addWidget(self.radio_button2)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b>" % _("Step 3 - select a database option")
+
+    def showEvent(self, event):
+        self.radio_button1.setFocus()
+
+    @property
+    def create_new(self):
+        return self.radio_button1.isChecked()
+
+
+class PageFour(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        message = "%s<br />%s" % (
+            _("Please enter connection criteria for the database."),
+            _("If the user and/or database does not exist, "
+              "you will be given an opportunity to create them ")
+        )
+        self.label.setText(message)
+
+        layout = QtGui.QFormLayout(self.frame)
+        self.line_edit1 = QtGui.QLineEdit()
+        self.line_edit2 = QtGui.QLineEdit()
+        self.line_edit3 = QtGui.QLineEdit()
+
+        self.line_edit1.setText(DB_NAME)
+        self.line_edit2.setText(DB_USER)
+        self.line_edit3.setText(DB_PASS)
+        self.show_cb = QtGui.QCheckBox(_("Show Password"))
+
+        layout.addRow(_("Database Name"), self.line_edit1)
+        layout.addRow(_("(mysql) user"), self.line_edit2)
+        layout.addRow(_("(mysql) password"), self.line_edit3)
+        layout.addRow("", self.show_cb)
+        self.show_passwords()
+
+        self.show_cb.toggled.connect(self.show_passwords)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b>" % _("Step 5(a) - Your Database Details")
+
+    def showEvent(self, event):
+        self.line_edit1.setFocus()
+
+    def show_passwords(self, show=False):
+        if show:
+            e_mode = QtGui.QLineEdit.Normal
+        else:
+            e_mode = QtGui.QLineEdit.Password
+        self.line_edit3.setEchoMode(e_mode)
+
+    @property
+    def is_completed(self):
+        for le in (self.line_edit1, self.line_edit2, self.line_edit3):
+            if le.text() == "":
+                return False
+        return True
+
+    @property
+    def error_message(self):
+        message = "%s<ul>" % _("The Following errors were found")
+        if self.line_edit1.text() == "":
+            message += "<li>%s</li>" % _("Database Name Field is Blank")
+        if self.line_edit2.text() == "":
+            message += "<li>%s</li>" % _("User Field is Blank")
+        if self.line_edit3.text() == "":
+            message += "<li>%s</li>" % _("Password Field is Blank")
+
+        return message + "</ul>"
+
+
+class PageFive(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        message = "%s<br />%s" % (
+            _("To create a database, and set the privileges for user, "
+              "OpenMolar must log into mysql as a privileged mysql user."),
+            _("OpenMolar does NOT store this username or password.")
+        )
+
+        message2 = "%s<br /><em>%s</em>" % (
+            _("Please enter the username and password of a "
+              "privileged mysql user."),
+            _("(note - on most mysql setups, login by 'root' is only allowed"
+              " on localhost)")
+        )
+
+        self.label.setText(message)
+
+        layout = QtGui.QFormLayout(self.frame)
+        self.line_edit1 = QtGui.QLineEdit()
+        self.line_edit1.setText("root")
+        self.line_edit2 = QtGui.QLineEdit()
+        self.show_cb = QtGui.QCheckBox(_("Show Password"))
+
+        layout.addRow(_("Privileged user"), self.line_edit1)
+        layout.addRow(_("Password for this user"), self.line_edit2)
+        layout.addRow("", self.show_cb)
+        self.show_passwords()
+
+        self.show_cb.toggled.connect(self.show_passwords)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b>" % _(
+            "Step 5b - Create an authenticated user and database")
+
+    def showEvent(self, event):
+        self.line_edit2.setFocus()
+
+    def show_passwords(self, show=False):
+        if show:
+            e_mode = QtGui.QLineEdit.Normal
+        else:
+            e_mode = QtGui.QLineEdit.Password
+        self.line_edit2.setEchoMode(e_mode)
+
+    @property
+    def is_completed(self):
+        return self.line_edit1.text() != "" and self.line_edit2.text() != ""
+
+    @property
+    def error_message(self):
+        message = "%s<ul>" % _("The Following errors were found")
+        if self.line_edit1.text() == "":
+            message += "<li>%s</li>" % _("Privileged User Field is Blank")
+        if self.line_edit2.text() == "":
+            message += "<li>%s</li>" % _("Password Field is Blank")
+
+        return message + "</ul>"
+
+
+class PageSix(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        self.db_created = False
+        message = _("Creating Database")
+        self.label.setText(message)
+        self.progress_bar = QtGui.QProgressBar()
+
+        layout = QtGui.QVBoxLayout(self.frame)
+        layout.addWidget(self.progress_bar)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b>" % _("Step 6 - Create Database")
+
+    def showEvent(self, event):
+        if not self.db_created:
+            QtCore.QTimer.singleShot(100, self.create_database)
+
+    def create_database(self):
+        self.progress_bar.setValue(0)
+        PB_LIMIT = 50
+
+        def updatePB():
+            val = self.progress_bar.value()
+            if val < PB_LIMIT:
+                self.progress_bar.setValue(val + 5)
+                self.progress_bar.update()
+
+        self.timer1 = QtCore.QTimer()
+        self.connect(self.timer1, QtCore.SIGNAL("timeout()"),
+                     updatePB)
+
+        try:
+            from openmolar import create_db
+            if (create_db.exists_already(
+                self.dialog.host,
+               self.dialog.port,
+               self.dialog.db_name,
+               self.dialog.privileged_user_pass,
+               self.dialog.privileged_user
+                ) and
+               QtGui.QMessageBox.question(self, _("Confirm"),
+                                          "%s '%s' %s<hr />%s" % (_("A database named"),
+                                                                  self.dialog.db_name,
+                                                                  _(
+                                                                  "exists already"),
+                                                                  _("Overwrite this database?")),
+                                          QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                                          QtGui.QMessageBox.No) == QtGui.QMessageBox.No):
+                self.dialog.database_exists_already()
+                return
+            self.timer1.start(10)  # 1/100thsecond
+
+            self.progress_bar.setValue(10)
+            create_db.create_database(
+                self.dialog.host,
+                self.dialog.port,
+                self.dialog.db_user,
+                self.dialog.db_pass,
+                self.dialog.db_name,
+                self.dialog.privileged_user_pass,
+                self.dialog.privileged_user
+            )
+
+            self.progress_bar.setValue(50)
+            PB_LIMIT = 90
+            create_db.create_tables(self.dialog.host,
+                                    self.dialog.port,
+                                    self.dialog.db_user,
+                                    self.dialog.db_pass,
+                                    self.dialog.db_name,
+                                    )
+
+            self.progress_bar.setValue(100)
+            QtGui.QMessageBox.information(
+                self,
+                _("Success!"),
+                _("Database created successfully!")
+            )
+            self.db_created = True
+            self.dialog.next()
+        except Exception as exc:
+            LOGGER.exception("error creating database")
+            message = "%s<hr />%s" % (_("Error Creating Database"), exc)
+            QtGui.QMessageBox.warning(self, _("Error"), message)
+            self.db_created = False
+
+
+class PageSeven(_InputPage):
+
+    def __init__(self, parent=None):
+        _InputPage.__init__(self, parent)
+
+        message = _("Testing connection")
+        self.label.setText(message + ".......")
+
+        layout = QtGui.QVBoxLayout(self.frame)
+
+    @property
+    def header_text(self):
+        return "<b>%s</b>" % _(
+            "Final Step - Test Connection & Write Config File")
+
+    def showEvent(self, event):
+        QtCore.QTimer.singleShot(100, self.test_connection)
+
+    def test_connection(self):
+        self.dialog.wait()
+        try:
+            LOGGER.info("attempting to connect to mysql server")
+
+            db = MySQLdb.connect(host=self.dialog.host,
+                                 port=self.dialog.port,
+                                 db=self.dialog.db_name,
+                                 passwd=self.dialog.db_pass,
+                                 user=self.dialog.db_user)
+            result = db.open
+            db.close()
+            self.dialog.wait(False)
+            self.label.setText(_("Your database is accepting connections!"))
+            return True
+        except Exception as exc:
+            self.dialog.wait(False)
+            LOGGER.exception("connection attempt failed")
+            self.label.setText("<b>%s</b>" % (
+                _("WARNING"),
+                _("Your database is NOT accepting connections!"))
+            )
+            return False
+        finally:
+            self.dialog.wait(False)
+
+
+class FirstRunDialog(BaseDialog):
+
+    def __init__(self, parent=None):
+        BaseDialog.__init__(self, parent)
+        self.setWindowTitle(_("First Run Dialog"))
+
+        self.top_label = WarningLabel("FirstRun")
+
+        self.wizard_widget = QtGui.QStackedWidget()
+
+        page0 = PageZero(self)
+        self.page1 = PageOne(self)
+        self.page2 = PageTwo(self)
+        self.page3 = PageThree(self)
+        self.page4 = PageFour(self)
+        self.page5 = PageFive(self)
+        page6 = PageSix(self)
+        self.page7 = PageSeven(self)
+        # accept_page = AcceptPage(self)
+
+        self.wizard_widget.addWidget(page0)
+        self.wizard_widget.addWidget(self.page1)
+        self.wizard_widget.addWidget(self.page2)
+        self.wizard_widget.addWidget(self.page3)
+        self.wizard_widget.addWidget(self.page4)
+        self.wizard_widget.addWidget(self.page5)
+        self.wizard_widget.addWidget(page6)
+        self.wizard_widget.addWidget(self.page7)
+        # self.wizard_widget.addWidget(accept_page)
+
+        self.insertWidget(self.top_label)
+        self.insertWidget(self.wizard_widget)
+
+        self.next_but = self.button_box.addButton(
+            _("Next"), self.button_box.ActionRole)
+        self.back_but = self.button_box.addButton(
+            _("Back"), self.button_box.ActionRole)
+
+        self.apply_but.hide()
+        self.back_but.hide()
+        self.cancel_but.setText(_("Quit OpenMolar"))
+
+        self.set_labels()
+
+    def sizeHint(self):
+        return QtCore.QSize(400, 400)
+
+    def wait(self, waiting=True):
+        if waiting:
+            QtGui.QApplication.instance().setOverrideCursor(
+                QtCore.Qt.WaitCursor)
+        else:
+            QtGui.QApplication.instance().restoreOverrideCursor()
+
+    def set_labels(self):
+        self.top_label.setText(self.current_page.header_text)
+        self.cancel_but.setVisible(self.current_index == 0)
+        self.back_but.setVisible(self.current_index != 0)
+
+        if self.current_index == 5:
+            self.next_but.setText(_("Create Database Now!"))
+        elif self.current_index == 7:
+            self.next_but.setText(_("Write Config File and Proceed"))
+        else:
+            self.next_but.setText(_("Next"))
+
+    def next(self):
+        '''
+        0 = intro
+        1 = application password
+        2 = host and port
+        3 = database option (create new or use existing)
+        4 = database details (dbname, user and password)
+        5 = enter privileged user
+        6 = create database
+        7 = test connection, write config and exit.
+        '''
+        i = self.wizard_widget.currentIndex()
+        if not self.current_page.is_completed:
+            QtGui.QMessageBox.warning(self,
+                                      _("error"),
+                                      self.current_page.error_message)
+            new_i = i
+        elif i == 4 and not self.page3.create_new:
+            new_i = i + 3
+        elif i == 7:
+            self.finish()
+            return
+        else:
+            new_i = i + 1
+        self.wizard_widget.setCurrentIndex(new_i)
+        self.set_labels()
+
+    def back(self):
+        i = self.wizard_widget.currentIndex()
+        if i == 0:
+            new_i = 0
+        elif i == 7:  # shouldn't happen?
+            new_i = 0  # don't create a database by hitting "back"
+        else:
+            new_i = i - 1
+        self.wizard_widget.setCurrentIndex(new_i)
+        self.set_labels()
+
+    def database_exists_already(self):
+        self.wizard_widget.setCurrentIndex(4)
+        self.set_labels()
+
+    def finish(self):
+        dom = minidom.parseString(XML_TEMPLATE)
+        #-- hash the password and save it
+        PSWORD = hashlib.md5(
+            hashlib.sha1(
+                str("diqug_ADD_SALT_3i2some" + self.sys_password)).hexdigest()
+        ).hexdigest()
+        dom.getElementsByTagName(
+            "system_password")[0].firstChild.replaceWholeText(PSWORD)
+        #-- server settings
+        xmlnode = dom.getElementsByTagName("server")[0]
+        #-- host
+        xmlnode.getElementsByTagName(
+            "location")[0].firstChild.replaceWholeText(self.host)
+        #--port
+        xmlnode.getElementsByTagName(
+            "port")[0].firstChild.replaceWholeText(str(self.port))
+        #-- database settings
+        xmlnode = dom.getElementsByTagName("database")[0]
+        #--user
+        xmlnode.getElementsByTagName(
+            "user")[0].firstChild.replaceWholeText(self.db_user)
+        #--password
+        xmlnode.getElementsByTagName(
+            "password")[0].firstChild.replaceWholeText(
+            base64.b64encode(self.db_pass))
+        #--db name
+        xmlnode.getElementsByTagName(
+            "dbname")[0].firstChild.replaceWholeText(self.db_name)
+
+        settings_dir = os.path.dirname(localsettings.global_cflocation)
+        successful_save = False
+        try:
+            if not os.path.exists(settings_dir):
+                LOGGER.info("creating settings directory '%s'", settings_dir)
+                os.mkdir(settings_dir)
+            LOGGER.info(
+                'writing settings to %s', localsettings.global_cflocation)
+            f = open(localsettings.global_cflocation, "w")
+            f.write(dom.toxml())
+            f.close()
+            localsettings.cflocation = localsettings.global_cflocation
+            successful_save = True
+        except OSError:
+            pass
+        except IOError:
+            pass
+
+        if not successful_save:
+            message = (
+                "unable to write to '%s' "
+                "we need root privileges for that\n"
+                "will resort to putting settings into a local file '%s'")
+            LOGGER.warning(message, settings_dir, localsettings.cflocation)
+            settings_dir = os.path.dirname(localsettings.cflocation)
+            if not os.path.exists(settings_dir):
+                os.mkdir(settings_dir)
+            LOGGER.info("putting a local settings file in '%s'", settings_dir)
+            f = open(localsettings.cflocation, "w")
+            f.write(dom.toxml())
+            f.close()
+            localsettings.cflocation = localsettings.cflocation
+
+        conf_text = "[login]\nPASSWORD=\nUSER1=\nUSER2="
+        if self.page3.create_new:
+            conf_text = conf_text.replace("USER1=", "USER1=USER")
+        f = open(localsettings.LOGIN_CONF, "w")
+        f.write(conf_text)
+        f.close()
+
+        self.accept()
+
+    def _clicked(self, but):
+        '''
+        "private" function called when button box is clicked
+        '''
+        if but == self.next_but:
+            self.next()
+        elif but == self.back_but:
+            self.back()
+        else:
+            BaseDialog._clicked(self, but)
+
+    @property
+    def current_index(self):
+        return self.wizard_widget.currentIndex()
+
+    @property
+    def current_page(self):
+        return self.wizard_widget.currentWidget()
+
+    @property
+    def sys_password(self):
+        return str(self.page1.line_edit1.text().toAscii())
+
+    @property
+    def host(self):
+        return str(self.page2.line_edit1.text().toAscii())
+
+    @property
+    def port(self):
+        return int(str(self.page2.line_edit2.text().toAscii()))
+
+    @property
+    def db_name(self):
+        return str(self.page4.line_edit1.text().toAscii())
+
+    @property
+    def db_user(self):
+        return str(self.page4.line_edit2.text().toAscii())
+
+    @property
+    def db_pass(self):
+        return str(self.page4.line_edit3.text().toAscii())
+
+    @property
+    def privileged_user(self):
+        return str(self.page5.line_edit1.text().toAscii())
+
+    @property
+    def privileged_user_pass(self):
+        return str(self.page5.line_edit2.text().toAscii())
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+
+    dl = FirstRunDialog()
+    print dl.exec_()
+    print dl.host
+    print dl.port
+    print dl.db_name
+    print dl.db_user
+    print dl.db_pass
+    print dl.privileged_user
+    print dl.privileged_user_pass
diff --git a/src/openmolar/qt4gui/dialogs/initial_check_dialog.py b/src/openmolar/qt4gui/dialogs/initial_check_dialog.py
new file mode 100644
index 0000000..694add2
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/initial_check_dialog.py
@@ -0,0 +1,155 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+from openmolar.dbtools import appointments
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class InitialCheckDialog(ExtendableDialog):
+
+    def __init__(self, parent=None):
+        ExtendableDialog.__init__(self, parent)
+        self.setWindowTitle(_("Initial Check Dialog"))
+
+        top_label = WarningLabel(
+            _('OpenMolar has found the following issues with your database.'))
+
+        frame = QtGui.QFrame(self)
+        self.form_layout = QtGui.QFormLayout(frame)
+
+        self.add_advanced_widget(QtGui.QLabel(_("No Advanced options")))
+        self.enableApply(True)
+
+        self.insertWidget(top_label)
+        self.insertWidget(frame)
+
+        self.apply_but.setText(_("Proceed"))
+        self.cancel_but.hide()
+
+    def advise(self, message):
+        QtGui.QMessageBox.information(self.parent(), _("Information"),
+                                      message)
+
+    @property
+    def has_issues(self):
+        example_name = _("Example Dental Practice")
+        has_issues = (
+            len(localsettings.cashbookCodesDict) < 1 or
+            len(localsettings.activedents) < 1 or
+            localsettings.PRACTICE_NAME == example_name
+        )
+
+        if not has_issues:
+            return False
+
+        if not localsettings.activedents:
+            but = QtGui.QPushButton(_("How do I Fix This?"))
+            but.clicked.connect(self.show_add_clinician_advise)
+            message = _("Your database contains no dentists")
+            self.form_layout.addRow(message, but)
+
+        if localsettings.PRACTICE_NAME == example_name:
+            but = QtGui.QPushButton(_("How do I Fix This?"))
+            but.clicked.connect(self.show_edit_practice)
+            message = "%s <b>'%s'</b>" % (
+                _("Your practice name is"),
+                example_name)
+            self.form_layout.addRow(message, but)
+
+        if len(appointments.future_slots(localsettings.currentDay(),
+                                         localsettings.BOOKEND,
+                                         localsettings.apptix.values(),
+                                         override_emergencies=True)
+               ) == 0:
+            but = QtGui.QPushButton(_("Why is this?"))
+            but.clicked.connect(self.show_appt_space)
+            message = _("You have no appointment space in your diary!")
+            self.form_layout.addRow(message, but)
+
+        return True
+
+    @property
+    def critical_messages(self):
+        if len(localsettings.cashbookCodesDict) < 1:
+            yield "%s<br />%s" % (
+                _("The cbcodes table in your database is inadequate."),
+                _("This will create problems when accepting payments.")
+            )
+
+    @property
+    def messages(self):
+        yield "%s %d %s" % (
+            _("you have"), localsettings.PT_COUNT, _("patients"))
+
+        yield "%s %d %s" % (
+            _("you have"), len(localsettings.activedents), _("active dentists"))
+
+        yield "%s %d %s" % (
+            _("you have"), len(localsettings.activehygs), _("active hygienists"))
+
+        yield "%s %s" % (
+            _("appointment search final date is"),
+            localsettings.formatDate(localsettings.BOOKEND))
+
+    def show_add_clinician_advise(self):
+        self.advise(
+            _("Once the application is open, click on Tools - > Menu - > Add Clinician"))
+
+    def show_edit_practice(self):
+        self.advise(
+            _("Once the application is open, click on Tools - > Menu - > Edit Practice Details"))
+
+    def show_appt_space(self):
+        self.advise("<h4>%s</h4><ul><li>%s</li><li>%s</li><li>%s</li><li>%s</li></ul>" % (
+            _("This could be for a variety of reasons"),
+            _(
+                "You need to have at least one clinician with an appointment book"),
+            _(
+                "No Clinicians have any days contracted to work in the practice?"),
+            _("Perhaps all future clinical time is already booked?"),
+            _(
+                "The BOOKEND value (last day to search for appointments) may simply need adjusting"),
+        ))
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+    localsettings.initiate()
+
+    dl = InitialCheckDialog()
+    if dl.has_issues:
+        dl.exec_()
+    for message in dl.critical_messages:
+        LOGGER.warning(message)
+    for message in dl.messages:
+        LOGGER.info(message)
diff --git a/src/openmolar/qt4gui/dialogs/login_dialog.py b/src/openmolar/qt4gui/dialogs/login_dialog.py
new file mode 100644
index 0000000..962e989
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/login_dialog.py
@@ -0,0 +1,307 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import hashlib
+import logging
+import os
+import sys
+from xml.dom import minidom
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.customwidgets.upper_case_line_edit import \
+    UpperCaseLineEdit
+
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AlternateServersWidget(QtGui.QWidget):
+    chosen = 0
+
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.radio_buttons = []
+        layout = QtGui.QVBoxLayout(self)
+        for i, server in enumerate(localsettings.server_names):
+            if i == 0:
+                server = "%s (%s)" % (server, _("Default"))
+            radio_button = (QtGui.QRadioButton(server, self))
+            radio_button.setChecked(i == 0)
+
+            self.radio_buttons.append(radio_button)
+            radio_button.toggled.connect(self.input)
+            layout.addWidget(radio_button)
+
+    @property
+    def has_options(self):
+        return self.radio_buttons != []
+
+    @property
+    def confirm_message(self):
+        return "%s <b>%s</b>< hr />%s" % (
+            _("You have selected to connect to"),
+            localsettings.server_names[self.chosen],
+            _("This is not the default database - "
+                "are you sure you wish to use this database?")
+        )
+
+    def input(self, bool_):
+        if not bool_:
+            return
+        self.chosen = self.radio_buttons.index(self.sender())
+        if self.chosen != 0:
+            if QtGui.QMessageBox.question(
+                self,
+                _("confirm"),
+                self.confirm_message,
+                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                    QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
+                self.radio_buttons[0].setChecked(True)
+        LOGGER.warning("chosen server = %s", self.chosen)
+
+
+class LoginDialog(ExtendableDialog):
+
+    sys_password = None
+    uninitiated = True
+    __is_developer_environment = None
+
+    def __init__(self, parent=None):
+        ExtendableDialog.__init__(self, parent)
+        self.setWindowTitle(_("Login Dialog"))
+
+        header_label = WarningLabel(_('Login Required'))
+
+        self.password_lineEdit = QtGui.QLineEdit()
+        self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
+        self.user1_lineEdit = UpperCaseLineEdit()
+        self.user1_lineEdit.setMaximumWidth(50)
+        self.user2_lineEdit = UpperCaseLineEdit()
+        self.user2_lineEdit.setMaximumWidth(50)
+
+        self.reception_radioButton = QtGui.QRadioButton(_("Reception Machine"))
+        self.surgery_radioButton = QtGui.QRadioButton(_("Surgery Machine"))
+        self.surgery_radioButton.setChecked(True)
+
+        frame = QtGui.QFrame()
+        form_layout = QtGui.QFormLayout(frame)
+
+        form_layout.addRow(_("System Password"), self.password_lineEdit)
+
+        form_layout.addRow(_("User 1 (Required)"), self.user1_lineEdit)
+        form_layout.addRow(_("User 2 (Optional)"), self.user2_lineEdit)
+
+        but_group = QtGui.QButtonGroup(self)
+        but_group.addButton(self.surgery_radioButton)
+        but_group.addButton(self.reception_radioButton)
+
+        self.insertWidget(header_label)
+        self.insertWidget(frame)
+        self.insertWidget(self.surgery_radioButton)
+        self.insertWidget(self.reception_radioButton)
+        self.enableApply()
+
+        # grab any stored information
+        PASSWORD, USER1, USER2 = localsettings.autologin()
+        self.password_lineEdit.setText(PASSWORD)
+        self.user1_lineEdit.setText(USER1)
+        self.user2_lineEdit.setText(USER2)
+        self.autoreception(QtCore.QString(USER1))
+        self.autoreception(QtCore.QString(USER2))
+
+        self.parse_conf_file()
+
+        self.alternate_servers_widget = AlternateServersWidget(self)
+        if self.alternate_servers_widget.has_options:
+            self.more_but.setText(_("Database choice"))
+            self.add_advanced_widget(self.alternate_servers_widget)
+        else:
+            self.more_but.hide()
+
+        self.user1_lineEdit.textEdited.connect(self.autoreception)
+        self.user2_lineEdit.textEdited.connect(self.autoreception)
+
+        self.dirty = True
+        self.set_check_on_cancel(True)
+
+        QtCore.QTimer.singleShot(0, self._developer_login)
+
+    def sizeHint(self):
+        return QtCore.QSize(350, 300)
+
+    def showEvent(self, event):
+        self.password_lineEdit.setFocus(True)
+
+    @property
+    def abandon_message(self):
+        return _("Are you sure you wish to cancel the login process?")
+
+    def parse_conf_file(self):
+        try:
+            dom = minidom.parse(localsettings.cflocation)
+            self.sys_password = dom.getElementsByTagName(
+                "system_password")[0].firstChild.data
+
+            servernames = dom.getElementsByTagName("connection")
+
+            for i, server in enumerate(servernames):
+                nameDict = server.attributes
+                try:
+                    localsettings.server_names.append(nameDict["name"].value)
+                except KeyError:
+                    localsettings.server_names.append("%d" % i + 1)
+
+        except IOError as e:
+            LOGGER.warning("still no settings file. quitting politely")
+            QtGui.QMessageBox.information(None, _("Unable to Run OpenMolar"),
+                                          _("Good Bye!"))
+
+            QtGui.QApplication.instance().closeAllWindows()
+            sys.exit("unable to run - openMolar couldn't find a settings file")
+
+    def autoreception(self, user):
+        '''
+        check to see if the user is special user "rec"
+        which implies a reception machine
+        '''
+        if user.toLower() == "rec":
+            self.reception_radioButton.setChecked(True)
+
+    @property
+    def _is_developer_environment(self):
+        if self.__is_developer_environment is None:
+            self.__is_developer_environment = False
+            try:
+                dev_path = os.path.join(
+                    localsettings.localFileDirectory, "dev_login.txt")
+                f = open(dev_path, "r")
+                data = f.read().strip("\n")
+                f.close()
+                if localsettings.hash_func(data) == \
+                        '1fd0c27f4d65caaa10ef5ef6a714faf96ed44fdd':
+                    LOGGER.warning("allowing developer login")
+                    self.__is_developer_environment = True
+                else:
+                    LOGGER.warning(
+                        "dev_login - file present, but with bad checksum")
+            except:
+                # fail quietly
+                pass
+        return self.__is_developer_environment
+
+    def _developer_login(self):
+        '''
+        convenience function for developer to login without password
+        '''
+        if self._is_developer_environment and not "--no-dev-login" in sys.argv:
+            self.accept()
+
+    @property
+    def password_ok(self):
+        LOGGER.info("checking password")
+        pword = "diqug_ADD_SALT_3i2some%s" % (
+            self.password_lineEdit.text().toAscii())
+        #-- hash the salted password (twice!) and compare to the value
+        #-- stored in /etc/openmolar/openmolar.conf (linux)
+        stored_password = hashlib.md5(
+            hashlib.sha1(pword).hexdigest()).hexdigest()
+
+        match = stored_password == self.sys_password
+        return match
+
+    @property
+    def user1(self):
+        return str(self.user1_lineEdit.text().toAscii())
+
+    @property
+    def user1_ok(self):
+        return self.user1 in localsettings.allowed_logins
+
+    @property
+    def user2(self):
+        return str(self.user2_lineEdit.text().toAscii())
+
+    @property
+    def user2_ok(self):
+        return self.user2 == "" or self.user2 in localsettings.allowed_logins
+
+    @property
+    def login_ok(self):
+        return self.user1_ok and self.user2_ok and (
+            self._is_developer_environment or self.password_ok)
+
+    @property
+    def chosen_server(self):
+        return self.alternate_servers_widget.chosen
+
+    def db_check(self):
+        LOGGER.debug("performing db_check")
+        changedServer = localsettings.chosenserver != self.chosen_server
+        localsettings.setChosenServer(self.chosen_server)
+
+        if self.uninitiated or changedServer:
+            #- user has entered the correct password
+            #- so now we connect to the mysql database
+            #- for the 1st time
+            #- I do it this way so that anyone sniffing the network
+            #- won't see the mysql password until this point
+            #- this could and should possibly still be improved upon
+            #- maybe by using an ssl connection to the server.
+            localsettings.initiateUsers(changedServer)
+            self.uninitiated = False
+
+    def exec_(self):
+        while ExtendableDialog.exec_(self):
+            self.db_check()
+            if self.login_ok:
+                if self.reception_radioButton.isChecked():
+                    localsettings.station = "reception"
+                localsettings.setOperator(self.user1, self.user2)
+                self.accept()
+                return True
+            else:
+                # LOGGER.debug("passwords ok %s", self.password_ok)
+                # LOGGER.debug("user1 ok %s", self.user1_ok)
+                # LOGGER.debug("user2 ok %s", self.user2_ok)
+                QtGui.QMessageBox.warning(
+                    self.parent(),
+                    _("Login Error"),
+                    u'<h2>%s %s</h2><em>%s</em>' % (
+                        _('Incorrect'),
+                        _("User/password combination!"),
+                        _('Please Try Again.')
+                    )
+                )
+        return False
+
+if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    app = QtGui.QApplication([])
+
+    dl = LoginDialog()
+    print dl.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/newBPE.py b/src/openmolar/qt4gui/dialogs/newBPE.py
index 2b90648..00b914f 100644
--- a/src/openmolar/qt4gui/dialogs/newBPE.py
+++ b/src/openmolar/qt4gui/dialogs/newBPE.py
@@ -49,9 +49,13 @@ class BPE_Dialog(QtGui.QDialog, Ui_newBPE.Ui_Dialog):
     def getBPE(self):  # this could be simplified!!!!
         retarg = ""
         for i in (
-            self.bpe_comboBox.currentText(), self.bpe2_comboBox.currentText(),
-            self.bpe3_comboBox.currentText(), self.bpe4_comboBox.currentText(),
-                self.bpe5_comboBox.currentText(), self.bpe6_comboBox.currentText()):
+            self.bpe_comboBox.currentText(),
+            self.bpe2_comboBox.currentText(),
+            self.bpe3_comboBox.currentText(),
+            self.bpe4_comboBox.currentText(),
+            self.bpe5_comboBox.currentText(),
+            self.bpe6_comboBox.currentText()
+            ):
             val = str(i)
             if val == "":
                 val = "_"
@@ -59,11 +63,6 @@ class BPE_Dialog(QtGui.QDialog, Ui_newBPE.Ui_Dialog):
         return retarg  # a 6 character string.
 
 if __name__ == "__main__":
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    ui = BPE_Dialog()
-    print str(ui.getInput())
-    # if Dialog.exec_():
-    #        print "accepted"
-    # else:
-    #        print "rejected"
+    app = QtGui.QApplication([])
+    dl = BPE_Dialog()
+    print dl.getInput()
diff --git a/src/openmolar/qt4gui/dialogs/new_denture_dialog.py b/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
index 16be470..ed462a0 100644
--- a/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
@@ -47,6 +47,7 @@ VALID_INPUTS = (
 
 
 class _OptionPage(QtGui.QWidget):
+    finished_signal = QtCore.pyqtSignal()
 
     def __init__(self, parent=None):
         QtGui.QWidget.__init__(self, parent)
@@ -130,27 +131,56 @@ class PageZero(_OptionPage):
 
     def __init__(self, parent=None):
         _OptionPage.__init__(self, parent)
-        self.upper_radioButton = QtGui.QRadioButton(_("Upper Denture"))
-        self.lower_radioButton = QtGui.QRadioButton(_("Lower Denture"))
-
-        layout = QtGui.QVBoxLayout(self.frame)
-        layout.addWidget(self.upper_radioButton)
-        layout.addWidget(self.lower_radioButton)
+        self._is_completed = False
+        self._chosen_arch = "upper"
+        self._return_text = ""
+
+        upper_but = QtGui.QPushButton(_("New UPPER Denture"))
+        upper_but.setMinimumSize(QtCore.QSize(150, 150))
+        lower_but = QtGui.QPushButton(_("New LOWER Denture"))
+        lower_but.setMinimumSize(QtCore.QSize(150, 150))
+        full_fulls_but = QtGui.QPushButton(
+            _("Complete Upper AND Lower Acrylic Dentures"))
+        full_fulls_but.setMinimumSize(QtCore.QSize(150, 150))
+
+        layout = QtGui.QGridLayout(self.frame)
+        layout.addWidget(upper_but, 0, 0)
+        layout.addWidget(lower_but, 0, 1)
+        layout.addWidget(full_fulls_but, 1, 0, 1, 2)
+
+        upper_but.clicked.connect(self._finished)
+        lower_but.clicked.connect(self._lower)
+        full_fulls_but.clicked.connect(self._full_fulls)
 
     @property
     def is_completed(self):
-        return (self.upper_radioButton.isChecked() or
-                self.lower_radioButton.isChecked())
+        return self._is_completed
 
     @property
     def return_text(self):
-        return ""
+        return self._return_text
 
     @property
     def chosen_arch(self):
-        if self.upper_radioButton.isChecked():
-            return "upper"
-        return "lower"
+        return self._chosen_arch
+
+    def _finished(self):
+        self._is_completed = True
+        self.finished_signal.emit()
+
+    def _lower(self):
+        self._chosen_arch = "lower"
+        self._finished()
+
+    @property
+    def next_index(self):
+        if self._return_text == "SR_F/F":
+            return 4
+        return 1
+
+    def _full_fulls(self):
+        self._return_text = "SR_F/F"
+        self._finished()
 
 
 class PageOne(_OptionPage):
@@ -167,6 +197,12 @@ class PageOne(_OptionPage):
         layout.addWidget(self.flexible_radioButton)
 
     @property
+    def is_completed(self):
+        return (self.acrylic_radioButton.isChecked() or
+                self.metal_radioButton.isChecked() or
+                self.flexible_radioButton.isChecked())
+
+    @property
     def return_text(self):
         if self.acrylic_radioButton.isChecked():
             return "SR_"
@@ -181,8 +217,8 @@ class PageThree(_OptionPage):
     def __init__(self, parent=None):
         _OptionPage.__init__(self, parent)
         self.dl = parent
-        self.label.setText(_(
-                           "Please select teeth which this denture is to replace"))
+        self.label.setText(
+            _("Please select teeth which this denture is to replace"))
         self.chartwidg = SimpleChartWidg(self, auto_ctrl_key=True)
         layout = QtGui.QVBoxLayout(self.frame)
         layout.addWidget(self.chartwidg)
@@ -223,8 +259,8 @@ class PageFour(_OptionPage):
 
     def __init__(self, parent=None):
         _OptionPage.__init__(self, parent)
-        self.label.setText(_(
-                           "You may wish to add the following optional items"))
+        self.label.setText(
+            _("You may wish to add the following optional items"))
 
         self.st_checkBox = QtGui.QCheckBox(_("Special Tray"))
         self.sl_checkBox = QtGui.QCheckBox(_("Soft Lining"))
@@ -244,7 +280,7 @@ class PageFour(_OptionPage):
 
     @property
     def return_text(self):
-        if self.dialog.ndu_le.text() != "":
+        if self.dialog.default_lineedit.text() != "":
             return self._additional_text
         return ""
 
@@ -278,6 +314,7 @@ class NewDentureDialog(ExtendableDialog):
         self.wizard_widget = QtGui.QStackedWidget()
 
         page0 = PageZero(self)
+        page0.finished_signal.connect(self.next_widget)
         page1 = PageOne(self)
         page2 = PageTwo(self)
         page3 = PageThree(self)
@@ -334,6 +371,11 @@ class NewDentureDialog(ExtendableDialog):
 
         self.current_page.cleanup()
 
+        if self.current_index == 4:
+            if "F/F" in self.upper_input:
+                le = self.ndl_le
+                le.setText(le.text() + self.current_page.return_text)
+
         index_ = self.current_index + self.current_page.next_index
         if index_ >= self.wizard_widget.count() - 1:
             self.apply_but.show()
@@ -374,8 +416,10 @@ class NewDentureDialog(ExtendableDialog):
                 if re.match(input_, ndu):
                     matched = True
             if not matched:
-                QtGui.QMessageBox.warning(self, _("Warning"),
-                                          _("Your upper denture input is invalid"))
+                QtGui.QMessageBox.warning(
+                    self,
+                    _("Warning"),
+                    _("Your upper denture input is invalid"))
                 return False
         for ndl in ndls.split(" "):
             LOGGER.debug("checking '%s'" % ndl)
@@ -384,8 +428,10 @@ class NewDentureDialog(ExtendableDialog):
                 if re.match(input_, ndl):
                     matched = True
             if not matched:
-                QtGui.QMessageBox.warning(self, _("Warning"),
-                                          _("Your lower denture input is invalid"))
+                QtGui.QMessageBox.warning(
+                    self,
+                    ("Warning"),
+                    _("Your lower denture input is invalid"))
                 return False
         return True
 
diff --git a/src/openmolar/qt4gui/dialogs/permissions.py b/src/openmolar/qt4gui/dialogs/permissions.py
index 45b8311..52c9c05 100644
--- a/src/openmolar/qt4gui/dialogs/permissions.py
+++ b/src/openmolar/qt4gui/dialogs/permissions.py
@@ -22,12 +22,102 @@
 # #                                                                          # #
 # ############################################################################ #
 
-from PyQt4 import QtGui, QtCore
 import datetime
 import hashlib
+import logging
+
+from PyQt4 import QtGui, QtCore
 
 from openmolar.settings import localsettings
-from openmolar.qt4gui.compiled_uis import Ui_permissions
+from openmolar.dbtools import db_settings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+def _hashed_input(input_):
+    salted_input = "%s%s" % (input_, localsettings.SALT)
+    return hashlib.sha1(salted_input).hexdigest()
+
+
+class RaisePermissionsDialog(BaseDialog):
+
+    def __init__(self, parent=None):
+        BaseDialog.__init__(self, parent)
+        self.setWindowTitle(_("Raise Permissions Dialog"))
+        label = WarningLabel("%s<hr />%s" % (
+            _("Supervisor privileges required to perform this action"),
+            _("Please enter the supervisor password"))
+        )
+
+        frame = QtGui.QFrame()
+        self.form_layout = QtGui.QFormLayout(frame)
+        self.line_edit = QtGui.QLineEdit()
+        self.line_edit.setEchoMode(QtGui.QLineEdit.Password)
+        self.form_layout.addRow(_("Supervisor Password"), self.line_edit)
+
+        self.insertWidget(label)
+        self.insertWidget(frame)
+        self.enableApply()
+        self.line_edit.setFocus(True)
+
+    @property
+    def correct_password(self):
+        return _hashed_input(self.line_edit.text().toAscii()) == \
+            localsettings.SUPERVISOR
+
+    def exec_(self):
+        if not BaseDialog.exec_(self):
+            return False
+        if self.correct_password:
+            localsettings.permissionsRaised = True
+            resetExpireTime()
+            return True
+        else:
+            QtGui.QMessageBox.information(self,
+                                          _("whoops"),
+                                          _("incorrect supervisor password")
+                                          )
+        return False
+
+
+class ResetSupervisorPasswordDialog(RaisePermissionsDialog):
+
+    def __init__(self, parent=None):
+        RaisePermissionsDialog.__init__(self, parent)
+
+        self.new_password_line_edit = QtGui.QLineEdit()
+        self.confirm_password_line_edit = QtGui.QLineEdit()
+
+        self.new_password_line_edit.setEchoMode(QtGui.QLineEdit.Password)
+        self.confirm_password_line_edit.setEchoMode(QtGui.QLineEdit.Password)
+
+        self.form_layout.addRow(_("New Password"), self.new_password_line_edit)
+        self.form_layout.addRow(_("Confirm New Password"),
+                                self.confirm_password_line_edit)
+
+    @property
+    def _new_password(self):
+        return self.new_password_line_edit.text().toAscii()
+
+    def passwords_match(self):
+        if self._new_password == \
+                self.confirm_password_line_edit.text().toAscii():
+            return True
+        QtGui.QMessageBox.warning(self, _("error"),
+                                  _("new passwords didn't match"))
+
+    def exec_(self):
+        if RaisePermissionsDialog.exec_(self) and self.passwords_match():
+            localsettings.SUPERVISOR = _hashed_input(self._new_password)
+            db_settings.updateData("supervisor_pword",
+                                   localsettings.SUPERVISOR,
+                                   localsettings.operator)
+            message = _("password changed successfully")
+        else:
+            message = _("Password unchanged")
+        QtGui.QMessageBox.information(self, _("information"), message)
 
 
 def granted(parent=None):
@@ -38,18 +128,8 @@ def granted(parent=None):
         else:
             localsettings.permissionsRaised = False
 
-    Dialog = QtGui.QDialog(parent)
-    dl = Ui_permissions.Ui_Dialog()
-    dl.setupUi(Dialog)
-    if Dialog.exec_():
-        hash = hashlib.sha1(str((dl.lineEdit.text().toAscii()))).hexdigest()
-        if hash == localsettings.SUPERVISOR:
-            localsettings.permissionsRaised = True
-            resetExpireTime()
-            return True
-        else:
-            QtGui.QMessageBox.information(parent, "whoops", "wrong password")
-    return False
+    dl = RaisePermissionsDialog(parent)
+    return dl.exec_()
 
 
 def resetExpireTime():
@@ -60,4 +140,6 @@ if __name__ == "__main__":
     import sys
     app = QtGui.QApplication(sys.argv)
     print granted()
+    dl = ResetSupervisorPasswordDialog()
+    dl.exec_()
     sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/dialogs/denture_dialog.py b/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
similarity index 52%
copy from src/openmolar/qt4gui/dialogs/denture_dialog.py
copy to src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
index 7012189..ff0e152 100644
--- a/src/openmolar/qt4gui/dialogs/denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
@@ -25,72 +25,65 @@
 import logging
 
 from PyQt4 import QtGui, QtCore
-
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
 from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
-from openmolar.qt4gui.dialogs.alter_denture_dialog import AlterDentureDialog
-from openmolar.qt4gui.dialogs.new_denture_dialog import NewDentureDialog
 
 LOGGER = logging.getLogger("openmolar")
 
 
-class DentureDialog(BaseDialog):
-    chosen_treatments = []
+class RecallPromptDialog(BaseDialog):
+    APPLY = 0
+    IGNORE = 1
+    CANCEL = 2
+    result = APPLY
+
+    def __init__(self, pt, parent=None):
+        BaseDialog.__init__(self, parent)
+        self.setWindowTitle(_("Recall Prompt Dialog"))
 
-    def __init__(self, om_gui=None):
-        BaseDialog.__init__(self, om_gui)
+        pt_details = "<b>%s %s %s</b>" % (pt.title, pt.fname, pt.sname)
+        self.patient_label = QtGui.QLabel(pt_details)
+        self.patient_label.setAlignment(QtCore.Qt.AlignCenter)
 
-        self.om_gui = om_gui
-        message = _("Denture Treatment Dialog")
-        self.setWindowTitle(message)
-        self.header_label = QtGui.QLabel(message)
-        self.header_label.setAlignment(QtCore.Qt.AlignCenter)
+        message = _("There is a problem with the recall date of this patient.")
+        action = _("Would you like to fix this now?")
 
-        frame = QtGui.QFrame()
-        layout = QtGui.QHBoxLayout(frame)
+        self.warning_label = WarningLabel("%s<hr />%s" % (message, action))
 
-        new_but = QtGui.QPushButton(_("Plan a New Denture"))
-        new_but.setMinimumSize(QtCore.QSize(150, 150))
-        alt_but = QtGui.QPushButton(_("Alter an Existing Denture"))
-        alt_but.setMinimumSize(QtCore.QSize(150, 150))
+        self.apply_but.setText(_("Fix"))
 
-        layout.addWidget(new_but)
-        layout.addWidget(alt_but)
+        self.ignore_but = self.button_box.addButton(
+            QtGui.QDialogButtonBox.Discard)
+        self.ignore_but.setText(_("Ignore Recall Date"))
+        self.ignore_but.setToolTip(_("Ignore this for now."))
 
-        self.insertWidget(self.header_label)
-        self.insertWidget(frame)
+        self.cancel_but.setToolTip(_("Cancel and Continue Editing"))
 
-        self.apply_but.hide()
+        self.insertWidget(self.patient_label)
+        self.insertWidget(self.warning_label)
 
-        new_but.clicked.connect(self.new_denture)
-        alt_but.clicked.connect(self.alt_denture)
+        self.enableApply()
 
     def sizeHint(self):
-        return QtCore.QSize(400, 400)
+        return QtCore.QSize(400, 200)
 
-    def new_denture(self):
-        self.hide()
-        chosen_dialog = NewDentureDialog(self)
-        if chosen_dialog.exec_():
-            self.chosen_treatments = list(chosen_dialog.chosen_treatments)
-            self.accept()
-        else:
-            self.reject()
-
-    def alt_denture(self):
-        self.hide()
-        chosen_dialog = AlterDentureDialog(self)
-        if chosen_dialog.exec_():
-            self.chosen_treatments = list(chosen_dialog.chosen_treatments)
+    def _clicked(self, but):
+        if but == self.ignore_but:
+            self.result = self.IGNORE
             self.accept()
-        else:
-            self.reject()
+            return
+        BaseDialog._clicked(self, but)
 
-if __name__ == "__main__":
+    def reject(self):
+        self.result = self.CANCEL
+        BaseDialog.reject(self)
 
-    app = QtGui.QApplication([])
+if __name__ == "__main__":
     LOGGER.setLevel(logging.DEBUG)
-    dl = DentureDialog(None)
-    if dl.exec_():
-        print dl.chosen_treatments
-    else:
-        print "dialog rejected"
+    app = QtGui.QApplication([])
+    from openmolar.dbtools.patient_class import patient
+
+    dl = RecallPromptDialog(patient(11932))
+
+    dl.exec_()
+    print dl.result
diff --git a/src/openmolar/qt4gui/dialogs/save_discard_cancel.py b/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
index fabfc1f..77dd763 100644
--- a/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
+++ b/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
@@ -24,6 +24,7 @@
 
 from PyQt4 import QtCore, QtGui
 
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
 from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
 
 
@@ -44,8 +45,7 @@ class SaveDiscardCancelDialog(ExtendableDialog):
         self.enableApply()
         self.save_on_exit = True
 
-        label = QtGui.QLabel(message)
-        label.setAlignment(QtCore.Qt.AlignCenter)
+        label = WarningLabel(message)
         self.insertWidget(label)
 
         self.discard_but = self.button_box.addButton(
@@ -70,11 +70,12 @@ class SaveDiscardCancelDialog(ExtendableDialog):
         ExtendableDialog._clicked(self, but)
 
     def discard(self):
-        if QtGui.QMessageBox.question(self, _("Confirm"),
-                                      _(
-                                      "Are you sure you want to discard these changes?"),
-                                      QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                      QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+        if QtGui.QMessageBox.question(
+            self,
+            _("Confirm"),
+            _("Are you sure you want to discard these changes?"),
+            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
             self.result = self.DISCARD
             self.accept()
 
diff --git a/src/openmolar/qt4gui/diary_widget.py b/src/openmolar/qt4gui/diary_widget.py
index 418d3c0..9fa17a7 100644
--- a/src/openmolar/qt4gui/diary_widget.py
+++ b/src/openmolar/qt4gui/diary_widget.py
@@ -41,13 +41,15 @@ from openmolar.qt4gui.dialogs import permissions
 from openmolar.qt4gui.dialogs import choose_clinicians
 from openmolar.qt4gui.dialogs.find_patient_dialog import FinalChoiceDialog
 from openmolar.qt4gui.dialogs import begin_make_appt_dialog
+from openmolar.qt4gui.dialogs.appointments_insert_blocks_dialog \
+    import InsertBlocksDialog
+from openmolar.qt4gui.dialogs.appointments_memo_dialog \
+    import AppointmentsMemoDialog
 
 from openmolar.qt4gui.customwidgets import appointmentwidget
 
 from openmolar.qt4gui.printing import om_printing
 
-from openmolar.qt4gui.tools import apptTools
-
 from openmolar.qt4gui.compiled_uis import Ui_diary_widget
 
 from openmolar.qt4gui.customwidgets.schedule_control \
@@ -55,7 +57,6 @@ from openmolar.qt4gui.customwidgets.schedule_control \
 from openmolar.qt4gui.customwidgets.diary_view_controller \
     import DiaryViewController
 
-
 from openmolar.qt4gui.customwidgets.appointment_overviewwidget \
     import AppointmentOverviewWidget
 
@@ -88,6 +89,7 @@ class DiaryWidget(QtGui.QWidget):
     alterAday_clipboard_date = None
 
     message_alert = None
+    laid_out = False
 
     def __init__(self, parent=None):
         QtGui.QWidget.__init__(self, parent)
@@ -114,25 +116,31 @@ class DiaryWidget(QtGui.QWidget):
         #-appointment OVerview widget
         self.ui.apptoverviews = []
 
-        for day in range(7):
+        for frame in (self.ui.appt_OV_Frame1,
+                      self.ui.appt_OV_Frame2,
+                      self.ui.appt_OV_Frame3,
+                      self.ui.appt_OV_Frame4,
+                      self.ui.appt_OV_Frame5,
+                      self.ui.appt_OV_Frame6,
+                      self.ui.appt_OV_Frame7
+                      ):
             bw = AppointmentOverviewWidget("0820", "1910", 10, 3, self)
             self.ui.apptoverviews.append(bw)
 
-        i = 0
-        for frame in (self.ui.appt_OV_Frame1,
-                      self.ui.appt_OV_Frame2, self.ui.appt_OV_Frame3,
-                      self.ui.appt_OV_Frame4, self.ui.appt_OV_Frame5,
-                      self.ui.appt_OV_Frame6, self.ui.appt_OV_Frame7):
             hlayout = QtGui.QHBoxLayout(frame)
             hlayout.setMargin(2)
-            hlayout.addWidget(self.ui.apptoverviews[i])
-            i += 1
+            hlayout.addWidget(bw)
 
         self.ui.apptoverviewControls = []
 
-        for widg in (self.ui.day1_frame, self.ui.day2_frame,
-                     self.ui.day3_frame, self.ui.day4_frame, self.ui.day5_frame,
-                     self.ui.day6_frame, self.ui.day7_frame):
+        for widg in (self.ui.day1_frame,
+                     self.ui.day2_frame,
+                     self.ui.day3_frame,
+                     self.ui.day4_frame,
+                     self.ui.day5_frame,
+                     self.ui.day6_frame,
+                     self.ui.day7_frame
+                     ):
             hlayout = QtGui.QHBoxLayout(widg)
             hlayout.setMargin(0)
             control = aptOVcontrol.control()
@@ -141,11 +149,8 @@ class DiaryWidget(QtGui.QWidget):
 
         self.ui.weekView_splitter.setSizes([600, 10])
 
-        self.appt_clinician_selector = dent_hyg_selector.dentHygSelector(
-            localsettings.activedents, localsettings.activehygs)
-
-        self.monthClinicianSelector = dent_hyg_selector.dentHygSelector(
-            localsettings.activedents, localsettings.activehygs)
+        self.appt_clinician_selector = dent_hyg_selector.dentHygSelector()
+        self.monthClinicianSelector = dent_hyg_selector.dentHygSelector()
 
         #--customise the appointment widget calendar
         self.ui.dayCalendar = calendars.controlCalendar()
@@ -181,9 +186,18 @@ class DiaryWidget(QtGui.QWidget):
         self.ticker.start(30000)  # fire every 30 seconds
         self.ticker.timeout.connect(self.triangles)
 
+    def initiate(self):
+        LOGGER.debug("initialising diary clinicians")
+        for selector in (self.appt_clinician_selector,
+                         self.monthClinicianSelector):
+            selector.set_dents(localsettings.activedents)
+            selector.set_hygs(localsettings.activehygs)
+
     def showEvent(self, event):
-        LOGGER.debug("DiaryWidget.showEvent called")
-        # QtCore.QTimer.singleShot(10, self.layout_diary)
+        LOGGER.debug("ShowEvent called laid_out = %s", self.laid_out)
+        if not self.laid_out:
+            self.initiate()
+            QtCore.QTimer.singleShot(10, self.layout_diary)
 
     def advise(self, arg, warning_level=0):
         '''
@@ -457,9 +471,9 @@ class DiaryWidget(QtGui.QWidget):
 
         seldate = self.selected_date()
 
-        if seldate.toPyDate() > localsettings.bookEnd:
+        if seldate.toPyDate() > localsettings.BOOKEND:
             message = (_("Reached") +
-                       ' %s <br />' % localsettings.longDate(localsettings.bookEnd) +
+                       ' %s <br />' % localsettings.longDate(localsettings.BOOKEND) +
                        _("which is specified as the book end point"))
             return (False, message, ())
 
@@ -630,11 +644,10 @@ class DiaryWidget(QtGui.QWidget):
     def apptOVheaderclick(self, arg):
         '''
         a click on the dentist portion of the appointment overview widget
+        current implementation has little value!
         '''
-
-        # TODO should I abandon this?
         apptix, adate = arg
-        self.advise("week header clicked %s %s" % (apptix, adate), 1)
+        LOGGER.debug("week header clicked apptix=%s date=%s", apptix, adate)
 
     def offer_appointment_card(self):
         result = QtGui.QMessageBox.question(self,
@@ -732,22 +745,6 @@ class DiaryWidget(QtGui.QWidget):
             self.advise("Cleared %d emergency slots" % number_cleared, 1)
             self.layout_diary()
 
-    def updateDayMemos(self, memos):
-        '''
-        user has added some memos
-        '''
-        d = self.selected_date().toPyDate()
-        appointments.setMemos(d, memos)
-        self.layout_diary()
-
-    def addpubHol(self, details):
-        '''
-        user has update/added a pub holiday
-        '''
-        d = self.selected_date().toPyDate()
-        appointments.setPubHol(d, details)
-        self.layout_diary()
-
     def add_appointmentwidget(self):
         LOGGER.debug("initiating a new AppointmentWidget")
         book = appointmentwidget.AppointmentWidget(
@@ -784,6 +781,7 @@ class DiaryWidget(QtGui.QWidget):
         OR a memo has been added
         '''
         LOGGER.debug("DiaryWidget.layout_diary")
+        self.laid_out = True
 
         date_ = self.selected_date()
         self.ui.weekCalendar.setSelectedDate(date_)
@@ -813,7 +811,7 @@ class DiaryWidget(QtGui.QWidget):
             self.layout_agenda()
 
         if self.appt_mode == self.SCHEDULING_MODE:
-            if date_ > localsettings.bookEnd:
+            if date_ > localsettings.BOOKEND:
                 self.advise(u'''<b>%s<br />%s %s</b><hr /><em>(%s)</em>
                 <ul><li>%s</li><li>%s</li><li>%s</li></ul>''' % (
                             _("This date is beyond the diary limit."),
@@ -977,7 +975,7 @@ class DiaryWidget(QtGui.QWidget):
                 self.finding_next_slot = 0
                 # self.set_date(localsettings.currentDay())
                 # return
-            if date_ > localsettings.bookEnd:
+            if date_ > localsettings.BOOKEND:
                 # self.advise(_("You are beyond scheduling range"),1)
                 self.finding_next_slot = 0
                 available_slots = []
@@ -1092,7 +1090,7 @@ class DiaryWidget(QtGui.QWidget):
 
         if self.appt_mode == self.SCHEDULING_MODE:
             if (date_ < localsettings.currentDay() or
-               date_ > localsettings.bookEnd):
+               date_ > localsettings.BOOKEND):
                 self.finding_next_slot = 0
                 available_slots = []
                 self.schedule_controller.set_available_slots([])
@@ -1330,7 +1328,7 @@ class DiaryWidget(QtGui.QWidget):
         returns a list
         '''
         retlist = []
-        for dent in self.monthClinicianSelector.getSelectedClinicians():
+        for dent in self.monthClinicianSelector.selectedClinicians:
             retlist.append(localsettings.apptix.get(dent))
         return tuple(retlist)
 
@@ -1350,17 +1348,20 @@ class DiaryWidget(QtGui.QWidget):
     def edit_appointment_memo_clicked(self, list_of_snos, start, dentist):
         if len(list_of_snos) != 1:
             self.advise(
-                "multiple appointments selected, unable to edit memo", 2)
+                _("multiple appointments selected, unable to edit memo"), 2)
             return
         sno = list_of_snos[0]
         adate = self.selected_date().toPyDate()
         atime = int(start.replace(":", ""))
         note, result = appointments.get_appt_note(sno, adate, atime, dentist)
         if not result:
-            self.advise("unable to locate appointment memo, sorry", 2)
+            self.advise(_("unable to locate appointment memo, sorry"), 2)
         else:
-            new_note, result = QtGui.QInputDialog.getText(self,
-                                                          "New Memo", "Please enter Memo for this appointment", text=note)
+            new_note, result = QtGui.QInputDialog.getText(
+                self,
+                _("New Memo"),
+                _("Please enter Memo for this appointment"),
+                text=note)
             if result and new_note != note:
                 appointments.set_appt_note(
                     sno, adate, atime, dentist, new_note)
@@ -1403,14 +1404,16 @@ class DiaryWidget(QtGui.QWidget):
 
                 #--keep in the patient's diary?
 
-                if QtGui.QMessageBox.question(self, _("Question"),
-                                              _(
-                                              "Removed from appointment book - keep for rescheduling?"),
-                                              QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                              QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
+                if QtGui.QMessageBox.question(
+                    self,
+                    _("Question"),
+                    _("Removed from appointment book - "
+                      "keep for rescheduling?"),
+                    QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                        QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
                     # remove from the patients diary
                     if appointments.delete_appt_from_apr(appt):
-                        self.advise(_("Sucessfully removed appointment"))
+                        self.advise(_("Successfully removed appointment"))
                         self.schedule_controller.get_data()
                     else:
                         self.advise(_("Error removing from patient diary"), 2)
@@ -1436,9 +1439,12 @@ class DiaryWidget(QtGui.QWidget):
         message += "%s<br />" % localsettings.readableDate(adate)
         message += "with %s?" % localsettings.ops.get(arg[2])
 
-        if QtGui.QMessageBox.question(self, "Confirm", message,
-                                      QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                      QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+        if QtGui.QMessageBox.question(
+                self,
+                _("Confirm"),
+                message,
+            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
             appt = appointments.APR_Appointment()
             appt.atime = localsettings.humanTimetoWystime(arg[0])
             appt.date = adate
@@ -1460,7 +1466,8 @@ class DiaryWidget(QtGui.QWidget):
         if not appointments.block_appt(adate, dent, start, end,
                                        adjstart, adjend, reason):
             self.advise(
-                _("unable to block - has the book been altered elsewhere?"), 1)
+                _("unable to block - "
+                  "has the book been altered elsewhere?"), 1)
         self.layout_dayView()
 
     def fillEmptySlot(self, tup):
@@ -1478,8 +1485,8 @@ class DiaryWidget(QtGui.QWidget):
         if not appointments.fill_appt(adate, dent, start, end,
                                       adjstart, adjend, reason, pt):
             self.advise(
-                _(
-                    "unable to make appointment - has the book been altered elsewhere?"), 1)
+                _("unable to make appointment - "
+                  "has the book been altered elsewhere?"), 1)
         self.layout_dayView()
 
         self.pt_diary_changed.emit(pt.serialno)
@@ -1526,15 +1533,13 @@ class DiaryWidget(QtGui.QWidget):
             if dl.getInput():
                 self.layout_weekView()
 
-    def appointmentTools(self):
+    def insert_regular_blocks(self):
         '''
-        called from the main menu
-        this just invokes a dialog which has a choice of options
+        insert blocks and appointments
         '''
-        if permissions.granted(self):
-            self.appointmentToolsWindow = QtGui.QMainWindow(self)
-            self.ui2 = apptTools.apptTools(self.appointmentToolsWindow)
-            self.appointmentToolsWindow.show()
+        dl = InsertBlocksDialog()
+        if dl.exec_():
+            dl.apply()
 
     def diary_tabWidget_nav(self, i):
         '''
@@ -1620,6 +1625,29 @@ class DiaryWidget(QtGui.QWidget):
         '''
         return self.ui.diary_tabWidget.currentIndex() == 4
 
+    def memo_dialog(self, date_):
+        dl = AppointmentsMemoDialog(date_, self)
+        if dl.exec_():
+            dl.apply()
+            self.layout_diary()
+
+    def edit_public_hol(self, date_):
+        '''
+        enter/modify the stored public holiday field
+        '''
+        LOGGER.debug("edit pub hol for %s", date_)
+        current = appointments.getBankHol(date_)
+        new, result = QtGui.QInputDialog.getText(
+            self,
+            _("Public Holidays"),
+            _("Enter the information for ") + localsettings.longDate(date_),
+            QtGui.QLineEdit.Normal,
+            current)
+        new_value = unicode(new.toUtf8())
+        if result and current != new_value:
+            appointments.setPubHol(date_, new_value)
+            self.layout_diary()
+
     def init_signals(self):
         self.ui.diary_tabWidget.currentChanged.connect(
             self.diary_tabWidget_nav)
@@ -1704,16 +1732,14 @@ class DiaryWidget(QtGui.QWidget):
         self.signals_calendar()
 
         QtCore.QObject.connect(self.ui.weekCalendar,
-                               QtCore.SIGNAL("weekChanged"), self.ui.dayCalendar.setSelectedDate)
+                               QtCore.SIGNAL("weekChanged"),
+                               self.ui.dayCalendar.setSelectedDate)
 
         for cal in (self.ui.yearView, self.ui.monthView):
-            QtCore.QObject.connect(cal, QtCore.SIGNAL("selectedDate"),
-                                   self.ui.dayCalendar.setSelectedDate)
-            QtCore.QObject.connect(cal, QtCore.SIGNAL("add_memo"),
-                                   self.updateDayMemos)
-
-        QtCore.QObject.connect(self.ui.yearView,
-                               QtCore.SIGNAL("add_pub_hol"), self.addpubHol)
+            cal.selected_date_signal.connect(
+                self.ui.dayCalendar.setSelectedDate)
+            cal.memo_dialog_signal.connect(self.memo_dialog)
+            cal.public_holiday_signal.connect(self.edit_public_hol)
 
         self.ui.aptOVprevmonth.clicked.connect(self.aptOV_monthBack)
         self.ui.aptOVnextmonth.clicked.connect(self.aptOV_monthForward)
@@ -1739,11 +1765,9 @@ class DiaryWidget(QtGui.QWidget):
                          self.apptOVheaderclick)
 
         for control in self.ui.apptoverviewControls:
-            self.connect(control,
-                         QtCore.SIGNAL("clicked"), self.aptOVlabelClicked)
-
-            self.connect(control,
-                         QtCore.SIGNAL("right-clicked"), self.aptOVlabelRightClicked)
+            control.dayview_signal.connect(self.aptOVlabelClicked)
+            control.edit_hours_signal.connect(self.aptOVlabelRightClicked)
+            control.edit_memo_signal.connect(self.memo_dialog)
 
 
 class _testDiary(QtGui.QMainWindow):
@@ -1752,23 +1776,31 @@ class _testDiary(QtGui.QMainWindow):
         QtGui.QMainWindow.__init__(self, parent)
 
         dw = DiaryWidget()
-
+        dw.initiate()
         dw.patient_card_request.connect(self.sig_catcher)
 
         from openmolar.dbtools import patient_class
-        pt = patient_class.patient(20862)
+        pt = patient_class.patient(1)
         dw.schedule_controller.set_patient(pt)
 
         self.setCentralWidget(dw)
 
+        action1 = QtGui.QAction("clear emergency slots", self)
+        action1.triggered.connect(dw.clearTodaysEmergencyTime)
+
+        action2 = QtGui.QAction("insert regular blocks", self)
+        action2.triggered.connect(dw.insert_regular_blocks)
+
+        self.menuBar().addAction(action1)
+        self.menuBar().addAction(action2)
+
     def sig_catcher(self, *args):
         print "signal caught", args
 
 if __name__ == "__main__":
+    LOGGER.setLevel(logging.DEBUG)
+    import gettext
     import gettext
-    import sys
-
-    sys.argv.append("-v")
     gettext.install("openmolar")
 
     localsettings.initiate()
diff --git a/src/openmolar/qt4gui/fees/course_module.py b/src/openmolar/qt4gui/fees/course_module.py
index 266ca9a..d3416b7 100644
--- a/src/openmolar/qt4gui/fees/course_module.py
+++ b/src/openmolar/qt4gui/fees/course_module.py
@@ -25,15 +25,18 @@
 '''
 functions to open a course, close a course, or check if one is needed.
 '''
+import datetime
 import logging
 
 from PyQt4 import QtGui, QtCore
 
 from openmolar.settings import localsettings
 from openmolar.dbtools import writeNewCourse
-from openmolar.qt4gui.dialogs import newCourse
+from openmolar.qt4gui.dialogs.close_course_dialog import CloseCourseDialog
+from openmolar.qt4gui.dialogs.newCourse import NewCourseDialog
+from openmolar.qt4gui.dialogs.appt_prefs_dialog import ApptPrefsDialog
+from openmolar.qt4gui.dialogs.recall_prompt_dialog import RecallPromptDialog
 from openmolar.qt4gui.printing import om_printing
-from openmolar.qt4gui.compiled_uis import Ui_completionDate
 from openmolar.qt4gui import contract_gui_module
 from openmolar.ptModules import plan
 from openmolar.qt4gui.printing.gp17.gp17_printer import GP17Printer
@@ -48,7 +51,8 @@ def newCourseNeeded(om_gui):
     '''
     if om_gui.pt.underTreatment:
         return False
-    if om_gui.pt.treatment_course.cmpd != om_gui.pt.dbstate.treatment_course.cmpd:
+    if (om_gui.pt.treatment_course.cmpd !=
+       om_gui.pt.dbstate.treatment_course.cmpd):
         om_gui.advise(
             _("Please save the old course changes before continuing"), 1)
         return True
@@ -58,17 +62,19 @@ def newCourseNeeded(om_gui):
 
     if om_gui.pt.newer_course_found:
         om_gui.ui.actionFix_Locked_New_Course_of_Treatment.setEnabled(True)
-        om_gui.advise(u"<p>%s<br />%s</p><hr /><em>%s</em>" % (
-                      _(
-                      "It looks as if another user is starting a course of treatment"),
-                      _("Please allow this other user to commit their changes"
-                        " then reload this record before continuing."),
-                      _("If you are seeing this message and are sure no other user is"
-                        " using this record, use menu->tools->"
-                        "Fix Locked New Course of Treatment")), 1)
-
+        message = u"<p>%s<br />%s</p><hr /><em>%s</em>" % (
+            _("It looks as if another user is "
+              "starting a course of treatment"),
+            _("Please allow this other user to commit their changes"
+              " then reload this record before continuing."),
+            _("If you are seeing this message and are sure no other user is"
+              " using this record, use menu->tools->"
+              "Fix Locked New Course of Treatment"))
+        om_gui.advise(message, 1)
+    elif course_should_be_resumed(om_gui):
+        return False
     elif setupNewCourse(om_gui):
-        LOGGER.info("new course started with accd of '%s'" %
+        LOGGER.info("new course started with accd of '%s'",
                     om_gui.pt.treatment_course.accd)
         return False
     else:
@@ -95,10 +101,10 @@ def setupNewCourse(om_gui):
 
     dialog = QtGui.QDialog(om_gui)
 
-    dl = newCourse.NewCourseDialog(dialog,
-                                   localsettings.ops.get(om_gui.pt.dnt1),
-                                   localsettings.ops.get(cdnt),
-                                   om_gui.pt.cset)
+    dl = NewCourseDialog(dialog,
+                         localsettings.ops.get(om_gui.pt.dnt1),
+                         localsettings.ops.get(cdnt),
+                         om_gui.pt.cset)
 
     result, atts = dl.getInput()
 
@@ -117,31 +123,33 @@ def setupNewCourse(om_gui):
         accd = atts[3].toPyDate()
 
         new_courseno = writeNewCourse.write(om_gui.pt.serialno, accd)
+        om_gui.load_dentComboBoxes()
         return apply_new_courseno(om_gui, new_courseno, accd)
 
 
 def apply_new_courseno(om_gui, new_courseno, accd=None):
-        new_course = om_gui.pt.new_tx_course(new_courseno)
-        # om_gui.pt.dbstate.treatment_course = new_course
-        om_gui.pt.treatment_course.setAccd(accd)
-        # force a recheck for the new course date
-        om_gui.pt.forget_fee_table()
-        om_gui.pt.estimates = []
-        om_gui.load_newEstPage()
-        om_gui.ui.planChartWidget.clear(keepSelection=True)
-        om_gui.ui.completedChartWidget.clear(keepSelection=True)
-        om_gui.updateDetails()
-        om_gui.load_clinicalSummaryPage()
-        om_gui.load_receptionSummaryPage()
-        om_gui.pt.addHiddenNote("open_course")
-        om_gui.updateHiddenNotesLabel()
-        message = "%s<hr />%s <em>%s</em>" % (
-            _("Sucessfully started new course of treatment"),
-            _("Using Feescale"),
-            om_gui.pt.fee_table.briefName
-        )
-        om_gui.advise(message, 1)
-        return True
+    new_course = om_gui.pt.new_tx_course(new_courseno)
+    # om_gui.pt.dbstate.treatment_course = new_course
+    om_gui.pt.treatment_course.setAccd(accd)
+    # force a recheck for the new course date
+    om_gui.pt.forget_fee_table()
+    om_gui.pt.estimates = []
+    om_gui.load_newEstPage()
+    om_gui.ui.planChartWidget.clear(keepSelection=True)
+    om_gui.ui.completedChartWidget.clear(keepSelection=True)
+    om_gui.updateDetails()
+    om_gui.load_clinicalSummaryPage()
+    om_gui.load_receptionSummaryPage()
+    om_gui.pt.addHiddenNote("open_course")
+    om_gui.updateHiddenNotesLabel()
+    message = "%s<hr />%s <em>%s</em>" % (
+        _("Successfully started new course of treatment"),
+        _("Using Feescale"),
+        om_gui.pt.fee_table.briefName
+    )
+    om_gui.debug_browser_refresh_func = None
+    om_gui.advise(message)
+    return True
 
 
 def prompt_close_course(om_gui):
@@ -154,6 +162,25 @@ def prompt_close_course(om_gui):
             closeCourse(om_gui, True)
 
 
+def recall_check(om_gui):
+    if (not om_gui.pt.recall_active or
+       om_gui.pt.recd > localsettings.currentDay() or
+       om_gui.pt.has_exam_booked):
+        return True
+    dl = RecallPromptDialog(om_gui.pt, om_gui)
+    if dl.exec_():
+        if dl.result == dl.IGNORE:
+            return True
+        else:
+            dl = ApptPrefsDialog(om_gui.pt, om_gui)
+            if dl.exec_():
+                om_gui.pt.appt_prefs.commit_changes()
+                om_gui.updateDetails()
+                om_gui.advise(_("Appointment Preferences Applied"))
+                return True
+    return False
+
+
 def delete_new_course(om_gui):
     '''
     user is discarding all changes to a record.
@@ -169,34 +196,27 @@ def closeCourse(om_gui, leaving=False):
     '''
     allow the user to add a completion Date to a course of treatment
     '''
-    Dialog = QtGui.QDialog(om_gui)
-    my_dialog = Ui_completionDate.Ui_Dialog()
-    my_dialog.setupUi(Dialog)
-    my_dialog.pt_label.setText("%s %s - (%s)" % (om_gui.pt.fname,
-                                                 om_gui.pt.sname, om_gui.pt.serialno))
-
+    ftr = om_gui.pt.treatment_course.has_treatment_outstanding
+    dl = CloseCourseDialog(ftr, om_gui)
     if not leaving:
-        my_dialog.autoComplete_label.hide()
-    my_dialog.dateEdit.setMinimumDate(om_gui.pt.treatment_course.accd)
-    my_dialog.dateEdit.setMaximumDate(QtCore.QDate().currentDate())
-    my_dialog.dateEdit.setDate(QtCore.QDate().currentDate())
-    # focus the "yes" button
-    my_dialog.buttonBox.buttons()[0].setFocus()
-
-    if (Dialog.exec_() and
-       QtGui.QMessageBox.question(om_gui, _("Confirm"),
-                                  _(
-                                  "are you sure you wish to close this course of treatment?"),
-                                  QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
-                                  QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Ok):
-
-        cmpd = my_dialog.dateEdit.date().toPyDate()
-        om_gui.pt.treatment_course.setCmpd(cmpd)
+        dl.tx_complete_label.hide()
+    dl.patient_label.setText("%s %s - (%s)" % (
+        om_gui.pt.fname, om_gui.pt.sname, om_gui.pt.serialno))
+    dl.set_minimum_date(om_gui.pt.treatment_course.accd)
+    dl.set_date(om_gui.pt.last_treatment_date)
+
+    if dl.exec_():
+        om_gui.pt.treatment_course.setCmpd(dl.completion_date)
+        om_gui.pt.treatment_course.ftr = dl.ftr
         om_gui.pt.addHiddenNote("close_course")
         om_gui.updateDetails()
         om_gui.updateHiddenNotesLabel()
         offerFinalPaperWork(om_gui)
         plan.completedFillsToStatic(om_gui.pt)
+        if not leaving:
+            om_gui.refresh_charts()
+            om_gui.debug_browser_refresh_func = None
+
         return True
 
     return False
@@ -212,21 +232,52 @@ def offerFinalPaperWork(om_gui):
         form_printer.print_(final_paperwork=True)
 
 
+def course_should_be_resumed(om_gui):
+    '''
+    see if it would make more sense to resume a course rather than start a new
+    one.
+    '''
+
+    if not om_gui.pt.treatment_course.cmpd:
+        return False
+    elapsed = localsettings.currentDay() - om_gui.pt.treatment_course.cmpd
+    if elapsed > datetime.timedelta(days=7):
+        return False
+    elif elapsed == datetime.timedelta(days=0):
+        message = _("A course was closed earlier today.")
+    elif elapsed == datetime.timedelta(days=1):
+        message = _("A course was closed yesterday.")
+    else:
+        message = _("A course was closed less than a week ago.")
+
+    if QtGui.QMessageBox.question(
+        om_gui,
+        _("Question"),
+        "%s<hr />%s" % (message, _("Would you like to resume this course?")),
+        QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+            QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+            return resumeCourse(om_gui)
+    return False
+
+
 def resumeCourse(om_gui):
     '''
     resume the previous treatment course
     '''
-    message = _("Resume the previous course of treatment?")
-    result = QtGui.QMessageBox.question(om_gui, "Confirm", message,
-                                        QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                        QtGui.QMessageBox.Yes)
+    if QtGui.QMessageBox.question(
+        om_gui,
+        _("Confirm"),
+        _("Are you sure you wish to Resume the previous course of treatment?"),
+        QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+            QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
 
-    if result == QtGui.QMessageBox.Yes:
         om_gui.pt.treatment_course.cmpd = None
+        om_gui.pt.treatment_course.ftr = False
         om_gui.updateDetails()
         om_gui.pt.addHiddenNote("resume_course")
         om_gui.updateHiddenNotesLabel()
-
+        plan.reverse_completedFillsToStatic(om_gui.pt)
+        om_gui.debug_browser_refresh_func = None
         return True
 
 
@@ -242,12 +293,16 @@ def fix_zombied_course(om_gui):
 
     message = _("a situation COULD arise where a new course was started"
                 " but the client lost connectivity crashed"
-                " (without cleaning up the temporary row in the currtrtmt2 table)")
+                " (without cleaning up the temporary row "
+                "in the currtrtmt2 table)")
     question = _("Do you wish to recover this row now?")
-    if QtGui.QMessageBox.question(om_gui, _("question"),
-                                  u"%s<hr /><b>%s</b>" % (message, question),
-                                  QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
-                                  QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+
+    if QtGui.QMessageBox.question(
+        om_gui,
+        _("question"),
+        u"%s<hr /><b>%s</b>" % (message, question),
+        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+            QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
 
         cno = om_gui.pt.max_tx_courseno
         apply_new_courseno(om_gui, cno)
diff --git a/src/openmolar/qt4gui/fees/fees_module.py b/src/openmolar/qt4gui/fees/fees_module.py
index acdf846..840ba95 100644
--- a/src/openmolar/qt4gui/fees/fees_module.py
+++ b/src/openmolar/qt4gui/fees/fees_module.py
@@ -119,7 +119,7 @@ def takePayment(om_gui):
                                          total=dl.grand_total_text)
 
                 #-- always refer to money in terms of pence
-                print "adjusting money"
+                LOGGER.debug("adjusting money")
                 if om_gui.pt.cset[:1] == "N":
                     om_gui.pt.money2 += dl.tx_total
                 else:
@@ -134,8 +134,10 @@ def takePayment(om_gui):
                                           paymentPt.HIDDENNOTES)
 
             LOGGER.debug("writing payment notes")
-            if patient_write_changes.discreet_changes(paymentPt,
-                                                     ("money2", "money3", "money11")) and om_gui.pt.serialno != 0:
+            if (patient_write_changes.discreet_money_changes(
+                paymentPt, ("money2", "money3", "money11")) and
+            om_gui.pt.serialno != 0
+                ):
                 LOGGER.debug("updating patient's stored money values")
                 om_gui.pt.dbstate.money2 = om_gui.pt.money2
                 om_gui.pt.dbstate.money3 = om_gui.pt.money3
@@ -355,7 +357,7 @@ def makeBadDebt(om_gui):
         om_gui.pt.resetAllMonies()
         om_gui.pt.status = "BAD DEBT"
         om_gui.ui.notesEnter_textEdit.setText(
-            _("changed patients status to BAD DEBT")
+            _("changed patient's status to BAD DEBT")
         )
 
         om_gui.updateStatus()
diff --git a/src/openmolar/qt4gui/fees/manipulate_plan.py b/src/openmolar/qt4gui/fees/manipulate_plan.py
index 97051a8..8742288 100644
--- a/src/openmolar/qt4gui/fees/manipulate_plan.py
+++ b/src/openmolar/qt4gui/fees/manipulate_plan.py
@@ -136,17 +136,19 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
                 continue
             alt_code = alt_table.getToothCode(att, shortcut)
             if alt_code != "-----":
-                if QtGui.QMessageBox.question(om_gui, _("Confirm"),
-                                              u"<p><b>%s %s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" % (
-                                                  att, shortcut,
-                                                  _(
-                                                      "was not found in the patient's default feescale"),
-                                                  _(
-                                                      "It is matched in another feescale -"),
-                                                  alt_table.briefName,
-                                                  _("Shall we add this item from this feescale?")),
-                                              QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
-                                              QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+                if QtGui.QMessageBox.question(
+                    om_gui,
+                    _("Confirm"),
+                    u"<p><b>%s %s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" % (
+                        att, shortcut,
+                        _(
+                            "was not found in the patient's default feescale"),
+                        _(
+                            "It is matched in another feescale -"),
+                        alt_table.briefName,
+                        _("Shall we add this item from this feescale?")),
+                    QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                        QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
                     return alt_code, alt_table
 
         return itemcode, table
@@ -161,17 +163,19 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
                 continue
             alt_code = alt_table.getItemCodeFromUserCode(usercode)
             if alt_code != "-----":
-                if QtGui.QMessageBox.question(om_gui, _("Confirm"),
-                                              u"<p><b>%s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" % (
-                                                  usercode,
-                                                  _(
-                                                      "was not found in the patient's default feescale"),
-                                                  _(
-                                                      "It is matched in another feescale -"),
-                                                  alt_table.briefName,
-                                                  _("Shall we add this item from this feescale?")),
-                                              QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
-                                              QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+                if QtGui.QMessageBox.question(
+                    om_gui,
+                    _("Confirm"),
+                    u"<p><b>%s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" % (
+                        usercode,
+                        _(
+                            "was not found in the patient's default feescale"),
+                        _(
+                            "It is matched in another feescale -"),
+                        alt_table.briefName,
+                        _("Shall we add this item from this feescale?")),
+                    QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                        QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
                     return alt_code, alt_table
         return itemcode, table
 
@@ -326,7 +330,7 @@ def customAdd(om_gui, description=None):
             descr = "??"
         usercode = str(descr.replace(" ", "_"))[:20].upper()
 
-        fee = int(dl.fee_doubleSpinBox.value() * 100)
+        fee = localsettings.pencify(str(dl.fee_doubleSpinBox.value()))
 
         for i in range(no):
             pt.treatment_course.custompl += "%s " % usercode
@@ -594,9 +598,10 @@ def fromFeeTable(om_gui, fee_item, sub_index):
             reason = _("Exam items can never be added this way")
         else:
             reason = fee_item.forbid_reason
-        message = "%s<hr /><em>%s</em>" % (_(
-                                           "This item can not be added to the treatment plan "
-                                           "using the feescale method, sorry"), reason)
+        message = "%s<hr /><em>%s</em>" % (
+            _("This item can not be added to the treatment plan "
+              "using the feescale method, sorry"),
+            reason)
         om_gui.advise(message, 1)
         return
 
@@ -700,8 +705,13 @@ def complex_shortcut_addition(om_gui, att, shortcut, n_txs, tx_hash,
 
                 for item_code in case.additions:
                     LOGGER.debug("adding additional code %s" % item_code)
-                    add_treatment_to_estimate(om_gui,
-                                              att, shortcut, dentid, list(tx_hashes), item_code)
+                    add_treatment_to_estimate(
+                        om_gui,
+                        att,
+                        shortcut,
+                        dentid,
+                        list(tx_hashes),
+                        item_code)
 
                 for item_code in case.alterations:
                     # instead of adding a new estimate item
@@ -787,8 +797,13 @@ def complex_shortcut_removal_handled(om_gui, att, shortcut, n_txs, tx_hash):
 
                 for item_code in case.additions:
                     LOGGER.debug("adding additional code %s" % item_code)
-                    add_treatment_to_estimate(om_gui,
-                                              att, shortcut, dentid, tx_hashes, item_code)
+                    add_treatment_to_estimate(
+                        om_gui,
+                        att,
+                        shortcut,
+                        dentid,
+                        tx_hashes,
+                        item_code)
 
                 for item_code in case.alterations:
                     # instead of adding a new estimate item
@@ -916,6 +931,7 @@ def remove_estimate_item(om_gui, est_item):
                     pt.addHiddenNote("exam", treat_code, attempt_delete=True)
                     for est in pt.ests_from_hash(tx_hash):
                         pt.estimates.remove(est)
+                    om_gui.updateHiddenNotesLabel()
                 elif treat_code.strip(" ") == "!FEE":
                     LOGGER.debug("special case - removing feescale added item")
                     if tx_hash.completed:
@@ -924,13 +940,17 @@ def remove_estimate_item(om_gui, est_item):
                         pt.estimates.remove(est)
                 else:
                     LOGGER.debug("not a special case")
-                    remove_treatments_from_plan_and_est(om_gui,
-                                                       ((att, treat_code.strip(" ")),), tx_hash.completed)
+                    remove_treatments_from_plan_and_est(
+                        om_gui,
+                        ((att, treat_code.strip(" ")),),
+                        tx_hash.completed)
 
     if not found:
         LOGGER.debug("NO MATCHING hash FOUND!")
-        om_gui.advise(u"%s - %s" % (
-                      _("couldn't pass on delete message for"), est_item.description), 1)
+        om_gui.advise(
+            u"%s - %s" % (_("couldn't pass on delete message for"),
+                          est_item.description),
+            1)
 
 
 def recalculate_estimate(om_gui):
@@ -1045,6 +1065,12 @@ def complete_txs(om_gui, treatments, confirm_multiples=True):
     args is a list - [("ul5","MOD"),("ul5", "RT"), ("perio", "SP")]
 
     '''
+    if localsettings.clinicianNo == 0:
+        om_gui.advise(
+            _("You have no clinician login. "
+              "Treatments cannot be completed by you!"),
+            2)
+        return
     LOGGER.debug(treatments)
 
     pt = om_gui.pt
@@ -1087,6 +1113,13 @@ def tx_hash_complete(om_gui, tx_hash):
     reponds to a signal when the user completes an item of treatment by
     checking a checkbox on the estwidget
     '''
+    if localsettings.clinicianNo == 0:
+        om_gui.advise(
+            _("You have no clinician login. "
+              "Treatments cannot be completed by you!"),
+            2)
+        return
+
     LOGGER.debug(tx_hash)
 
     pt = om_gui.pt
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_editor.py b/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
index 0b5fb23..332c913 100755
--- a/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
@@ -118,7 +118,7 @@ class FeescaleEditor(QtGui.QMainWindow):
         QtGui.QMainWindow.__init__(self, parent)
         self.window_title = _("Feescale Editor")
         self.setWindowTitle(self.window_title)
-        self.loading = True
+        self.is_loading = True
 
         statusbar = QtGui.QStatusBar()
         self.setStatusBar(statusbar)
@@ -260,7 +260,7 @@ class FeescaleEditor(QtGui.QMainWindow):
         self.feescale_parsers = OrderedDict()
         self.text_editors = []
         self.feescale_handler = feescale_handler
-
+        self.feescale_handler.check_dir()
         self.action_refactor = QtGui.QAction(_("XML tidy"), self)
         self.action_refactor.triggered.connect(self.refactor)
 
@@ -406,7 +406,15 @@ class FeescaleEditor(QtGui.QMainWindow):
         self.view_feescale(0)
 
     def load_feescales(self):
-        self.loading = True
+        self.is_loading = True
+
+        # if reloading.. disconnect signals.
+        for editor in self.text_editors:
+            editor.editing_finished.disconnect(self.te_editing_finished)
+            editor.cursorPositionChanged.disconnect(
+                self.cursor_position_changed)
+            editor.deleteLater()
+
         self.text_editors = []
         self.feescale_parsers = OrderedDict()
         for ix, filepath in self.feescale_handler.local_files:
@@ -430,10 +438,10 @@ class FeescaleEditor(QtGui.QMainWindow):
 
             self.tab_widget.addTab(editor, title)
 
-        self.loading = False
+        self.is_loading = False
 
     def view_feescale(self, i=0):
-        while self.loading:
+        while self.is_loading:
             QtCore.QTimer.singleShot(1000, self.view_feescale)
             return
         if len(self.text_editors) > 1:
@@ -665,9 +673,11 @@ class FeescaleEditor(QtGui.QMainWindow):
         parser = self.current_parser
         try:
             if filepath is None:
-                filepath = QtGui.QFileDialog.getSaveFileName(self,
-                _("save as"), parser.filepath,
-                    "%s %s" % (_("xml_files"), "(*.xml)"))
+                filepath = unicode(
+                    QtGui.QFileDialog.getSaveFileName(self,
+                    _("save as"), parser.filepath,
+                        "%s (*.xml)" % _("xml_files")).toUtf8()
+                )
             if filepath == '':
                 return
             if not re.match(".*\.xml$", filepath):
@@ -677,7 +687,7 @@ class FeescaleEditor(QtGui.QMainWindow):
             f.close()
             if filepath != parser.filepath:
                 self.advise("%s %s" % (_("Copy saved to"), filepath), 1)
-                if os.path.dirname(filepath) == FEESCALE_DIR:
+                if os.path.dirname(filepath) == FEESCALE_DIR():
                     self.advise(_("Reload files to edit the new feescale"), 1)
             else:
                 if parser in self._known_deleted_parsers:
@@ -700,26 +710,57 @@ class FeescaleEditor(QtGui.QMainWindow):
             ) == QtGui.QMessageBox.Cancel):
             return
 
-        for fp in self.feescale_parsers.values():
-            fp.refresh()
-        self.view_feescale(self.tab_widget.currentIndex())
+        self.tab_widget.clear()
+        self.load_feescales()
 
     def apply_changes(self):
+        if self.is_dirty:
+            self.advise(
+                _("Please save local files before pushing to database"), 1)
+            return
         if QtGui.QMessageBox.question(self, _("confirm"),
-        _("commit all local files to database?"),
+        _("update all existing feescales with data from the local files?"),
             QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel
-        ) == QtGui.QMessageBox.Ok:
-            message = self.feescale_handler.update_db_all()
-            LOGGER.info("message")
-            self.advise("<pre>%s</pre>" % message, 1)
+        ) == QtGui.QMessageBox.Cancel:
+            return
+
+        message, insert_ids = self.feescale_handler.update_db_all()
+        LOGGER.info("message")
+        self.advise("<pre>%s</pre>" % message, 1)
+
+        mappings = {}
+        for ins_id in insert_ids:
+            if QtGui.QMessageBox.question(self, _("confirm"),
+            "%s %s?" % (_("Insert new Feescale"),
+            self.feescale_handler.index_to_local_filepath(ins_id)),
+                QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel
+            ) == QtGui.QMessageBox.Ok:
+                mappings[ins_id] = self.feescale_handler.insert_db(ins_id)
+
+        move_required = False
+        for file_ix, db_ix in mappings.iteritems():
+            if file_ix != db_ix:
+                move_required = True
+                self.advise(_("your local files will now be moved to "
+                "comply with the database indexes they have been given"), 1)
+                break
+        if not move_required:
+            return
+
+        # self._checking_files = True
+        for file_ix in mappings.keys():
+            self.feescale_handler.temp_move(file_ix)
+        for file_ix, db_ix in mappings.iteritems():
+            self.feescale_handler.final_move(file_ix, db_ix)
+        self.refresh_files()
 
     def cursor_position_changed(self, row, col):
         self.cursor_pos_label.setText("Line %d, Column %d" % (row + 1, col))
 
     def text_changed(self):
         new_text = self.text_edit.text()
-        if self.current_parser.text.count("\n") == new_text.count("\n"):
-            return
+        # if self.current_parser.text.count("\n") == new_text.count("\n"):
+        #    return
         if self.current_parser.set_edited_text(new_text):
             self.update_index()
 
diff --git a/src/openmolar/qt4gui/maingui.py b/src/openmolar/qt4gui/maingui.py
index 118dcb2..264073a 100755
--- a/src/openmolar/qt4gui/maingui.py
+++ b/src/openmolar/qt4gui/maingui.py
@@ -28,7 +28,6 @@ provides the main class which is my gui
 
 from __future__ import division
 
-import copy
 import datetime
 import logging
 import os
@@ -42,7 +41,7 @@ from functools import partial
 
 from PyQt4 import QtGui, QtCore
 
-from openmolar.connect import database_name
+from openmolar.connect import params
 from openmolar.settings import localsettings, utilities
 from openmolar.qt4gui import colours
 
@@ -76,15 +75,12 @@ from openmolar.qt4gui.dialogs import saveMemo
 from openmolar.qt4gui.dialogs import permissions
 from openmolar.qt4gui.dialogs import select_language
 
-from openmolar.qt4gui.dialogs import *
+from openmolar.qt4gui.dialogs.dialog_collection import *
 
 from openmolar.qt4gui.phrasebook.phrasebook_dialog import PhraseBookDialog
 from openmolar.qt4gui.phrasebook.phrasebook_dialog import PHRASEBOOKS
 from openmolar.qt4gui.phrasebook.phrasebook_editor import PhrasebookEditor
 
-# secondary applications
-from openmolar.qt4gui.tools import recordtools
-
 #--database modules
 #--(do not even think of making db queries from ANYWHERE ELSE)
 from openmolar.dbtools import appointments
@@ -103,13 +99,14 @@ from openmolar.dbtools import estimatesHistory
 from openmolar.dbtools import est_logger
 from openmolar.dbtools import daybook
 from openmolar.dbtools.distinct_statuses import DistinctStatuses
+from openmolar.dbtools import schema_version
+from openmolar.dbtools import referral
 
 
 #--modules which act upon the pt class type (and subclasses)
 from openmolar.ptModules import patientDetails
 from openmolar.ptModules import formatted_notes
 from openmolar.ptModules import plan
-from openmolar.ptModules import referral
 from openmolar.ptModules import debug_html
 from openmolar.ptModules import estimates
 from openmolar.ptModules import tooth_history
@@ -125,25 +122,25 @@ from openmolar.qt4gui.diary_widget import DiaryWidget
 from openmolar.qt4gui.pt_diary_widget import PtDiaryWidget
 from openmolar.qt4gui.customwidgets import chartwidget
 from openmolar.qt4gui.customwidgets import toothProps
-from openmolar.qt4gui.customwidgets import perioToothProps
-from openmolar.qt4gui.customwidgets import perioChartWidget
 from openmolar.qt4gui.customwidgets import estimate_widget
 from openmolar.qt4gui.customwidgets import notification_widget
 from openmolar.qt4gui.customwidgets.static_control_panel \
     import StaticControlPanel
 
+from openmolar.backports.advisor import Advisor
+
 LOGGER = logging.getLogger("openmolar")
-LOGGER.setLevel(logging.INFO)
 
 
-class OpenmolarGui(QtGui.QMainWindow):
+class OpenmolarGui(QtGui.QMainWindow, Advisor):
     fee_table_editor = None
     fee_table_tester = None
     phrasebook_editor = None
     entering_new_patient = False
 
-    def __init__(self):
-        QtGui.QMainWindow.__init__(self)
+    def __init__(self, parent=None):
+        QtGui.QMainWindow.__init__(self, parent)
+        Advisor.__init__(self, parent)
         self.ui = Ui_main.Ui_MainWindow()
         self.ui.setupUi(self)
         self.diary_widget = DiaryWidget(self)
@@ -172,7 +169,6 @@ class OpenmolarGui(QtGui.QMainWindow):
         self.ui.actionSurgery_Mode.setChecked(
             localsettings.station == "surgery")
         self.setupSignals()
-        self.loadDentistComboboxes()
         self.feestableLoaded = False
         self.forum_parenting_mode = (False, None)
         self.ui.new_patient_frame.hide()
@@ -185,43 +181,153 @@ class OpenmolarGui(QtGui.QMainWindow):
         self.ui.completed_listView.setContextMenuPolicy(
             QtCore.Qt.CustomContextMenu)
 
-        self.setWindowTitle("OpenMolar - %s '%s'" % (
-            _("connected to"), database_name()))
+        self.setWindowTitle("OpenMolar - %s" % _("OFFLINE"))
 
         # reimplement these functions to catch "clicked links"
         self.ui.daybook_filters_frame.setEnabled(False)
         self.ui.debugBrowser.setSource = self.set_browser_source
         self.ui.daybookTextBrowser.setSource = self.set_browser_source
 
-        QtCore.QTimer.singleShot(500, self.set_operator_label)
-        QtCore.QTimer.singleShot(500, self.load_pt_statuses)
-        QtCore.QTimer.singleShot(1000, self.load_todays_patients_combobox)
-        QtCore.QTimer.singleShot(2000, self.load_fee_tables)
-
-    def advise(self, arg, warning_level=0):
-        '''
-        inform the user of events -
-        warning level0 = status bar only.
-        warning level 1 advisory
-        warning level 2 critical (and logged)
-        '''
-        if warning_level == 0:
-            m = QtGui.QMessageBox(self)
-            m.setText(arg)
-            m.setStandardButtons(QtGui.QMessageBox.NoButton)
-            m.setWindowTitle(_("advisory"))
-            m.setModal(False)
-            QtCore.QTimer.singleShot(3 * 1000, m.accept)
-            m.show()
-            self.ui.statusbar.showMessage(arg, 5000)  # 5000 milliseconds=5secs
-        elif warning_level == 1:
-            QtGui.QMessageBox.information(self, _("Advisory"), arg)
-        elif warning_level == 2:
-            now = QtCore.QTime.currentTime()
-            QtGui.QMessageBox.warning(self, _("Error"), arg)
-            #--for logging purposes
-            print "%d:%02d ERROR MESSAGE" % (now.hour(), now.minute())
-            print arg
+        self.ui.backButton.setEnabled(False)
+        self.ui.nextButton.setEnabled(False)
+        self.ui.reloadButton.setEnabled(False)
+        self.ui.relatedpts_pushButton.setEnabled(False)
+
+        self.debug_browser_refresh_func = None
+
+        self.forum_timer = QtCore.QTimer()
+        QtCore.QTimer.singleShot(100, self.check_first_run)
+
+    def initiate(self):
+        localsettings.initiate()
+        self.setWindowTitle("OpenMolar - %s '%s'" % (
+            _("connected to"), params.database_name))
+
+        dl = InitialCheckDialog(self)
+        for message in dl.critical_messages:
+            self.advise("%s<hr />%s" % (_("CRITICAL MESSAGE"), message), 2)
+        if dl.has_issues:
+            dl.exec_()
+        for message in dl.messages:
+            self.advise(message)
+        self.set_surgery_mode()
+        self.load_pt_statuses()
+        self.loadDentistComboboxes()
+        self.ui.reception_textBrowser.setHtml(localsettings.message)
+        self.ui.notesSummary_webView.setHtml(localsettings.message)
+        self.ui.forumViewFilter_comboBox.addItems(
+            localsettings.allowed_logins)
+
+        QtCore.QTimer.singleShot(500, self.load_todays_patients_combobox)
+        QtCore.QTimer.singleShot(1000, self.load_fee_tables)
+        self.forum_timer.start(60000)  # fire every minute
+        self.forum_timer.timeout.connect(self.checkForNewForumPosts)
+        self.set_referral_centres()
+        self.diary_widget.initiate()
+
+    def check_first_run(self):
+        if os.path.exists(localsettings.global_cflocation):
+            localsettings.cflocation = localsettings.global_cflocation
+            cf_Found = True
+        else:
+            cf_found = os.path.exists(localsettings.cflocation)
+        if not cf_found or localsettings.FORCE_FIRST_RUN:
+            dl = FirstRunDialog(self)
+            if not dl.exec_():
+                QtGui.QApplication.instance().closeAllWindows()
+                return
+            params.reload()
+        self.login()
+
+    def login(self):
+        dl = LoginDialog(self)
+        if not dl.exec_():
+            app = QtGui.QApplication.instance()
+            QtCore.QTimer.singleShot(4000, app.closeAllWindows)
+            self.advise(_("Login Cancelled- Closing Application"), 2)
+            app.closeAllWindows()
+        else:
+            self.advise("%s %s %s" % (
+                _("Login by"), localsettings.operator, "accepted"))
+            self.check_schema()
+            self.initiate()
+
+    def check_schema(self):
+        LOGGER.debug("checking schema version...")
+
+        if localsettings.IGNORE_SCHEMA_CHECK:
+            LOGGER.warning(
+                "Ignoring schema check - I hope you know what you are doing!")
+            self.advise(_("Warning - ignoring schema check!"), 2)
+            return
+        sv = schema_version.getVersion()
+        if localsettings.CLIENT_SCHEMA_VERSION == sv:
+            self.advise(_("database schema is up to date"))
+
+        elif localsettings.CLIENT_SCHEMA_VERSION > sv:
+            LOGGER.warning("schema is out of date")
+            self.advise(_("database schema is incompatible"))
+            from openmolar.qt4gui.schema_updater import SchemaUpdater
+            schema_updater = SchemaUpdater()
+            if not schema_updater.exec_():
+                QtGui.QApplication.instance().closeAllWindows()
+
+        elif localsettings.CLIENT_SCHEMA_VERSION < sv:
+            LOGGER.warning("client is out of date")
+            compatible = schema_version.clientCompatibility(
+                localsettings.CLIENT_SCHEMA_VERSION)
+
+            if not compatible:
+                self.advise("<p>%s</p><p>%s %s %s %s</p><hr />%s" % (
+                    _('Sorry, you cannot run this version of the openMolar '
+                      'client because your database schema is more advanced.'),
+                    _('this client requires schema version '),
+                    localsettings.CLIENT_SCHEMA_VERSION,
+                    _('but your database is at'),
+                    sv,
+                    _('Please Update openMolar now')), 2)
+                QtGui.QApplication.instance().closeAllWindows()
+            else:
+                message = '''<p>%s</p><p>%s %s %s %s</p>
+                <p>%s<br />%s</p><hr />%s''' % (
+                    _('This openMolar client has fallen behind your database '
+                      'schema version'),
+                    _('This client was written for schema version'),
+                    localsettings.CLIENT_SCHEMA_VERSION,
+                    _('and your database is now at'),
+                    sv.
+                    _('However, the differences are not critical, and you can '
+                      'continue if you wish'),
+                    _('It would still be wise to update this client ASAP'),
+                    _('Do you wish to continue?'))
+
+                if QtGui.QMessageBox.question(
+                    self,
+                    _("Proceed without upgrade?"),
+                    message,
+                    QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                        QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
+                    QtGui.QApplication.instance().closeAllWindows()
+
+    def resizeEvent(self, event):
+        '''
+        this function is overwritten so that the advisor popup can be
+        put in the correct place
+        '''
+        QtGui.QMainWindow.resizeEvent(self, event)
+        self.setBriefMessageLocation()
+
+    def setBriefMessageLocation(self):
+        '''
+        make the Advisor sub class aware of the windows geometry.
+        set it top right, and right_to_left
+        '''
+        widg = self.menuBar()
+        brief_pos_x = (widg.pos().x() + widg.width())
+        brief_pos_y = (widg.pos().y() + widg.height())
+
+        brief_pos = QtCore.QPoint(brief_pos_x, brief_pos_y)
+        self.setBriefMessagePosition(brief_pos, True)
 
     def wait(self, waiting=True):
         if waiting:
@@ -287,7 +393,6 @@ class OpenmolarGui(QtGui.QMainWindow):
         self.operator_label = QtGui.QLabel()
         self.loadedPatient_label = QtGui.QLabel()
         self.loadedPatient_label.setMinimumWidth(450)
-        # self.loadedPatient_label.setAlignment(QtCore.Qt.AlignCenter)
         self.sepline = QtGui.QFrame(self.statusbar_frame)
         self.sepline.setFrameShape(QtGui.QFrame.VLine)
         self.sepline.setFrameShadow(QtGui.QFrame.Sunken)
@@ -305,11 +410,6 @@ class OpenmolarGui(QtGui.QMainWindow):
         hlayout = QtGui.QHBoxLayout(self.ui.staticSummaryPanel)
         hlayout.addWidget(self.ui.summaryChartWidget)
 
-        #-perio chart
-        self.ui.perioChartWidget = chartwidget.chartWidget()
-        hlayout = QtGui.QHBoxLayout(self.ui.perioChart_frame)
-        hlayout.addWidget(self.ui.perioChartWidget)
-
         #-static chart
         self.ui.staticChartWidget = chartwidget.chartWidget()
         self.ui.staticChartWidget.setFocusPolicy(QtCore.Qt.StrongFocus)
@@ -345,46 +445,7 @@ class OpenmolarGui(QtGui.QMainWindow):
         hlayout.setMargin(0)
         hlayout.addWidget(self.ui.toothPropsWidget)
 
-        #-PERIOPROPS
-        self.ui.perioToothPropsWidget = perioToothProps.tpWidget()
-        hlayout = QtGui.QHBoxLayout(self.ui.perioToothProps_frame)
-        hlayout.addWidget(self.ui.perioToothPropsWidget)
-
-        self.ui.perioChartWidgets = []
-        self.ui.perioGroupBoxes = []
-        hlayout = QtGui.QVBoxLayout(self.ui.perioChartData_frame)
-        hlayout.setMargin(2)
-        for i in range(8):
-            gbtitle = (_("Recession"), _("Pocketing"), _("Plaque"),
-                       _("Bleeding"), _("Other"), _(
-                           "Suppuration"), _("Furcation"),
-                       _("Mobility"))[i]
-            periogb = QtGui.QGroupBox(gbtitle)
-            periogb.setCheckable(True)
-            periogb.setChecked(True)
-            # periogb.setMinimumSize(0, 120)
-            pchart = perioChartWidget.chartWidget()
-            pchart.type = gbtitle
-            gblayout = QtGui.QVBoxLayout(periogb)
-            gblayout.setMargin(2)
-            gblayout.addWidget(pchart)
-            hlayout.addWidget(periogb)
-
-            # make these widgets accessible
-            self.ui.perioGroupBoxes.append(periogb)
-            self.ui.perioChartWidgets.append(pchart)
-
-        #--updates the current time in appointment books
-        self.ui.referralLettersComboBox.clear()
-
-        self.forum_timer = QtCore.QTimer()
-        self.forum_timer.start(60000)  # fire every minute
-        self.forum_timer.timeout.connect(self.checkForNewForumPosts)
-
         self.enableEdit(False)
-        for desc in referral.getDescriptions():
-            s = QtCore.QString(desc)
-            self.ui.referralLettersComboBox.addItem(s)
 
         #-- add a header to the estimates page
         self.ui.estWidget = estimate_widget.EstimateWidget(self)
@@ -407,6 +468,11 @@ class OpenmolarGui(QtGui.QMainWindow):
         layout.setMargin(0)
         layout.addWidget(self.ui.cashbookTextBrowser)
 
+    def set_referral_centres(self):
+        #--updates the current time in appointment books
+        self.ui.referralLettersComboBox.clear()
+        self.ui.referralLettersComboBox.addItems(referral.getDescriptions())
+
     def setClinician(self):
         result, selected = ClinicianSelectDialog(self).result()
         if result:
@@ -421,7 +487,7 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.set_operator_label()
 
     def saveButtonClicked(self):
-        self.okToLeaveRecord(cont=True)
+        self.okToLeaveRecord(discard_possible=False)
 
     def bpe_table(self, arg):
         '''
@@ -429,12 +495,6 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         charts_gui.bpe_table(self, arg)
 
-    def layoutPerioCharts(self):
-        '''
-        layout the perio charts
-        '''
-        charts_gui.layoutPerioCharts(self)
-
     def deleteComments(self):
         '''
         called when user has trigger deleted comments in the toothProp
@@ -519,17 +579,16 @@ class OpenmolarGui(QtGui.QMainWindow):
         dl = ChooseToothDialog(self)
         return dl.getInput()
 
-    def okToLeaveRecord(self, cont=False):
+    def okToLeaveRecord(self, discard_possible=True):
         '''
         leaving a pt record - has state changed?
         '''
         if self.pt.serialno == 0:
             return True
-        #--a debug print statement
-        if not cont:
-            LOGGER.debug(
-                "leaving record checking to see if save is required...")
-            course_module.prompt_close_course(self)
+
+        course_module.prompt_close_course(self)
+        if not course_module.recall_check(self):
+            return False
 
         #--apply changes to patient details
         self.pt.synopsis = str(self.ui.synopsis_lineEdit.text().toAscii())
@@ -549,7 +608,7 @@ class OpenmolarGui(QtGui.QMainWindow):
             dl = SaveDiscardCancelDialog(message, changes, self)
             # dl.setPatient()
             # dl.setChanges(uc)
-            dl.discard_but.setVisible(not cont)
+            dl.discard_but.setVisible(discard_possible)
             dl.exec_()
             if dl.result == dl.DISCARD:
                 LOGGER.info(
@@ -634,9 +693,10 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.update_plan_est()
 
         elif ci == 8:  # -- perio tab
-            charts_gui.periochart_dates(self)
-            # load the periocharts (if the patient has data)
-            charts_gui.layoutPerioCharts(self)
+            LOGGER.debug("perio interface being rewritten")
+
+        elif ci == 9:  # -- history tab
+            self.refresh_debug_browser()
 
         self.wait(False)
 
@@ -677,7 +737,7 @@ class OpenmolarGui(QtGui.QMainWindow):
                 self.pt.sname, self.pt.addr1, self.pt.addr2,
                 self.pt.addr3, self.pt.town, self.pt.county,
                 self.pt.pcde, self.pt.tel1)
-            LOGGER.debug("details are %s" % str(localsettings.LAST_ADDRESS))
+            LOGGER.debug("details are %s", str(localsettings.LAST_ADDRESS))
 
             # print "clearing record"
             self.ui.dobEdit.setDate(QtCore.QDate(1900, 1, 1))
@@ -690,8 +750,9 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.ui.synopsis_lineEdit.setText("")
             self.pt_diary_widget.clear()
             #--restore the charts to full dentition
-            for chart in (self.ui.staticChartWidget, self.ui.planChartWidget,
-                          self.ui.completedChartWidget, self.ui.perioChartWidget,
+            for chart in (self.ui.staticChartWidget,
+                          self.ui.planChartWidget,
+                          self.ui.completedChartWidget,
                           self.ui.summaryChartWidget):
                 chart.clear()
                 chart.update()
@@ -790,40 +851,46 @@ class OpenmolarGui(QtGui.QMainWindow):
         return True
 
     def load_dentComboBoxes(self, newpatient=False):
-        # print "loading dnt comboboxes."
+        LOGGER.debug("loading dnt comboboxes. dnt1=%s dnt2=%s",
+                     self.pt.dnt1, self.pt.dnt2)
+
         inits = localsettings.ops.get(self.pt.dnt1, "")
-        if inits in localsettings.activedents:
+        if len(localsettings.activedents) == 0:
+            self.advise(_("You have no dentists in your database."), 1)
+        elif inits in localsettings.activedents:
             self.ui.dnt1comboBox.setCurrentIndex(
                 localsettings.activedents.index(inits))
         else:
             self.ui.dnt1comboBox.setCurrentIndex(-1)
             if not newpatient:
-                print "dnt1 error - record %d" % self.pt.serialno
-                if not inits in ("", "NONE"):
+                LOGGER.warning("dnt1 error %s - record %s",
+                               self.pt.dnt1, self.pt.serialno)
+                if inits != "":
                     message = "%s " % inits + _(
                         "is no longer an active dentist in this practice")
                 else:
-                    print "unknown dentist number", self.pt.dnt1
                     message = _(
                         "unknown contract dentist - please correct this")
                 self.advise(message, 2)
 
         inits = localsettings.ops.get(self.pt.dnt2, "")
-        if inits in localsettings.activedents:
-            self.ui.dnt2comboBox.setCurrentIndex(
-                localsettings.activedents.index(inits))
+        if self.pt.dnt2 is None:
+            i = -1
+        elif inits in localsettings.activedents:
+            i = localsettings.activedents.index(inits)
         else:
-            self.ui.dnt2comboBox.setCurrentIndex(-1)
+            i = -1
             if self.pt.dnt1 == self.pt.dnt2:
                 pass
-            elif not inits in ("", "NONE"):
-                message = "%s " % inits + _(
-                    "is no longer an active dentist in this practice")
-                self.advise(message, 2)
-            elif inits == "":
-                print "unknown dentist number", self.pt.dnt2
-                message = _("unknown course dentist - please correct this")
+            elif inits != "":
+                message = "%s '%s' %s" % (
+                    _("Course dentist"),
+                    inits,
+                    _("is no longer an active dentist in this practice")
+                )
+                self.pt.dnt2 = None
                 self.advise(message, 2)
+        self.ui.dnt2comboBox.setCurrentIndex(i)
 
     def enterNewPatient(self):
         '''
@@ -843,8 +910,8 @@ class OpenmolarGui(QtGui.QMainWindow):
         if they are, function will return the user to that part of the gui
         and return True. otherwise, will return False.
         '''
-        LOGGER.debug("enteringNewPatient")
         if self.entering_new_patient:
+            LOGGER.debug("enteringNewPatient")
             self.ui.main_tabWidget.setCurrentIndex(0)
             self.ui.tabWidget.setCurrentIndex(0)
             return not new_patient_gui.abortNewPatientEntry(self)
@@ -875,23 +942,25 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         ix = int(item.text(3))
         if "(html)" in item.text(1):
-            result = QtGui.QMessageBox.question(self, _("Re-open"),
-                                                _(
-                                                "Do you want to review and/or reprint this item?"),
-                                                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                                QtGui.QMessageBox.Yes)
+            result = QtGui.QMessageBox.question(
+                self,
+                _("Re-open"),
+                _("Do you want to review and/or reprint this item?"),
+                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                QtGui.QMessageBox.Yes)
             if result == QtGui.QMessageBox.Yes:
                 html, version = docsprinted.getData(ix)
-                type = item.text(1).replace("(html)", "")
-                if om_printing.htmlEditor(self, type, html, version):
+                type_ = item.text(1).replace("(html)", "")
+                if om_printing.htmlEditor(self, type_, html, version):
                     self.docsPrintedInit()
 
         elif "pdf" in item.text(1):
-            result = QtGui.QMessageBox.question(self, _("Re-open"),
-                                                _(
-                                                "Do you want to review and/or reprint this item?"),
-                                                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                                QtGui.QMessageBox.Yes)
+            result = QtGui.QMessageBox.question(
+                self,
+                _("Re-open"),
+                _("Do you want to review and/or reprint this item?"),
+                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                QtGui.QMessageBox.Yes)
             if result == QtGui.QMessageBox.Yes:
                 try:
                     data, version = docsprinted.getData(ix)
@@ -916,8 +985,13 @@ class OpenmolarGui(QtGui.QMainWindow):
         load the docsImported listWidget
         '''
         self.ui.importDoc_treeWidget.clear()
-        self.ui.importDoc_treeWidget.setHeaderLabels([_("Date imported"),
-                                                      _("Description"), _("Size"), _("Type"), "Index"])
+        self.ui.importDoc_treeWidget.setHeaderLabels([
+            _("Date imported"),
+            _("Description"),
+            _("Size"),
+            _("Type"),
+            _("Index")
+        ])
 
         docs = docsimported.storedDocs(self.pt.serialno)
         for doc in docs:
@@ -949,11 +1023,12 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         ix = int(item.text(4))
         print "opening file index ", ix
-        result = QtGui.QMessageBox.question(self, _("Re-open"),
-                                            _(
-                                            "Do you want to open a copy of this document?"),
-                                            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                            QtGui.QMessageBox.Yes)
+        result = QtGui.QMessageBox.question(
+            self,
+            _("Re-open"),
+            _("Do you want to open a copy of this document?"),
+            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+            QtGui.QMessageBox.Yes)
         if result == QtGui.QMessageBox.Yes:
             try:
                 fpath = os.path.join(localsettings.localFileDirectory,
@@ -1030,12 +1105,13 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         cycle forwards through the list of recently visited records
         '''
-        desiredPos = localsettings.recent_sno_index + 1
+        offset = 0 if self.pt.serialno == 0 else 1
+        desiredPos = localsettings.recent_sno_index + offset
         try:
             self.getrecord(localsettings.recent_snos[desiredPos],
                            addToRecentSnos=False)
         except IndexError:
-            self.advise(_("Reached end of the List"))
+            self.advise(_("Reached End of Record History"))
 
     def last_patient(self):
         '''
@@ -1045,11 +1121,11 @@ class OpenmolarGui(QtGui.QMainWindow):
             desiredPos = localsettings.recent_sno_index
         else:
             desiredPos = localsettings.recent_sno_index - 1
-        if len(localsettings.recent_snos) > desiredPos >= 0:
+        try:
             self.getrecord(localsettings.recent_snos[desiredPos],
                            addToRecentSnos=False)
-        else:
-            self.advise(_("Reached Start of the List"))
+        except IndexError:
+            self.advise(_("Reached Start Record History"))
 
     def apply_editpage_changes(self):
         '''
@@ -1092,7 +1168,8 @@ class OpenmolarGui(QtGui.QMainWindow):
         sno = self.ui.accounts_tableWidget.item(row, 1).text()
         self.getrecord(int(sno))
 
-    def getrecord(self, serialno,
+    def getrecord(self,
+                  serialno,
                   checkedNeedToLeaveAlready=False,
                   addToRecentSnos=True,
                   newPatientReload=False
@@ -1105,47 +1182,51 @@ class OpenmolarGui(QtGui.QMainWindow):
         if serialno in (0, None):
             self.update_family_label()
             return
+        LOGGER.info("loading record %s", serialno)
+        if self.pt and serialno == self.pt.serialno and not newPatientReload:
+            self.ui.main_tabWidget.setCurrentIndex(0)
+            self.advise(_("Patient already loaded"))
+            return
+        elif not checkedNeedToLeaveAlready and not self.okToLeaveRecord():
+            print "not loading"
+            self.advise(_("Not loading patient"))
+            return
 
-        if addToRecentSnos:
+        try:
+            self.pt = patient_class.patient(serialno)
+            self.pt_diary_widget.set_patient(self.pt)
+
+            try:
+                self.loadpatient(newPatientReload=newPatientReload)
+            except Exception as e:
+                message = _("Error populating interface")
+                LOGGER.exception(message)
+                self.advise(u"<b>%s</b><hr /><pre>%s" % (message, e), 2)
+
+        except localsettings.PatientNotFoundError:
+            print "NOT FOUND ERROR"
+            self.advise(_("error getting serialno") + " %d - " % serialno +
+                        _("please check this number is correct?"), 1)
+        except Exception as exc:
+            LOGGER.exception("Unknown ERROR loading patient - serialno %s",
+                             serialno)
+            self.advise("Unknown Error - Tell Neil<br />%s" % exc, 2)
+
+        if addToRecentSnos:  # add to end of list
             try:
                 localsettings.recent_snos.remove(serialno)
             except ValueError:
                 pass
             localsettings.recent_snos.append(serialno)
+            can_go_forwards = False
+        else:
+            can_go_forwards = serialno != localsettings.recent_snos[-1]
         localsettings.recent_sno_index = localsettings.recent_snos.index(
             serialno)
 
         can_go_back = localsettings.recent_sno_index > 0
         self.ui.backButton.setEnabled(can_go_back)
-        self.ui.nextButton.setEnabled(
-            localsettings.recent_sno_index < len(localsettings.recent_snos) - 1)
-
-        if (self.pt and serialno == self.pt.serialno and not newPatientReload):
-            self.ui.main_tabWidget.setCurrentIndex(0)
-            self.advise(_("Patient already loaded"))
-        elif not checkedNeedToLeaveAlready and not self.okToLeaveRecord():
-            print "not loading"
-            self.advise(_("Not loading patient"))
-        else:
-            try:
-                self.pt = patient_class.patient(serialno)
-                self.pt_diary_widget.set_patient(self.pt)
-
-                try:
-                    self.loadpatient(newPatientReload=newPatientReload)
-                except Exception as e:
-                    message = _("Error populating interface")
-                    LOGGER.exception(message)
-                    self.advise(u"<b>%s</b><hr /><pre>%s" % (message, e), 2)
-
-            except localsettings.PatientNotFoundError:
-                print "NOT FOUND ERROR"
-                self.advise(_("error getting serialno") + " %d - " % serialno +
-                            _("please check this number is correct?"), 1)
-            except Exception as exc:
-                LOGGER.exception(
-                    "Unknown ERROR loading patient - serialno %d" % serialno)
-                self.advise("Unknown Error - Tell Neil<br />%s" % exc, 2)
+        self.ui.nextButton.setEnabled(can_go_forwards)
 
     def reload_patient(self):
         '''
@@ -1201,6 +1282,13 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.load_receptionSummaryPage()
         self.ui.actionFix_Locked_New_Course_of_Treatment.setEnabled(False)
         #--populate dnt1 and dnt2 comboboxes
+        if not self.pt.dnt1:
+            if len(localsettings.activedents) == 1:
+                self.pt.dnt1 = localsettings.activedent_ixs[0]
+                self.advise("%s %s %s" % (_("Setting"),
+                                          localsettings.activedents[0],
+                                          _("as patient's dentist"))
+                            )
         self.load_dentComboBoxes(newPatientReload)
         self.pt.checkExemption()
         self.updateDetails()
@@ -1209,9 +1297,11 @@ class OpenmolarGui(QtGui.QMainWindow):
 
         self.ui.notes_webView.setHtml("")
         self.ui.notesEnter_textEdit.setText("")
-        for chart in (self.ui.staticChartWidget, self.ui.planChartWidget,
-                      self.ui.completedChartWidget, self.ui.perioChartWidget,
-                      self.ui.summaryChartWidget):
+        for chart in (self.ui.staticChartWidget,
+                      self.ui.planChartWidget,
+                      self.ui.completedChartWidget,
+                      self.ui.summaryChartWidget
+                      ):
             chart.clear()
             #--necessary to restore the chart to full dentition
         self.selectedChartWidget = "st"
@@ -1221,7 +1311,7 @@ class OpenmolarGui(QtGui.QMainWindow):
 
         self.ui.toothPropsWidget.setTooth("ur8", "st")
         charts_gui.chartsTable(self)
-        charts_gui.bpe_dates(self)
+        charts_gui.bpe_table(self, 0)
 
         try:
             pos = localsettings.CSETYPES.index(self.pt.cset)
@@ -1243,6 +1333,7 @@ class OpenmolarGui(QtGui.QMainWindow):
         if self.ui.tabWidget.currentIndex() == 4:  # clinical summary
             self.ui.summaryChartWidget.update()
         self.ui.debugBrowser.setText("")
+        self.debug_browser_refresh_func = None
 
         self.update_family_label()
         self.medalert()
@@ -1274,7 +1365,7 @@ class OpenmolarGui(QtGui.QMainWindow):
 
             Dialog.exec_()
             if dl.checkBox.checkState():
-                LOGGER.debug("deleting Memo %s" % umemo.ix)
+                LOGGER.debug("deleting Memo %s", umemo.ix)
                 memos.deleteMemo(umemo.ix)
 
     def newCustomMemo(self):
@@ -1375,19 +1466,19 @@ class OpenmolarGui(QtGui.QMainWindow):
 
     def find_patient(self):
         if self.enteringNewPatient():
-                return
-        if not self.okToLeaveRecord():
-            print "not loading"
+            pass
+        elif not self.okToLeaveRecord():
             self.advise(_("Not loading patient"))
-            return
-
-        dl = FindPatientDialog(self)
-        if dl.exec_():
-            if dl.chosen_sno:
+        else:
+            dl = FindPatientDialog(self)
+            if dl.exec_() and dl.chosen_sno:
                 self.getrecord(dl.chosen_sno, True)
 
-    def set_surgery_mode(self, surgery):
-        localsettings.station = "surgery" if surgery else "reception"
+    def set_surgery_mode(self, is_surgery=None):
+        if is_surgery is None:
+            is_surgery = localsettings.station == "surgery"
+        localsettings.station = "surgery" if is_surgery else "reception"
+        self.ui.actionSurgery_Mode.setChecked(is_surgery)
         self.set_operator_label()
         self.gotoDefaultTab()
 
@@ -1396,8 +1487,7 @@ class OpenmolarGui(QtGui.QMainWindow):
             if localsettings.station == "surgery":
                 op_text = " <b>" + _("NO CLINICIAN SET") + "</b> - "
                 self.advise(
-                    _("you are in surgery mode without a clinician"),
-                    1)
+                    _("You are in surgery mode without a clinician"))
             else:
                 op_text = ""
         else:
@@ -1427,9 +1517,7 @@ class OpenmolarGui(QtGui.QMainWindow):
         else:
             self.ui.tabWidget.setCurrentIndex(3)
 
-        self.ui.reception_textBrowser.setHtml(localsettings.message)
         self.ui.recNotes_webView.setHtml("")
-        self.ui.notesSummary_webView.setHtml(localsettings.message)
 
         today = QtCore.QDate().currentDate()
         self.ui.daybookEndDateEdit.setDate(today)
@@ -1447,12 +1535,12 @@ class OpenmolarGui(QtGui.QMainWindow):
                      self.ui.pcdeEdit, self.ui.sexEdit):
             widg.setPalette(palette)
 
-        self.ui.forumViewFilter_comboBox.addItems(
-            localsettings.allowed_logins)
-
         self.forum_mode()
         self.addHistoryMenu()
 
+        self.ui.perio_scrollArea.setWidget(
+            QtGui.QLabel("perio interface is being rewritten"))
+
     def addHistoryMenu(self):
         '''
         add items to a toolbutton for trawling the database
@@ -1626,8 +1714,9 @@ class OpenmolarGui(QtGui.QMainWindow):
         dl = MedNotesDialog(self.pt, self)
         if dl.exec_():
             dl.apply()
-            self.advise("Updated Medical Notes", 1)
+            self.advise("Updated Medical Notes")
             self.medalert()
+            self.updateHiddenNotesLabel()
 
     def newBPE_Dialog(self):
         '''
@@ -1644,10 +1733,8 @@ class OpenmolarGui(QtGui.QMainWindow):
             newnotes = str(self.ui.notesEnter_textEdit.toPlainText().toAscii())
             newnotes += " bpe of %s recorded \n" % result[1]
             self.ui.notesEnter_textEdit.setText(newnotes)
-            self.ui.bpe_textBrowser
         else:
             self.advise("BPE not applied", 2)
-        charts_gui.bpe_dates(self)
         charts_gui.bpe_table(self, 0)
 
     def nhsformOptionsDialog(self):
@@ -1663,9 +1750,12 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         if self.pt.serialno != self.pt.dbstate.serialno:
             # this should NEVER happen!!!
-            self.advise(
-                _('''POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS''') +
-                ' %d and %d' % (self.pt.serialno, self.pt.dbstate.serialno), 2)
+            message = "%s %s %s %s" % (
+                _('POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS'),
+                self.pt.serialno,
+                _("AND"),
+                self.pt.dbstate.serialno)
+            self.advise(message, 2)
             return []
 
         changes = self.pt.changes
@@ -1696,14 +1786,16 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.apply_editpage_changes()
         uc = self.unsavedChanges()
         if uc != []:
-            print "changes made to patient atttributes..... updating database"
+            LOGGER.info(
+                "changes made to patient atttributes..... updating database")
             result = patient_write_changes.all_changes(self.pt, uc)
-            daybook_module.updateDaybook(self)
-            if self.pt.est_logger is not None:
-                self.pt.est_logger.add_row(
-                    self.pt.courseno0, self.pt.est_logger_text)
 
-            if result:  # True if sucessful
+            if result:  # True if successful
+                daybook_module.updateDaybook(self)
+                if self.pt.est_logger is not None:
+                    self.pt.est_logger.add_row(
+                        self.pt.courseno0, self.pt.est_logger_text)
+
                 if not leavingRecord and "estimates" in uc:
                     #-- necessary to get index numbers for estimate data types
                     self.pt.getEsts()
@@ -1727,9 +1819,9 @@ class OpenmolarGui(QtGui.QMainWindow):
             result = patient_write_changes.toNotes(
                 self.pt.serialno, notetuplets)
 
-            #--sucessful write to db?
+            #--successful write to db?
             if result:
-                #--result will be a "line number" or -1 if unsucessful write
+                #--result will be a "line number" or -1 if unsuccessful write
                 self.ui.notesEnter_textEdit.setText("")
                 self.ui.hiddenNotes_label.setText("")
                 self.pt.getNotesTuple()
@@ -1760,27 +1852,38 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.ui.summaryChartWidget,
             self.ui.printEst_pushButton,
             self.ui.printAccount_pushButton,
-            # self.ui.relatedpts_pushButton,
             self.ui.saveButton,
             self.ui.phraseBook_pushButton,
             self.ui.clinician_phrasebook_pushButton,
-            self.ui.exampushButton,
-            self.ui.xray_pushButton,
             self.ui.medNotes_pushButton,
             self.ui.printGP17_pushButton,
-            self.ui.newBPE_pushButton,
-            self.ui.hygWizard_pushButton,
             self.ui.notesEnter_textEdit,
             self.ui.synopsis_lineEdit,
             self.ui.memos_pushButton,
             self.pt_diary_widget,
-            self.ui.childsmile_button,
+            self.ui.reloadButton,
         ):
-
             widg.setEnabled(arg)
 
+        enable_tx_buts = arg and localsettings.clinicianNo != 0
+        for widg in (
+            self.ui.exampushButton,
+            self.ui.xray_pushButton,
+            self.ui.newBPE_pushButton,
+            self.ui.hygWizard_pushButton,
+            self.ui.childsmile_button,
+            self.ui.completedChartWidget
+        ):
+            widg.setEnabled(enable_tx_buts)
+
         self.ui.closeCourse_pushButton.setEnabled(False)
         self.ui.actionFix_Locked_New_Course_of_Treatment.setEnabled(False)
+        if not arg:
+            self.ui.backButton.setEnabled(len(localsettings.recent_snos))
+            self.ui.nextButton.setEnabled(False)
+
+        self.ui.relatedpts_pushButton.setEnabled(
+            bool(self.pt.serialno or self.pt.familyno))
 
         for i in (0, 1, 2, 5, 6, 7, 8, 9):
             if self.ui.tabWidget.isTabEnabled(i) != arg:
@@ -1820,15 +1923,23 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.advise(_("no record selected"), 1)
         else:
             if permissions.granted(self):
-                dl = recordtools.recordTools(self)
-                dl.exec_()
+                dl = AdvancedRecordManagementDialog(self.pt, self)
+                if dl.exec_():
+                    LOGGER.warning(
+                        "Applying changes from AdvancedRecordManagementDialog")
+                    dl.apply()
+                    self.updateDetails()
+                    self.updateHiddenNotesLabel()
 
     def apptBook_fontSize(self):
         '''
         user is asking for a different font on the appointment book
         '''
-        i, result = QtGui.QInputDialog.getInteger(self, _("FontSize"),
-                                                  _("Enter your preferred font size for appointment book"), 8, 6, 16)
+        i, result = QtGui.QInputDialog.getInteger(
+            self,
+            _("FontSize"),
+            _("Enter your preferred font size for appointment book"),
+            8, 6, 16)
         if result:
             self.diary_widget.aptFontSize(i)
 
@@ -1889,9 +2000,7 @@ class OpenmolarGui(QtGui.QMainWindow):
         fees_module.expandFees(self)
 
     def plan_page_course_but_clicked(self):
-        if self.pt.underTreatment:  # shouldn't happen
-            return
-        course_module.setupNewCourse(self)
+        course_module.newCourseNeeded(self)
 
     def closeTx_pushButton_clicked(self):
         '''
@@ -1899,13 +2008,15 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         if self.pt.underTreatment:
             course_module.closeCourse(self)
-            # static items may have changed
-            charts_gui.chartsTable(self)
-            self.load_clinicalSummaryPage()
-            self.ui.summaryChartWidget.update()
-
         else:
             course_module.resumeCourse(self)
+        # static items may have changed
+        self.refresh_charts()
+
+    def refresh_charts(self):
+        charts_gui.chartsTable(self)
+        self.load_clinicalSummaryPage()
+        self.ui.summaryChartWidget.update()
 
     def showExamDialog(self):
         '''
@@ -1941,6 +2052,8 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         add Xray items to COMPLETED tx
         '''
+        if course_module.newCourseNeeded(self):
+            return
         manipulate_plan.xrayAdd(self, complete=True)
 
     def addPerioItems(self):
@@ -1980,7 +2093,7 @@ class OpenmolarGui(QtGui.QMainWindow):
         fees_module.showTableXML(self)
 
     def handle_chart_treatment_input(self, tooth, prop, completed):
-        LOGGER.debug("%s %s completed=%s" % (tooth, prop, completed))
+        LOGGER.debug("%s %s completed=%s", tooth, prop, completed)
         if course_module.newCourseNeeded(self):
             return
 
@@ -2008,19 +2121,18 @@ class OpenmolarGui(QtGui.QMainWindow):
                 continue
             n_txs = existing_cmp_items.count(tx)
             courseno = self.pt.treatment_course.courseno
-            if (completed and tx in existing_pl_items):
+            if completed and tx in existing_pl_items:
                 hash_ = localsettings.hash_func(
                     "%s%s%s%s" % (courseno, tooth, n_txs + 1, tx))
                 tx_hash = estimates.TXHash(hash_)
+                self.advise(
+                    _("Moving existing treatment from plan to completed."))
                 manipulate_plan.tx_hash_complete(self, tx_hash)
-            elif not completed and n_txs:
-                hash_ = localsettings.hash_func(
-                    "%s%s%s%s" % (courseno, tooth, n_txs, tx))
-                tx_hash = estimates.TXHash(hash_)
-                manipulate_plan.tx_hash_reverse(self, tx_hash)
             else:
-                manipulate_plan.add_treatments_to_plan(self,
-                                                      ((tooth, tx),), completed)
+                manipulate_plan.add_treatments_to_plan(
+                    self,
+                    ((tooth, tx),),
+                    completed)
 
         if removals:
             manipulate_plan.remove_treatments_from_plan_and_est(
@@ -2206,60 +2318,65 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         show all past payments for a patient
         '''
-        html = paymentHistory.details(self.pt.serialno)
-        self.ui.debugBrowser.setText(html)
+        self.debug_browser_refresh_func = partial(
+            paymentHistory.details, self.pt.serialno)
+        self.refresh_debug_browser()
 
     def pastTreatment_clicked(self):
         '''
         show all past estimates for a patient
         '''
-        html = daybookHistory.details(self.pt.serialno)
-        self.ui.debugBrowser.setText(html)
+        self.debug_browser_refresh_func = partial(
+            daybookHistory.details, self.pt.serialno)
+        self.refresh_debug_browser()
 
     def pastCourses_clicked(self):
         '''
         show all past treatment plans for a patient
         (including treatment that was never carried out)
         '''
-        html = courseHistory.details(self.pt.serialno)
-        self.ui.debugBrowser.setText(html)
+        dl = CourseHistoryOptionsDialog(self)
+        if dl.exec_():
+            self.debug_browser_refresh_func = partial(
+                courseHistory.details,
+                self.pt.serialno,
+                self.pt.courseno0 if self.pt.underTreatment else None,
+                dl.include_estimates,
+                dl.include_daybook
+            )
+            self.refresh_debug_browser()
 
     def pastEstimates_clicked(self):
         '''
         show all past estimates for a patient
         '''
-        html = estimatesHistory.details(self.pt.serialno)
-        self.ui.debugBrowser.setText(html)
-
-    def past_course_estimates_clicked(self):
-        '''
-        show all past treatment plans for a patient
-        (including treatment that was never carried out)
-        and include the estimate for that course
-        '''
-        html = courseHistory.all_details(self.pt.serialno)
-        self.ui.debugBrowser.setText(html)
+        self.debug_browser_refresh_func = partial(
+            estimatesHistory.details, self.pt.serialno)
+        self.refresh_debug_browser()
 
     def NHSClaims_clicked(self):
         '''
         show all past NHS claims for a patient
         '''
-        html = nhs_claims.details(self.pt.serialno)
-        self.ui.debugBrowser.setText(html)
+        self.debug_browser_refresh_func = partial(
+            nhs_claims.details, self.pt.serialno)
+        self.refresh_debug_browser()
 
     def show_memo_history(self):
         '''
         show all memos for a patient
         '''
-        html = memos.html_history(self.pt.serialno)
-        self.ui.debugBrowser.setText(html)
+        self.debug_browser_refresh_func = partial(
+            memos.html_history, self.pt.serialno)
+        self.refresh_debug_browser()
 
     def show_estimate_versioning(self):
         '''
         show how the current estimate has changed
         '''
-        html = est_logger.html_history(self.pt.courseno0)
-        self.ui.debugBrowser.setText(html)
+        self.debug_browser_refresh_func = partial(
+            est_logger.html_history, self.pt.serialno)
+        self.refresh_debug_browser()
 
     def nhsClaimsShortcut(self):
         '''
@@ -2287,8 +2404,9 @@ class OpenmolarGui(QtGui.QMainWindow):
             txtype = None
 
         changesOnly = self.ui.ptAtts_checkBox.isChecked()
-        html = debug_html.toHtml(self.pt, txtype, changesOnly)
-        self.ui.debugBrowser.setText(html)
+        self.debug_browser_refresh_func = partial(
+            debug_html.toHtml, self.pt, txtype, changesOnly)
+        self.refresh_debug_browser()
 
     def cashbookView(self):
         '''
@@ -2418,10 +2536,9 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         normal notes print
         '''
-        self.advise(
-            _(
-                "use the checkboxes on the notes tab to control what is printed."),
-            1)
+        message = _("use the checkboxes on the notes tab "
+                    "to control what is printed.")
+        self.advise(message, 1)
         om_printing.printNotes(self)
 
     def printMH(self):
@@ -2440,7 +2557,7 @@ class OpenmolarGui(QtGui.QMainWindow):
 
     def notes_link_clicked(self, url):
         url_text = url.toString()
-        m = re.match("edit_notes\?(\d+|\|\|SNO\|\|)", url_text)
+        m = re.match(r"edit_notes\?(\d+|\|\|SNO\|\|)", url_text)
         if m:
             if m.groups()[0] == "||SNO||":
                 serialno = self.pt.serialno
@@ -2492,7 +2609,6 @@ class OpenmolarGui(QtGui.QMainWindow):
         self.signals_charts()
         self.signals_editPatient()
         self.signals_notesPage()
-        self.signals_periochart()
         self.signals_tabs()
         self.signals_appointments()
         self.signals_forum()
@@ -2505,99 +2621,59 @@ class OpenmolarGui(QtGui.QMainWindow):
         connect the signals from various buttons which do not
         belong to any other function
         '''
-        QtCore.QObject.connect(self.ui.closeCourse_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.saveButton,
-                               QtCore.SIGNAL("clicked()"), self.saveButtonClicked)
-
-        QtCore.QObject.connect(self.ui.exampushButton,
-                               QtCore.SIGNAL("clicked()"), self.showExamDialog)
-
-        QtCore.QObject.connect(self.ui.hygWizard_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.showHygDialog)
-
-        QtCore.QObject.connect(self.ui.xray_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.addXrays)
-
-        QtCore.QObject.connect(self.ui.newBPE_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.newBPE_Dialog)
-
-        QtCore.QObject.connect(self.ui.medNotes_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.showMedNotes)
-
+        self.ui.closeCourse_pushButton.clicked.connect(
+            self.closeTx_pushButton_clicked)
+        self.ui.saveButton.clicked.connect(self.saveButtonClicked)
+        self.ui.exampushButton.clicked.connect(self.showExamDialog)
+        self.ui.hygWizard_pushButton.clicked.connect(self.showHygDialog)
+        self.ui.xray_pushButton.clicked.connect(self.addXrays)
+        self.ui.newBPE_pushButton.clicked.connect(self.newBPE_Dialog)
+        self.ui.medNotes_pushButton.clicked.connect(self.showMedNotes)
         self.ui.phraseBook_pushButton.clicked.connect(
             self.show_phrase_book_dialog)
         self.ui.clinician_phrasebook_pushButton.clicked.connect(
             self.show_clinician_phrase_book_dialog)
-
-        QtCore.QObject.connect(self.ui.memos_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.newCustomMemo)
-
-        QtCore.QObject.connect(self.ui.childsmile_button,
-                               QtCore.SIGNAL("clicked()"), self.childsmile_button_clicked)
-
+        self.ui.memos_pushButton.clicked.connect(self.newCustomMemo)
+        self.ui.childsmile_button.clicked.connect(
+            self.childsmile_button_clicked)
         self.ui.actionSurgery_Mode.toggled.connect(self.set_surgery_mode)
         self.ui.actionDocuments_Dialog.triggered.connect(
             self.documents_pushButton_clicked)
 
     def signals_admin(self):
         # admin frame
-        QtCore.QObject.connect(self.ui.home_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.home)
-
-        QtCore.QObject.connect(self.ui.newPatientPushButton,
-                               QtCore.SIGNAL("clicked()"), self.enterNewPatient)
-
-        QtCore.QObject.connect(self.ui.findButton,
-                               QtCore.SIGNAL("clicked()"), self.find_patient)
-
-        QtCore.QObject.connect(self.ui.reloadButton,
-                               QtCore.SIGNAL("clicked()"), self.reload_patient)
-
-        QtCore.QObject.connect(self.ui.backButton,
-                               QtCore.SIGNAL("clicked()"), self.last_patient)
-
-        QtCore.QObject.connect(self.ui.nextButton,
-                               QtCore.SIGNAL("clicked()"), self.next_patient)
-
-        QtCore.QObject.connect(self.ui.relatedpts_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.find_related)
-
-        QtCore.QObject.connect(self.ui.dayList_comboBox,
-                               QtCore.SIGNAL("currentIndexChanged(int)"), self.todays_pts)
+        self.ui.home_pushButton.clicked.connect(self.home)
+        self.ui.newPatientPushButton.clicked.connect(self.enterNewPatient)
+        self.ui.findButton.clicked.connect(self.find_patient)
+        self.ui.reloadButton.clicked.connect(self.reload_patient)
+        self.ui.backButton.clicked.connect(self.last_patient)
+        self.ui.nextButton.clicked.connect(self.next_patient)
+        self.ui.relatedpts_pushButton.clicked.connect(self.find_related)
+        self.ui.dayList_comboBox.currentIndexChanged.connect(self.todays_pts)
 
     def signals_reception(self):
         '''
         a function to connect all the receptionists buttons
         '''
-
-        QtCore.QObject.connect(self.ui.printAccount_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.printaccount)
-
-        QtCore.QObject.connect(self.ui.printEst_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.printEstimate)
-
-        QtCore.QObject.connect(self.ui.printRecall_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.printrecall)
-
-        QtCore.QObject.connect(self.ui.takePayment_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.takePayment_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.printGP17_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.printGP17_clicked)
+        self.ui.printAccount_pushButton.clicked.connect(self.printaccount)
+        self.ui.printEst_pushButton.clicked.connect(self.printEstimate)
+        self.ui.printRecall_pushButton.clicked.connect(self.printrecall)
+        self.ui.takePayment_pushButton.clicked.connect(
+            self.takePayment_pushButton_clicked)
+        self.ui.printGP17_pushButton.clicked.connect(self.printGP17_clicked)
 
     def signals_notes(self):
         '''
         all the notes browsers need to send a signal when they have loaded
         so that they can be scrolled to the end
         '''
-        for wv in (self.ui.recNotes_webView, self.ui.notes_webView,
+        for wv in (self.ui.recNotes_webView,
+                   self.ui.notes_webView,
                    self.ui.notesSummary_webView):
-            QtCore.QObject.connect(wv,
-                                   QtCore.SIGNAL("loadFinished(bool)"), self.webviewloaded)
+            wv.loadFinished.connect(self.webviewloaded)
 
-        for wv in (self.ui.notes_webView, self.ui.notesSummary_webView,
+        for wv in (self.ui.notes_webView,
+                   self.ui.notesSummary_webView,
                    self.diary_widget.ui.appt_notes_webView):
             wv.linkClicked.connect(self.notes_link_clicked)
 
@@ -2605,46 +2681,23 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         connect buttons which print stuff
         '''
-        QtCore.QObject.connect(self.ui.receiptPrintButton,
-                               QtCore.SIGNAL("clicked()"), self.printDupReceipt)
-
-        QtCore.QObject.connect(self.ui.notesPrintButton,
-                               QtCore.SIGNAL("clicked()"), self.printNotes)
-
-        QtCore.QObject.connect(self.ui.referralLettersPrintButton,
-                               QtCore.SIGNAL("clicked()"), self.printReferral)
-
-        QtCore.QObject.connect(self.ui.standardLetterPushButton,
-                               QtCore.SIGNAL("clicked()"), self.printLetter)
-
-        QtCore.QObject.connect(self.ui.recallLoad_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.exportRecalls)
-
-        QtCore.QObject.connect(self.ui.bulkMail_options_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.bulkMailLetterOptions)
-
-        QtCore.QObject.connect(self.ui.bulkMailPrint_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.bulkMailPrint)
-
-        QtCore.QObject.connect(self.ui.bulk_mail_expand_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.bulkMailExpand)
-
-        QtCore.QObject.connect(self.ui.importDoc_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.importDoc)
-
-        QtCore.QObject.connect(self.ui.account2_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.accountButton2Clicked)
-
-        QtCore.QObject.connect(self.ui.prevCorres_treeWidget,
-                               QtCore.SIGNAL(
-                                   "itemDoubleClicked (QTreeWidgetItem *,int)"),
-                               self.showPrevPrintedDoc)
-
-        QtCore.QObject.connect(self.ui.importDoc_treeWidget,
-                               QtCore.SIGNAL(
-                                   "itemDoubleClicked (QTreeWidgetItem *,int)"),
-                               self.showImportedDoc)
-
+        self.ui.receiptPrintButton.clicked.connect(self.printDupReceipt)
+        self.ui.notesPrintButton.clicked.connect(self.printNotes)
+        self.ui.referralLettersPrintButton.clicked.connect(
+            self.printReferral)
+        self.ui.standardLetterPushButton.clicked.connect(self.printLetter)
+        self.ui.recallLoad_pushButton.clicked.connect(self.exportRecalls)
+        self.ui.bulkMail_options_pushButton.clicked.connect(
+            self.bulkMailLetterOptions)
+        self.ui.bulkMailPrint_pushButton.clicked.connect(self.bulkMailPrint)
+        self.ui.bulk_mail_expand_pushButton.clicked.connect(
+            self.bulkMailExpand)
+        self.ui.importDoc_pushButton.clicked.connect(self.importDoc)
+        self.ui.account2_pushButton.clicked.connect(self.accountButton2Clicked)
+        self.ui.prevCorres_treeWidget.itemDoubleClicked.connect(
+            self.showPrevPrintedDoc)
+        self.ui.importDoc_treeWidget.itemDoubleClicked.connect(
+            self.showImportedDoc)
         self.ui.medicalPrintButton.clicked.connect(self.printMH)
 
     def signals_menu(self):
@@ -2664,153 +2717,124 @@ class OpenmolarGui(QtGui.QMainWindow):
         self.ui.actionTable_View_For_Charting.toggled.connect(
             self.showChartTable)
         self.ui.actionClear_Today_s_Emergency_Slots.triggered.connect(
-            self.diary_widget.clearTodaysEmergencyTime)
+            self.clear_todays_emergencies)
+        self.ui.actionInsert_Regular_Blocks.triggered.connect(
+            self.insert_regular_blocks)
         self.ui.actionTest_Print_a_GP17.triggered.connect(self.testGP17)
         self.ui.actionNHS_Form_Settings.triggered.connect(
             self.nhsformOptionsDialog)
-        self.ui.actionAppointment_Tools.triggered.connect(
-            self.diary_widget.appointmentTools)
         self.ui.actionPrint_Daylists.triggered.connect(self.daylistPrintWizard)
         self.ui.actionAdvanced_Record_Management.triggered.connect(
             self.advancedRecordTools)
         self.ui.actionFix_Locked_New_Course_of_Treatment.triggered.connect(
             self.fix_zombied_course)
+        self.ui.action_all_history_edits.triggered.connect(
+            self.allow_all_history_edits)
         self.ui.actionAllow_Full_Edit.triggered.connect(
             self.ui.cashbookTextBrowser.allow_full_edit)
         self.ui.actionSet_Surgery_Number.triggered.connect(
             self.set_surgery_number)
         self.ui.actionEdit_Phrasebooks.triggered.connect(self.edit_phrasebooks)
         self.ui.actionAllow_Edit.triggered.connect(self.allow_edit_daybook)
+        self.ui.actionAllow_Edit_Treatment.triggered.connect(
+            self.allow_edit_daybook)
         self.ui.actionEnable_Filters.triggered.connect(
             self.enable_daybook_filters)
+        self.ui.actionEdit_Courses.triggered.connect(self.edit_currtrtmt2)
+        self.ui.actionEdit_Estimates.triggered.connect(self.edit_estimates)
+        self.ui.actionEdit_Referral_Centres.triggered.connect(
+            self.edit_referral_centres)
+        self.ui.actionReset_Supervisor_Password.triggered.connect(
+            self.reset_supervisor)
+        self.ui.actionAdd_User.triggered.connect(self.add_user)
+        self.ui.actionAdd_Clinician.triggered.connect(self.add_clinician)
+        self.ui.actionEdit_Practice_Details.triggered.connect(
+            self.edit_practice)
 
     def signals_estimates(self):
-        # Estimates and course ManageMent
-        QtCore.QObject.connect(self.ui.closeTx_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.estLetter_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.customEstimate)
-
-        QtCore.QObject.connect(self.ui.recalcEst_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.recalculateEstimate)
-
-        QtCore.QObject.connect(self.ui.apply_exemption_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.apply_exemption)
-
-        QtCore.QObject.connect(self.ui.rec_apply_exemption_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.apply_exemption)
-
+        # Estimates and Course Management
+        self.ui.closeTx_pushButton.clicked.connect(
+            self.closeTx_pushButton_clicked)
+        self.ui.estLetter_pushButton.clicked.connect(
+            self.customEstimate)
+        self.ui.recalcEst_pushButton.clicked.connect(
+            self.recalculateEstimate)
+        self.ui.apply_exemption_pushButton.clicked.connect(
+            self.apply_exemption)
+        self.ui.rec_apply_exemption_pushButton.clicked.connect(
+            self.apply_exemption)
         self.ui.xrayTxpushButton.clicked.connect(self.addXrayItems)
         self.ui.perioTxpushButton.clicked.connect(self.addPerioItems)
         self.ui.dentureTxpushButton.clicked.connect(self.add_denture_items)
         self.ui.otherTxpushButton.clicked.connect(self.addOtherItems)
         self.ui.customTx_pushButton.clicked.connect(self.addCustomItem)
-
         self.ui.estWidget.updated_fees_signal.connect(self.updateDetails)
-
-        QtCore.QObject.connect(self.ui.estWidget,
-                               QtCore.SIGNAL("deleteItem"), self.estwidget_deleteTxItem)
+        self.ui.estWidget.delete_estimate_item.connect(
+            self.estwidget_deleteTxItem)
 
     def signals_plan(self):
         self.ui.advanced_tx_planning_button.clicked.connect(
             self.advanced_tx_planning)
-
         self.ui.plan_listView.customContextMenuRequested.connect(
             self.show_plan_listview_context_menu)
         self.ui.plan_listView.doubleClicked.connect(
             self.handle_plan_listview_2xclick)
-
         self.ui.completed_listView.customContextMenuRequested.connect(
             self.show_cmp_listview_context_menu)
         self.ui.completed_listView.doubleClicked.connect(
             self.handle_completed_listview_2xclick)
-
         self.ui.planChartWidget.request_tx_context_menu_signal.connect(
             self.show_plan_chart_context_menu)
         self.ui.completedChartWidget.request_tx_context_menu_signal.connect(
             self.show_cmp_chart_context_menu)
-
         self.ui.plan_course_manage_button.clicked.connect(
             self.plan_page_course_but_clicked)
 
     def signals_bulk_mail(self):
-        QtCore.QObject.connect(self.ui.bulk_mailings_treeView,
-                               QtCore.SIGNAL(
-                               "doubleClicked (const QModelIndex&)"),
-                               self.bulk_mail_doubleclicked)
+        self.ui.bulk_mailings_treeView.doubleClicked.connect(
+            self.bulk_mail_doubleclicked)
 
     def signals_forum(self):
-        QtCore.QObject.connect(self.ui.forum_treeWidget,
-                               QtCore.SIGNAL("itemSelectionChanged ()"),
-                               self.forum_treeWidget_selectionChanged)
-
+        self.ui.forum_treeWidget.itemSelectionChanged.connect(
+            self.forum_treeWidget_selectionChanged)
         self.ui.action_forum_show_advanced_options.triggered.connect(
             self.forum_mode)
-
-        QtCore.QObject.connect(self.ui.forumDelete_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.forumDeleteItem_clicked)
-
-        QtCore.QObject.connect(self.ui.forumReply_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.forumReply_clicked)
-
-        QtCore.QObject.connect(self.ui.forumNewTopic_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.forumNewTopic_clicked)
-
-        QtCore.QObject.connect(self.ui.forumParent_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.forumParent_clicked)
-
-        QtCore.QObject.connect(self.ui.forumViewFilter_comboBox,
-                               QtCore.SIGNAL(
-                                   "currentIndexChanged (const QString&)"),
-                               self.forumViewFilterChanged)
-
-        QtCore.QObject.connect(self.ui.forumCollapse_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.forumCollapse)
-
-        QtCore.QObject.connect(self.ui.forumExpand_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.forumExpand)
+        self.ui.forumDelete_pushButton.clicked.connect(
+            self.forumDeleteItem_clicked)
+        self.ui.forumReply_pushButton.clicked.connect(
+            self.forumReply_clicked)
+        self.ui.forumNewTopic_pushButton.clicked.connect(
+            self.forumNewTopic_clicked)
+        self.ui.forumParent_pushButton.clicked.connect(
+            self.forumParent_clicked)
+        self.ui.forumViewFilter_comboBox.currentIndexChanged[
+            QtCore.QString].connect(self.forumViewFilterChanged)
+        self.ui.forumCollapse_pushButton.clicked.connect(self.forumCollapse)
+        self.ui.forumExpand_pushButton.clicked.connect(self.forumExpand)
 
         for widg in (self.ui.group_replies_radioButton,
                      self.ui.forum_deletedposts_checkBox):
-            QtCore.QObject.connect(widg,
-                                   QtCore.SIGNAL("toggled (bool)"), self.forum_radioButtons)
+            widg.toggled.connect(self.forum_radioButtons)
 
     def signals_history(self):
-        QtCore.QObject.connect(self.debugMenu,
-                               QtCore.SIGNAL("triggered (QAction *)"), self.showPtAttributes)
-
-        QtCore.QObject.connect(self.ui.ptAtts_checkBox,
-                               QtCore.SIGNAL("stateChanged (int)"), self.updateAttributes)
-
-        QtCore.QObject.connect(self.ui.historyPrint_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.historyPrint)
-
-        QtCore.QObject.connect(self.ui.pastPayments_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.pastPayments_clicked)
-
-        QtCore.QObject.connect(self.ui.pastTreatment_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.pastTreatment_clicked)
-
-        QtCore.QObject.connect(self.ui.pastCourses_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.pastCourses_clicked)
-
-        QtCore.QObject.connect(self.ui.pastEstimates_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.pastEstimates_clicked)
-
-        QtCore.QObject.connect(self.ui.past_course_estimates_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.past_course_estimates_clicked)
-
-        QtCore.QObject.connect(self.ui.NHSClaims_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.NHSClaims_clicked)
-
+        self.debugMenu.triggered.connect(self.showPtAttributes)
+        self.ui.ptAtts_checkBox.stateChanged.connect(self.updateAttributes)
+        self.ui.historyPrint_pushButton.clicked.connect(self.historyPrint)
+        self.ui.pastPayments_pushButton.clicked.connect(
+            self.pastPayments_clicked)
+        self.ui.pastTreatment_pushButton.clicked.connect(
+            self.pastTreatment_clicked)
+        self.ui.pastCourses_pushButton.clicked.connect(
+            self.pastCourses_clicked)
+        self.ui.pastEstimates_pushButton.clicked.connect(
+            self.pastEstimates_clicked)
+        self.ui.NHSClaims_pushButton.clicked.connect(self.NHSClaims_clicked)
         self.ui.memo_history_pushButton.clicked.connect(self.show_memo_history)
         self.ui.current_est_versioning_pushButton.clicked.connect(
             self.show_estimate_versioning)
 
     def signals_daybook(self):
         # daybook - cashbook
-
         self.ui.daybookGoPushButton.clicked.connect(self.daybookView)
         self.ui.daybookPrintButton.clicked.connect(self.daybookPrint)
         self.ui.daybook_filters_pushButton.clicked.connect(
@@ -2824,104 +2848,69 @@ class OpenmolarGui(QtGui.QMainWindow):
 
     def signals_accounts(self):
         # accounts
-        QtCore.QObject.connect(self.ui.loadAccountsTable_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.loadAccountsTable_clicked)
-
-        QtCore.QObject.connect(self.ui.printSelectedAccounts_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.printSelectedAccounts)
-
-        QtCore.QObject.connect(self.ui.printAccountsTable_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.printAccountsTable)
-
-        QtCore.QObject.connect(self.ui.accounts_tableWidget,
-                               QtCore.SIGNAL("cellDoubleClicked (int,int)"),
-                               self.accountsTableClicked)
+        self.ui.loadAccountsTable_pushButton.clicked.connect(
+            self.loadAccountsTable_clicked)
+        self.ui.printSelectedAccounts_pushButton.clicked.connect(
+            self.printSelectedAccounts)
+        self.ui.printAccountsTable_pushButton.clicked.connect(
+            self.printAccountsTable)
+        self.ui.accounts_tableWidget.cellDoubleClicked.connect(
+            self.accountsTableClicked)
 
     def signals_contract(self):
         # contract
         self.ui.status_comboBox.currentIndexChanged.connect(
             self.change_pt_status)
-
-        QtCore.QObject.connect(self.ui.badDebt_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.makeBadDebt_clicked)
-
-        QtCore.QObject.connect(self.ui.contract_tabWidget,
-                               QtCore.SIGNAL("currentChanged(int)"), self.contractTab_navigated)
-
-        QtCore.QObject.connect(self.ui.dnt1comboBox, QtCore.
-                               SIGNAL("activated(const QString&)"), self.dnt1comboBox_clicked)
-
-        QtCore.QObject.connect(self.ui.dnt2comboBox, QtCore.
-                               SIGNAL("activated(const QString&)"), self.dnt2comboBox_clicked)
-
-        QtCore.QObject.connect(self.ui.cseType_comboBox,
-                               QtCore.SIGNAL("activated(const QString&)"),
-                               self.cseType_comboBox_clicked)
-
-        QtCore.QObject.connect(self.ui.editNHS_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.editNHS_pushButton_clicked)
-
-        for le in (self.ui.exemption_lineEdit, self.ui.exempttext_lineEdit):
-            QtCore.QObject.connect(le, QtCore.SIGNAL("editingFinished ()"),
-                                   self.exemption_edited)
-
-        QtCore.QObject.connect(self.ui.editPriv_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.editPriv_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.nhsclaims_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.nhsclaims_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.editHDP_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.editHDP_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.editRegDent_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.editRegDent_pushButton_clicked)
+        self.ui.badDebt_pushButton.clicked.connect(self.makeBadDebt_clicked)
+        self.ui.contract_tabWidget.currentChanged.connect(
+            self.contractTab_navigated)
+        self.ui.dnt1comboBox.activated[QtCore.QString].connect(
+            self.dnt1comboBox_clicked)
+        self.ui.dnt2comboBox.activated[QtCore.QString].connect(
+            self.dnt2comboBox_clicked)
+        self.ui.cseType_comboBox.activated[QtCore.QString].connect(
+            self.cseType_comboBox_clicked)
+        self.ui.editNHS_pushButton.clicked.connect(
+            self.editNHS_pushButton_clicked)
+        self.ui.exemption_lineEdit.editingFinished.connect(
+            self.exemption_edited)
+        self.ui.exempttext_lineEdit.editingFinished.connect(
+            self.exemption_edited)
+        self.ui.editPriv_pushButton.clicked.connect(
+            self.editPriv_pushButton_clicked)
+        self.ui.nhsclaims_pushButton.clicked.connect(
+            self.nhsclaims_pushButton_clicked)
+        self.ui.editHDP_pushButton.clicked.connect(
+            self.editHDP_pushButton_clicked)
+        self.ui.editRegDent_pushButton.clicked.connect(
+            self.editRegDent_pushButton_clicked)
 
     def signals_feesTable(self):
         # feesTable
         # TODO bring this functionality back
         # QtCore.QObject.connect(self.ui.printFeescale_pushButton,
         # QtCore.SIGNAL("clicked()"), self.printFeesTable)
-
-        QtCore.QObject.connect(self.ui.feeScales_treeView,
-                               QtCore.SIGNAL("clicked (QModelIndex)"),
-                               self.feeScale_clicked)
-
-        QtCore.QObject.connect(self.ui.feeScales_treeView,
-                               QtCore.SIGNAL("expanded (QModelIndex)"),
-                               self.feeScale_expanded)
-
-        QtCore.QObject.connect(self.ui.chooseFeescale_comboBox,
-                               QtCore.SIGNAL("currentIndexChanged(int)"),
-                               self.chooseFeescale_comboBox_changed)
-
-        QtCore.QObject.connect(self.ui.feeExpand_radioButton,
-                               QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
-
-        QtCore.QObject.connect(self.ui.feeCompress_radioButton,
-                               QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
-
+        self.ui.feeScales_treeView.clicked.connect(self.feeScale_clicked)
+        self.ui.feeScales_treeView.expanded.connect(self.feeScale_expanded)
+        self.ui.chooseFeescale_comboBox.currentIndexChanged.connect(
+            self.chooseFeescale_comboBox_changed)
+        self.ui.feeExpand_radioButton.clicked.connect(
+            self.feeExpand_radiobuttons_clicked)
+        self.ui.feeCompress_radioButton.clicked.connect(
+            self.feeExpand_radiobuttons_clicked)
         self.ui.documents_pushButton.clicked.connect(
             self.documents_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.feeSearch_lineEdit,
-                               QtCore.SIGNAL("returnPressed()"), self.feeSearch_lineEdit_edited)
-
+        self.ui.feeSearch_lineEdit.returnPressed.connect(
+            self.feeSearch_lineEdit_edited)
         self.ui.search_descriptions_radioButton.toggled.connect(
             self.feeSearch_pushButton_clicked)
-
         self.ui.feeSearch_pushButton.clicked.connect(
             self.feeSearch_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.feescale_tester_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.feescale_tester_pushButton_clicked)
-
-        QtCore.QObject.connect(self.ui.feetable_xml_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.feetable_xml)
-
+        self.ui.feescale_tester_pushButton.clicked.connect(
+            self.feescale_tester_pushButton_clicked)
+        self.ui.feetable_xml_pushButton.clicked.connect(self.feetable_xml)
         self.ui.hide_rare_feescale_codes_checkBox.toggled.connect(
             self.hide_rare_feescale_items)
-
         self.ui.reload_feescales_pushButton.clicked.connect(
             self.reload_feescales)
 
@@ -2929,7 +2918,6 @@ class OpenmolarGui(QtGui.QMainWindow):
 
         for chart in (self.ui.summaryChartWidget, self.ui.staticChartWidget):
             chart.teeth_selected_signal.connect(self.static_chartNavigation)
-
             chart.show_history_signal.connect(self.toothHistory)
             chart.flip_deciduous_signal.connect(self.flipDeciduous)
             chart.add_comments_signal.connect(self.tooth_add_comments)
@@ -2938,31 +2926,23 @@ class OpenmolarGui(QtGui.QMainWindow):
 
         self.ui.planChartWidget.teeth_selected_signal.connect(
             self.plan_chartNavigation)
-
         self.ui.completedChartWidget.teeth_selected_signal.connect(
             self.comp_chartNavigation)
-
         self.ui.planChartWidget.complete_treatments_signal.connect(
             self.complete_planned_chart_treatments)
         self.ui.completedChartWidget.complete_treatments_signal.connect(
             self.reverse_completed_chart_treatments)
-
-        QtCore.QObject.connect(self.ui.toothPropsWidget,
-                               QtCore.SIGNAL("NextTooth"), self.navigateCharts)
-
+        self.ui.toothPropsWidget.next_tooth_signal.connect(self.navigateCharts)
         self.ui.static_control_panel.clicked.connect(
             self.ui.toothPropsWidget.static_input)
 
         #--fillings have changed!!
-        QtCore.QObject.connect(self.ui.toothPropsWidget.lineEdit,
-                               QtCore.SIGNAL("Changed_Properties"), self.updateCharts)
-
-        QtCore.QObject.connect(self.ui.toothPropsWidget.lineEdit,
-                               QtCore.SIGNAL("DeletedComments"), self.deleteComments)
-
+        self.ui.toothPropsWidget.lineEdit.changed_properties_signal.connect(
+            self.updateCharts)
+        self.ui.toothPropsWidget.lineEdit.deleted_comments_signal.connect(
+            self.deleteComments)
         self.ui.static_control_panel.deciduous_signal.connect(
             self.flipDeciduous)
-
         self.ui.toothPropsWidget.static_chosen.connect(
             self.ui.static_control_panel.setEnabled)
 
@@ -2987,59 +2967,37 @@ class OpenmolarGui(QtGui.QMainWindow):
             rb.toggled.connect(self.updateNotesPage)
             rb.toggled.connect(self.load_notes_summary)
 
-    def signals_periochart(self):
-
-        # periochart
-        # defunct  QtCore.QObject.connect(self.ui.perioChartWidget,
-        # QtCore.SIGNAL("toothSelected"), self.periocharts)
-
-        QtCore.QObject.connect(self.ui.perioChartDateComboBox,
-                               QtCore.SIGNAL("currentIndexChanged(int)"), self.layoutPerioCharts)
-        QtCore.QObject.connect(self.ui.bpeDateComboBox,
-                               QtCore.SIGNAL("currentIndexChanged(int)"), self.bpe_table)
-
     def signals_tabs(self, connect=True):
         '''
         connect (or disconnect) the slots for the main_tabWidget,
         and patient tabWidget        default is to connect
         '''
         if connect:
-            QtCore.QObject.connect(self.ui.main_tabWidget,
-                                   QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
-
-            QtCore.QObject.connect(self.ui.tabWidget,
-                                   QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
+            self.ui.main_tabWidget.currentChanged.connect(self.handle_mainTab)
+            self.ui.tabWidget.currentChanged.connect(self.handle_patientTab)
         else:
-            QtCore.QObject.disconnect(self.ui.main_tabWidget,
-                                      QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
-
-            QtCore.QObject.disconnect(self.ui.tabWidget,
-                                      QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
+            self.ui.main_tabWidget.currentChanged.disconnect(
+                self.handle_mainTab)
+            self.ui.tabWidget.currentChanged.disconnect(self.handle_patientTab)
 
     def signals_appointments(self):
         # signals raised on the main appointment tab
-        QtCore.QObject.connect(self.ui.actionSet_Font_Size,
-                               QtCore.SIGNAL("triggered ()"), self.apptBook_fontSize)
-
+        self.ui.actionSet_Font_Size.triggered.connect(self.apptBook_fontSize)
         self.diary_widget.bring_to_front.connect(self.show_diary)
-
         self.diary_widget.patient_card_request.connect(self.getrecord)
-
         self.diary_widget.schedule_controller.appointment_selected.connect(
-            self.pt_diary_widget.update_pt_diary_selection)
-
+            self.diary_widget_schedule_controller_appointment_selected)
         self.diary_widget.pt_diary_changed.connect(
             self.pt_diary_widget.refresh_ptDiary)
         self.diary_widget.print_mh_signal.connect(self.print_mh_forms)
-
         self.pt_diary_widget.start_scheduling.connect(self.start_scheduling)
         self.pt_diary_widget.find_appt.connect(self.diary_widget.find_appt)
-
         self.pt_diary_widget.appointment_selected.connect(
             self.diary_widget.schedule_controller.update_appt_selection)
-
         self.pt_diary_widget.preferences_changed.connect(
             self.appt_prefs_changed)
+        self.pt_diary_widget.appointments_changed_signal.connect(
+            self.handle_pt_diary_update)
 
     def start_scheduling(self):
         self.diary_widget.schedule_controller.set_patient(self.pt)
@@ -3048,6 +3006,18 @@ class OpenmolarGui(QtGui.QMainWindow):
         self.ui.main_tabWidget.setCurrentIndex(1)  # appointmenttab
         self.signals_tabs()
         self.diary_widget.start_scheduling(self.pt)
+        self.updateDetails()
+
+    def handle_pt_diary_update(self):
+        LOGGER.debug("handle_pt_diary_update")
+        self.pt.forget_exam_booked()
+        self.updateDetails()
+
+    def diary_widget_schedule_controller_appointment_selected(self, appt):
+        if (self.diary_widget.schedule_controller.pt.serialno ==
+           self.pt.serialno):
+            self.pt_diary_widget.layout_ptDiary()
+            self.pt_diary_widget.update_pt_diary_selection(appt)
 
     def appt_prefs_changed(self):
         self.updateDetails()
@@ -3059,18 +3029,19 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         if not self.pt.underTreatment:
             self.advise(
-                _("Recalculate Estimate is for active courses only"), 1)
-            return
-        result = QtGui.QMessageBox.question(self, "Confirm",
-                                            u"%s<hr /><i>(%s)</i>" % (
-                                                _(
-                                                    "Scrap the estimate and re-price everything?"),
-                                                _(
-                                                    "Custom items and items added using feescale method will be unaffected")
-                                            ),
-                                            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                            QtGui.QMessageBox.No)
-        if result == QtGui.QMessageBox.No:
+                _("Recalculate Estimate is not normally used on closed courses"), 1)
+            if not permissions.granted(self):
+                return
+        if QtGui.QMessageBox.question(
+            self,
+            _("Confirm"),
+            u"%s<hr /><i>(%s)</i>" % (
+                _("Scrap the estimate and re-price everything?"),
+                _("Custom items and items added using feescale "
+                  "method will be unaffected")
+            ),
+            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
             return
 
         if manipulate_plan.recalculate_estimate(self):
@@ -3081,18 +3052,22 @@ class OpenmolarGui(QtGui.QMainWindow):
         '''
         applies a max fee chargeable
         '''
-        result = QtGui.QMessageBox.question(self, _("Confirm"),
-                                            _(
-                                            "apply an exemption to the NHS items on this estimate?"),
-                                            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                            QtGui.QMessageBox.No)
-        if result == QtGui.QMessageBox.No:
+        if QtGui.QMessageBox.question(
+            self,
+            _("Confirm"),
+            _("apply an exemption to the NHS items on this estimate?"),
+            QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
             return
-        max, result = QtGui.QInputDialog.getInteger(self, _("input needed"),
-                                                    _("maximum charge for the patient") + "<br />" + _(
-                                                    "please enter the amount in pence, or leave as 0 for full exemption"))
-
-        if result and estimates.apply_exemption(self.pt, max):
+        max_, result = QtGui.QInputDialog.getInteger(
+            self,
+            _("input needed"),
+            "%s <br />%s" % (_("maximum charge for the patient"),
+                             _("please enter the amount in pence, "
+                               "or leave as 0 for full exemption"))
+        )
+
+        if result and estimates.apply_exemption(self.pt, max_):
             self.handle_patientTab()
             self.updateDetails()
 
@@ -3149,7 +3124,7 @@ class OpenmolarGui(QtGui.QMainWindow):
         self.ui.family_group_label.setText(message)
         self.ui.relatedpts_pushButton.setText(message_2)
 
-        LOGGER.debug("updating family label '%s' '%s'" % (message, message_2))
+        LOGGER.debug("updating family label '%s' '%s'", message, message_2)
 
     def send_email(self):
         if self.sender == self.ui.email2_button:
@@ -3169,9 +3144,9 @@ class OpenmolarGui(QtGui.QMainWindow):
                         _("error loading feetable"), warning), 2)
         self.ui.cseType_comboBox.addItems(localsettings.CSETYPES)
 
-    def hide_rare_feescale_items(self, bool):
+    def hide_rare_feescale_items(self, bool_):
         # TODO - this could actually have 3 levels.
-        if bool:
+        if bool_:
             level = 1
         else:
             level = 0
@@ -3223,33 +3198,47 @@ class OpenmolarGui(QtGui.QMainWindow):
             self.updateDetails()
 
     def show_plan_chart_context_menu(self, att, values, point):
-        QtCore.QTimer.singleShot(100, partial(
-                                 manipulate_plan.plan_viewer_context_menu, self, att, values, point))
+        QtCore.QTimer.singleShot(
+            100,
+            partial(manipulate_plan.plan_viewer_context_menu,
+                    self,
+                    att,
+                    values,
+                    point))
 
     def show_cmp_chart_context_menu(self, att, values, point):
         # use singleShot to slow this down fractionally
         #(was occasionaly firing the Qmenu)
-        QtCore.QTimer.singleShot(100, partial(
-                                 manipulate_plan.cmp_viewer_context_menu, self, att, values, point))
+        QtCore.QTimer.singleShot(
+            100,
+            partial(manipulate_plan.cmp_viewer_context_menu,
+                    self,
+                    att,
+                    values,
+                    point))
 
     def show_plan_listview_context_menu(self, point):
-        LOGGER.debug("plan listview pressed %s" % point)
-        QtCore.QTimer.singleShot(100,
-                                 partial(manipulate_plan.plan_list_right_click, self, point))
+        LOGGER.debug("plan listview pressed %s", point)
+        QtCore.QTimer.singleShot(
+            100,
+            partial(manipulate_plan.plan_list_right_click, self, point)
+        )
 
     def handle_plan_listview_2xclick(self, index):
-        LOGGER.debug("plan listview 2xclick %s" % index)
+        LOGGER.debug("plan listview 2xclick %s", index)
         manipulate_plan.plan_listview_2xclick(self, index)
 
     def show_cmp_listview_context_menu(self, point):
-        LOGGER.debug("completed listview pressed %s" % point)
+        LOGGER.debug("completed listview pressed %s", point)
         # use singleShot to slow this down fractionally
         #(was occasionaly firing the Qmenu)
-        QtCore.QTimer.singleShot(100,
-                                 partial(manipulate_plan.cmp_list_right_click, self, point))
+        QtCore.QTimer.singleShot(
+            100,
+            partial(manipulate_plan.cmp_list_right_click, self, point)
+        )
 
     def handle_completed_listview_2xclick(self, index):
-        LOGGER.debug("completed listview 2xclick %s" % index)
+        LOGGER.debug("completed listview 2xclick %s", index)
         manipulate_plan.completed_listview_2xclick(self, index)
 
     def set_surgery_number(self):
@@ -3264,10 +3253,6 @@ class OpenmolarGui(QtGui.QMainWindow):
             return True
         return False
 
-    def allow_edit_daybook(self, bool_value):
-        daybook.ALLOW_TX_EDITS = bool_value
-        daybookHistory.ALLOW_TX_EDITS = bool_value
-
     def edit_phrasebooks(self):
         def editor_closed():
             self.phrasebook_editor.setParent(None)
@@ -3289,26 +3274,131 @@ class OpenmolarGui(QtGui.QMainWindow):
     def show_daybook_filter_help(self):
         self.advise(daybook.filter_help_text(), 1)
 
+    def allow_all_history_edits(self, bool_value):
+        self.edit_currtrtmt2(bool_value, False)
+        self.ui.actionEdit_Courses.setChecked(bool_value)
+        self.edit_estimates(bool_value, False)
+        self.ui.actionEdit_Estimates.setChecked(bool_value)
+        self.allow_edit_daybook(bool_value, False)
+        self.refresh_debug_browser()
+
+    def edit_currtrtmt2(self, bool_value, refresh=True):
+        courseHistory.ALLOW_EDIT = bool_value
+        if refresh:
+            self.refresh_debug_browser()
+
+    def allow_edit_daybook(self, bool_value, refresh=True):
+        self.ui.actionAllow_Edit_Treatment.setChecked(bool_value)
+        self.ui.actionAllow_Edit.setChecked(bool_value)
+        daybook.ALLOW_TX_EDITS = bool_value
+        daybookHistory.ALLOW_TX_EDITS = bool_value
+        if refresh:
+            self.refresh_debug_browser()
+
+    def edit_estimates(self, bool_value, refresh=True):
+        estimatesHistory.ALLOW_EDIT = bool_value
+        if refresh:
+            self.refresh_debug_browser()
+
+    def refresh_debug_browser(self):
+        '''
+        update the debug browser
+        '''
+        LOGGER.debug("refreshing debug %s", self.debug_browser_refresh_func)
+        if self.debug_browser_refresh_func is None:
+            self.ui.debugBrowser.setText("")
+        else:
+            self.ui.debugBrowser.setText(self.debug_browser_refresh_func())
+
     def set_browser_source(self, url):
         '''
         A function to re-implement QTextBrowser.setUrl
         this will catch "edit links"
         '''
         url = str(url.toString().toAscii())
-        m = re.match("daybook_id\?(\d+)feesa=(\d+)feesb=(\d+)", url)
-        n = re.match("daybook_id_edit\?(\d+)", url)
-        if m:
-            id = int(m.groups()[0])
-            fee = int(m.groups()[1])
-            ptfee = int(m.groups()[2])
-
-            dl = DaybookItemDialog(id, fee, ptfee, self)
+        m1 = re.match(r"daybook_id\?(\d+)feesa=(\d+)feesb=(\d+)", url)
+        m2 = re.match(r"daybook_id_edit\?(\d+)", url)
+        m3 = re.match(r"edit_courseno\?(\d+)", url)
+        m4 = re.match(r"edit_estimate\?(\d+)", url)
+        m5 = re.match(r"merge_courses\?(\d+)\+(\d+)", url)
+        m6 = re.match(r"consistent_courseno\?(\d+)", url)
+        m7 = re.match(r"edit_tx_courseno\?(\d+)", url)
+
+        if m1:
+            id_ = int(m1.groups()[0])
+            fee = int(m1.groups()[1])
+            ptfee = int(m1.groups()[2])
+            dl = DaybookItemDialog(id_, fee, ptfee, self)
             dl.exec_()
-        if n and permissions.granted():
-            id = int(n.groups()[0])
-            dl = DaybookEditDialog(id, self)
+        elif m2 and permissions.granted():
+            id_ = int(m2.groups()[0])
+            dl = DaybookEditDialog(id_, self)
             if dl.exec_():
                 dl.update_treatments()
+        elif m3 and permissions.granted():
+            courseno = int(m3.groups()[0])
+            dl = CourseEditDialog(courseno, self)
+            if dl.exec_():
+                dl.update_db()
+        elif m4 and permissions.granted():
+            courseno = int(m4.groups()[0])
+            dl = EstimateEditDialog(self.pt.serialno, courseno, self)
+            if dl.exec_():
+                dl.update_db()
+        elif m5 and permissions.granted():
+            courseno1, courseno2 = m5.groups()
+            dl = CourseMergeDialog(self.pt.serialno,
+                                   int(courseno1), int(courseno2), self)
+            if dl.exec_():
+                dl.update_db()
+        elif m6 and permissions.granted():
+            courseno = int(m6.groups()[0])
+            dl = CourseConsistencyDialog(self.pt.serialno, courseno, self)
+            if dl.exec_():
+                dl.update_db()
+        elif m7 and permissions.granted():
+            courseno = int(m7.groups()[0])
+            dl = EditTreatmentDialog(self.pt.serialno, courseno, self)
+            if dl.exec_():
+                dl.update_db()
+        else:
+            LOGGER.info("Not editing %s", url)
+
+    def edit_referral_centres(self):
+        dl = EditReferralCentresDialog(self)
+        if dl.exec_():
+            self.set_referral_centres()
+
+    def reset_supervisor(self):
+        dl = ResetSupervisorPasswordDialog(self)
+        dl.exec_()
+
+    def add_user(self):
+        dl = AddUserDialog(self)
+        if dl.exec_():
+            self.advise(_("New user added to login table"), 1)
+
+    def add_clinician(self):
+        if self.pt.serialno:
+            self.advise(
+                _("Please exit any record before taking this action"), 1)
+            return
+        dl = AddClinicianDialog(self)
+        if dl.exec_():
+            self.initiate()
+
+    def edit_practice(self):
+        dl = EditPracticeDialog(self)
+        if dl.exec_():
+            self.advise(_("Practice Name and/or Address modified."), 1)
+
+    def clear_todays_emergencies(self):
+        self.show_diary()
+        self.diary_widget.clearTodaysEmergencyTime()
+
+    def insert_regular_blocks(self):
+        self.show_diary()
+        self.diary_widget.insert_regular_blocks()
 
     def excepthook(self, exc_type, exc_val, tracebackobj):
         '''
@@ -3320,41 +3410,26 @@ class OpenmolarGui(QtGui.QMainWindow):
         for l in traceback.format_exception(exc_type, exc_val, tracebackobj):
             message += l
         self.advise('UNHANDLED EXCEPTION!<hr /><pre>%s' % message, 2)
+        sys.stderr.write(message)
 
 
-def main(app):
+def main():
     '''
     the entry point for the app
     '''
-    if not localsettings.successful_login:
-        try:
-            dev_path = os.path.join(
-                localsettings.localFileDirectory, "dev_login.txt")
-            f = open(dev_path, "r")
-            data = f.read().strip("\n")
-            f.close()
-            if localsettings.hash_func(data) != \
-                    '1fd0c27f4d65caaa10ef5ef6a714faf96ed44fdd':
-                raise IOError("bad checksum")
-            LOGGER.warning("allowing developer login")
-        except:
-            sys.exit("unable to run... no login")
-    localsettings.initiate()
+    os.chdir(os.path.expanduser("~"))
+    app = QtGui.QApplication(sys.argv)
     mainWindow = OpenmolarGui()
     sys.excepthook = mainWindow.excepthook
     mainWindow.show()
     mainWindow.setWindowState(QtCore.Qt.WindowMaximized)
-
     sys.exit(app.exec_())
 
 if __name__ == "__main__":
+    from gettext import gettext as _
     LOGGER.setLevel(logging.DEBUG)
     LOGGER.warning("dev mode in use - verbose logging")
-    os.chdir(os.path.expanduser("~"))
+    LOGGER.debug("Qt Version: %s", QtCore.QT_VERSION_STR)
+    LOGGER.debug("PyQt Version: %s", QtCore.PYQT_VERSION_STR)
 
-    LOGGER.debug("Qt Version: %s" % QtCore.QT_VERSION_STR)
-    LOGGER.debug("PyQt Version: %s" % QtCore.PYQT_VERSION_STR)
-    newapp = QtGui.QApplication(sys.argv)
-    localsettings.operator = "NW"
-    # localsettings.station = "reception"
-    main(newapp)
+    main()
diff --git a/src/openmolar/qt4gui/new_patient_gui.py b/src/openmolar/qt4gui/new_patient_gui.py
index b41b97f..6cda6be 100644
--- a/src/openmolar/qt4gui/new_patient_gui.py
+++ b/src/openmolar/qt4gui/new_patient_gui.py
@@ -55,21 +55,24 @@ def check_use_family(om_gui):
     else:
         return
 
-    if localsettings.last_family_no is None:
-        if QtGui.QMessageBox.question(om_gui,
-                                      _("Question"),
-                                      _("Start a new family group?"),
-                                      QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
-                                      QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+    if localsettings.last_family_no in (None, 0):
+        if QtGui.QMessageBox.question(
+                om_gui,
+            _("Question"),
+            _("Start a new family group?"),
+            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
             om_gui.pt.familyno = families.new_group(
                 localsettings.previous_sno())
+            LOGGER.info("starting new family group %s", om_gui.pt.familyno)
     else:
-        if QtGui.QMessageBox.question(om_gui,
-                                      _("Question"),
-                                      _(
-                                      "Add the new patient to this family group?"),
-                                      QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
-                                      QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+        if QtGui.QMessageBox.question(
+            om_gui,
+            _("Question"),
+            _(
+                "Add the new patient to this family group?"),
+            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
             om_gui.pt.familyno = localsettings.last_family_no
 
 
diff --git a/src/openmolar/qt4gui/printing/bulk_mail.py b/src/openmolar/qt4gui/printing/bulk_mail.py
index 0b07f15..13a593a 100644
--- a/src/openmolar/qt4gui/printing/bulk_mail.py
+++ b/src/openmolar/qt4gui/printing/bulk_mail.py
@@ -54,8 +54,6 @@ FAMILY_BODY = '''%s\n%s''' % (
 
 SIGN_OFF = _("Yours sincerely,")
 
-SIGNATURE = localsettings.PRACTICE_NAME
-
 FOOTER = _('''* If you already have a future appointment with us -
 please accept our apologies and ignore this letter.''')
 
@@ -584,7 +582,7 @@ class bulkMails(object):
                 20, sign_off_rect.height(), 0, sig_font_height)
             painter.save()
             painter.setFont(sigFont)
-            painter.drawText(sig_rect, SIGNATURE, option)
+            painter.drawText(sig_rect, localsettings.PRACTICE_NAME, option)
             if DEBUG:
                 painter.drawRect(sig_rect.adjusted(2, 2, -2, -2))
             painter.restore()
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17_data.py b/src/openmolar/qt4gui/printing/gp17/gp17_data.py
index 4c29bd7..e6b161b 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17_data.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17_data.py
@@ -402,7 +402,7 @@ class Gp17Data(object):
         except KeyError:
             print "Key Error getting dentist", self.dentist
             text = "\n"
-        for line in localsettings.practiceAddress:
+        for line in localsettings.PRACTICE_ADDRESS:
             text += line + "\n"
         try:
             text += localsettings.dentDict[self.dentist][3]
@@ -463,11 +463,20 @@ class Gp17Data(object):
         '''
         date of completion
         '''
-        if "cmpd" in self.exclusions:
+        if "cmpd" in self.exclusions or self.pftr:
             return ""
         return self.format_date(self.pt.treatment_course.cmpd)
 
     @property
+    def pftr(self):
+        '''
+        patient failed to return
+        '''
+        if "pftr" in self.exclusions:
+            return False
+        return self.pt.treatment_course.ftr
+
+    @property
     def show_chart(self):
         if "chart" in self.exclusions:
             return False
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py b/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
index f9d5692..8dc8952 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
@@ -241,6 +241,7 @@ class GP17iFront(PrintedForm):
             self._fill_pid,
             self._fill_accd,
             self._fill_cmpd,
+            self._fill_pftr,
             self._fill_stampbox,
             self._fill_previous_surname,
             self._fill_address,
@@ -356,6 +357,11 @@ class GP17iFront(PrintedForm):
             except IndexError:
                 break
 
+    def _fill_pftr(self, painter):
+        if self.data.pftr:
+            rect = self.rects["pftr"]
+            painter.drawText(rect, "X", OPTION)
+
     def _fill_charting(self, painter):
         if not self.data.show_chart:
             return
diff --git a/src/openmolar/qt4gui/printing/mh_print.py b/src/openmolar/qt4gui/printing/mh_print.py
index aa6eb4a..2e1d2e0 100644
--- a/src/openmolar/qt4gui/printing/mh_print.py
+++ b/src/openmolar/qt4gui/printing/mh_print.py
@@ -118,10 +118,11 @@ class MHPrint(object):
 
         y = MARGIN_TOP
 
-        for value in localsettings.MH_HEADER:
+        for value in (localsettings.PRACTICE_NAME,
+                      _("Confidential Medical History Questionaire")
+                      ):
             if not value:
                 continue
-
             y += print_text(value, y, option=QtCore.Qt.AlignCenter)
 
         print_line(y)
diff --git a/src/openmolar/qt4gui/printing/om_printing.py b/src/openmolar/qt4gui/printing/om_printing.py
index 48dd971..f7a6ca9 100644
--- a/src/openmolar/qt4gui/printing/om_printing.py
+++ b/src/openmolar/qt4gui/printing/om_printing.py
@@ -23,7 +23,7 @@
 # ############################################################################ #
 
 '''
-provides the main class which is my gui
+provides printing functions for the main gui.
 '''
 
 from __future__ import division
@@ -38,12 +38,12 @@ from openmolar.settings import localsettings, utilities
 
 from openmolar.ptModules import estimates
 from openmolar.ptModules import standardletter
-from openmolar.ptModules import referral
 
 from openmolar.dbtools import docsprinted
 from openmolar.dbtools import appointments
 from openmolar.dbtools import patient_class
 from openmolar.dbtools import patient_write_changes
+from openmolar.dbtools import referral
 
 from openmolar.qt4gui.compiled_uis import Ui_enter_letter_text
 from openmolar.qt4gui.compiled_uis import Ui_daylist_print
@@ -88,22 +88,6 @@ def commitPDFtoDB(om_gui, descr, serialno=None):
         om_gui.advise(_("Error saving PDF copy %s") % e, 2)
 
 
-def printDupReceipt(om_gui):
-    '''
-    print a duplicate receipt
-    '''
-    dupdate = localsettings.currentDay()
-    amount = om_gui.ui.receiptDoubleSpinBox.value()
-
-    printReceipt(om_gui, {_("Professional Services"): amount * 100},
-                 total=amount * 100, duplicate=True, dupdate=dupdate)
-
-    om_gui.pt.addHiddenNote("printed", "%s %.02f" % (
-        _("duplicate receipt for"),
-        amount))
-    om_gui.updateHiddenNotesLabel()
-
-
 def printReceipt(om_gui, valDict, total="0.00"):
     '''
     print a receipt
@@ -183,7 +167,7 @@ def printAccountsTable(om_gui):
                 if col == 1:
                     html += '<td align="right">%s</td>' % item.text()
                 elif col == 12:
-                    money = int(float(item.text()) * 100)
+                    money = localsettings.pencify(item.text())
                     money_str = localsettings.formatMoney(money)
                     html += '<td align="right">%s</td>' % money_str
                     total += money
@@ -486,12 +470,7 @@ def printrecall(om_gui):
     if om_gui.pt.serialno == 0:
         om_gui.advise("no patient selected", 1)
     else:
-        args = (
-            (om_gui.pt.title, om_gui.pt.fname, om_gui.pt.sname, om_gui.pt.dnt1,
-             om_gui.pt.serialno, om_gui.pt.addr1, om_gui.pt.addr2, om_gui.pt.addr3,
-             om_gui.pt.town, om_gui.pt.county, om_gui.pt.pcde), )
-
-        recall_printer = recallprint.RecallPrinter(args)
+        recall_printer = recallprint.RecallPrinter(om_gui.pt)
         recall_printer.print_()
 
         om_gui.pt.addHiddenNote("printed", "recall - non batch")
@@ -576,8 +555,8 @@ def printSelectedAccounts(om_gui):
                     printpt.addHiddenNote(
                         "printed", "account - tone %s" % tone)
 
-                    patient_write_changes.discreet_changes(printpt, (
-                                                           "billct", "billdate", "billtype"))
+                    patient_write_changes.discreet_changes(
+                        printpt, ("billct", "billdate", "billtype"))
 
                     patient_write_changes.toNotes(sno,
                                                   printpt.HIDDENNOTES)
diff --git a/src/openmolar/qt4gui/printing/recallprint.py b/src/openmolar/qt4gui/printing/recallprint.py
index 3bdc3a8..6a7423c 100644
--- a/src/openmolar/qt4gui/printing/recallprint.py
+++ b/src/openmolar/qt4gui/printing/recallprint.py
@@ -30,12 +30,21 @@ import datetime
 DATE_FORMAT = "MMMM, yyyy"
 
 
-class RecallPrinter():
+class RecallPrinter(object):
 
-    def __init__(self, rows):
+    def __init__(self, pt):
         self.printer = QtGui.QPrinter()
-        self.printer.setPageSize(QtGui.QPrinter.A5)
-        self.recalls = rows
+        self.pt = pt
+
+        self.line1 = _('We are writing to inform you that your '
+                       'dental examination is now due.')
+
+        self.line2 = _('Please contact the surgery to arrange '
+                       'an appointment. *')
+
+        self.line3 = _('We look forward to seeing you in the near future.')
+
+        self.sign_off = _("Yours Sincerely")
 
     def print_(self):
         dialog = QtGui.QPrintDialog(self.printer)
@@ -53,89 +62,98 @@ class RecallPrinter():
         DateWidth = fm.width(" September 99, 2999 ")
         painter = QtGui.QPainter(self.printer)
         pageRect = self.printer.pageRect()
-        page = 1
-        for recall in self.recalls:
-            painter.save()
-            painter.setPen(QtCore.Qt.black)
-            painter.setFont(sansFont)
-            # put dent serialno in topleft corner
-            painter.drawText(
-                LeftMargin, TopMargin, "%s %d" %
-                (localsettings.ops[recall[3]], recall[4]))
-            x, y = AddressMargin, TopMargin + 50
-            painter.drawText(
-                x, y, "%s %s %s" %
-                (recall[0].title(), recall[1].title(), recall[2].title()))
-            y += sansLineHeight
-            for line in recall[5:10]:
-                if line:
-                    painter.drawText(x, y, str(line).title() + ",")
-                    y += serifLineHeight
-            if recall[10]:
-                painter.drawText(x, y, str(recall[10]) + ".")  # postcode
-            y += serifLineHeight
-
-            x, y = LeftMargin, (pageRect.height() * 0.3)
-            painter.drawText(
-                x + 250,
-                y,
-                QtCore.QDate.currentDate(
-                ).toString(
-                    DATE_FORMAT))
-            y += sansLineHeight
-            painter.setFont(serifFont)
-            y += serifLineHeight
-            painter.drawText(
-                x, y, _("Dear %s %s,") %
-                (recall[0].title(), recall[2].title()))
-            y += serifLineHeight * 2
-            painter.drawText(x, y,
-                             _('We are writing to inform you that your dental examination is now due.'))
-            y += serifLineHeight
-            painter.drawText(
-                x,
-                y,
-                _('Please contact the surgery to arrange an appointment. *'))
-            y += serifLineHeight * 1.2
-            painter.drawText(
-                x,
-                y,
-                _('We look forward to seeing you in the near future.'))
-            painter.setPen(QtCore.Qt.black)
-            y += serifLineHeight * 2
-            painter.drawText(x, y, _("Yours sincerely,"))
-            y += serifLineHeight * 1.5
-            painter.setFont(sigFont)
-            y += serifLineHeight * 2
-            painter.drawText(x, y, "The Academy Dental Practice")
-            painter.setFont(serifFont)
-            y = pageRect.height() - 120
-            painter.drawLine(x, y, pageRect.width() - (2 * AddressMargin), y)
-            y += 2
-            font = QtGui.QFont("Helvetica", 7)
-            font.setItalic(True)
-            painter.setFont(font)
-            option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
-            option.setWrapMode(QtGui.QTextOption.WordWrap)
-            painter.drawText(
-                QtCore.QRectF(x, y,
-                              pageRect.width() - (2 * AddressMargin), 31),
-                "* If you already have a future appointment with us - "
-                "please accept our apologies and ignore this letter.",
-                option)
-            page += 1
-            if page <= len(self.recalls):
-                self.printer.newPage()
-            painter.restore()
+        painter.save()
+        painter.setPen(QtCore.Qt.black)
+        painter.setFont(sansFont)
+        # put dent serialno in topleft corner
+        painter.drawText(
+            LeftMargin,
+            TopMargin,
+            "%s %d" % (localsettings.ops.get(self.pt.dnt1, ""),
+                       self.pt.serialno)
+        )
+        x, y = AddressMargin, TopMargin + 50
+        painter.drawText(
+            x, y,
+            "%s %s %s" % (self.pt.title.title(),
+                          self.pt.fname.title(),
+                          self.pt.sname.title())
+        )
+        y += sansLineHeight
+        for line_ in (self.pt.addr1,
+                      self.pt.addr2,
+                      self.pt.addr3,
+                      self.pt.town,
+                      self.pt.county
+                      ):
+            if line_:
+                painter.drawText(x, y, "%s," % line_.title())
+                y += serifLineHeight
+        if self.pt.pcde:
+            painter.drawText(x, y, "%s." % self.pt.pcde)
+        y += serifLineHeight
+
+        x, y = LeftMargin, (pageRect.height() * 0.3)
+        painter.drawText(
+            x + 250,
+            y,
+            QtCore.QDate.currentDate(
+            ).toString(
+                DATE_FORMAT))
+        y += sansLineHeight
+        painter.setFont(serifFont)
+        y += serifLineHeight
+        painter.drawText(
+            x, y, _("Dear %s %s,") %
+            (self.pt.title.title(), self.pt.sname.title()))
+        y += serifLineHeight * 2
+        painter.drawText(x, y, self.line1)
+        y += serifLineHeight
+        painter.drawText(x, y, self.line2)
+        y += serifLineHeight * 1.2
+        painter.drawText(x, y, self.line3)
+        painter.setPen(QtCore.Qt.black)
+        y += serifLineHeight * 2
+        painter.drawText(x, y, self.sign_off)
+        y += serifLineHeight * 1.5
+        painter.setFont(sigFont)
+        y += serifLineHeight * 2
+        painter.drawText(x, y, localsettings.PRACTICE_NAME)
+        painter.setFont(serifFont)
+        y = pageRect.height() - 120
+        painter.drawLine(x, y, pageRect.width() - (2 * AddressMargin), y)
+        y += 2
+        font = QtGui.QFont("Helvetica", 7)
+        font.setItalic(True)
+        painter.setFont(font)
+        option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
+        option.setWrapMode(QtGui.QTextOption.WordWrap)
+        painter.drawText(
+            QtCore.QRectF(x, y,
+                          pageRect.width() - (2 * AddressMargin), 31),
+            _("* If you already have a future appointment with us - "
+              "please accept our apologies and ignore this letter."),
+            option)
+        painter.restore()
 
 if __name__ == "__main__":
-    import sys
-    localsettings.initiate()
-    app = QtGui.QApplication(sys.argv)
-    pts = (
-        ('TITLE', 'FNAME', 'SNAME', 6, 1809,
-         "6 ST MARY'S ROAD", 'KIRKHILL', '', '', '', 'IV5 7NX'),
-    )
+    import os
+    os.chdir(os.path.expanduser("~"))
 
-    recall_printer = RecallPrinter(pts)
+    class DuckPatient(object):
+        title = 'TITLE'
+        fname = 'FNAME'
+        sname = 'SNAME'
+        dnt1 = 1
+        serialno = 1
+        addr1 = '1512 Rue de la Soleil'
+        addr2 = 'Tampa'
+        addr3 = ""
+        town = "Florida"
+        county = "USA"
+        pcde = "ZIPCODE"
+
+    localsettings.initiate()
+    app = QtGui.QApplication([])
+    recall_printer = RecallPrinter(DuckPatient())
     recall_printer.print_()
diff --git a/src/openmolar/qt4gui/pt_diary_widget.py b/src/openmolar/qt4gui/pt_diary_widget.py
index 6246961..30b2707 100644
--- a/src/openmolar/qt4gui/pt_diary_widget.py
+++ b/src/openmolar/qt4gui/pt_diary_widget.py
@@ -49,6 +49,7 @@ class PtDiaryWidget(QtGui.QWidget):
     find_appt = QtCore.pyqtSignal(object)
     appointment_selected = QtCore.pyqtSignal(object)
     preferences_changed = QtCore.pyqtSignal()
+    # also inherits a signal from the model "appointments_changed_signal"
 
     def __init__(self, parent=None):
         QtGui.QWidget.__init__(self, parent)
@@ -63,6 +64,8 @@ class PtDiaryWidget(QtGui.QWidget):
             QtGui.QSizePolicy(
                 QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
         )
+        self.appointments_changed_signal = \
+            self.diary_model.appointments_changed_signal
 
     def sizeHint(self):
         return QtCore.QSize(800, 200)
@@ -390,7 +393,7 @@ class PtDiaryWidget(QtGui.QWidget):
         '''
         def delete_appt():
             if appointments.delete_appt_from_apr(appt):
-                self.advise(_("Sucessfully removed appointment"))
+                self.advise(_("Successfully removed appointment"))
             else:
                 self.advise(_("Error removing proposed appointment"), 2)
 
@@ -438,7 +441,7 @@ class PtDiaryWidget(QtGui.QWidget):
                                               QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
                     # remove from the patients diary
                     if appointments.delete_appt_from_apr(appt):
-                        self.advise(_("Sucessfully removed appointment"))
+                        self.advise(_("Successfully removed appointment"))
                     else:
                         self.advise(_("Error removing from patient diary"), 2)
 
diff --git a/src/openmolar/qt4gui/schema_updater.py b/src/openmolar/qt4gui/schema_updater.py
index 64fd420..7bca50b 100644
--- a/src/openmolar/qt4gui/schema_updater.py
+++ b/src/openmolar/qt4gui/schema_updater.py
@@ -26,17 +26,20 @@
 this module is called when the schema is found to be out of date
 '''
 
-from gettext import gettext as _
 import logging
 import sys
 import time
+
 from PyQt4 import QtGui, QtCore
 from openmolar.settings import localsettings
 from openmolar.dbtools import schema_version
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+from openmolar.backports.advisor import Advisor
 
 LOGGER = logging.getLogger("openmolar")
 
-MESSAGE = "<h3>%s</h3>%s<br />%s {OLD} %s {NEW}<hr />%s<br /><b>%s</b>" % (
+MESSAGE = '''<h3>%s</h3>
+%s<br />%s {OLD}<br />%s {NEW}<br /><br />%s<hr /><b>%s</b>''' % (
     _("Update required"),
     _("Your Openmolar database schema is out of date "
       "for this version of the client."),
@@ -49,7 +52,7 @@ MESSAGE = "<h3>%s</h3>%s<br />%s {OLD} %s {NEW}<hr />%s<br /><b>%s</b>" % (
 ABORT_MESSAGE = _('Sorry, you cannot run this version of the '
                   'openmolar client without updating your database schema.')
 
-FAILURE_MESSAGE = "<p>%s</p><p>%s</p><p>%s></p>" % (
+FAILURE_MESSAGE = "<p>%s</p><p>%s</p><p>%s</p>" % (
     _("Sorry, we seem unable to update your schema at this point, "
       "Perhaps you have grabbed a development version of the program?"),
     ("If so, please revert to a release version."),
@@ -62,206 +65,288 @@ class UserQuit(Exception):
     pass
 
 
-def proceed():
-    '''
-    on to the main gui.
-    '''
-    from openmolar.qt4gui import maingui
-    localsettings.loadFeeTables()
-    sys.exit(maingui.main(QtGui.QApplication.instance()))
-
+class SchemaUpdater(BaseDialog, Advisor):
 
-def user_quit():
-    raise UserQuit("user has quit the update")
+    def __init__(self, parent=None):
+        Advisor.__init__(self, parent)
+        BaseDialog.__init__(self, parent, remove_stretch=True)
+        self.setWindowTitle("openMolar")
 
+        self.header_label = QtGui.QLabel(_("Updating Database"))
+        self.header_label.setStyleSheet("font-weight:bold;")
+        self.label = QtGui.QLabel("")
+        self.pb = QtGui.QProgressBar()
 
-class SchemaUpdater(object):
+        self.insertWidget(self.header_label)
+        self.insertWidget(self.label)
+        self.insertWidget(self.pb)
+        self.pb.hide()
 
-    def __init__(self):
-        self.pb = QtGui.QProgressDialog()
-        self.pb.canceled.connect(user_quit)
+        self._current_version = None
+        self.apply_but.setText(_("Continue"))
 
-        required = localsettings.CLIENT_SCHEMA_VERSION
-        self.current = schema_version.getVersion()
+        self.dbu = None
+        QtCore.QTimer.singleShot(100, self.confirm_update)
 
-        message = MESSAGE.replace(
-            "{OLD}",
-            self.current).replace(
-            "{NEW}",
-            required)
+    @property
+    def current_version(self):
+        if self._current_version is None:
+            self._current_version = schema_version.getVersion()
+        return self._current_version
 
-        if QtGui.QMessageBox.question(None, "Update Schema",
-                                      message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                      QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
-            self.pb.setWindowTitle("openMolar")
-            self.pb.show()
-        else:
-            self.completed(False, ABORT_MESSAGE)
+    def confirm_update(self):
+        message = MESSAGE.replace("{OLD}", self.current_version)
+        message = message.replace("{NEW}", localsettings.CLIENT_SCHEMA_VERSION)
 
-        self.apply_updates()
+        if QtGui.QMessageBox.question(
+                self,
+                _("Schema Update Required"),
+                message,
+                QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+                QtGui.QMessageBox.No
+        ) == QtGui.QMessageBox.Yes:
 
-        if schema_version.getVersion() == required:
-            self.pb.destroy()
-            proceed()
+            self.apply_updates()
         else:
-            self.completed(False, FAILURE_MESSAGE)
+            self.hide_brief_message()
+            self.label.setText(_("Operation Cancelled."))
+            self.completed(ABORT_MESSAGE)
+            time.sleep(2)
+            self.reject()
+
+    def sizeHint(self):
+        return QtCore.QSize(700, 300)
+
+    def resizeEvent(self, event):
+        '''
+        this function is overwritten so that the advisor popup can be
+        put in the correct place
+        '''
+        QtGui.QDialog.resizeEvent(self, event)
+        widg = self.header_label
+        brief_pos_x = widg.pos().x() + widg.width()
+        brief_pos_y = widg.pos().y()
+
+        brief_pos = QtCore.QPoint(brief_pos_x, brief_pos_y)
+        self.setBriefMessagePosition(brief_pos, True)
+
+    def reject(self):
+        if self.dbu is not None:
+            self.dbu.force_stop()
+        BaseDialog.reject(self)
+        sys.exit("user rejected")
+        # raise UserQuit("user has quit the update")
 
     def updateProgress(self, arg, message):
         LOGGER.info("%s %s" % (arg, message))
-        self.pb.setLabelText(message)
+        self.label.setText(message)
         self.pb.setValue(arg)
         QtGui.QApplication.instance().processEvents()
 
     def apply_update(self):
-        self.updateProgress(1,
-                            "%s %s" % (_("upgrading to schema version"), self.next_version))
-
-        QtCore.QObject.connect(self.dbu,
-                               QtCore.SIGNAL("progress"), self.updateProgress)
-        QtCore.QObject.connect(self.dbu,
-                               QtCore.SIGNAL("completed"), self.completed)
-
+        QtGui.QApplication.instance().processEvents()
+        time.sleep(2)
+        header_message = "%s <b>%s</b> %s <b>%s</b>" % (
+            _("Converting Database Schema from version"),
+            self.current_version,
+            _("to"),
+            self.next_version)
+        self.header_label.setText(header_message)
+        self.pb.show()
+        self.updateProgress(
+            1,
+            "%s %s" % (_("upgrading to schema version"),
+                       self.next_version))
+
+        self.dbu.progress_signal.connect(self.updateProgress)
+        self.dbu.completed_signal.connect(self.completed)
+        QtGui.QApplication.instance().processEvents()
         try:
             if self.dbu.run():
                 localsettings.DB_SCHEMA_VERSION = self.next_version
+                self._current_version = None
             else:
-                self.completed(False,
-                               _('Conversion to %s failed') % self.next_version)
+                self.completed(
+                    False,
+                    _('Conversion to %s failed') % self.next_version)
         except UserQuit:
             LOGGER.warning("user quit the database upgrade")
-            completed(False, "Schema Upgrade Halted")
+            self.completed(False, _("Schema Upgrade Halted"))
 
         except Exception as exc:
             LOGGER.exception("unexpected exception")
             # fatal error!
-            completed(False, ('Unexpected Error updating the schema '
-                              'please file a bug at http:www.openmolar.com'))
-
-    def completed(self, sucess, message):
-        def accept():
-            m.accept()
-            self.pb.hide()
-        if sucess:
-            m = QtGui.QMessageBox()
-            m.setText(message)
-            m.setStandardButtons(QtGui.QMessageBox.NoButton)
-            m.setWindowTitle(_("OpenMolar"))
-            m.setModal(False)
-            QtCore.QTimer.singleShot(3 * 1000, accept)
-            m.exec_()
-            m.move(0, 0)
-        else:
-            LOGGER.warning("failure - %s" % message)
-            QtGui.QMessageBox.warning(self.pb, "Failure", message)
-            QtGui.QApplication.instance().closeAllWindows()
-            sys.exit("FAILED TO UPGRADE SCHEMA")
+            self.completed(
+                _('Unexpected Error updating the schema '
+                  'please file a bug at http:www.openmolar.com')
+            )
+
+    def completed(self, message):
+        '''
+        called by DatabaseUpdaterThread when completed
+        '''
+        QtGui.QApplication.instance().processEvents()
+        self.advise(message)
+        time.sleep(2)
+        self.pb.hide()
+
+    def success(self):
+        message = _("All updates successully applied!")
+        self.advise(message)
+        self.label.setText("%s<hr />%s" % (
+            message, _("continuing to openmolar")))
+        self.enableApply()
+        self.cancel_but.setText(_("Quit"))
+        QtCore.QTimer.singleShot(5000, self.accept)
+
+    def failure(self, message=None):
+        if message is None:
+            message = FAILURE_MESSAGE
+        self.hide_brief_message()
+        self.label.setText(message)
 
     def apply_updates(self):
         # UPDATE TO SCHEMA 1.1 ########################
         self.next_version = "1.1"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_0to1_1 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.2 ########################
+        # UPDATE TO SCHEMA 1.2 ########################
         self.next_version = "1.2"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_1to1_2 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.3 ########################
+        # UPDATE TO SCHEMA 1.3 ########################
         self.next_version = "1.3"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_2to1_3 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.4 ########################
+        # UPDATE TO SCHEMA 1.4 ########################
         self.next_version = "1.4"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_3to1_4 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.5 ########################
+        # UPDATE TO SCHEMA 1.5 ########################
         self.next_version = "1.5"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_4to1_5 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.6 ########################
+        # UPDATE TO SCHEMA 1.6 ########################
         self.next_version = "1.6"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
+            from openmolar.schema_upgrades import schema1_5to1_6 as upmod
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.7 ########################
+        # UPDATE TO SCHEMA 1.7 ########################
         self.next_version = "1.7"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_6to1_7 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.8 ########################
+        # UPDATE TO SCHEMA 1.8 ########################
         self.next_version = "1.8"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_7to1_8 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 1.9 ########################
+        # UPDATE TO SCHEMA 1.9 ########################
         self.next_version = "1.9"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_8to1_9 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 2.0 ########################
+        # UPDATE TO SCHEMA 2.0 ########################
         self.next_version = "2.0"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema1_9to2_0 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 2.1 ########################
+        # UPDATE TO SCHEMA 2.1 ########################
         self.next_version = "2.1"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema2_0to2_1 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 2.2 ########################
+        # UPDATE TO SCHEMA 2.2 ########################
         self.next_version = "2.2"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema2_1to2_2 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 2.3 ########################
+        # UPDATE TO SCHEMA 2.3 ########################
         self.next_version = "2.3"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema2_2to2_3 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
-       # UPDATE TO SCHEMA 2.4 ########################
+        # UPDATE TO SCHEMA 2.4 ########################
         self.next_version = "2.4"
-        if self.current < self.next_version:
+        if self.current_version < self.next_version:
             from openmolar.schema_upgrades import schema2_3to2_4 as upmod
-            self.dbu = upmod.dbUpdater(self.pb)
+            self.dbu = upmod.DatabaseUpdater(self.pb)
             self.apply_update()
 
+        # UPDATE TO SCHEMA 2.5 ########################
+        self.next_version = "2.5"
+        if self.current_version < self.next_version:
+            from openmolar.schema_upgrades import schema2_4to2_5 as upmod
+            self.dbu = upmod.DatabaseUpdater(self.pb)
+            self.apply_update()
 
-def main():
-    LOGGER.info("running schema_updater")
-    if QtGui.QApplication.instance() is None:
-        app = QtGui.QApplication(sys.argv)
-    schema_update = SchemaUpdater()
-    schema_update.run()
+        # UPDATE TO SCHEMA 2.6 ########################
+        self.next_version = "2.6"
+        if self.current_version < self.next_version:
+            from openmolar.schema_upgrades import schema2_5to2_6 as upmod
+            self.dbu = upmod.DatabaseUpdater(self.pb)
+            self.apply_update()
+
+        # UPDATE TO SCHEMA 2.7 ########################
+        self.next_version = "2.7"
+        if self.current_version < self.next_version:
+            from openmolar.schema_upgrades import schema2_6to2_7 as upmod
+            self.dbu = upmod.DatabaseUpdater(self.pb)
+            self.apply_update()
+
+        # UPDATE TO SCHEMA 2.8 ########################
+        self.next_version = "2.8"
+        if self.current_version < self.next_version:
+            from openmolar.schema_upgrades import schema2_7to2_8 as upmod
+            self.dbu = upmod.DatabaseUpdater(self.pb)
+            self.apply_update()
+
+        # UPDATE TO SCHEMA 2.9 ########################
+        self.next_version = "2.9"
+        if self.current_version < self.next_version:
+            from openmolar.schema_upgrades import schema2_8to2_9 as upmod
+            self.dbu = upmod.DatabaseUpdater(self.pb)
+            self.apply_update()
+
+        self.dbu = None
+        if schema_version.getVersion() == localsettings.CLIENT_SCHEMA_VERSION:
+            self.success()
+        else:
+            self.failure()
 
 if __name__ == "__main__":
+    from gettext import gettext as _
     #-- put "openmolar" on the pyth path and go....
     LOGGER.setLevel(logging.DEBUG)
     LOGGER.debug("starting schema_updater")
@@ -284,4 +369,6 @@ if __name__ == "__main__":
     wkdir = determine_path()
     sys.path.append(os.path.dirname(wkdir))
 
-    main()
+    app = QtGui.QApplication(sys.argv)
+    schema_updater = SchemaUpdater()
+    print schema_updater.exec_()
diff --git a/src/openmolar/qt4gui/tools/__init__.py b/src/openmolar/qt4gui/tools/__init__.py
deleted file mode 100644
index c701215..0000000
--- a/src/openmolar/qt4gui/tools/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
diff --git a/src/openmolar/qt4gui/tools/apptTools.py b/src/openmolar/qt4gui/tools/apptTools.py
deleted file mode 100644
index 30b0643..0000000
--- a/src/openmolar/qt4gui/tools/apptTools.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from PyQt4 import QtGui, QtCore
-
-import datetime
-
-from openmolar.settings import localsettings
-from openmolar.qt4gui.compiled_uis import Ui_apptTools
-from openmolar.qt4gui.dialogs import apptOpenDay, block_wizard
-from openmolar.dbtools import extend_books, db_settings
-
-
-class apptTools(Ui_apptTools.Ui_MainWindow):
-
-    def __init__(self, parent=None):
-        self.parent = parent
-        self.setupUi(parent)
-        self.signals()
-
-    def advise(self, arg, warning_level=1):
-        '''
-        inform the user of events -
-        warning level0 = status bar only.
-        warning level 1 advisory
-        warning level 2 critical (and logged)
-        '''
-        if warning_level == 0:
-            self.statusbar.showMessage(arg, 5000)  # 5000 milliseconds=5secs
-        elif warning_level == 1:
-            QtGui.QMessageBox.information(self.parent, _("Advisory"), arg)
-        elif warning_level == 2:
-            now = QtCore.QTime.currentTime()
-            QtGui.QMessageBox.warning(self.parent, _("Error"), arg)
-            #--for logging purposes
-            print "%d:%02d ERROR MESSAGE" % (now.hour(), now.minute()), arg
-
-    def openDay(self):
-        print "openDay called"
-        Dialog = QtGui.QDialog(self.parent)
-        dl = apptOpenDay.apptDialog(Dialog)
-        if dl.exec_():
-            print "openDay returned True"
-        else:
-            print "openDay returned False"
-
-    def extendBooks(self):
-        print "extending books"
-
-        message = "%s %s %s %s" % (_("Books Currently end on"),
-                                   localsettings.formatDate(
-                                   localsettings.bookEnd), "<br />",
-                                   _("extend the books now?"))
-
-        result = QtGui.QMessageBox.question(self.parent, _("Confirm"),
-                                            message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
-                                            QtGui.QMessageBox.Yes)
-
-        if result == QtGui.QMessageBox.No:
-            return
-        else:
-            months, result = QtGui.QInputDialog.getInteger(self.parent,
-                                                           _("Extend Books"), _("How many months?"))
-
-        if result:
-
-            newBookEnd = QtCore.QDate(
-                localsettings.bookEnd).addMonths(months).toPyDate()
-
-            if extend_books.extend(localsettings.apptix.values(),
-                                   localsettings.bookEnd, newBookEnd):
-                # now put this date into the settings database.
-
-                db_format = "%s,%s,%s" % newBookEnd.timetuple()[:3]
-                db_settings.insertData(
-                    "bookend", db_format, localsettings.operator)
-
-    def removeOld(self):
-        '''
-        throw the old diaries away now?
-        '''
-        print "removing old weeks"
-        self.advise(_("not yet implemented"))
-
-    def editWeeks(self):
-        '''
-        edit the working hours for a standard week for a dentist/hygenist
-        '''
-        print "editing weeks"
-        self.advise(_("not yet implemented"))
-
-    def blocks(self):
-        '''
-        insert blocks and appointments
-        '''
-        print "blocks called"
-        Dialog = QtGui.QDialog(self.parent)
-        dl = block_wizard.blocker(Dialog)
-        Dialog.exec_()
-
-    def signals(self):
-        '''
-        connect signals
-        '''
-        QtCore.QObject.connect(self.openDay_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.openDay)
-
-        QtCore.QObject.connect(self.extendBook_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.extendBooks)
-
-        QtCore.QObject.connect(self.editWeeks_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.editWeeks)
-
-        QtCore.QObject.connect(self.removeOld_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.removeOld)
-
-        QtCore.QObject.connect(self.blocks_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.blocks)
-
-if __name__ == "__main__":
-    localsettings.initiate()
-    import sys
-    app = QtGui.QApplication(sys.argv)
-    MainWindow = QtGui.QMainWindow()
-    ui = apptTools(MainWindow)
-    MainWindow.show()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/tools/new_setup.py b/src/openmolar/qt4gui/tools/new_setup.py
deleted file mode 100644
index d6e8ddc..0000000
--- a/src/openmolar/qt4gui/tools/new_setup.py
+++ /dev/null
@@ -1,457 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-import datetime
-import re
-import sys
-from PyQt4 import QtGui, QtCore
-from xml.dom import minidom
-from openmolar.settings import localsettings
-from openmolar.qt4gui.compiled_uis import Ui_initialise
-
-PRACTICE_ATTRIBS = ("name", "add1", "add2", "add3", "town", "county",
-                    "pcde_zip", "tel", "fax", "web", "email")
-
-USER_ATTRIBS = ("user_id", "user_inits", "user_name", 'user_group',
-                'active', 'deactivation_dt')
-
-
-class om_user():
-
-    def __init__(self, parent_ui):
-        self.id = None
-        self.inits = ""
-        self.name = ""
-        self.group = ""
-        self.deactivation_dt = None
-        self.active = False
-        self.parent_ui = parent_ui
-
-    def toTuple(self):
-        '''
-        changes the class to a tuple of xml friendly attribs, consistent with
-        the USER_ATTRIBS expected
-        '''
-        return (str(self.id), self.inits.upper(), self.name, self.group,
-                str(self.active), str(self.deactivation_dt))
-
-    def fromTuple(self, tup):
-        '''
-        reloads the values from a tuple
-        '''
-        self.id = tup[0]
-        self.inits = tup[1]
-        self.name = tup[2]
-        self.group = tup[3]
-        self.active = tup[4] == "True"
-        if not self.active:
-            da = tup[5].split("-")
-            self.deactivation_dt = datetime.date(int(da[0]), int(da[1]),
-                                                 int(da[2]))
-
-    def load(self):
-        '''
-        grab the user entered values
-        '''
-        self.inits = str(self.parent_ui.userInits_lineEdit.text().toAscii())
-        self.name = str(self.parent_ui.userName_lineEdit.text().toAscii())
-        self.group = str(
-            self.parent_ui.userGroup_comboBox.currentText().toAscii())
-        self.deactivation_dt = self.parent_ui.user_dateEdit.date().toPyDate()
-        self.active = self.parent_ui.userActive_checkBox.isChecked()
-
-    def verifies(self):
-        '''
-        check the data for integrity, return (True,"") if ok
-        or (False,"error message") otherwise
-        '''
-        error = ""
-        if self.inits == "":
-            error = "<p>%s</p>" % _("Please enter initials for this user")
-        if self.name == "":
-            error += "<p>%s</p>" % _("Please set a name for this user")
-
-        return (error == "", error)
-
-    def toNode(self):
-        '''
-        create an xml Node
-        '''
-        d = minidom.Document()
-        unode = d.createElement("user")
-        i = 0
-        values = self.toTuple()
-        for attrib in USER_ATTRIBS:
-            if values[i] != "None":
-                c = d.createElement(attrib)
-                c.appendChild(d.createTextNode(values[i]))
-                unode.appendChild(c)
-            i += 1
-        return unode
-
-    def fromNode(self, unode):
-        '''
-        creates an instance from existing xml
-        '''
-        tup = []
-        for attrib in USER_ATTRIBS:
-            d = unode.getElementsByTagName(attrib)
-            value = None
-            if d:
-                try:
-                    child = d[0].childNodes
-                    value = child[0].data
-                except IndexError:
-                    value = None
-            tup.append(value)
-
-        self.fromTuple(tuple(tup))
-
-
-class setup_gui(QtGui.QMainWindow):
-
-    '''
-    a ui for customising the database of openmolar
-    set details for a practice, patient categories etc...
-    '''
-
-    def __init__(self, app):
-        QtGui.QMainWindow.__init__(self)
-        self.ui = Ui_initialise.Ui_MainWindow()
-        self.ui.setupUi(self)
-        self.app = app
-        self.previousTabIndex = 0
-        self.ui.tabWidget.setCurrentIndex(0)
-        self.template = minidom.Document()
-        self.template.appendChild(self.template.createElement("template"))
-        self.ui.user_dateEdit.setDate(QtCore.QDate.currentDate())
-        self.ui.user_dateEdit.hide()
-        self.ui.user_date_label.hide()
-        self.ui.user_groupBox.hide()
-        self.ui.modifyUser_pushButton.hide()
-        self.signals()
-
-    def advise(self, arg, warning_level=0):
-        '''
-        inform the user of events -
-        warning level0 = status bar only.
-        warning level 1 advisory
-        warning level 2 critical (and logged)
-        '''
-        if warning_level == 0:
-            self.ui.statusbar.showMessage(arg, 5000)  # 5000 milliseconds=5secs
-        elif warning_level == 1:
-            QtGui.QMessageBox.information(self, _("Advisory"), arg)
-        elif warning_level == 2:
-            now = QtCore.QTime.currentTime()
-            QtGui.QMessageBox.warning(self, _("Error"), arg)
-            #--for logging purposes
-            print "%d:%02d ERROR MESSAGE" % (now.hour(), now.minute()), arg
-
-    def confirmDataOverwrite(self):
-        '''
-        check that the user is prepared to lose any changes
-        '''
-        result = QtGui.QMessageBox.question(self, _("confirm"),
-                                            "<p>%s<br />%s</p>" % (
-                                                _(
-                                                    "this action will overwrite any current data stored"),
-                                                _("proceed?")),
-                                            QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
-                                            QtGui.QMessageBox.Ok)
-        return result == QtGui.QMessageBox.Ok
-
-    def save_template(self):
-        '''
-        save the template, so it can be re-used in future
-        '''
-        try:
-            filepath = QtGui.QFileDialog.getSaveFileName(self,
-                                                         _(
-                                                         "save template file"), "",
-                                                         _("openmolar template files ") + "(*.om_xml)")
-            if filepath != '':
-                if not re.match(".*\.om_xml$", filepath):
-                    filepath += ".om_xml"
-                f = open(filepath, "w")
-                f.write(self.template.toxml())
-                f.close()
-                self.advise(_("Template Saved"), 1)
-            else:
-                self.advise(_("operation cancelled"), 1)
-        except Exception as e:
-            self.advise(_("Template not saved") + " - %s" % e, 2)
-
-    def load_template(self):
-        '''
-        change the default template for a new database
-        '''
-        if not self.confirmDataOverwrite():
-            return
-        filename = QtGui.QFileDialog.getOpenFileName(self,
-                                                     _(
-                                                     "load an existing template file"), "",
-                                                     _("openmolar template files") + " (*.om_xml)")
-
-        if filename != '':
-            try:
-                self.template = minidom.parse(str(filename))
-                self.advise(_("template loaded sucessfully"), 1)
-                self.tab_navigated(self.ui.tabWidget.currentIndex(), False)
-            except Exception as e:
-                self.advise(_("error parsing template file") + " - %s" % e, 2)
-        else:
-            self.advise(_("operation cancelled"), 1)
-
-    def tab_navigated(self, i, updateTemplate=True):
-        '''
-        a slot called when the user navigates the tabwidget
-        current tab is i
-        previous tab stored in self.previousTabIndex
-        '''
-        if updateTemplate:
-            # always true unless called following a load from file
-            if self.previousTabIndex == 1:
-                self.save_addy()
-
-        if i == 1:  # practice addy
-            self.load_addy()
-        elif i == 2:  # users
-            self.load_users()
-        elif i == 9:  # XML viewer
-            self.ui.xml_label.setText(self.template.toprettyxml())
-
-        self.previousTabIndex = i
-
-    def blankdb_radioButton(self, i):
-        '''
-        user has altered the state of the newdb from template checkbox
-        '''
-        if i and self.confirmDataOverwrite():
-            self.template = minidom.Document()
-
-    def newdb_from_template_radioButton(self, i):
-        '''
-        user has altered the state of the newdb from template checkbox
-        '''
-        if i:
-            self.load_template()
-
-    def save_addy(self):
-        '''
-        save the practice address
-        '''
-        d = self.template.getElementsByTagName("practice")
-        if d:
-            d[0].parentNode.removeChild(d[0])
-        foundText = False  # a bool to prevent unnecessary nodes
-        d = self.template.createElement("practice")
-        i = 0
-        for widg in self.ui.practice_frame.children():
-            if isinstance(widg, QtGui.QLineEdit):
-                attrib = PRACTICE_ATTRIBS[i]
-                value = str(widg.text().toAscii())
-                if value != "":
-                    foundText = True
-                    new_element = self.template.createElement(attrib)
-                    d.appendChild(new_element)
-                    new_element.appendChild(
-                        self.template.createTextNode(value))
-                i += 1
-        if foundText:
-            self.template.childNodes[0].appendChild(d)
-
-    def load_addy(self):
-        '''
-        load the practice address
-        '''
-        d = self.template.getElementsByTagName("practice")
-        i = 0
-        for widg in self.ui.practice_frame.children():
-            if isinstance(widg, QtGui.QLineEdit):
-                attrib = PRACTICE_ATTRIBS[i]
-                try:
-                    value = \
-                        d[0].getElementsByTagName(attrib)[0].firstChild.data
-                except IndexError:
-                    value = ""
-                widg.setText(value)
-                i += 1
-
-    def nameEntered(self, arg):
-        '''
-        user is entering the name of a new user
-        '''
-        wordlist = arg.split(" ")
-        inits = ""
-        for word in wordlist:
-            try:
-                inits += word[0]
-            except IndexError:
-                pass
-        self.ui.userInits_lineEdit.setText(inits)
-
-    def add_modify_User(self):
-        '''
-        user has clicked the button to add a new user
-        '''
-        if self.ui.newUser_pushButton.text() in (
-                _("Apply Now"), _("Modify Now")):
-            user = om_user(self.ui)
-            user.load()
-            result, error = user.verifies()
-            if result:
-                nodelist = self.template.getElementsByTagName("users")
-                if nodelist:
-                    d = nodelist[0]
-                else:
-                    d = self.template.createElement("users")
-                if self.ui.newUser_pushButton.text() == _("Modify Now"):
-                    selected = self.ui.users_tableWidget.currentItem().row()
-                    d.removeChild(d.childNodes[selected])
-                    self.ui.users_tableWidget.setCurrentCell(-1, -1)
-                    self.ui.modifyUser_pushButton.hide()
-
-                d.appendChild(user.toNode())
-                self.template.childNodes[0].appendChild(d)
-                self.ui.user_groupBox.hide()
-                self.ui.userName_lineEdit.setText("")
-                self.ui.userGroup_comboBox.setCurrentIndex(0)
-                self.ui.newUser_pushButton.setText(_("Add New User"))
-
-                self.tab_navigated(self.ui.tabWidget.currentIndex(), False)
-            else:
-                self.advise(error, 1)
-
-        else:
-            self.ui.users_tableWidget.setCurrentCell(-1, -1)
-            self.ui.user_groupBox.show()
-            self.ui.userActive_checkBox.setChecked(True)
-            self.ui.newUser_pushButton.setText(_("Apply Now"))
-
-    def userSelected(self):
-        '''
-        user has navigated the users table
-        '''
-        if self.ui.users_tableWidget.currentRow() != -1:
-            self.ui.user_groupBox.hide()
-            self.ui.modifyUser_pushButton.show()
-        else:
-            self.ui.modifyUser_pushButton.hide()
-
-    def modifyUser(self):
-        '''
-        modify user pushButton ha been pressed
-        '''
-        self.ui.newUser_pushButton.setText(_("Modify Now"))
-        self.ui.modifyUser_pushButton.hide()
-        selected = self.ui.users_tableWidget.selectedItems()
-        tup = []
-        for val in selected:
-            tup.append(val.text())
-        user = om_user(self.ui)
-        user.fromTuple(tuple(tup))
-        self.ui.user_groupBox.show()
-        self.ui.userName_lineEdit.setText(user.name)
-        self.ui.userInits_lineEdit.setText(user.inits)
-        self.ui.userActive_checkBox.setChecked(user.active)
-        try:
-            self.ui.user_dateEdit.setDate(user.deactivation_dt)
-        except TypeError:
-            self.ui.user_dateEdit.setDate(QtCore.QDate.currentDate())
-
-    def handleUserActive(self, arg):
-        '''
-        hide/show the deactivation date
-        '''
-        self.ui.user_dateEdit.setVisible(not arg)
-        self.ui.user_date_label.setVisible(not arg)
-
-    def load_users(self):
-        '''
-        populate the user table from the template
-        '''
-        users = self.template.getElementsByTagName("user")
-        self.ui.users_tableWidget.setRowCount(len(users))
-        rowno = 0
-        for user in users:
-            uclass = om_user(self)
-            uclass.fromNode(user)
-            colno = 0
-            for val in uclass.toTuple():
-                item = QtGui.QTableWidgetItem(val)
-                self.ui.users_tableWidget.setItem(rowno, colno, item)
-                colno += 1
-            rowno += 1
-
-    def signals(self):
-        '''
-        set up signals/slots
-        '''
-        QtCore.QObject.connect(self.ui.action_Save_Template,
-                               QtCore.SIGNAL("triggered()"), self.save_template)
-
-        QtCore.QObject.connect(self.ui.actionLoad_Template,
-                               QtCore.SIGNAL("triggered()"), self.load_template)
-
-        QtCore.QObject.connect(self.ui.blankdb_radioButton,
-                               QtCore.SIGNAL("toggled (bool)"), self.blankdb_radioButton)
-
-        QtCore.QObject.connect(self.ui.newdb_template_radioButton,
-                               QtCore.SIGNAL("toggled (bool)"), self.newdb_from_template_radioButton)
-
-        QtCore.QObject.connect(self.ui.tabWidget,
-                               QtCore.SIGNAL("currentChanged(int)"), self.tab_navigated)
-
-        QtCore.QObject.connect(self.ui.userName_lineEdit,
-                               QtCore.SIGNAL("textChanged (const QString&)"), self.nameEntered)
-
-        QtCore.QObject.connect(self.ui.newUser_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.add_modify_User)
-
-        QtCore.QObject.connect(self.ui.users_tableWidget,
-                               QtCore.SIGNAL("itemSelectionChanged()"), self.userSelected)
-
-        QtCore.QObject.connect(self.ui.users_tableWidget,
-                               QtCore.SIGNAL(
-                               "itemDoubleClicked (QTableWidgetItem *)"),
-                               self.modifyUser)
-
-        QtCore.QObject.connect(self.ui.modifyUser_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.modifyUser)
-
-        QtCore.QObject.connect(self.ui.userActive_checkBox,
-                               QtCore.SIGNAL("stateChanged (int)"), self.handleUserActive)
-
-
-def main(args):
-    app = QtGui.QApplication(args)
-    ui = setup_gui(app)
-    ui.show()
-    sys.exit(app.exec_())
-
-
-if __name__ == "__main__":
-
-    main(sys.argv)
diff --git a/src/openmolar/qt4gui/tools/recordtools.py b/src/openmolar/qt4gui/tools/recordtools.py
deleted file mode 100644
index 8429205..0000000
--- a/src/openmolar/qt4gui/tools/recordtools.py
+++ /dev/null
@@ -1,381 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-import re
-from PyQt4 import QtGui, QtCore
-
-from openmolar.settings import localsettings
-from openmolar.qt4gui.compiled_uis import Ui_record_tools
-
-TEETH = (
-    'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1',
-    'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
-    'll8', 'll7', 'll6', 'll5', 'll4', 'll3', 'll2', 'll1',
-    'lr1', 'lr2', 'lr3', 'lr4', 'lr5', 'lr6', 'lr7', 'lr8')
-
-
-class recordTools(Ui_record_tools.Ui_Dialog):
-
-    def __init__(self, om_gui):
-        self.om_gui = om_gui
-        self.dialog = QtGui.QDialog(om_gui)
-        self.setupUi(self.dialog)
-        self.tabWidget.setCurrentIndex(0)
-        self.initialMoney()
-        self.initialDates()
-        self.chartplan_lineEdits = {}
-        self.initialPlan()
-        self.chartcompleted_lineEdits = {}
-        self.initialCompleted()
-        self.initialHidden_notes()
-        self.signals()
-
-    def initialMoney(self):
-        '''
-        loads the money at startup
-        '''
-        self.total_label.setText(localsettings.formatMoney(
-                                 self.om_gui.pt.fees))
-
-        self.money0_spinBox.setValue(self.om_gui.pt.money0)
-        self.money1_spinBox.setValue(self.om_gui.pt.money1)
-        self.money2_spinBox.setValue(self.om_gui.pt.money2)
-        self.money3_spinBox.setValue(self.om_gui.pt.money3)
-        self.money4_spinBox.setValue(self.om_gui.pt.money4)
-        self.money5_spinBox.setValue(self.om_gui.pt.money5)
-        self.money6_spinBox.setValue(self.om_gui.pt.money6)
-        self.money7_spinBox.setValue(self.om_gui.pt.money7)
-        self.money8_spinBox.setValue(self.om_gui.pt.money8)
-        self.money9_spinBox.setValue(self.om_gui.pt.money9)
-        self.money10_spinBox.setValue(self.om_gui.pt.money10)
-        self.money11_spinBox.setValue(self.om_gui.pt.money11)
-
-    def updateMoneyTotal(self, arg=0):
-        '''
-        updates the money label
-        '''
-        fees = (self.money0_spinBox.value() + self.money1_spinBox.value() +
-                self.money9_spinBox.value() + self.money10_spinBox.value() +
-                self.money11_spinBox.value() - self.money2_spinBox.value() -
-                self.money3_spinBox.value() - self.money8_spinBox.value())
-
-        self.total_label.setText(localsettings.formatMoney(fees))
-
-    def changeMoney(self):
-        '''
-        modify the money fields on a patient record
-        '''
-        self.om_gui.pt.money0 = self.money0_spinBox.value()
-        self.om_gui.pt.money1 = self.money1_spinBox.value()
-        self.om_gui.pt.money2 = self.money2_spinBox.value()
-        self.om_gui.pt.money3 = self.money3_spinBox.value()
-        self.om_gui.pt.money4 = self.money4_spinBox.value()
-        self.om_gui.pt.money5 = self.money5_spinBox.value()
-        self.om_gui.pt.money6 = self.money6_spinBox.value()
-        self.om_gui.pt.money7 = self.money7_spinBox.value()
-        self.om_gui.pt.money8 = self.money8_spinBox.value()
-        self.om_gui.pt.money9 = self.money9_spinBox.value()
-        self.om_gui.pt.money10 = self.money10_spinBox.value()
-        self.om_gui.pt.money11 = self.money11_spinBox.value()
-
-        self.om_gui.updateDetails()
-        self.om_gui.advise(_("money changes applied"), 1)
-
-    def initialDates(self):
-        '''
-        modify Date fields
-        '''
-        try:
-            self.pd5_dateEdit.setDate(self.om_gui.pt.pd5)
-            self.pd5_pushButton.hide()
-        except TypeError:
-            self.pd5_dateEdit.hide()
-            QtCore.QObject.connect(self.pd5_pushButton,
-                                   QtCore.SIGNAL("clicked()"), self.pd5_dateEdit.show)
-
-        try:
-            self.pd6_dateEdit.setDate(self.om_gui.pt.pd6)
-            self.pd6_pushButton.hide()
-        except TypeError:
-            self.pd6_dateEdit.hide()
-            QtCore.QObject.connect(self.pd6_pushButton,
-                                   QtCore.SIGNAL("clicked()"), self.pd6_dateEdit.show)
-
-        try:
-            self.pd7_dateEdit.setDate(self.om_gui.pt.pd7)
-            self.pd7_pushButton.hide()
-        except TypeError:
-            self.pd7_dateEdit.hide()
-            QtCore.QObject.connect(self.pd7_pushButton,
-                                   QtCore.SIGNAL("clicked()"), self.pd7_dateEdit.show)
-
-        try:
-            self.pd8_dateEdit.setDate(self.om_gui.pt.pd8)
-            self.pd8_pushButton.hide()
-        except TypeError:
-            self.pd8_dateEdit.hide()
-            QtCore.QObject.connect(self.pd8_pushButton,
-                                   QtCore.SIGNAL("clicked()"), self.pd8_dateEdit.show)
-
-        try:
-            self.pd9_dateEdit.setDate(self.om_gui.pt.pd9)
-            self.pd9_pushButton.hide()
-        except TypeError:
-            self.pd9_dateEdit.hide()
-            QtCore.QObject.connect(self.pd9_pushButton,
-                                   QtCore.SIGNAL("clicked()"), self.pd9_dateEdit.show)
-
-        try:
-            self.pd10_dateEdit.setDate(self.om_gui.pt.pd10)
-            self.pd10_pushButton.hide()
-        except TypeError:
-            self.pd10_dateEdit.hide()
-            QtCore.QObject.connect(self.pd10_pushButton,
-                                   QtCore.SIGNAL("clicked()"), self.pd10_dateEdit.show)
-
-        try:
-            self.billdate_dateEdit.setDate(self.om_gui.pt.billdate)
-            self.billdate_pushButton.hide()
-        except TypeError:
-            self.billdate_dateEdit.hide()
-            QtCore.QObject.connect(self.billdate_pushButton,
-                                   QtCore.SIGNAL("clicked()"), self.billdate_dateEdit.show)
-
-    def changeDates(self):
-        '''
-        apply date changes
-        '''
-        if self.pd5_dateEdit.isVisible():
-            self.om_gui.pt.pd5 = self.pd5_dateEdit.date().toPyDate()
-        if self.pd6_dateEdit.isVisible():
-            self.om_gui.pt.pd6 = self.pd6_dateEdit.date().toPyDate()
-        if self.pd7_dateEdit.isVisible():
-            self.om_gui.pt.pd7 = self.pd7_dateEdit.date().toPyDate()
-        if self.pd8_dateEdit.isVisible():
-            self.om_gui.pt.pd8 = self.pd8_dateEdit.date().toPyDate()
-        if self.pd9_dateEdit.isVisible():
-            self.om_gui.pt.pd9 = self.pd9_dateEdit.date().toPyDate()
-        if self.pd10_dateEdit.isVisible():
-            self.om_gui.pt.pd10 = self.pd10_dateEdit.date().toPyDate()
-        if self.billdate_dateEdit.isVisible():
-            self.om_gui.pt.billdate = \
-                self.billdate_dateEdit.date().toPyDate()
-
-        self.om_gui.updateDetails()
-        self.om_gui.advise(_("date changes applied"), 1)
-
-    def initialPlan(self):
-        '''
-        set up the plan page
-        '''
-        glayout = QtGui.QGridLayout(self.chartplan_frame)
-        # glayout.setSpacing(0)
-        row = 0
-        for tooth in TEETH:
-            label = QtGui.QLabel()
-            label.setText(tooth)
-            self.chartplan_lineEdits[tooth] = QtGui.QLineEdit()
-            self.chartplan_lineEdits[tooth].setMaxLength(34)
-            self.chartplan_lineEdits[tooth].setText(
-                self.om_gui.pt.treatment_course.__dict__.get(tooth + "pl"))
-
-            glayout.addWidget(label, row, 0)
-            glayout.addWidget(self.chartplan_lineEdits[tooth], row, 1)
-            row += 1
-
-        self.xraypl_lineEdit.setText(self.om_gui.pt.treatment_course.xraypl)
-        self.periopl_lineEdit.setText(self.om_gui.pt.treatment_course.periopl)
-        self.anaespl_lineEdit.setText(self.om_gui.pt.treatment_course.anaespl)
-        self.otherpl_lineEdit.setText(self.om_gui.pt.treatment_course.otherpl)
-        self.custompl_lineEdit.setText(
-            self.om_gui.pt.treatment_course.custompl)
-        self.ndupl_lineEdit.setText(self.om_gui.pt.treatment_course.ndupl)
-        self.ndlpl_lineEdit.setText(self.om_gui.pt.treatment_course.ndlpl)
-        self.odupl_lineEdit.setText(self.om_gui.pt.treatment_course.odupl)
-        self.odlpl_lineEdit.setText(self.om_gui.pt.treatment_course.odlpl)
-
-    def planEntryCheck(self, le):
-        '''
-        does a quick check on anything entered
-        takes a Line Edit as arg, returns a python string
-        '''
-        vals = str(le.text().toAscii()).upper().split(" ")
-        retarg = ""
-        for val in vals:
-            if not val in ("", " "):
-                retarg += val.upper()
-        return retarg
-
-    def dentureEntry(self, le):
-        '''
-        denture lines include spaces
-        '''
-        return str(le.text().toAscii()).upper()
-
-    def changePlan(self):
-        '''
-        apply date changes
-        '''
-        for tooth in TEETH:
-            self.om_gui.pt.treatment_course.__dict__[tooth + "pl"] = \
-                self.planEntryCheck(self.chartplan_lineEdits[tooth])
-
-        course = self.om_gui.pt.treatment_course
-        course.xraypl = self.planEntryCheck(self.xraypl_lineEdit)
-        course.periopl = self.planEntryCheck(self.periopl_lineEdit)
-        course.anaespl = self.planEntryCheck(self.anaespl_lineEdit)
-        course.custompl = self.planEntryCheck(self.custompl_lineEdit)
-        course.ndupl = self.dentureEntry(self.ndupl_lineEdit)
-        course.ndlpl = self.dentureEntry(self.ndlpl_lineEdit)
-        course.odupl = self.dentureEntry(self.odupl_lineEdit)
-        course.odlpl = self.dentureEntry(self.odlpl_lineEdit)
-        self.om_gui.advise(_("plan changes applied"), 1)
-
-    def initialCompleted(self):
-        '''
-        set up the plan page
-        '''
-        glayout = QtGui.QGridLayout(self.chartcompleted_frame)
-        # glayout.setSpacing(0)
-        row = 0
-        for tooth in TEETH:
-            label = QtGui.QLabel()
-            label.setText(tooth)
-            self.chartcompleted_lineEdits[tooth] = QtGui.QLineEdit()
-            self.chartcompleted_lineEdits[tooth].setMaxLength(34)
-            self.chartcompleted_lineEdits[tooth].setText(
-                self.om_gui.pt.treatment_course.__dict__.get(tooth + "cmp"))
-
-            glayout.addWidget(label, row, 0)
-            glayout.addWidget(self.chartcompleted_lineEdits[tooth], row, 1)
-            row += 1
-
-        course = self.om_gui.pt.treatment_course
-        self.xraycmp_lineEdit.setText(course.xraycmp)
-        self.periocmp_lineEdit.setText(course.periocmp)
-        self.anaescmp_lineEdit.setText(course.anaescmp)
-        self.othercmp_lineEdit.setText(course.othercmp)
-        self.customcmp_lineEdit.setText(course.customcmp)
-        self.nducmp_lineEdit.setText(course.nducmp)
-        self.ndlcmp_lineEdit.setText(course.ndlcmp)
-        self.oducmp_lineEdit.setText(course.oducmp)
-        self.odlcmp_lineEdit.setText(course.odlcmp)
-
-    def changeCompleted(self):
-        '''
-        apply date changes
-        '''
-        for tooth in TEETH:
-            self.om_gui.pt.treatment_course.__dict__[tooth + "cmp"] = \
-                self.planEntryCheck(self.chartcompleted_lineEdits[tooth])
-
-        course = self.om_gui.pt.treatment_course
-
-        course.xraycmp = self.planEntryCheck(self.xraycmp_lineEdit)
-        course.periocmp = self.planEntryCheck(self.periocmp_lineEdit)
-        course.anaescmp = self.planEntryCheck(self.anaescmp_lineEdit)
-        course.customcmp = self.planEntryCheck(self.customcmp_lineEdit)
-        course.nducmp = self.dentureEntry(self.nducmp_lineEdit)
-        course.ndlcmp = self.dentureEntry(self.ndlcmp_lineEdit)
-        course.oducmp = self.dentureEntry(self.oducmp_lineEdit)
-        course.odlcmp = self.dentureEntry(self.odlcmp_lineEdit)
-        self.om_gui.advise(_("completed treatment changes applied"), 1)
-
-    def initialHidden_notes(self):
-        '''
-        load the patients hidden notes
-        '''
-        self.hidden_notes_tableWidget.clear()
-        self.hidden_notes_tableWidget.setColumnCount(2)
-        self.hidden_notes_tableWidget.setRowCount(
-            len(self.om_gui.pt.HIDDENNOTES))
-        header = self.hidden_notes_tableWidget.horizontalHeader()
-        self.hidden_notes_tableWidget.setHorizontalHeaderLabels(
-            ["type", "note"])
-        header.setStretchLastSection(True)
-        for row_no, (ntype, note) in enumerate(self.om_gui.pt.HIDDENNOTES):
-            ntype_item = QtGui.QTableWidgetItem(ntype)
-            self.hidden_notes_tableWidget.setItem(row_no, 0, ntype_item)
-
-            note_item = QtGui.QTableWidgetItem(note)
-            self.hidden_notes_tableWidget.setItem(row_no, 1, note_item)
-
-    def changeHidden_notes(self):
-        '''
-        apply new notes
-        '''
-        HN = []
-        for row_no in range(self.hidden_notes_tableWidget.rowCount()):
-            ntype = self.hidden_notes_tableWidget.item(row_no, 0).text()
-            note = self.hidden_notes_tableWidget.item(row_no, 1).text()
-
-            HN.append((ntype, note))
-
-        self.om_gui.pt.HIDDENNOTES = HN
-        self.om_gui.updateHiddenNotesLabel()
-        self.om_gui.advise(_("updated hidden notes list"), 1)
-
-    def signals(self):
-        '''
-        connect signals
-        '''
-        for widg in self.money_scrollAreaWidgetContents.children():
-            if isinstance(widg, QtGui.QSpinBox):
-                QtCore.QObject.connect(widg,
-                                       QtCore.SIGNAL("valueChanged (int)"), self.updateMoneyTotal)
-
-        QtCore.QObject.connect(self.money_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.changeMoney)
-
-        QtCore.QObject.connect(self.dates_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.changeDates)
-
-        QtCore.QObject.connect(self.plan_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.changePlan)
-
-        QtCore.QObject.connect(self.completed_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.changeCompleted)
-
-        QtCore.QObject.connect(self.hidden_notes_pushButton,
-                               QtCore.SIGNAL("clicked()"), self.changeHidden_notes)
-
-    def exec_(self):
-        self.dialog.exec_()
-
-if __name__ == "__main__":
-    localsettings.initiate()
-    localsettings.loadFeeTables()
-    import sys
-    from openmolar.qt4gui import maingui
-    app = QtGui.QApplication(sys.argv)
-    om_gui = maingui.OpenmolarGui()
-    om_gui.getrecord(1)
-    om_gui.pt.HIDDENNOTES = [
-        ('COURSE OPENED', '= = = = = '),
-        ('TC: EXAM', 'CE')
-    ]
-
-    ui = recordTools(om_gui)
-    ui.exec_()
-    sys.exit(app.exec_())
diff --git a/src/openmolar/resources/demodump.sql b/src/openmolar/resources/demodump.sql
deleted file mode 100644
index 2e2479f..0000000
--- a/src/openmolar/resources/demodump.sql
+++ /dev/null
@@ -1,1306 +0,0 @@
--- MySQL dump 10.13  Distrib 5.1.41, for debian-linux-gnu (x86_64)
---
--- Host: localhost    Database: openmolar_demo
--- ------------------------------------------------------
--- Server version	5.1.41-3ubuntu12.1
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `aday`
---
-
-DROP TABLE IF EXISTS `aday`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `aday` (
-  `adate` date NOT NULL DEFAULT '0000-00-00',
-  `apptix` smallint(6) NOT NULL DEFAULT '0',
-  `start` smallint(6) DEFAULT NULL,
-  `end` smallint(6) DEFAULT NULL,
-  `maxtime` smallint(6) DEFAULT NULL,
-  `flag` tinyint(4) DEFAULT NULL,
-  `memo` char(30) DEFAULT NULL,
-  `stn` tinyint(4) DEFAULT NULL,
-  `ver` tinyint(4) DEFAULT NULL,
-  PRIMARY KEY (`adate`,`apptix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `aday`
---
-
-LOCK TABLES `aday` WRITE;
-/*!40000 ALTER TABLE `aday` DISABLE KEYS */;
-INSERT INTO `aday` VALUES ('2010-05-01',4,0,1800,NULL,0,'',NULL,NULL),('2010-05-01',5,0,1800,NULL,0,'',NULL,NULL),('2010-05-01',6,0,1800,NULL,0,'',NULL,NULL),('2010-05-01',7,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',4,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',5,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',6,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',7,0,1800,NULL,0,'',NULL,NULL),('2010-05-03',0,830,1800,NULL,NULL,'DTS closed today',NULL,NULL),('2010-05-03',4,1300,1800,NULL,1,'',NULL,NULL),(' [...]
-/*!40000 ALTER TABLE `aday` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `apr`
---
-
-DROP TABLE IF EXISTS `apr`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `apr` (
-  `serialno` int(11) NOT NULL DEFAULT '0',
-  `aprix` tinyint(4) NOT NULL DEFAULT '0',
-  `practix` smallint(6) DEFAULT NULL,
-  `code0` char(8) DEFAULT NULL,
-  `code1` char(8) DEFAULT NULL,
-  `code2` char(8) DEFAULT NULL,
-  `note` char(20) DEFAULT NULL,
-  `adate` date DEFAULT NULL,
-  `atime` smallint(6) DEFAULT NULL,
-  `length` smallint(6) DEFAULT NULL,
-  `flag0` tinyint(4) DEFAULT NULL,
-  `flag1` tinyint(4) DEFAULT NULL,
-  `flag2` tinyint(4) DEFAULT NULL,
-  `flag3` tinyint(4) DEFAULT NULL,
-  `flag4` tinyint(4) DEFAULT NULL,
-  `datespec` char(10) DEFAULT NULL,
-  PRIMARY KEY (`serialno`,`aprix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `apr`
---
-
-LOCK TABLES `apr` WRITE;
-/*!40000 ALTER TABLE `apr` DISABLE KEYS */;
-INSERT INTO `apr` VALUES (1,1,4,'EXAM','','','','2009-04-06',945,20,0,80,0,0,0,''),(1,2,4,'CR PREP','','','','2009-05-05',915,60,0,80,0,0,0,''),(1,3,4,'CR FIT','FILL','','',NULL,0,30,0,80,0,0,0,'+14'),(1,4,6,'SP','','','nw patient','2009-05-26',1200,30,1,80,0,0,0,''),(3,1,6,'SP','','','',NULL,NULL,30,1,80,0,0,0,''),(4,1,4,'EXAM','','','new patient','2009-07-01',1130,15,1,73,0,0,0,'');
-/*!40000 ALTER TABLE `apr` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `aslot`
---
-
-DROP TABLE IF EXISTS `aslot`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `aslot` (
-  `adate` date DEFAULT NULL,
-  `apptix` smallint(6) DEFAULT NULL,
-  `start` smallint(6) DEFAULT NULL,
-  `end` smallint(6) DEFAULT NULL,
-  `name` char(30) DEFAULT NULL,
-  `serialno` int(11) DEFAULT NULL,
-  `code0` char(8) DEFAULT NULL,
-  `code1` char(8) DEFAULT NULL,
-  `code2` char(8) DEFAULT NULL,
-  `note` char(20) DEFAULT NULL,
-  `flag0` tinyint(4) DEFAULT NULL,
-  `flag1` tinyint(4) DEFAULT NULL,
-  `flag2` tinyint(4) DEFAULT NULL,
-  `flag3` tinyint(4) DEFAULT NULL,
-  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
-  KEY `adate` (`adate`,`apptix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `aslot`
---
-
-LOCK TABLES `aslot` WRITE;
-/*!40000 ALTER TABLE `aslot` DISABLE KEYS */;
-INSERT INTO `aslot` VALUES ('2010-05-03',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-04',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-05',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-06',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-10',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-11',6,1300,1400,'LUNCH',0,'','','','',-128,0, [...]
-/*!40000 ALTER TABLE `aslot` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `bpe`
---
-
-DROP TABLE IF EXISTS `bpe`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `bpe` (
-  `serialno` int(11) NOT NULL DEFAULT '0',
-  `bpedate` date NOT NULL DEFAULT '0000-00-00',
-  `bpe` char(6) DEFAULT NULL,
-  PRIMARY KEY (`serialno`,`bpedate`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `bpe`
---
-
-LOCK TABLES `bpe` WRITE;
-/*!40000 ALTER TABLE `bpe` DISABLE KEYS */;
-INSERT INTO `bpe` VALUES (1,'2004-04-15','444344'),(1,'2009-05-07','_____3');
-/*!40000 ALTER TABLE `bpe` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `calendar`
---
-
-DROP TABLE IF EXISTS `calendar`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `calendar` (
-  `adate` date NOT NULL,
-  `memo` char(30) DEFAULT NULL,
-  PRIMARY KEY (`adate`),
-  KEY `adate` (`adate`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `calendar`
---
-
-LOCK TABLES `calendar` WRITE;
-/*!40000 ALTER TABLE `calendar` DISABLE KEYS */;
-INSERT INTO `calendar` VALUES ('2009-12-25','Christmas Day'),('2009-12-26','Boxing Day'),('2009-01-01','New Year\'s Day'),('2009-01-25','Burn\'s Night'),('2009-04-10','GoodFriday'),('2009-05-04','May Bank Holiday'),('2009-05-25','Spring Bank Holiday'),('2009-08-03','Summer Bank Holiday'),('2009-12-28','in lieu of Boxing Day'),('2010-12-26','Boxing Day'),('2010-12-25','Christmas Day'),('2010-01-01','New Year\'s Day'),('2010-01-04','in Lieu of January 2'),('2010-05-03','May Bank Holiday'), [...]
-/*!40000 ALTER TABLE `calendar` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `calldurr`
---
-
-DROP TABLE IF EXISTS `calldurr`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `calldurr` (
-  `stn` tinyint(4) NOT NULL DEFAULT '0',
-  `serialno` int(11) DEFAULT NULL,
-  PRIMARY KEY (`stn`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `calldurr`
---
-
-LOCK TABLES `calldurr` WRITE;
-/*!40000 ALTER TABLE `calldurr` DISABLE KEYS */;
-/*!40000 ALTER TABLE `calldurr` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `cashbook`
---
-
-DROP TABLE IF EXISTS `cashbook`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `cashbook` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `cbdate` date DEFAULT NULL,
-  `ref` char(10) DEFAULT NULL,
-  `linkid` int(11) DEFAULT NULL,
-  `descr` varchar(32) DEFAULT NULL,
-  `code` tinyint(3) unsigned DEFAULT NULL,
-  `dntid` smallint(6) DEFAULT NULL,
-  `amt` int(11) DEFAULT NULL,
-  PRIMARY KEY (`id`),
-  KEY `date` (`cbdate`),
-  KEY `ref` (`ref`)
-) ENGINE=InnoDB AUTO_INCREMENT=112372 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `cashbook`
---
-
-LOCK TABLES `cashbook` WRITE;
-/*!40000 ALTER TABLE `cashbook` DISABLE KEYS */;
-INSERT INTO `cashbook` VALUES (37424,'1996-06-14','000001',0,'MOLAR O',1,2,1076),(40664,'1996-12-23','000001',0,'MOLAR O',1,2,416),(51621,'1998-10-07','000001',0,'MOLAR O',1,4,2108),(54730,'1999-06-28','000001',0,'MOLAR O',1,4,1064),(55284,'1999-08-05','000001',0,'MOLAR O',7,4,7300),(58957,'2000-04-28','000001',0,'MOLAR O',2,4,1175),(63432,'2001-03-23','000001',0,'MOLAR O',2,4,3150),(70944,'2002-07-01','000001',0,'MOLAR O',2,4,3300),(90356,'2005-03-08','000001',0,'MOLAR O',2,4,4200),(976 [...]
-/*!40000 ALTER TABLE `cashbook` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `cbcodes`
---
-
-DROP TABLE IF EXISTS `cbcodes`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `cbcodes` (
-  `code` tinyint(3) unsigned DEFAULT NULL,
-  `flag` tinyint(4) DEFAULT NULL,
-  `descr` char(20) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `cbcodes`
---
-
-LOCK TABLES `cbcodes` WRITE;
-/*!40000 ALTER TABLE `cbcodes` DISABLE KEYS */;
-INSERT INTO `cbcodes` VALUES (0,2,'DPB'),(1,2,'NHS CASH'),(2,2,'PRIVATE CASH'),(3,2,'NHS CHEQUE'),(4,2,'PRIVATE CHEQUE'),(5,2,'NHS CREDIT CARD'),(6,2,'PRIVATE CREDIT CARD'),(7,2,'NHS SWITCH CARD'),(8,2,'PRIVATE SWITCH CARD'),(9,0,''),(10,0,''),(11,0,''),(12,0,''),(13,1,'HIGHLAND DENTAL PLAN'),(14,2,'SUNDRIES CASH'),(15,2,'SUNDRIES CHEQUE'),(16,2,'SUNDRIES SWITCH'),(17,2,'SUNDRIES CREDIT CARD'),(18,3,'SUNDRIES'),(19,0,''),(20,0,''),(21,3,'ANNUAL HDPS'),(22,0,''),(23,0,''),(24,3,'OTHER'),( [...]
-/*!40000 ALTER TABLE `cbcodes` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `claims`
---
-
-DROP TABLE IF EXISTS `claims`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `claims` (
-  `courseno` int(11) NOT NULL DEFAULT '0',
-  `serialno` int(11) NOT NULL DEFAULT '0',
-  `dntix` smallint(6) DEFAULT '0',
-  `proddate` date DEFAULT NULL,
-  `startdate` date DEFAULT NULL,
-  `cmpldate` date DEFAULT NULL,
-  `regdate` date DEFAULT NULL,
-  `authdate` date DEFAULT NULL,
-  `dob` date DEFAULT NULL,
-  `sname` varchar(30) DEFAULT NULL,
-  `fname` varchar(30) DEFAULT NULL,
-  `addr1` varchar(30) DEFAULT NULL,
-  `addr2` varchar(30) DEFAULT NULL,
-  `addr3` varchar(30) DEFAULT NULL,
-  `pcde` varchar(30) DEFAULT NULL,
-  `nhsno` varchar(30) DEFAULT NULL,
-  `prevsname` varchar(30) DEFAULT NULL,
-  `exempttext` varchar(50) DEFAULT NULL,
-  `i0` int(11) DEFAULT '0',
-  `i1` int(11) DEFAULT '0',
-  `i2` int(11) DEFAULT '0',
-  `i3` int(11) DEFAULT '0',
-  `i4` int(11) DEFAULT '0',
-  `f0` tinyint(3) unsigned DEFAULT '0',
-  `f1` tinyint(3) unsigned DEFAULT '0',
-  `f2` tinyint(3) unsigned DEFAULT '0',
-  `f3` tinyint(3) unsigned DEFAULT '0',
-  `f4` tinyint(3) unsigned DEFAULT '0',
-  `f5` tinyint(3) unsigned DEFAULT '0',
-  `f6` tinyint(3) unsigned DEFAULT '0',
-  `f7` tinyint(3) unsigned DEFAULT '0',
-  `f8` tinyint(3) unsigned DEFAULT '0',
-  `f9` tinyint(3) unsigned DEFAULT '0',
-  `submstatus` tinyint(4) DEFAULT '0',
-  `submcount` tinyint(4) DEFAULT '0',
-  `submno` int(11) DEFAULT '0',
-  `claimdata` blob,
-  `trtdata` blob,
-  `archdate` date DEFAULT NULL,
-  `town` varchar(30) DEFAULT NULL,
-  `county` varchar(30) DEFAULT NULL,
-  `regtype` tinyint(3) unsigned DEFAULT '0',
-  PRIMARY KEY (`serialno`,`courseno`),
-  KEY `dentist` (`dntix`),
-  KEY `patient` (`sname`,`fname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `claims`
---
-
-LOCK TABLES `claims` WRITE;
-/*!40000 ALTER TABLE `claims` DISABLE KEYS */;
-/*!40000 ALTER TABLE `claims` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `clinical_memos`
---
-
-DROP TABLE IF EXISTS `clinical_memos`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `clinical_memos` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `serialno` int(11) unsigned NOT NULL,
-  `author` char(8) DEFAULT NULL,
-  `datestamp` datetime NOT NULL,
-  `hidden` tinyint(1) NOT NULL DEFAULT '0',
-  `synopsis` text,
-  PRIMARY KEY (`ix`),
-  KEY `serialno` (`serialno`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `clinical_memos`
---
-
-LOCK TABLES `clinical_memos` WRITE;
-/*!40000 ALTER TABLE `clinical_memos` DISABLE KEYS */;
-/*!40000 ALTER TABLE `clinical_memos` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `currtrtmt`
---
-
-DROP TABLE IF EXISTS `currtrtmt`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `currtrtmt` (
-  `serialno` int(11) NOT NULL,
-  `courseno` int(11) NOT NULL,
-  `xraypl` varchar(56) DEFAULT NULL,
-  `periopl` varchar(56) DEFAULT NULL,
-  `anaespl` varchar(56) DEFAULT NULL,
-  `otherpl` varchar(56) DEFAULT NULL,
-  `ndupl` varchar(56) DEFAULT NULL,
-  `ndlpl` varchar(56) DEFAULT NULL,
-  `odupl` varchar(56) DEFAULT NULL,
-  `odlpl` varchar(56) DEFAULT NULL,
-  `xraycmp` varchar(56) DEFAULT NULL,
-  `periocmp` varchar(56) DEFAULT NULL,
-  `anaescmp` varchar(56) DEFAULT NULL,
-  `othercmp` varchar(56) DEFAULT NULL,
-  `nducmp` varchar(56) DEFAULT NULL,
-  `ndlcmp` varchar(56) DEFAULT NULL,
-  `oducmp` varchar(56) DEFAULT NULL,
-  `odlcmp` varchar(56) DEFAULT NULL,
-  `ur8pl` varchar(34) DEFAULT NULL,
-  `ur7pl` varchar(34) DEFAULT NULL,
-  `ur6pl` varchar(34) DEFAULT NULL,
-  `ur5pl` varchar(34) DEFAULT NULL,
-  `ur4pl` varchar(34) DEFAULT NULL,
-  `ur3pl` varchar(34) DEFAULT NULL,
-  `ur2pl` varchar(34) DEFAULT NULL,
-  `ur1pl` varchar(34) DEFAULT NULL,
-  `ul1pl` varchar(34) DEFAULT NULL,
-  `ul2pl` varchar(34) DEFAULT NULL,
-  `ul3pl` varchar(34) DEFAULT NULL,
-  `ul4pl` varchar(34) DEFAULT NULL,
-  `ul5pl` varchar(34) DEFAULT NULL,
-  `ul6pl` varchar(34) DEFAULT NULL,
-  `ul7pl` varchar(34) DEFAULT NULL,
-  `ul8pl` varchar(34) DEFAULT NULL,
-  `ll8pl` varchar(34) DEFAULT NULL,
-  `ll7pl` varchar(34) DEFAULT NULL,
-  `ll6pl` varchar(34) DEFAULT NULL,
-  `ll5pl` varchar(34) DEFAULT NULL,
-  `ll4pl` varchar(34) DEFAULT NULL,
-  `ll3pl` varchar(34) DEFAULT NULL,
-  `ll2pl` varchar(34) DEFAULT NULL,
-  `ll1pl` varchar(34) DEFAULT NULL,
-  `lr1pl` varchar(34) DEFAULT NULL,
-  `lr2pl` varchar(34) DEFAULT NULL,
-  `lr3pl` varchar(34) DEFAULT NULL,
-  `lr4pl` varchar(34) DEFAULT NULL,
-  `lr5pl` varchar(34) DEFAULT NULL,
-  `lr6pl` varchar(34) DEFAULT NULL,
-  `lr7pl` varchar(34) DEFAULT NULL,
-  `lr8pl` varchar(34) DEFAULT NULL,
-  `ur8cmp` varchar(34) DEFAULT NULL,
-  `ur7cmp` varchar(34) DEFAULT NULL,
-  `ur6cmp` varchar(34) DEFAULT NULL,
-  `ur5cmp` varchar(34) DEFAULT NULL,
-  `ur4cmp` varchar(34) DEFAULT NULL,
-  `ur3cmp` varchar(34) DEFAULT NULL,
-  `ur2cmp` varchar(34) DEFAULT NULL,
-  `ur1cmp` varchar(34) DEFAULT NULL,
-  `ul1cmp` varchar(34) DEFAULT NULL,
-  `ul2cmp` varchar(34) DEFAULT NULL,
-  `ul3cmp` varchar(34) DEFAULT NULL,
-  `ul4cmp` varchar(34) DEFAULT NULL,
-  `ul5cmp` varchar(34) DEFAULT NULL,
-  `ul6cmp` varchar(34) DEFAULT NULL,
-  `ul7cmp` varchar(34) DEFAULT NULL,
-  `ul8cmp` varchar(34) DEFAULT NULL,
-  `ll8cmp` varchar(34) DEFAULT NULL,
-  `ll7cmp` varchar(34) DEFAULT NULL,
-  `ll6cmp` varchar(34) DEFAULT NULL,
-  `ll5cmp` varchar(34) DEFAULT NULL,
-  `ll4cmp` varchar(34) DEFAULT NULL,
-  `ll3cmp` varchar(34) DEFAULT NULL,
-  `ll2cmp` varchar(34) DEFAULT NULL,
-  `ll1cmp` varchar(34) DEFAULT NULL,
-  `lr1cmp` varchar(34) DEFAULT NULL,
-  `lr2cmp` varchar(34) DEFAULT NULL,
-  `lr3cmp` varchar(34) DEFAULT NULL,
-  `lr4cmp` varchar(34) DEFAULT NULL,
-  `lr5cmp` varchar(34) DEFAULT NULL,
-  `lr6cmp` varchar(34) DEFAULT NULL,
-  `lr7cmp` varchar(34) DEFAULT NULL,
-  `lr8cmp` varchar(34) DEFAULT NULL,
-  `examt` varchar(10) DEFAULT NULL,
-  `examd` date DEFAULT NULL,
-  `accd` date DEFAULT NULL,
-  `cmpd` date DEFAULT NULL,
-  `custompl` varchar(56) DEFAULT NULL,
-  `customcmp` varchar(56) DEFAULT NULL,
-  PRIMARY KEY (`serialno`,`courseno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `currtrtmt`
---
-
-LOCK TABLES `currtrtmt` WRITE;
-/*!40000 ALTER TABLE `currtrtmt` DISABLE KEYS */;
-INSERT INTO `currtrtmt` VALUES (1,147660,'2S 2S ','SP','','','','','','','','','','','','','','','','CR,GO ','','','','P ','','','','MI ','','','','DO ','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','CE','2009-05-24','2009-04-06','2009-05-25','',''),(1,147670,'','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','' [...]
-/*!40000 ALTER TABLE `currtrtmt` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `daybook`
---
-
-DROP TABLE IF EXISTS `daybook`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `daybook` (
-  `date` date DEFAULT NULL,
-  `serialno` int(11) DEFAULT NULL,
-  `coursetype` char(1) DEFAULT NULL,
-  `dntid` smallint(6) DEFAULT NULL,
-  `trtid` smallint(6) DEFAULT NULL,
-  `diagn` varchar(56) DEFAULT NULL,
-  `perio` varchar(56) DEFAULT NULL,
-  `anaes` varchar(56) DEFAULT NULL,
-  `misc` varchar(56) DEFAULT NULL,
-  `ndu` varchar(56) DEFAULT NULL,
-  `ndl` varchar(56) DEFAULT NULL,
-  `odu` varchar(56) DEFAULT NULL,
-  `odl` varchar(56) DEFAULT NULL,
-  `other` varchar(56) DEFAULT NULL,
-  `chart` blob,
-  `feesa` int(11) DEFAULT NULL,
-  `feesb` int(11) DEFAULT NULL,
-  `feesc` int(11) DEFAULT NULL,
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  PRIMARY KEY (`id`),
-  KEY `date` (`date`),
-  KEY `serialno` (`serialno`)
-) ENGINE=InnoDB AUTO_INCREMENT=287212 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `daybook`
---
-
-LOCK TABLES `daybook` WRITE;
-/*!40000 ALTER TABLE `daybook` DISABLE KEYS */;
-INSERT INTO `daybook` VALUES ('1996-06-14',1,'N',2,2,'CE ','SP ','','','','','','','','\0',1345,1076,0,107466),('1996-12-23',1,'N',2,2,'CE ','','','','','','','','','\0',520,416,0,117803),('1997-11-07',1,'N',2,2,'CE ','SP ','','','','','','','','\0',1390,1112,0,135436),('1997-11-21',1,'N',2,2,'','','','','','','','','','UR4 DO,PR  LR6 DO,PR  \0',3190,-1112,0,136327),('1998-10-07',1,'N',4,4,'CE ','','','','','','','','','LL7 MODL,PR  \0',2635,0,0,151382),('1999-06-28',1,'N',4,4,'CE 2S ',' [...]
-/*!40000 ALTER TABLE `daybook` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `docsimported`
---
-
-DROP TABLE IF EXISTS `docsimported`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `docsimported` (
-  `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
-  `serialno` int(11) unsigned NOT NULL DEFAULT '0',
-  `datatype` varchar(60) NOT NULL DEFAULT 'application/octet-stream',
-  `name` varchar(120) NOT NULL DEFAULT '',
-  `size` bigint(20) unsigned NOT NULL DEFAULT '1024',
-  `filedate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
-  `importime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
-  PRIMARY KEY (`ix`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `docsimported`
---
-
-LOCK TABLES `docsimported` WRITE;
-/*!40000 ALTER TABLE `docsimported` DISABLE KEYS */;
-/*!40000 ALTER TABLE `docsimported` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `docsimporteddata`
---
-
-DROP TABLE IF EXISTS `docsimporteddata`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `docsimporteddata` (
-  `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
-  `masterid` mediumint(8) unsigned NOT NULL DEFAULT '0',
-  `filedata` blob NOT NULL,
-  PRIMARY KEY (`ix`),
-  KEY `master_idx` (`masterid`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `docsimporteddata`
---
-
-LOCK TABLES `docsimporteddata` WRITE;
-/*!40000 ALTER TABLE `docsimporteddata` DISABLE KEYS */;
-/*!40000 ALTER TABLE `docsimporteddata` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `exemptions`
---
-
-DROP TABLE IF EXISTS `exemptions`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `exemptions` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `serialno` int(11) unsigned NOT NULL,
-  `exemption` varchar(10) DEFAULT NULL,
-  `exempttext` varchar(50) DEFAULT NULL,
-  `datestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
-  PRIMARY KEY (`ix`),
-  KEY `serialno` (`serialno`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `exemptions`
---
-
-LOCK TABLES `exemptions` WRITE;
-/*!40000 ALTER TABLE `exemptions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `exemptions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `families`
---
-
-DROP TABLE IF EXISTS `families`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `families` (
-  `familyno` int(11) NOT NULL,
-  `head` int(11) DEFAULT NULL,
-  PRIMARY KEY (`familyno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `families`
---
-
-LOCK TABLES `families` WRITE;
-/*!40000 ALTER TABLE `families` DISABLE KEYS */;
-/*!40000 ALTER TABLE `families` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `feetable_key`
---
-
-DROP TABLE IF EXISTS `feetable_key`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `feetable_key` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `tablename` char(30) DEFAULT NULL,
-  `categories` char(30) DEFAULT NULL,
-  `description` char(60) DEFAULT NULL,
-  `startdate` date DEFAULT NULL,
-  `enddate` date DEFAULT NULL,
-  `feecoltypes` tinytext,
-  `in_use` tinyint(1) NOT NULL DEFAULT '1',
-  `display_order` smallint(6) DEFAULT NULL,
-  `data` mediumtext,
-  PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `feetable_key`
---
-
-LOCK TABLES `feetable_key` WRITE;
-/*!40000 ALTER TABLE `feetable_key` DISABLE KEYS */;
-INSERT INTO `feetable_key` VALUES (1,'feetable_scotNHS_08_Adult','N','Scottish NHS Adult feescale implemented April 2008','2008-04-01','2009-08-31','<?xml version=\"1.0\"?><columns><column type=\"fee\">fee</column><column type=\"ptfee\">pt_fee</column></columns>',1,5,'<?xml version=\"1.0\" ?><table><item><section>1</section><code>0101</code><oldcode>1a</oldcode><USERCODE>CE</USERCODE><description>clinical examination^</description><brief_description>clinical exam</brief_description><pl_c [...]
-/*!40000 ALTER TABLE `feetable_key` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `forum`
---
-
-DROP TABLE IF EXISTS `forum`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `forum` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `parent_ix` int(10) unsigned DEFAULT NULL,
-  `inits` char(5) DEFAULT NULL,
-  `fdate` datetime DEFAULT NULL,
-  `topic` char(30) DEFAULT NULL,
-  `comment` text NOT NULL,
-  `open` tinyint(1) NOT NULL DEFAULT '1',
-  `recipient` char(8) DEFAULT NULL,
-  PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `forum`
---
-
-LOCK TABLES `forum` WRITE;
-/*!40000 ALTER TABLE `forum` DISABLE KEYS */;
-INSERT INTO `forum` VALUES (1,NULL,'Anon','2009-06-26 13:01:32','What Are you working on?','can you tell us?',0,NULL),(2,NULL,'USER','2009-06-26 13:02:12','windows version','doesn\'t look as good as the linux version - can you fix this?',0,NULL),(3,NULL,'USER','2010-05-31 22:45:34','Example Forum Posts','This could be anything which needs to be aired. The forum has proved REALLY useful, espescially as many care workers are part-time.',1,'ALL'),(4,3,'Anon','2010-05-31 22:45:50','re. Examp [...]
-/*!40000 ALTER TABLE `forum` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `forumread`
---
-
-DROP TABLE IF EXISTS `forumread`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `forumread` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `id` int(10) unsigned NOT NULL,
-  `op` char(8) DEFAULT NULL,
-  `readdate` datetime NOT NULL,
-  PRIMARY KEY (`ix`),
-  KEY `id` (`id`)
-) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `forumread`
---
-
-LOCK TABLES `forumread` WRITE;
-/*!40000 ALTER TABLE `forumread` DISABLE KEYS */;
-INSERT INTO `forumread` VALUES (1,2,'USER','2010-05-31 22:43:56'),(2,3,'USER','2010-05-31 22:45:34'),(3,4,'USER','2010-05-31 22:45:50'),(4,4,'NW','2010-05-31 23:37:40'),(5,5,'NW','2010-05-31 23:39:03'),(6,5,'NW','2010-06-01 00:29:30');
-/*!40000 ALTER TABLE `forumread` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mednotes`
---
-
-DROP TABLE IF EXISTS `mednotes`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mednotes` (
-  `serialno` int(11) NOT NULL,
-  `drnm` varchar(60) DEFAULT NULL,
-  `adrtel` varchar(60) DEFAULT NULL,
-  `curmed` varchar(60) DEFAULT NULL,
-  `allerg` varchar(60) DEFAULT NULL,
-  `heart` varchar(60) DEFAULT NULL,
-  `lungs` varchar(60) DEFAULT NULL,
-  `liver` varchar(60) DEFAULT NULL,
-  `kidney` varchar(60) DEFAULT NULL,
-  `bleed` varchar(60) DEFAULT NULL,
-  `anaes` varchar(60) DEFAULT NULL,
-  `other` varchar(60) DEFAULT NULL,
-  `oldmed` varchar(60) DEFAULT NULL,
-  `alert` tinyint(1) NOT NULL DEFAULT '0',
-  `chkdate` date DEFAULT NULL,
-  PRIMARY KEY (`serialno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mednotes`
---
-
-LOCK TABLES `mednotes` WRITE;
-/*!40000 ALTER TABLE `mednotes` DISABLE KEYS */;
-INSERT INTO `mednotes` VALUES (1,'new doctor again','dunno','non','med ok','heart','lungs','liver','bleeding','kidneys','ops','other','?',0,NULL),(3,'','','','','','','','','','','','',0,NULL);
-/*!40000 ALTER TABLE `mednotes` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mnhist`
---
-
-DROP TABLE IF EXISTS `mnhist`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mnhist` (
-  `serialno` int(11) DEFAULT NULL,
-  `chgdate` date DEFAULT NULL,
-  `ix` tinyint(3) unsigned DEFAULT NULL,
-  `note` varchar(60) DEFAULT NULL,
-  KEY `sd` (`serialno`,`chgdate`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mnhist`
---
-
-LOCK TABLES `mnhist` WRITE;
-/*!40000 ALTER TABLE `mnhist` DISABLE KEYS */;
-INSERT INTO `mnhist` VALUES (1,'2009-05-05',140,'new doctor'),(1,'2009-05-05',141,''),(1,'2009-05-05',142,''),(1,'2009-05-05',143,''),(1,'2009-05-05',144,''),(1,'2009-05-05',145,''),(1,'2009-05-05',146,''),(1,'2009-05-05',147,''),(1,'2009-05-05',148,''),(1,'2009-05-05',149,''),(1,'2009-05-05',150,'');
-/*!40000 ALTER TABLE `mnhist` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `newdocsprinted`
---
-
-DROP TABLE IF EXISTS `newdocsprinted`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `newdocsprinted` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `serialno` int(11) DEFAULT NULL,
-  `printdate` date DEFAULT NULL,
-  `docname` char(20) DEFAULT NULL,
-  `docversion` smallint(6) DEFAULT NULL,
-  `data` blob,
-  PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `newdocsprinted`
---
-
-LOCK TABLES `newdocsprinted` WRITE;
-/*!40000 ALTER TABLE `newdocsprinted` DISABLE KEYS */;
-INSERT INTO `newdocsprinted` VALUES (1,1,'2009-06-01','Account toneA (pdf)',1,'%PDF-1.4\n1 0 obj\n<<\n/Title ()\n/Creator ()\n/Producer (Qt 4.4.3 (C) 1992-2008 Nokia Corporation and/or its subsidiary(-ies))\n/CreationDate (D:20090601213502)\n>>\nendobj\n2 0 obj\n<<\n/Type /Catalog\n/Pages 3 0 R\n>>\nendobj\n4 0 obj\n<<\n/Type /ExtGState\n/SA true\n/SM 0.02\n/ca 1.0\n/CA 1.0\n/AIS false\n/SMask /None>>\nendobj\n5 0 obj\n[/Pattern /DeviceRGB]\nendobj\n6 0 obj\n<<\n/Type /Page\n/Parent 3 0  [...]
-/*!40000 ALTER TABLE `newdocsprinted` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `newestimates`
---
-
-DROP TABLE IF EXISTS `newestimates`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `newestimates` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `serialno` int(11) NOT NULL,
-  `courseno` int(10) unsigned DEFAULT NULL,
-  `category` char(12) DEFAULT NULL,
-  `type` char(20) DEFAULT NULL,
-  `number` tinyint(4) DEFAULT NULL,
-  `itemcode` char(4) DEFAULT NULL,
-  `description` char(50) DEFAULT NULL,
-  `fee` int(11) DEFAULT NULL,
-  `ptfee` int(11) DEFAULT NULL,
-  `csetype` char(5) DEFAULT NULL,
-  `feescale` char(1) DEFAULT NULL,
-  `dent` tinyint(1) DEFAULT NULL,
-  `completed` tinyint(1) DEFAULT NULL,
-  `carriedover` tinyint(1) DEFAULT NULL,
-  `linked` tinyint(1) DEFAULT NULL,
-  `modified_by` varchar(20) NOT NULL,
-  `time_stamp` datetime NOT NULL,
-  PRIMARY KEY (`ix`),
-  KEY `serialno` (`serialno`),
-  KEY `courseno` (`courseno`)
-) ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `newestimates`
---
-
-LOCK TABLES `newestimates` WRITE;
-/*!40000 ALTER TABLE `newestimates` DISABLE KEYS */;
-INSERT INTO `newestimates` VALUES (22,2,147669,'ul3','MI',1,'1420','composite filling* - ul3',8650,8650,'P','0',4,1,0,0,'NW','2010-05-31 23:58:01'),(3,1,147678,'exam','CE',1,'0101','clinical examination^',1950,1950,'P','A',4,0,0,NULL,'1_0to1_1script','2010-05-31 22:24:02'),(4,2,147669,'exam','CE',1,'0101','clinical examination^',1950,1950,'P','A',4,1,0,NULL,'1_0to1_1script','2010-05-31 22:24:02'),(5,3,147679,'exam','CE',1,'0101','clinical examination^',1950,1950,'P','A',5,1,0,NULL,'1_0to [...]
-/*!40000 ALTER TABLE `newestimates` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `newfeetable`
---
-
-DROP TABLE IF EXISTS `newfeetable`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `newfeetable` (
-  `ix` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
-  `section` smallint(6) DEFAULT NULL,
-  `USERCODE` char(14) DEFAULT NULL,
-  `code` char(8) DEFAULT NULL,
-  `oldcode` char(12) DEFAULT NULL,
-  `regulation` char(50) DEFAULT NULL,
-  `max_per_course` char(25) DEFAULT NULL,
-  `description` char(60) DEFAULT NULL,
-  `description1` char(60) DEFAULT NULL,
-  `NF08` int(11) DEFAULT NULL,
-  `NF08_pt` int(11) DEFAULT NULL,
-  `PFA` int(11) DEFAULT NULL,
-  `NF09` int(11) DEFAULT NULL,
-  `NF09_pt` int(11) DEFAULT NULL,
-  PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=495 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `newfeetable`
---
-
-LOCK TABLES `newfeetable` WRITE;
-/*!40000 ALTER TABLE `newfeetable` DISABLE KEYS */;
-INSERT INTO `newfeetable` VALUES (1,1,'CE','0101','1a','','1','clinical examination^','clinical exam',800,0,1950,1950,0),(2,1,'ECE','0111','1b','','1','extensive clinical examination^','extensive clinical exam',1200,0,3850,4500,0),(3,1,'FCA','0121','1c','','1','full case assessment^','full case assessment',2500,0,6655,7500,0),(4,1,'CTS','0131','1d','','1','care and treatment summary^','care & treatment summary',395,316,0,0,0),(5,2,'S','0201','2a1','n=1:A,n=2:B,n=3:C,n>3:C+(n-3)*D,max=E', [...]
-/*!40000 ALTER TABLE `newfeetable` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `notes`
---
-
-DROP TABLE IF EXISTS `notes`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `notes` (
-  `serialno` int(11) NOT NULL,
-  `lineno` smallint(5) unsigned NOT NULL,
-  `line` varchar(80) DEFAULT NULL,
-  PRIMARY KEY (`serialno`,`lineno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `notes`
---
-
-LOCK TABLES `notes` WRITE;
-/*!40000 ALTER TABLE `notes` DISABLE KEYS */;
-INSERT INTO `notes` VALUES (1,0,'ECM/CM``)'),(1,1,'pCE'),(1,2,'rˆTM —TM ¦TM ¤TM ´TM '),(1,3,'iSP '),(1,4,'d'),(1,5,'`4'),(1,6,'JM/JM``'),(1,7,'s'),(1,8,'a'),(1,9,'`'),(1,10,'JM/JM``'),(1,11,'w10.76 B'),(1,12,'`'),(1,13,'ECM/CM
`
`
;'),(1,14,'pCE'),(1,15,'
`
'),(1,16,'JM/JM
`
`
'),(1,17,'{'),(1,18,'w4.16 B'),(1,19,'a'),(1,20,'
`
'),(1,21,'ECM/CM
a
a7'),(1,22,'pCE'),(1,23,'iSP '),(1,24,'
a'),(1,25,'ECM/CM
a
a'),(1,26, [...]
-/*!40000 ALTER TABLE `notes` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `opid`
---
-
-DROP TABLE IF EXISTS `opid`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `opid` (
-  `id` char(5) NOT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `opid`
---
-
-LOCK TABLES `opid` WRITE;
-/*!40000 ALTER TABLE `opid` DISABLE KEYS */;
-INSERT INTO `opid` VALUES ('BW'),('NW'),('REC'),('USER');
-/*!40000 ALTER TABLE `opid` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `patients`
---
-
-DROP TABLE IF EXISTS `patients`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `patients` (
-  `serialno` int(11) NOT NULL,
-  `pf0` tinyint(4) DEFAULT NULL,
-  `pf1` tinyint(4) DEFAULT NULL,
-  `pf2` tinyint(4) DEFAULT NULL,
-  `pf3` tinyint(4) DEFAULT NULL,
-  `pf4` tinyint(4) DEFAULT NULL,
-  `pf5` tinyint(4) DEFAULT NULL,
-  `pf6` tinyint(4) DEFAULT NULL,
-  `pf7` tinyint(4) DEFAULT NULL,
-  `pf8` tinyint(4) DEFAULT NULL,
-  `pf9` tinyint(4) DEFAULT NULL,
-  `pf10` tinyint(4) DEFAULT NULL,
-  `pf11` tinyint(4) DEFAULT NULL,
-  `pf12` tinyint(4) DEFAULT NULL,
-  `pf14` tinyint(4) DEFAULT NULL,
-  `pf15` tinyint(4) DEFAULT NULL,
-  `pf16` tinyint(4) DEFAULT NULL,
-  `pf17` tinyint(4) DEFAULT NULL,
-  `pf18` tinyint(4) DEFAULT NULL,
-  `pf19` tinyint(4) DEFAULT NULL,
-  `money0` int(11) DEFAULT NULL,
-  `money1` int(11) DEFAULT NULL,
-  `money2` int(11) DEFAULT NULL,
-  `money3` int(11) DEFAULT NULL,
-  `money4` int(11) DEFAULT NULL,
-  `money5` int(11) DEFAULT NULL,
-  `money6` int(11) DEFAULT NULL,
-  `money7` int(11) DEFAULT NULL,
-  `money8` int(11) DEFAULT NULL,
-  `money9` int(11) DEFAULT NULL,
-  `money10` int(11) DEFAULT NULL,
-  `pd0` date DEFAULT NULL,
-  `pd1` date DEFAULT NULL,
-  `pd2` date DEFAULT NULL,
-  `pd3` date DEFAULT NULL,
-  `pd4` date DEFAULT NULL,
-  `pd5` date DEFAULT NULL,
-  `pd6` date DEFAULT NULL,
-  `pd7` date DEFAULT NULL,
-  `pd8` date DEFAULT NULL,
-  `pd9` date DEFAULT NULL,
-  `pd10` date DEFAULT NULL,
-  `pd11` date DEFAULT NULL,
-  `pd12` date DEFAULT NULL,
-  `pd13` date DEFAULT NULL,
-  `pd14` date DEFAULT NULL,
-  `sname` varchar(30) DEFAULT NULL,
-  `fname` varchar(30) DEFAULT NULL,
-  `title` varchar(30) DEFAULT NULL,
-  `sex` char(1) DEFAULT NULL,
-  `dob` date DEFAULT NULL,
-  `addr1` varchar(30) DEFAULT NULL,
-  `addr2` varchar(30) DEFAULT NULL,
-  `addr3` varchar(30) DEFAULT NULL,
-  `pcde` varchar(30) DEFAULT NULL,
-  `tel1` varchar(30) DEFAULT NULL,
-  `tel2` varchar(30) DEFAULT NULL,
-  `occup` varchar(30) DEFAULT NULL,
-  `nhsno` varchar(30) DEFAULT NULL,
-  `cnfd` date DEFAULT NULL,
-  `psn` varchar(30) DEFAULT NULL,
-  `cset` varchar(10) DEFAULT NULL,
-  `dnt1` smallint(6) DEFAULT NULL,
-  `dnt2` smallint(6) DEFAULT NULL,
-  `courseno0` int(11) DEFAULT NULL,
-  `courseno1` int(11) DEFAULT NULL,
-  `exempttext` varchar(50) DEFAULT NULL,
-  `ur8st` varchar(34) DEFAULT NULL,
-  `ur7st` varchar(34) DEFAULT NULL,
-  `ur6st` varchar(34) DEFAULT NULL,
-  `ur5st` varchar(34) DEFAULT NULL,
-  `ur4st` varchar(34) DEFAULT NULL,
-  `ur3st` varchar(34) DEFAULT NULL,
-  `ur2st` varchar(34) DEFAULT NULL,
-  `ur1st` varchar(34) DEFAULT NULL,
-  `ul1st` varchar(34) DEFAULT NULL,
-  `ul2st` varchar(34) DEFAULT NULL,
-  `ul3st` varchar(34) DEFAULT NULL,
-  `ul4st` varchar(34) DEFAULT NULL,
-  `ul5st` varchar(34) DEFAULT NULL,
-  `ul6st` varchar(34) DEFAULT NULL,
-  `ul7st` varchar(34) DEFAULT NULL,
-  `ul8st` varchar(34) DEFAULT NULL,
-  `ll8st` varchar(34) DEFAULT NULL,
-  `ll7st` varchar(34) DEFAULT NULL,
-  `ll6st` varchar(34) DEFAULT NULL,
-  `ll5st` varchar(34) DEFAULT NULL,
-  `ll4st` varchar(34) DEFAULT NULL,
-  `ll3st` varchar(34) DEFAULT NULL,
-  `ll2st` varchar(34) DEFAULT NULL,
-  `ll1st` varchar(34) DEFAULT NULL,
-  `lr1st` varchar(34) DEFAULT NULL,
-  `lr2st` varchar(34) DEFAULT NULL,
-  `lr3st` varchar(34) DEFAULT NULL,
-  `lr4st` varchar(34) DEFAULT NULL,
-  `lr5st` varchar(34) DEFAULT NULL,
-  `lr6st` varchar(34) DEFAULT NULL,
-  `lr7st` varchar(34) DEFAULT NULL,
-  `lr8st` varchar(34) DEFAULT NULL,
-  `dent0` tinyint(4) DEFAULT NULL,
-  `dent1` tinyint(4) DEFAULT NULL,
-  `dent2` tinyint(4) DEFAULT NULL,
-  `dent3` tinyint(4) DEFAULT NULL,
-  `exmpt` varchar(10) DEFAULT NULL,
-  `recd` date DEFAULT NULL,
-  `dmask` char(7) DEFAULT NULL,
-  `minstart` smallint(6) DEFAULT NULL,
-  `maxend` smallint(6) DEFAULT NULL,
-  `billdate` date DEFAULT NULL,
-  `billct` tinyint(3) unsigned DEFAULT NULL,
-  `billtype` char(1) DEFAULT NULL,
-  `pf20` tinyint(4) DEFAULT NULL,
-  `money11` int(11) DEFAULT NULL,
-  `pf13` tinyint(4) DEFAULT NULL,
-  `familyno` int(11) DEFAULT NULL,
-  `memo` varchar(255) DEFAULT NULL,
-  `town` varchar(30) DEFAULT NULL,
-  `county` varchar(30) DEFAULT NULL,
-  `mobile` varchar(30) DEFAULT NULL,
-  `fax` varchar(30) DEFAULT NULL,
-  `email1` varchar(50) DEFAULT NULL,
-  `email2` varchar(50) DEFAULT NULL,
-  `status` varchar(30) DEFAULT NULL,
-  `source` varchar(30) DEFAULT NULL,
-  `enrolled` date DEFAULT NULL,
-  `archived` tinyint(4) DEFAULT '0',
-  `initaccept` date DEFAULT NULL,
-  `lastreaccept` date DEFAULT NULL,
-  `lastclaim` date DEFAULT NULL,
-  `expiry` date DEFAULT NULL,
-  `cstatus` tinyint(3) unsigned DEFAULT NULL,
-  `transfer` date DEFAULT NULL,
-  `pstatus` tinyint(3) unsigned DEFAULT NULL,
-  `courseno2` int(11) DEFAULT NULL,
-  PRIMARY KEY (`serialno`),
-  KEY `sname` (`sname`,`fname`),
-  KEY `familyno` (`familyno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `patients`
---
-
-LOCK TABLES `patients` WRITE;
-/*!40000 ALTER TABLE `patients` DISABLE KEYS */;
-INSERT INTO `patients` VALUES (1,1,1,0,0,0,3,0,0,0,0,0,65,0,0,0,1,2,0,0,0,0,0,0,0,40450,0,0,0,0,0,NULL,NULL,NULL,'1999-08-05','2009-05-25','2007-07-13',NULL,NULL,NULL,'2006-02-08','1999-06-28',NULL,NULL,NULL,NULL,'MOLAR','OPEN','MR','M','1969-12-09','1512, RUE DE LA SOLEIL','DAVIOT','','IV0 0XX','NO PHONE','','','',NULL,'','P',4,4,147678,147660,'','TM ','MOB,GL ','TM ','DO ','MODBP ','','P RT MI ','DIP PV RT P ','D ','M ','P,AM ','','','MODP MB,CO ','MODBP,CO ','TM ','TM ','CR,GO ','TM ' [...]
-/*!40000 ALTER TABLE `patients` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `perio`
---
-
-DROP TABLE IF EXISTS `perio`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `perio` (
-  `serialno` int(11) NOT NULL DEFAULT '0',
-  `chartdate` date NOT NULL DEFAULT '0000-00-00',
-  `bpe` char(6) DEFAULT NULL,
-  `chartdata` blob,
-  `flag` tinyint(3) unsigned DEFAULT NULL,
-  PRIMARY KEY (`serialno`,`chartdate`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `perio`
---
-
-LOCK TABLES `perio` WRITE;
-/*!40000 ALTER TABLE `perio` DISABLE KEYS */;
-/*!40000 ALTER TABLE `perio` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `phrasebook`
---
-
-DROP TABLE IF EXISTS `phrasebook`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `phrasebook` (
-  `clinician_id` int(10) unsigned NOT NULL,
-  `phrases` text,
-  PRIMARY KEY (`clinician_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `phrasebook`
---
-
-LOCK TABLES `phrasebook` WRITE;
-/*!40000 ALTER TABLE `phrasebook` DISABLE KEYS */;
-INSERT INTO `phrasebook` VALUES (0,'<?xml version=\"1.0\" ?>\n<phrasebook>\n<section>\n    <header>Anaesthetics</header>\n    <phrase>No LA.</phrase>\n    <phrase>Anaesthetic Used - Citanest</phrase>\n    <phrase>Anaesthetic Used - Scandonest Plain</phrase>\n    <phrase>Anaesthetic Used - Septonest + 1:100,000 Adrenaline (Gold)</phrase>\n    <phrase>Anaesthetic Used - Septonest + 1:200,000 Adrenaline (Green)</phrase>\n    <phrase>Anaesthetic Used - Lignocaine + 1:80,000 Adrenaline</phras [...]
-/*!40000 ALTER TABLE `phrasebook` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `plandata`
---
-
-DROP TABLE IF EXISTS `plandata`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `plandata` (
-  `serialno` int(11) NOT NULL,
-  `plantype` char(4) DEFAULT NULL,
-  `band` char(1) DEFAULT NULL,
-  `grosschg` int(11) DEFAULT NULL,
-  `discount` int(11) DEFAULT NULL,
-  `netchg` int(11) DEFAULT NULL,
-  `catcode` char(1) DEFAULT NULL,
-  `planjoin` date DEFAULT NULL,
-  `regno` int(11) DEFAULT NULL,
-  PRIMARY KEY (`serialno`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `plandata`
---
-
-LOCK TABLES `plandata` WRITE;
-/*!40000 ALTER TABLE `plandata` DISABLE KEYS */;
-INSERT INTO `plandata` VALUES (1,'HDP','C',1229,5,NULL,'3','1994-01-05',67),(2,'','B',978,5,NULL,'3','2009-06-21',68),(3,'','B',978,5,NULL,'2','2009-06-21',69);
-/*!40000 ALTER TABLE `plandata` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `practitioners`
---
-
-DROP TABLE IF EXISTS `practitioners`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `practitioners` (
-  `id` smallint(6) NOT NULL DEFAULT '0',
-  `inits` char(4) DEFAULT NULL,
-  `name` varchar(30) DEFAULT NULL,
-  `apptix` smallint(6) DEFAULT NULL,
-  `formalname` varchar(30) DEFAULT NULL,
-  `fpcno` varchar(20) DEFAULT NULL,
-  `quals` varchar(30) DEFAULT NULL,
-  `datefrom` date DEFAULT NULL,
-  `dateto` date DEFAULT NULL,
-  `flag0` tinyint(4) DEFAULT NULL,
-  `flag1` tinyint(4) DEFAULT NULL,
-  `flag2` tinyint(4) DEFAULT NULL,
-  `flag3` tinyint(4) DEFAULT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `practitioners`
---
-
-LOCK TABLES `practitioners` WRITE;
-/*!40000 ALTER TABLE `practitioners` DISABLE KEYS */;
-INSERT INTO `practitioners` VALUES (4,'NW','Neil Wallace',4,'MR N.A. WALLACE','DEMO','BChD',NULL,NULL,1,1,1,1),(5,'BW','Bea Wallace',5,'MRS B.A. WALLACE','DEMO','B.Ch.D.',NULL,NULL,1,0,1,1),(6,'AH','Able Hygenist',6,'Ms Able Hygenist','DEMO','BSDHT',NULL,NULL,0,0,1,1);
-/*!40000 ALTER TABLE `practitioners` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `ptmemos`
---
-
-DROP TABLE IF EXISTS `ptmemos`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `ptmemos` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `serialno` int(11) DEFAULT NULL,
-  `enabled` tinyint(1) DEFAULT NULL,
-  `author` char(5) DEFAULT NULL,
-  `type` char(5) DEFAULT NULL,
-  `mdate` datetime DEFAULT NULL,
-  `expiredate` date DEFAULT NULL,
-  `message` char(200) DEFAULT NULL,
-  `open` tinyint(1) NOT NULL DEFAULT '1',
-  PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `ptmemos`
---
-
-LOCK TABLES `ptmemos` WRITE;
-/*!40000 ALTER TABLE `ptmemos` DISABLE KEYS */;
-INSERT INTO `ptmemos` VALUES (10,3,NULL,'USER','all','2009-06-18 00:00:00','3000-01-01','fees outstanding.',1);
-/*!40000 ALTER TABLE `ptmemos` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `settings`
---
-
-DROP TABLE IF EXISTS `settings`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `settings` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `value` varchar(128) DEFAULT NULL,
-  `data` text,
-  `hostname` varchar(128) DEFAULT NULL,
-  `station` char(20) DEFAULT NULL,
-  `user` char(20) DEFAULT NULL,
-  `modified_by` varchar(20) NOT NULL,
-  `time_stamp` datetime NOT NULL,
-  PRIMARY KEY (`ix`),
-  KEY `value` (`value`)
-) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `settings`
---
-
-LOCK TABLES `settings` WRITE;
-/*!40000 ALTER TABLE `settings` DISABLE KEYS */;
-INSERT INTO `settings` VALUES (1,'Schema_Version','1.1',NULL,NULL,NULL,'1_0 to 1_1 script','2010-05-31 22:24:02'),(3,'Schema_Version','1.2',NULL,NULL,NULL,'1_1 to 1_2 script','2010-05-31 22:24:02'),(5,'Schema_Version','1.3',NULL,NULL,NULL,'1_2 to 1_3 script','2010-05-31 22:24:03'),(8,'Schema_Version','1.4',NULL,NULL,NULL,'1_3 to 1_4 script','2010-05-31 22:24:04'),(10,'Schema_Version','1.5',NULL,NULL,NULL,'1_4 to 1_5 script','2010-05-31 22:24:04'),(12,'Schema_Version','1.6',NULL,NULL,NULL [...]
-/*!40000 ALTER TABLE `settings` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `tasks`
---
-
-DROP TABLE IF EXISTS `tasks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `tasks` (
-  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `op` char(8) DEFAULT NULL,
-  `author` char(8) DEFAULT NULL,
-  `type` char(8) DEFAULT NULL,
-  `mdate` datetime NOT NULL,
-  `due` datetime NOT NULL,
-  `message` char(255) DEFAULT NULL,
-  `completed` tinyint(1) NOT NULL DEFAULT '0',
-  `visible` tinyint(1) NOT NULL DEFAULT '1',
-  PRIMARY KEY (`ix`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `tasks`
---
-
-LOCK TABLES `tasks` WRITE;
-/*!40000 ALTER TABLE `tasks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `tasks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `userdata`
---
-
-DROP TABLE IF EXISTS `userdata`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `userdata` (
-  `serialno` int(11) NOT NULL,
-  `data` blob,
-  PRIMARY KEY (`serialno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `userdata`
---
-
-LOCK TABLES `userdata` WRITE;
-/*!40000 ALTER TABLE `userdata` DISABLE KEYS */;
-/*!40000 ALTER TABLE `userdata` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2010-06-01  0:31:09
diff --git a/src/openmolar/resources/referral_data.xml b/src/openmolar/resources/referral_data.xml
deleted file mode 100644
index 5accdec..0000000
--- a/src/openmolar/resources/referral_data.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0"?>
-<referrals>
-<referral>
-<description>Oral Surgery - Raigmore</description>
-<surgeon_postal>Dr Adrian Farrow</surgeon_postal>
-<surgeon_greeting>Dr Farrow</surgeon_greeting>
-<address>
-<line>The Consultant</line>
-<line>Oral Surgery</line>
-<line>Raigmore Hospital</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-<referral>
-<description>Orthodontics - Raigmore</description>
-<surgeon_postal>Mr Adrian Hart</surgeon_postal>
-<surgeon_greeting>Mr Hart</surgeon_greeting>
-<address>
-<line>Consultant Orthodontist</line>
-<line>Department of Orthodontics</line>
-<line>Raigmore Hospital</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-<referral>
-<description>Restorative - Raigmore</description>
-<surgeon_postal>Dr M.A. Donachie</surgeon_postal>
-<surgeon_greeting>Dr Donachie</surgeon_greeting>
-<address>
-<line>Restorative Consultant</line>
-<line>Dental Department</line>
-<line>Raigmore Hospital</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-
-<referral>
-<description>Dr. Chris Buchanan - Highland Ortho</description>
-<surgeon_postal>Dr. Chris Buchanan</surgeon_postal>
-<surgeon_greeting>Dr. Buchanan</surgeon_greeting>
-<address>
-<line>Highland Orthodontics</line>
-<line>67 Kenneth Street</line>
-<line>Inverness</line>
-<line>IV3 5QF</line>
-</address>
-</referral>
-
-<referral>
-<description>Michael Gough</description>
-<surgeon_postal>Dr. Michael Gough</surgeon_postal>
-<surgeon_greeting>Michael</surgeon_greeting>
-<address>
-<line>Southside Dental Practice</line> 
-<line>28 Southside Road</line>
-<line>Inverness</line>
-</address>
-</referral>
-
-<referral>
-<description>Inverness Dental Centre (GA kids..)</description>
-<surgeon_postal>The Community Dental Officer</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address> 
-<line>Inverness Dental Centre</line>
-<line>Centre For Health Science</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-<referral>
-<description>Special Care - RNI/New Craigs</description>
-<surgeon_postal>Dr. Rhona Brown</surgeon_postal>
-<surgeon_greeting>Dr. Brown</surgeon_greeting>
-<address>
-<line>Dental Department</line>
-<line>RNI Community Hospital</line>
-<line>Ness Walk</line>
-<line>Inverness</line>
-</address>
-</referral>
-
-<referral>
-<description>Oral Surgery, Dundee</description>
-<surgeon_postal>The Consultant Oral Surgeon</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address>
-<line>Department of Oral Surgery</line>
-<line>Dundee Dental Hospital</line>
-<line>Park Place</line>
-<line>Dundee</line>
-</address>
-</referral>
-
-<referral>
-<description>Oral Surgery, Glasgow</description>
-<surgeon_postal>The Consultant Oral Surgeon</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address>
-<line>Department of Oral Surgery</line>
-<line>Glasgow Dental Hospital</line>
-<line>378 Sauchiehall Street</line>
-<line>Glasgow</line>
-<line>G2 3JZ.</line>
-</address>
-</referral>
-
-<referral>
-<description>Oral Surgery, Edinburgh</description>
-<surgeon_postal>The Consultant Oral Surgeon</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address>
-<line>Department of Oral Surgery</line>
-<line>Edinburgh Dental Institute</line>
-<line>The University of Edinburgh</line>
-<line>4th Floor, Lauriston Building</line>
-<line>Lauriston Place</line>
-<line>Edinburgh</line>
-<line>EH3 9HA</line>
-</address>
-
-</referral>
-
-</referrals>
-
diff --git a/src/openmolar/resources/schema.sql b/src/openmolar/resources/schema.sql
new file mode 100644
index 0000000..ffd354f
--- /dev/null
+++ b/src/openmolar/resources/schema.sql
@@ -0,0 +1,1619 @@
+-- MySQL dump 10.13  Distrib 5.5.37, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost    Database: openmolar_demo
+-- ------------------------------------------------------
+-- Server version	5.5.37-1
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `aday`
+--
+
+DROP TABLE IF EXISTS `aday`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `aday` (
+  `adate` date NOT NULL DEFAULT '0000-00-00',
+  `apptix` smallint(6) NOT NULL DEFAULT '0',
+  `start` smallint(6) DEFAULT NULL,
+  `end` smallint(6) DEFAULT NULL,
+  `maxtime` smallint(6) DEFAULT NULL,
+  `flag` tinyint(4) DEFAULT NULL,
+  `memo` char(30) DEFAULT NULL,
+  `stn` tinyint(4) DEFAULT NULL,
+  `ver` tinyint(4) DEFAULT NULL,
+  PRIMARY KEY (`adate`,`apptix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `aday`
+--
+
+LOCK TABLES `aday` WRITE;
+/*!40000 ALTER TABLE `aday` DISABLE KEYS */;
+/*!40000 ALTER TABLE `aday` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `appt_prefs`
+--
+
+DROP TABLE IF EXISTS `appt_prefs`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `appt_prefs` (
+  `serialno` int(11) NOT NULL DEFAULT '0',
+  `recall_active` tinyint(1) NOT NULL DEFAULT '1',
+  `recdent_period` int(11) DEFAULT NULL,
+  `recdent` date DEFAULT NULL,
+  `rechyg_period` int(11) DEFAULT NULL,
+  `rechyg` date DEFAULT NULL,
+  `recall_method` enum('post','sms','email','tel') DEFAULT NULL,
+  `sms_reminders` tinyint(1) NOT NULL DEFAULT '0',
+  `no_combined_appts` tinyint(1) NOT NULL DEFAULT '0',
+  `note` varchar(120) DEFAULT NULL,
+  PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `appt_prefs`
+--
+
+LOCK TABLES `appt_prefs` WRITE;
+/*!40000 ALTER TABLE `appt_prefs` DISABLE KEYS */;
+/*!40000 ALTER TABLE `appt_prefs` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `apr`
+--
+
+DROP TABLE IF EXISTS `apr`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `apr` (
+  `serialno` int(11) NOT NULL DEFAULT '0',
+  `aprix` tinyint(4) NOT NULL DEFAULT '0',
+  `practix` smallint(6) DEFAULT NULL,
+  `code0` char(8) DEFAULT NULL,
+  `code1` char(8) DEFAULT NULL,
+  `code2` char(8) DEFAULT NULL,
+  `note` char(20) DEFAULT NULL,
+  `adate` date DEFAULT NULL,
+  `atime` smallint(6) DEFAULT NULL,
+  `length` smallint(6) DEFAULT NULL,
+  `flag0` tinyint(4) DEFAULT NULL,
+  `flag1` tinyint(4) DEFAULT NULL,
+  `flag2` tinyint(4) DEFAULT NULL,
+  `flag3` tinyint(4) DEFAULT NULL,
+  `flag4` tinyint(4) DEFAULT NULL,
+  `datespec` char(10) DEFAULT NULL,
+  PRIMARY KEY (`serialno`,`aprix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `apr`
+--
+
+LOCK TABLES `apr` WRITE;
+/*!40000 ALTER TABLE `apr` DISABLE KEYS */;
+/*!40000 ALTER TABLE `apr` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `aslot`
+--
+
+DROP TABLE IF EXISTS `aslot`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `aslot` (
+  `adate` date DEFAULT NULL,
+  `apptix` smallint(6) DEFAULT NULL,
+  `start` smallint(6) DEFAULT NULL,
+  `end` smallint(6) DEFAULT NULL,
+  `name` char(30) DEFAULT NULL,
+  `serialno` int(11) DEFAULT NULL,
+  `code0` char(8) DEFAULT NULL,
+  `code1` char(8) DEFAULT NULL,
+  `code2` char(8) DEFAULT NULL,
+  `note` char(20) DEFAULT NULL,
+  `flag0` tinyint(4) DEFAULT NULL,
+  `flag1` tinyint(4) DEFAULT NULL,
+  `flag2` tinyint(4) DEFAULT NULL,
+  `flag3` tinyint(4) DEFAULT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  KEY `adate` (`adate`,`apptix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `aslot`
+--
+
+LOCK TABLES `aslot` WRITE;
+/*!40000 ALTER TABLE `aslot` DISABLE KEYS */;
+/*!40000 ALTER TABLE `aslot` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `bpe`
+--
+
+DROP TABLE IF EXISTS `bpe`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `bpe` (
+  `serialno` int(11) NOT NULL DEFAULT '0',
+  `bpedate` date NOT NULL DEFAULT '0000-00-00',
+  `bpe` char(6) DEFAULT NULL,
+  PRIMARY KEY (`serialno`,`bpedate`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `bpe`
+--
+
+LOCK TABLES `bpe` WRITE;
+/*!40000 ALTER TABLE `bpe` DISABLE KEYS */;
+/*!40000 ALTER TABLE `bpe` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `calendar`
+--
+
+DROP TABLE IF EXISTS `calendar`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `calendar` (
+  `adate` date NOT NULL,
+  `memo` char(30) DEFAULT NULL,
+  PRIMARY KEY (`adate`),
+  KEY `adate` (`adate`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `calendar`
+--
+
+LOCK TABLES `calendar` WRITE;
+/*!40000 ALTER TABLE `calendar` DISABLE KEYS */;
+/*!40000 ALTER TABLE `calendar` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `calldurr`
+--
+
+DROP TABLE IF EXISTS `calldurr`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `calldurr` (
+  `stn` tinyint(4) NOT NULL DEFAULT '0',
+  `serialno` int(11) DEFAULT NULL,
+  PRIMARY KEY (`stn`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `calldurr`
+--
+
+LOCK TABLES `calldurr` WRITE;
+/*!40000 ALTER TABLE `calldurr` DISABLE KEYS */;
+/*!40000 ALTER TABLE `calldurr` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `cashbook`
+--
+
+DROP TABLE IF EXISTS `cashbook`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cashbook` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `cbdate` date DEFAULT NULL,
+  `ref` char(10) DEFAULT NULL,
+  `linkid` int(11) DEFAULT NULL,
+  `descr` varchar(32) DEFAULT NULL,
+  `code` tinyint(3) unsigned DEFAULT NULL,
+  `dntid` smallint(6) DEFAULT NULL,
+  `amt` int(11) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `date` (`cbdate`),
+  KEY `ref` (`ref`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cashbook`
+--
+
+LOCK TABLES `cashbook` WRITE;
+/*!40000 ALTER TABLE `cashbook` DISABLE KEYS */;
+/*!40000 ALTER TABLE `cashbook` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `cbcodes`
+--
+
+DROP TABLE IF EXISTS `cbcodes`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cbcodes` (
+  `code` tinyint(3) unsigned DEFAULT NULL,
+  `flag` tinyint(4) DEFAULT NULL,
+  `descr` char(20) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cbcodes`
+--
+
+LOCK TABLES `cbcodes` WRITE;
+/*!40000 ALTER TABLE `cbcodes` DISABLE KEYS */;
+INSERT INTO `cbcodes` VALUES (1,2,'NHS CASH'),(2,2,'PRIVATE CASH'),(3,2,'NHS CHEQUE'),(4,2,'PRIVATE CHEQUE'),(5,2,'NHS CARD'),(6,2,'PRIVATE CARD'),(9,2,'BANK TRANSFER'),(14,2,'SUNDRY CASH'),(15,2,'SUNDRY CHEQUE'),(17,2,'SUNDRY CARD'),(21,2,'ANNUAL HDP'),(24,2,'OTHER'),(125,2,'REFUND');
+/*!40000 ALTER TABLE `cbcodes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `claims`
+--
+
+DROP TABLE IF EXISTS `claims`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `claims` (
+  `courseno` int(11) NOT NULL DEFAULT '0',
+  `serialno` int(11) NOT NULL DEFAULT '0',
+  `dntix` smallint(6) DEFAULT '0',
+  `proddate` date DEFAULT NULL,
+  `startdate` date DEFAULT NULL,
+  `cmpldate` date DEFAULT NULL,
+  `regdate` date DEFAULT NULL,
+  `authdate` date DEFAULT NULL,
+  `dob` date DEFAULT NULL,
+  `sname` varchar(30) DEFAULT NULL,
+  `fname` varchar(30) DEFAULT NULL,
+  `addr1` varchar(30) DEFAULT NULL,
+  `addr2` varchar(30) DEFAULT NULL,
+  `addr3` varchar(30) DEFAULT NULL,
+  `pcde` varchar(30) DEFAULT NULL,
+  `nhsno` varchar(30) DEFAULT NULL,
+  `prevsname` varchar(30) DEFAULT NULL,
+  `exempttext` varchar(50) DEFAULT NULL,
+  `i0` int(11) DEFAULT '0',
+  `i1` int(11) DEFAULT '0',
+  `i2` int(11) DEFAULT '0',
+  `i3` int(11) DEFAULT '0',
+  `i4` int(11) DEFAULT '0',
+  `f0` tinyint(3) unsigned DEFAULT '0',
+  `f1` tinyint(3) unsigned DEFAULT '0',
+  `f2` tinyint(3) unsigned DEFAULT '0',
+  `f3` tinyint(3) unsigned DEFAULT '0',
+  `f4` tinyint(3) unsigned DEFAULT '0',
+  `f5` tinyint(3) unsigned DEFAULT '0',
+  `f6` tinyint(3) unsigned DEFAULT '0',
+  `f7` tinyint(3) unsigned DEFAULT '0',
+  `f8` tinyint(3) unsigned DEFAULT '0',
+  `f9` tinyint(3) unsigned DEFAULT '0',
+  `submstatus` tinyint(4) DEFAULT '0',
+  `submcount` tinyint(4) DEFAULT '0',
+  `submno` int(11) DEFAULT '0',
+  `claimdata` blob,
+  `trtdata` blob,
+  `archdate` date DEFAULT NULL,
+  `town` varchar(30) DEFAULT NULL,
+  `county` varchar(30) DEFAULT NULL,
+  `regtype` tinyint(3) unsigned DEFAULT '0',
+  PRIMARY KEY (`serialno`,`courseno`),
+  KEY `dentist` (`dntix`),
+  KEY `patient` (`sname`,`fname`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `claims`
+--
+
+LOCK TABLES `claims` WRITE;
+/*!40000 ALTER TABLE `claims` DISABLE KEYS */;
+/*!40000 ALTER TABLE `claims` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `clinical_memos`
+--
+
+DROP TABLE IF EXISTS `clinical_memos`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `clinical_memos` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) unsigned NOT NULL,
+  `author` char(8) DEFAULT NULL,
+  `datestamp` datetime NOT NULL,
+  `hidden` tinyint(1) NOT NULL DEFAULT '0',
+  `synopsis` text,
+  PRIMARY KEY (`ix`),
+  KEY `serialno` (`serialno`)
+) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `clinical_memos`
+--
+
+LOCK TABLES `clinical_memos` WRITE;
+/*!40000 ALTER TABLE `clinical_memos` DISABLE KEYS */;
+INSERT INTO `clinical_memos` VALUES (1,1,'REC','2014-06-10 20:28:10',0,'This patient is for demonstration purposes only. Any similarity to any person, alive or dead, is entirely unintentional.');
+/*!40000 ALTER TABLE `clinical_memos` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `clinician_dates`
+--
+
+DROP TABLE IF EXISTS `clinician_dates`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `clinician_dates` (
+  `clinician_ix` smallint(5) unsigned NOT NULL,
+  `start_date` date NOT NULL,
+  `end_date` date DEFAULT NULL,
+  `date_comments` varchar(255) DEFAULT NULL,
+  KEY `clinician_ix` (`clinician_ix`),
+  CONSTRAINT `clinician_dates_ibfk_1` FOREIGN KEY (`clinician_ix`) REFERENCES `clinicians` (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `clinician_dates`
+--
+
+LOCK TABLES `clinician_dates` WRITE;
+/*!40000 ALTER TABLE `clinician_dates` DISABLE KEYS */;
+/*!40000 ALTER TABLE `clinician_dates` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `clinicians`
+--
+
+DROP TABLE IF EXISTS `clinicians`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `clinicians` (
+  `ix` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+  `initials` char(5) NOT NULL,
+  `name` varchar(64) NOT NULL,
+  `formal_name` varchar(128) DEFAULT NULL,
+  `qualifications` varchar(64) DEFAULT NULL,
+  `type` smallint(5) NOT NULL DEFAULT '1',
+  `speciality` varchar(64) DEFAULT NULL,
+  `data` varchar(255) DEFAULT NULL,
+  `comments` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `clinicians`
+--
+
+LOCK TABLES `clinicians` WRITE;
+/*!40000 ALTER TABLE `clinicians` DISABLE KEYS */;
+/*!40000 ALTER TABLE `clinicians` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `currtrtmt2`
+--
+
+DROP TABLE IF EXISTS `currtrtmt2`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `currtrtmt2` (
+  `courseno` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) DEFAULT NULL,
+  `examt` varchar(10) NOT NULL DEFAULT '',
+  `examd` date DEFAULT NULL,
+  `accd` date DEFAULT NULL,
+  `cmpd` date DEFAULT NULL,
+  `xraypl` varchar(56) NOT NULL DEFAULT '',
+  `periopl` varchar(56) NOT NULL DEFAULT '',
+  `anaespl` varchar(56) NOT NULL DEFAULT '',
+  `otherpl` varchar(56) NOT NULL DEFAULT '',
+  `ndupl` varchar(56) NOT NULL DEFAULT '',
+  `ndlpl` varchar(56) NOT NULL DEFAULT '',
+  `odupl` varchar(56) NOT NULL DEFAULT '',
+  `odlpl` varchar(56) NOT NULL DEFAULT '',
+  `custompl` varchar(56) NOT NULL DEFAULT '',
+  `ur8pl` varchar(34) NOT NULL DEFAULT '',
+  `ur7pl` varchar(34) NOT NULL DEFAULT '',
+  `ur6pl` varchar(34) NOT NULL DEFAULT '',
+  `ur5pl` varchar(34) NOT NULL DEFAULT '',
+  `ur4pl` varchar(34) NOT NULL DEFAULT '',
+  `ur3pl` varchar(34) NOT NULL DEFAULT '',
+  `ur2pl` varchar(34) NOT NULL DEFAULT '',
+  `ur1pl` varchar(34) NOT NULL DEFAULT '',
+  `ul1pl` varchar(34) NOT NULL DEFAULT '',
+  `ul2pl` varchar(34) NOT NULL DEFAULT '',
+  `ul3pl` varchar(34) NOT NULL DEFAULT '',
+  `ul4pl` varchar(34) NOT NULL DEFAULT '',
+  `ul5pl` varchar(34) NOT NULL DEFAULT '',
+  `ul6pl` varchar(34) NOT NULL DEFAULT '',
+  `ul7pl` varchar(34) NOT NULL DEFAULT '',
+  `ul8pl` varchar(34) NOT NULL DEFAULT '',
+  `ll8pl` varchar(34) NOT NULL DEFAULT '',
+  `ll7pl` varchar(34) NOT NULL DEFAULT '',
+  `ll6pl` varchar(34) NOT NULL DEFAULT '',
+  `ll5pl` varchar(34) NOT NULL DEFAULT '',
+  `ll4pl` varchar(34) NOT NULL DEFAULT '',
+  `ll3pl` varchar(34) NOT NULL DEFAULT '',
+  `ll2pl` varchar(34) NOT NULL DEFAULT '',
+  `ll1pl` varchar(34) NOT NULL DEFAULT '',
+  `lr1pl` varchar(34) NOT NULL DEFAULT '',
+  `lr2pl` varchar(34) NOT NULL DEFAULT '',
+  `lr3pl` varchar(34) NOT NULL DEFAULT '',
+  `lr4pl` varchar(34) NOT NULL DEFAULT '',
+  `lr5pl` varchar(34) NOT NULL DEFAULT '',
+  `lr6pl` varchar(34) NOT NULL DEFAULT '',
+  `lr7pl` varchar(34) NOT NULL DEFAULT '',
+  `lr8pl` varchar(34) NOT NULL DEFAULT '',
+  `ur8cmp` varchar(34) NOT NULL DEFAULT '',
+  `ur7cmp` varchar(34) NOT NULL DEFAULT '',
+  `ur6cmp` varchar(34) NOT NULL DEFAULT '',
+  `ur5cmp` varchar(34) NOT NULL DEFAULT '',
+  `ur4cmp` varchar(34) NOT NULL DEFAULT '',
+  `ur3cmp` varchar(34) NOT NULL DEFAULT '',
+  `ur2cmp` varchar(34) NOT NULL DEFAULT '',
+  `ur1cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul1cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul2cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul3cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul4cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul5cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul6cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul7cmp` varchar(34) NOT NULL DEFAULT '',
+  `ul8cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll8cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll7cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll6cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll5cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll4cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll3cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll2cmp` varchar(34) NOT NULL DEFAULT '',
+  `ll1cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr1cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr2cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr3cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr4cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr5cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr6cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr7cmp` varchar(34) NOT NULL DEFAULT '',
+  `lr8cmp` varchar(34) NOT NULL DEFAULT '',
+  `xraycmp` varchar(56) NOT NULL DEFAULT '',
+  `periocmp` varchar(56) NOT NULL DEFAULT '',
+  `anaescmp` varchar(56) NOT NULL DEFAULT '',
+  `othercmp` varchar(56) NOT NULL DEFAULT '',
+  `nducmp` varchar(56) NOT NULL DEFAULT '',
+  `ndlcmp` varchar(56) NOT NULL DEFAULT '',
+  `oducmp` varchar(56) NOT NULL DEFAULT '',
+  `odlcmp` varchar(56) NOT NULL DEFAULT '',
+  `customcmp` varchar(56) NOT NULL DEFAULT '',
+  `ftr` tinyint(1) DEFAULT '0',
+  PRIMARY KEY (`courseno`),
+  KEY `serialno` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `currtrtmt2`
+--
+
+LOCK TABLES `currtrtmt2` WRITE;
+/*!40000 ALTER TABLE `currtrtmt2` DISABLE KEYS */;
+/*!40000 ALTER TABLE `currtrtmt2` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `daybook`
+--
+
+DROP TABLE IF EXISTS `daybook`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `daybook` (
+  `date` date DEFAULT NULL,
+  `serialno` int(11) DEFAULT NULL,
+  `coursetype` char(1) DEFAULT NULL,
+  `dntid` smallint(6) DEFAULT NULL,
+  `trtid` smallint(6) DEFAULT NULL,
+  `diagn` varchar(56) DEFAULT NULL,
+  `perio` varchar(56) DEFAULT NULL,
+  `anaes` varchar(56) DEFAULT NULL,
+  `misc` varchar(56) DEFAULT NULL,
+  `ndu` varchar(56) DEFAULT NULL,
+  `ndl` varchar(56) DEFAULT NULL,
+  `odu` varchar(56) DEFAULT NULL,
+  `odl` varchar(56) DEFAULT NULL,
+  `other` varchar(56) DEFAULT NULL,
+  `chart` blob,
+  `feesa` int(11) DEFAULT NULL,
+  `feesb` int(11) DEFAULT NULL,
+  `feesc` int(11) DEFAULT NULL,
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`id`),
+  KEY `date` (`date`),
+  KEY `serialno` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `daybook`
+--
+
+LOCK TABLES `daybook` WRITE;
+/*!40000 ALTER TABLE `daybook` DISABLE KEYS */;
+/*!40000 ALTER TABLE `daybook` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `daybook_link`
+--
+
+DROP TABLE IF EXISTS `daybook_link`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `daybook_link` (
+  `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `daybook_id` int(11) DEFAULT NULL,
+  `tx_hash` char(40) NOT NULL,
+  PRIMARY KEY (`ix`),
+  KEY `daybook_id` (`daybook_id`),
+  KEY `daybook_id_index` (`tx_hash`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `daybook_link`
+--
+
+LOCK TABLES `daybook_link` WRITE;
+/*!40000 ALTER TABLE `daybook_link` DISABLE KEYS */;
+/*!40000 ALTER TABLE `daybook_link` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `diary_link`
+--
+
+DROP TABLE IF EXISTS `diary_link`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `diary_link` (
+  `clinician_ix` smallint(5) unsigned NOT NULL,
+  `apptix` smallint(5) unsigned NOT NULL,
+  KEY `clinician_ix` (`clinician_ix`),
+  CONSTRAINT `diary_link_ibfk_1` FOREIGN KEY (`clinician_ix`) REFERENCES `clinicians` (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `diary_link`
+--
+
+LOCK TABLES `diary_link` WRITE;
+/*!40000 ALTER TABLE `diary_link` DISABLE KEYS */;
+/*!40000 ALTER TABLE `diary_link` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `docsimported`
+--
+
+DROP TABLE IF EXISTS `docsimported`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `docsimported` (
+  `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) unsigned NOT NULL DEFAULT '0',
+  `datatype` varchar(60) NOT NULL DEFAULT 'application/octet-stream',
+  `name` varchar(120) NOT NULL DEFAULT '',
+  `size` bigint(20) unsigned NOT NULL DEFAULT '1024',
+  `filedate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+  `importime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `docsimported`
+--
+
+LOCK TABLES `docsimported` WRITE;
+/*!40000 ALTER TABLE `docsimported` DISABLE KEYS */;
+/*!40000 ALTER TABLE `docsimported` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `docsimporteddata`
+--
+
+DROP TABLE IF EXISTS `docsimporteddata`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `docsimporteddata` (
+  `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+  `masterid` mediumint(8) unsigned NOT NULL DEFAULT '0',
+  `filedata` blob NOT NULL,
+  PRIMARY KEY (`ix`),
+  KEY `master_idx` (`masterid`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `docsimporteddata`
+--
+
+LOCK TABLES `docsimporteddata` WRITE;
+/*!40000 ALTER TABLE `docsimporteddata` DISABLE KEYS */;
+/*!40000 ALTER TABLE `docsimporteddata` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `est_link2`
+--
+
+DROP TABLE IF EXISTS `est_link2`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `est_link2` (
+  `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `est_id` int(11) DEFAULT NULL,
+  `tx_hash` char(40) NOT NULL,
+  `completed` tinyint(1) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`ix`),
+  KEY `est_id` (`est_id`),
+  KEY `est_link2_hash_index` (`tx_hash`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `est_link2`
+--
+
+LOCK TABLES `est_link2` WRITE;
+/*!40000 ALTER TABLE `est_link2` DISABLE KEYS */;
+/*!40000 ALTER TABLE `est_link2` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `est_logger`
+--
+
+DROP TABLE IF EXISTS `est_logger`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `est_logger` (
+  `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `courseno` int(11) unsigned NOT NULL,
+  `est_data` mediumtext NOT NULL,
+  `operator` varchar(16) NOT NULL,
+  `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `est_logger`
+--
+
+LOCK TABLES `est_logger` WRITE;
+/*!40000 ALTER TABLE `est_logger` DISABLE KEYS */;
+/*!40000 ALTER TABLE `est_logger` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `exemptions`
+--
+
+DROP TABLE IF EXISTS `exemptions`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `exemptions` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) unsigned NOT NULL,
+  `exemption` varchar(10) DEFAULT NULL,
+  `exempttext` varchar(50) DEFAULT NULL,
+  `datestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+  PRIMARY KEY (`ix`),
+  KEY `serialno` (`serialno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `exemptions`
+--
+
+LOCK TABLES `exemptions` WRITE;
+/*!40000 ALTER TABLE `exemptions` DISABLE KEYS */;
+/*!40000 ALTER TABLE `exemptions` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `families`
+--
+
+DROP TABLE IF EXISTS `families`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `families` (
+  `familyno` int(11) NOT NULL,
+  `head` int(11) DEFAULT NULL,
+  PRIMARY KEY (`familyno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `families`
+--
+
+LOCK TABLES `families` WRITE;
+/*!40000 ALTER TABLE `families` DISABLE KEYS */;
+/*!40000 ALTER TABLE `families` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `feescales`
+--
+
+DROP TABLE IF EXISTS `feescales`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `feescales` (
+  `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `in_use` tinyint(1) NOT NULL DEFAULT '0',
+  `priority` int(8) DEFAULT NULL,
+  `comment` varchar(255) NOT NULL DEFAULT 'unnamed feescale',
+  `xml_data` mediumtext NOT NULL,
+  PRIMARY KEY (`ix`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `feescales`
+--
+
+LOCK TABLES `feescales` WRITE;
+/*!40000 ALTER TABLE `feescales` DISABLE KEYS */;
+INSERT INTO `feescales` VALUES (1,1,0,'example feescale','<?xml version=\"1.0\" ?><feescale>\n	<version>0.1</version>\n	<tablename>test_feescale</tablename>\n	<feescale_description>Example Fee Scale</feescale_description>\n	<category>P</category>\n	<header id=\"1\">Diagnosis</header>\n	<header id=\"2\">Preventive Care</header>\n	<header id=\"3\">Periodontal Treatment</header>\n	<header id=\"4\">Conservative Treatment</header>\n	<header id=\"5\">Endodontic Treatment</header>\n	<header id= [...]
+/*!40000 ALTER TABLE `feescales` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `feetable_key`
+--
+
+DROP TABLE IF EXISTS `feetable_key`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `feetable_key` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `tablename` char(30) DEFAULT NULL,
+  `categories` char(30) DEFAULT NULL,
+  `description` char(60) DEFAULT NULL,
+  `startdate` date DEFAULT NULL,
+  `enddate` date DEFAULT NULL,
+  `feecoltypes` tinytext,
+  `in_use` tinyint(1) NOT NULL DEFAULT '1',
+  `display_order` smallint(6) DEFAULT NULL,
+  `data` mediumtext,
+  PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `feetable_key`
+--
+
+LOCK TABLES `feetable_key` WRITE;
+/*!40000 ALTER TABLE `feetable_key` DISABLE KEYS */;
+/*!40000 ALTER TABLE `feetable_key` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `formatted_notes`
+--
+
+DROP TABLE IF EXISTS `formatted_notes`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `formatted_notes` (
+  `ix` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) DEFAULT NULL,
+  `ndate` date DEFAULT NULL,
+  `op1` varchar(8) DEFAULT NULL,
+  `op2` varchar(8) DEFAULT NULL,
+  `ntype` varchar(32) DEFAULT NULL,
+  `note` varchar(80) DEFAULT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  UNIQUE KEY `ix` (`ix`),
+  KEY `formatted_notes_serialno_index` (`serialno`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `formatted_notes`
+--
+
+LOCK TABLES `formatted_notes` WRITE;
+/*!40000 ALTER TABLE `formatted_notes` DISABLE KEYS */;
+INSERT INTO `formatted_notes` VALUES (1,1,'2014-06-10','REC',NULL,'opened','System date - 10/06/2014 20:26:37','2014-06-10 19:26:37'),(2,1,'2014-06-10','REC',NULL,'newNOTE','This example patient was added to the demo database today.\n','2014-06-10 19:26:37'),(3,1,'2014-06-10','REC',NULL,'closed','REC 10/06/2014 20:26:37','2014-06-10 19:26:37');
+/*!40000 ALTER TABLE `formatted_notes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `forum`
+--
+
+DROP TABLE IF EXISTS `forum`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `forum` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `parent_ix` int(10) unsigned DEFAULT NULL,
+  `inits` char(5) DEFAULT NULL,
+  `fdate` datetime DEFAULT NULL,
+  `topic` char(30) DEFAULT NULL,
+  `comment` text NOT NULL,
+  `open` tinyint(1) NOT NULL DEFAULT '1',
+  `recipient` char(8) DEFAULT NULL,
+  PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `forum`
+--
+
+LOCK TABLES `forum` WRITE;
+/*!40000 ALTER TABLE `forum` DISABLE KEYS */;
+/*!40000 ALTER TABLE `forum` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `forumread`
+--
+
+DROP TABLE IF EXISTS `forumread`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `forumread` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `id` int(10) unsigned NOT NULL,
+  `op` char(8) DEFAULT NULL,
+  `readdate` datetime NOT NULL,
+  PRIMARY KEY (`ix`),
+  KEY `id` (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `forumread`
+--
+
+LOCK TABLES `forumread` WRITE;
+/*!40000 ALTER TABLE `forumread` DISABLE KEYS */;
+/*!40000 ALTER TABLE `forumread` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `mednotes`
+--
+
+DROP TABLE IF EXISTS `mednotes`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `mednotes` (
+  `serialno` int(11) NOT NULL,
+  `drnm` varchar(60) DEFAULT NULL,
+  `adrtel` varchar(60) DEFAULT NULL,
+  `curmed` varchar(60) DEFAULT NULL,
+  `allerg` varchar(60) DEFAULT NULL,
+  `heart` varchar(60) DEFAULT NULL,
+  `lungs` varchar(60) DEFAULT NULL,
+  `liver` varchar(60) DEFAULT NULL,
+  `kidney` varchar(60) DEFAULT NULL,
+  `bleed` varchar(60) DEFAULT NULL,
+  `anaes` varchar(60) DEFAULT NULL,
+  `other` varchar(60) DEFAULT NULL,
+  `oldmed` varchar(60) DEFAULT NULL,
+  `alert` tinyint(1) NOT NULL DEFAULT '0',
+  `chkdate` date DEFAULT NULL,
+  PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `mednotes`
+--
+
+LOCK TABLES `mednotes` WRITE;
+/*!40000 ALTER TABLE `mednotes` DISABLE KEYS */;
+/*!40000 ALTER TABLE `mednotes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `mnhist`
+--
+
+DROP TABLE IF EXISTS `mnhist`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `mnhist` (
+  `serialno` int(11) DEFAULT NULL,
+  `chgdate` date DEFAULT NULL,
+  `ix` tinyint(3) unsigned DEFAULT NULL,
+  `note` varchar(60) DEFAULT NULL,
+  KEY `sd` (`serialno`,`chgdate`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `mnhist`
+--
+
+LOCK TABLES `mnhist` WRITE;
+/*!40000 ALTER TABLE `mnhist` DISABLE KEYS */;
+/*!40000 ALTER TABLE `mnhist` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `new_patients`
+--
+
+DROP TABLE IF EXISTS `new_patients`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `new_patients` (
+  `serialno` int(11) NOT NULL,
+  `sname` varchar(30) DEFAULT NULL,
+  `fname` varchar(30) DEFAULT NULL,
+  `title` varchar(30) DEFAULT NULL,
+  `sex` char(1) DEFAULT NULL,
+  `dob` date DEFAULT NULL,
+  `addr1` varchar(30) NOT NULL DEFAULT '',
+  `addr2` varchar(30) NOT NULL DEFAULT '',
+  `addr3` varchar(30) NOT NULL DEFAULT '',
+  `town` varchar(30) NOT NULL DEFAULT '',
+  `county` varchar(30) NOT NULL DEFAULT '',
+  `pcde` varchar(30) NOT NULL DEFAULT '',
+  `tel1` varchar(30) NOT NULL DEFAULT '',
+  `tel2` varchar(30) NOT NULL DEFAULT '',
+  `mobile` varchar(30) NOT NULL DEFAULT '',
+  `fax` varchar(30) NOT NULL DEFAULT '',
+  `email1` varchar(50) NOT NULL DEFAULT '',
+  `email2` varchar(50) NOT NULL DEFAULT '',
+  `occup` varchar(30) NOT NULL DEFAULT '',
+  `nhsno` varchar(30) NOT NULL DEFAULT '',
+  `cnfd` date DEFAULT NULL,
+  `cset` varchar(10) DEFAULT NULL,
+  `dnt1` smallint(6) DEFAULT NULL,
+  `dnt2` smallint(6) DEFAULT NULL,
+  `courseno0` int(11) DEFAULT NULL,
+  `billdate` date DEFAULT NULL,
+  `billct` tinyint(3) unsigned DEFAULT NULL,
+  `billtype` char(1) DEFAULT NULL,
+  `familyno` int(11) DEFAULT NULL,
+  `memo` varchar(255) NOT NULL DEFAULT '',
+  `status` varchar(30) NOT NULL DEFAULT '',
+  PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `new_patients`
+--
+
+LOCK TABLES `new_patients` WRITE;
+/*!40000 ALTER TABLE `new_patients` DISABLE KEYS */;
+INSERT INTO `new_patients` VALUES (1,'PATIENT','EXAMPLE','MR','M','1969-12-09','19 UNION STREET','','','INVERNESS','SCOTLAND, UK','IV1 1PP','','','','','','','','',NULL,'P',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'','');
+/*!40000 ALTER TABLE `new_patients` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `newdocsprinted`
+--
+
+DROP TABLE IF EXISTS `newdocsprinted`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `newdocsprinted` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) DEFAULT NULL,
+  `printdate` date DEFAULT NULL,
+  `docname` char(20) DEFAULT NULL,
+  `docversion` smallint(6) DEFAULT NULL,
+  `data` blob,
+  PRIMARY KEY (`ix`),
+  KEY `newdocsprinted_serialno_index` (`serialno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `newdocsprinted`
+--
+
+LOCK TABLES `newdocsprinted` WRITE;
+/*!40000 ALTER TABLE `newdocsprinted` DISABLE KEYS */;
+/*!40000 ALTER TABLE `newdocsprinted` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `newestimates`
+--
+
+DROP TABLE IF EXISTS `newestimates`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `newestimates` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) NOT NULL,
+  `courseno` int(10) unsigned DEFAULT NULL,
+  `category` char(12) DEFAULT NULL,
+  `type` char(20) DEFAULT NULL,
+  `number` tinyint(4) DEFAULT NULL,
+  `itemcode` char(5) DEFAULT NULL,
+  `description` char(50) DEFAULT NULL,
+  `fee` int(11) DEFAULT NULL,
+  `ptfee` int(11) DEFAULT NULL,
+  `csetype` char(5) DEFAULT NULL,
+  `feescale` char(1) DEFAULT NULL,
+  `dent` tinyint(1) DEFAULT NULL,
+  `completed` tinyint(1) DEFAULT NULL,
+  `carriedover` tinyint(1) DEFAULT NULL,
+  `linked` tinyint(1) DEFAULT NULL,
+  `modified_by` varchar(20) NOT NULL,
+  `time_stamp` datetime NOT NULL,
+  PRIMARY KEY (`ix`),
+  KEY `serialno` (`serialno`),
+  KEY `courseno` (`courseno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `newestimates`
+--
+
+LOCK TABLES `newestimates` WRITE;
+/*!40000 ALTER TABLE `newestimates` DISABLE KEYS */;
+/*!40000 ALTER TABLE `newestimates` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `newfeetable`
+--
+
+DROP TABLE IF EXISTS `newfeetable`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `newfeetable` (
+  `ix` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+  `section` smallint(6) DEFAULT NULL,
+  `USERCODE` char(14) DEFAULT NULL,
+  `code` char(8) DEFAULT NULL,
+  `oldcode` char(12) DEFAULT NULL,
+  `regulation` char(50) DEFAULT NULL,
+  `max_per_course` char(25) DEFAULT NULL,
+  `description` char(60) DEFAULT NULL,
+  `description1` char(60) DEFAULT NULL,
+  `NF08` int(11) DEFAULT NULL,
+  `NF08_pt` int(11) DEFAULT NULL,
+  `PFA` int(11) DEFAULT NULL,
+  `NF09` int(11) DEFAULT NULL,
+  `NF09_pt` int(11) DEFAULT NULL,
+  PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `newfeetable`
+--
+
+LOCK TABLES `newfeetable` WRITE;
+/*!40000 ALTER TABLE `newfeetable` DISABLE KEYS */;
+/*!40000 ALTER TABLE `newfeetable` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `notes`
+--
+
+DROP TABLE IF EXISTS `notes`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `notes` (
+  `serialno` int(11) NOT NULL,
+  `lineno` smallint(5) unsigned NOT NULL,
+  `line` varchar(80) DEFAULT NULL,
+  PRIMARY KEY (`serialno`,`lineno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `notes`
+--
+
+LOCK TABLES `notes` WRITE;
+/*!40000 ALTER TABLE `notes` DISABLE KEYS */;
+/*!40000 ALTER TABLE `notes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `opid`
+--
+
+DROP TABLE IF EXISTS `opid`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `opid` (
+  `id` char(5) NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `opid`
+--
+
+LOCK TABLES `opid` WRITE;
+/*!40000 ALTER TABLE `opid` DISABLE KEYS */;
+INSERT INTO `opid` VALUES ('REC'),('USER');
+/*!40000 ALTER TABLE `opid` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `patient_dates`
+--
+
+DROP TABLE IF EXISTS `patient_dates`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `patient_dates` (
+  `pt_sno` int(11) NOT NULL,
+  `pd0` date DEFAULT NULL,
+  `pd1` date DEFAULT NULL,
+  `pd2` date DEFAULT NULL,
+  `pd3` date DEFAULT NULL,
+  `pd4` date DEFAULT NULL,
+  `pd5` date DEFAULT NULL,
+  `pd6` date DEFAULT NULL,
+  `pd7` date DEFAULT NULL,
+  `pd8` date DEFAULT NULL,
+  `pd9` date DEFAULT NULL,
+  `pd10` date DEFAULT NULL,
+  `pd11` date DEFAULT NULL,
+  `pd12` date DEFAULT NULL,
+  `pd13` date DEFAULT NULL,
+  `pd14` date DEFAULT NULL,
+  UNIQUE KEY `pt_sno` (`pt_sno`),
+  CONSTRAINT `patient_dates_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `patient_dates`
+--
+
+LOCK TABLES `patient_dates` WRITE;
+/*!40000 ALTER TABLE `patient_dates` DISABLE KEYS */;
+INSERT INTO `patient_dates` VALUES (1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+/*!40000 ALTER TABLE `patient_dates` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `patient_money`
+--
+
+DROP TABLE IF EXISTS `patient_money`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `patient_money` (
+  `pt_sno` int(11) NOT NULL,
+  `money0` int(11) NOT NULL DEFAULT '0',
+  `money1` int(11) NOT NULL DEFAULT '0',
+  `money2` int(11) NOT NULL DEFAULT '0',
+  `money3` int(11) NOT NULL DEFAULT '0',
+  `money4` int(11) NOT NULL DEFAULT '0',
+  `money5` int(11) NOT NULL DEFAULT '0',
+  `money6` int(11) NOT NULL DEFAULT '0',
+  `money7` int(11) NOT NULL DEFAULT '0',
+  `money8` int(11) NOT NULL DEFAULT '0',
+  `money9` int(11) NOT NULL DEFAULT '0',
+  `money10` int(11) NOT NULL DEFAULT '0',
+  `money11` int(11) NOT NULL DEFAULT '0',
+  UNIQUE KEY `pt_sno` (`pt_sno`),
+  CONSTRAINT `patient_money_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `patient_money`
+--
+
+LOCK TABLES `patient_money` WRITE;
+/*!40000 ALTER TABLE `patient_money` DISABLE KEYS */;
+INSERT INTO `patient_money` VALUES (1,0,0,0,0,0,0,0,0,0,0,0,0);
+/*!40000 ALTER TABLE `patient_money` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `patient_nhs`
+--
+
+DROP TABLE IF EXISTS `patient_nhs`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `patient_nhs` (
+  `pt_sno` int(11) NOT NULL,
+  `initaccept` date DEFAULT NULL,
+  `lastreaccept` date DEFAULT NULL,
+  `lastclaim` date DEFAULT NULL,
+  `expiry` date DEFAULT NULL,
+  `cstatus` tinyint(3) unsigned DEFAULT NULL,
+  `transfer` date DEFAULT NULL,
+  `pstatus` tinyint(3) unsigned DEFAULT NULL,
+  UNIQUE KEY `pt_sno` (`pt_sno`),
+  CONSTRAINT `patient_nhs_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `patient_nhs`
+--
+
+LOCK TABLES `patient_nhs` WRITE;
+/*!40000 ALTER TABLE `patient_nhs` DISABLE KEYS */;
+/*!40000 ALTER TABLE `patient_nhs` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `perio`
+--
+
+DROP TABLE IF EXISTS `perio`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `perio` (
+  `serialno` int(11) NOT NULL DEFAULT '0',
+  `chartdate` date NOT NULL DEFAULT '0000-00-00',
+  `bpe` char(6) DEFAULT NULL,
+  `chartdata` blob,
+  `flag` tinyint(3) unsigned DEFAULT NULL,
+  PRIMARY KEY (`serialno`,`chartdate`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `perio`
+--
+
+LOCK TABLES `perio` WRITE;
+/*!40000 ALTER TABLE `perio` DISABLE KEYS */;
+/*!40000 ALTER TABLE `perio` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `phrasebook`
+--
+
+DROP TABLE IF EXISTS `phrasebook`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `phrasebook` (
+  `clinician_id` int(10) unsigned NOT NULL,
+  `phrases` text,
+  PRIMARY KEY (`clinician_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `phrasebook`
+--
+
+LOCK TABLES `phrasebook` WRITE;
+/*!40000 ALTER TABLE `phrasebook` DISABLE KEYS */;
+/*!40000 ALTER TABLE `phrasebook` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `plandata`
+--
+
+DROP TABLE IF EXISTS `plandata`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `plandata` (
+  `serialno` int(11) NOT NULL,
+  `plantype` char(4) DEFAULT NULL,
+  `band` char(1) DEFAULT NULL,
+  `grosschg` int(11) DEFAULT NULL,
+  `discount` int(11) DEFAULT NULL,
+  `netchg` int(11) DEFAULT NULL,
+  `catcode` char(1) DEFAULT NULL,
+  `planjoin` date DEFAULT NULL,
+  `regno` int(11) DEFAULT NULL,
+  PRIMARY KEY (`serialno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `plandata`
+--
+
+LOCK TABLES `plandata` WRITE;
+/*!40000 ALTER TABLE `plandata` DISABLE KEYS */;
+/*!40000 ALTER TABLE `plandata` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `previous_snames`
+--
+
+DROP TABLE IF EXISTS `previous_snames`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `previous_snames` (
+  `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) DEFAULT NULL,
+  `psn` char(40) NOT NULL,
+  PRIMARY KEY (`ix`),
+  KEY `serialno` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `previous_snames`
+--
+
+LOCK TABLES `previous_snames` WRITE;
+/*!40000 ALTER TABLE `previous_snames` DISABLE KEYS */;
+/*!40000 ALTER TABLE `previous_snames` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `ptmemos`
+--
+
+DROP TABLE IF EXISTS `ptmemos`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ptmemos` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `serialno` int(11) DEFAULT NULL,
+  `enabled` tinyint(1) DEFAULT NULL,
+  `author` char(5) DEFAULT NULL,
+  `type` char(5) DEFAULT NULL,
+  `mdate` datetime DEFAULT NULL,
+  `expiredate` date DEFAULT NULL,
+  `message` char(200) DEFAULT NULL,
+  `open` tinyint(1) NOT NULL DEFAULT '1',
+  PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `ptmemos`
+--
+
+LOCK TABLES `ptmemos` WRITE;
+/*!40000 ALTER TABLE `ptmemos` DISABLE KEYS */;
+/*!40000 ALTER TABLE `ptmemos` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `referral_centres`
+--
+
+DROP TABLE IF EXISTS `referral_centres`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `referral_centres` (
+  `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `description` char(64) NOT NULL DEFAULT 'referral',
+  `greeting` char(64) NOT NULL DEFAULT 'Dear Sir/Madam',
+  `addr1` char(64) NOT NULL DEFAULT '',
+  `addr2` char(64) NOT NULL DEFAULT '',
+  `addr3` char(64) NOT NULL DEFAULT '',
+  `addr4` char(64) NOT NULL DEFAULT '',
+  `addr5` char(64) NOT NULL DEFAULT '',
+  `addr6` char(64) NOT NULL DEFAULT '',
+  `addr7` char(64) NOT NULL DEFAULT '',
+  PRIMARY KEY (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `referral_centres`
+--
+
+LOCK TABLES `referral_centres` WRITE;
+/*!40000 ALTER TABLE `referral_centres` DISABLE KEYS */;
+/*!40000 ALTER TABLE `referral_centres` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `settings`
+--
+
+DROP TABLE IF EXISTS `settings`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `settings` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `value` varchar(128) DEFAULT NULL,
+  `data` text,
+  `hostname` varchar(128) DEFAULT NULL,
+  `station` char(20) DEFAULT NULL,
+  `user` char(20) DEFAULT NULL,
+  `modified_by` varchar(20) NOT NULL,
+  `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`ix`),
+  KEY `value` (`value`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `settings`
+--
+
+LOCK TABLES `settings` WRITE;
+/*!40000 ALTER TABLE `settings` DISABLE KEYS */;
+INSERT INTO `settings` VALUES (1,'wikiurl','http://openmolar.com/wiki',NULL,NULL,NULL,'neil at openmolar.com','2014-06-10 17:52:59'),(2,'Schema_Version','2.9',NULL,NULL,NULL,'neil at openmolar.com','2014-07-01 12:51:30');
+/*!40000 ALTER TABLE `settings` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `static_chart`
+--
+
+DROP TABLE IF EXISTS `static_chart`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `static_chart` (
+  `pt_sno` int(11) NOT NULL,
+  `dent0` tinyint(4) DEFAULT NULL,
+  `dent1` tinyint(4) DEFAULT NULL,
+  `dent2` tinyint(4) DEFAULT NULL,
+  `dent3` tinyint(4) DEFAULT NULL,
+  `ur1` varchar(34) NOT NULL DEFAULT '',
+  `ur2` varchar(34) NOT NULL DEFAULT '',
+  `ur3` varchar(34) NOT NULL DEFAULT '',
+  `ur4` varchar(34) NOT NULL DEFAULT '',
+  `ur5` varchar(34) NOT NULL DEFAULT '',
+  `ur6` varchar(34) NOT NULL DEFAULT '',
+  `ur7` varchar(34) NOT NULL DEFAULT '',
+  `ur8` varchar(34) NOT NULL DEFAULT '',
+  `ul1` varchar(34) NOT NULL DEFAULT '',
+  `ul2` varchar(34) NOT NULL DEFAULT '',
+  `ul3` varchar(34) NOT NULL DEFAULT '',
+  `ul4` varchar(34) NOT NULL DEFAULT '',
+  `ul5` varchar(34) NOT NULL DEFAULT '',
+  `ul6` varchar(34) NOT NULL DEFAULT '',
+  `ul7` varchar(34) NOT NULL DEFAULT '',
+  `ul8` varchar(34) NOT NULL DEFAULT '',
+  `lr1` varchar(34) NOT NULL DEFAULT '',
+  `lr2` varchar(34) NOT NULL DEFAULT '',
+  `lr3` varchar(34) NOT NULL DEFAULT '',
+  `lr4` varchar(34) NOT NULL DEFAULT '',
+  `lr5` varchar(34) NOT NULL DEFAULT '',
+  `lr6` varchar(34) NOT NULL DEFAULT '',
+  `lr7` varchar(34) NOT NULL DEFAULT '',
+  `lr8` varchar(34) NOT NULL DEFAULT '',
+  `ll1` varchar(34) NOT NULL DEFAULT '',
+  `ll2` varchar(34) NOT NULL DEFAULT '',
+  `ll3` varchar(34) NOT NULL DEFAULT '',
+  `ll4` varchar(34) NOT NULL DEFAULT '',
+  `ll5` varchar(34) NOT NULL DEFAULT '',
+  `ll6` varchar(34) NOT NULL DEFAULT '',
+  `ll7` varchar(34) NOT NULL DEFAULT '',
+  `ll8` varchar(34) NOT NULL DEFAULT '',
+  UNIQUE KEY `pt_sno` (`pt_sno`),
+  CONSTRAINT `static_chart_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `static_chart`
+--
+
+LOCK TABLES `static_chart` WRITE;
+/*!40000 ALTER TABLE `static_chart` DISABLE KEYS */;
+INSERT INTO `static_chart` VALUES (1,NULL,16,NULL,NULL,'PV ','CR,LAVA ','MI ','B,GL ','MOD ','MO,CO ','','UE ','IM/TIT IM/ABUT  CR,V1 ','','','GI/MOD RT ','','','','UE ','','','','','OL,CO ','B ','FS ','UE ','','','','','','MOL,CO ','','UE ');
+/*!40000 ALTER TABLE `static_chart` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `tasks`
+--
+
+DROP TABLE IF EXISTS `tasks`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `tasks` (
+  `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `op` char(8) DEFAULT NULL,
+  `author` char(8) DEFAULT NULL,
+  `type` char(8) DEFAULT NULL,
+  `mdate` datetime NOT NULL,
+  `due` datetime NOT NULL,
+  `message` char(255) DEFAULT NULL,
+  `completed` tinyint(1) NOT NULL DEFAULT '0',
+  `visible` tinyint(1) NOT NULL DEFAULT '1',
+  PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `tasks`
+--
+
+LOCK TABLES `tasks` WRITE;
+/*!40000 ALTER TABLE `tasks` DISABLE KEYS */;
+/*!40000 ALTER TABLE `tasks` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `userdata`
+--
+
+DROP TABLE IF EXISTS `userdata`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `userdata` (
+  `serialno` int(11) NOT NULL,
+  `data` blob,
+  PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `userdata`
+--
+
+LOCK TABLES `userdata` WRITE;
+/*!40000 ALTER TABLE `userdata` DISABLE KEYS */;
+/*!40000 ALTER TABLE `userdata` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2014-07-01 13:52:09
diff --git a/src/openmolar/schema_upgrades/database_updater_thread.py b/src/openmolar/schema_upgrades/database_updater_thread.py
new file mode 100644
index 0000000..7d412a3
--- /dev/null
+++ b/src/openmolar/schema_upgrades/database_updater_thread.py
@@ -0,0 +1,152 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtCore
+from openmolar import connect
+from openmolar.dbtools import schema_version
+
+LOGGER = logging.getLogger("openmolar")
+
+class UpdateError(Exception):
+    '''
+    A custom exception. If this is thrown the db will be rolled back
+    '''
+    pass
+
+class DatabaseUpdaterThread(QtCore.QThread):
+    '''
+    A class to update the openmolar database
+    '''
+    UpdateError = UpdateError
+    progress_signal = QtCore.pyqtSignal(object, object)
+    completed_signal = QtCore.pyqtSignal(object)
+
+    def __init__(self, parent=None):
+        super(DatabaseUpdaterThread, self).__init__(parent)
+        self.message = "upating database"
+        self.db = None
+        self.cursor = None
+
+    def run(self):
+        '''
+        function should be re-implemented
+        '''
+        raise self.update_error, \
+        "DatabaseUpdateThread.run must be re-implemented"
+
+    def completeSig(self, message):
+        '''
+        let the application know that the updater has finished
+        '''
+        self.completed_signal.emit(message)
+
+    def progressSig(self, val, message=""):
+        '''
+        emits a signal showhing how we are proceeding.
+        val is a number between 0 and 100
+        '''
+        if message != "":
+            self.message = message
+        self.progress_signal.emit(val, self.message)
+        self.process_events()
+
+    def process_events(self):
+        '''
+        if attached to a gui.. update the interface, else pass quietly
+        '''
+        try:
+            QtCore.QCoreApplication.instance().processEvents()
+        except AttributeError:
+            pass
+
+    def connect(self):
+        if self.db is None:
+            self.db = connect.connect()
+            self.db.autocommit(False)
+            self.cursor = self.db.cursor()
+
+    def rollback(self):
+        self.db.rollback()
+        self.db.close()
+        self.db=None
+
+    def commit(self):
+        self.db.commit()
+        self.db.close()
+        self.db=None
+
+    def update_schema_version(self, compatible_versions, message):
+        schema_version.update(compatible_versions, message)
+
+    def execute_statements(self, sql_strings):
+        '''
+        execute the above commands
+        NOTE - this function may fail depending on the mysql permissions
+        in place
+        '''
+        self.connect()
+        try:
+            i, commandNo = 0, len(sql_strings)
+            for sql_string in sql_strings:
+                try:
+                    self.cursor.execute(sql_string)
+                except connect.GeneralError as exc:
+                    if 1091 in exc.args:
+                        LOGGER.warning(
+                            "statement:'%s' threw column removal error - "
+                            "continuing on assumption column is already "
+                            "removed", sql_string.replace("\n", " "))
+                    elif 1060 in exc.args:
+                        LOGGER.warning(
+                            "statement:'%s' threw column addition error - "
+                            "continuing on assumption column is already "
+                            "added", sql_string.replace("\n", " "))
+                    elif 1061 in exc.args:
+                        LOGGER.warning(
+                            "statement:'%s' threw dupliacte key error - "
+                            "continuing on assumption key is already "
+                            "added", sql_string.replace("\n", " "))
+                    else:
+                        LOGGER.warning(
+                            "FAILURE in executing sql statement \n%s",
+                            sql_string)
+                        raise exc
+                self.progressSig(2 + 70 * i / commandNo,
+                                "%s..." % sql_string[:10])
+        except Exception:
+            LOGGER.exception("FAILURE in executing sql statements")
+            raise self.UpdateError("couldn't execute all statements!")
+
+    def force_stop(self):
+        LOGGER.warning("forcing DatabaseUpdaterThread stop")
+        if self.isRunning() and self.cursor is not None:
+            # by changing this attribute, execute statements
+            # should die and rollback after an attribute error.
+            self.cursor = None
+
+if __name__ == "__main__":
+    dbu = DatabaseUpdaterThread()
+    dbu.run()
diff --git a/src/openmolar/schema_upgrades/formatted_notes1_9.py b/src/openmolar/schema_upgrades/formatted_notes1_9.py
deleted file mode 100644
index e88d809..0000000
--- a/src/openmolar/schema_upgrades/formatted_notes1_9.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from openmolar import connect
-from openmolar.ptModules import notes
-
-try:
-    from collections import OrderedDict
-except ImportError:
-    # OrderedDict only came in python 2.7
-    print "using openmolar.backports for OrderedDict"
-    from openmolar.backports import OrderedDict
-
-
-def get_notes(sno):
-    db = connect.connect()
-    cursor = db.cursor()
-    cursor.execute('''SELECT line from notes where serialno = %s
-    order by lineno''', sno)
-    results = cursor.fetchall()
-    cursor.close()
-
-    notes_dict = OrderedDict()
-    ndate, op = "", ""
-
-    # a line is like ('\x01REC\x0c\x08m\x0c\x08m\n\x08',)
-    for line, in results:
-        ntype, note, operator, date2 = notes.decipher_noteline(line)
-        if date2 != "":
-            ndate = date2
-        if operator != "":
-            op = operator
-
-        key = (ndate, op)
-        if key in notes_dict:
-            notes_dict[key].append((ntype, note))
-        else:
-            notes_dict[key] = [(ntype, note)]
-
-    return notes_dict
-
-
-def transfer(sno):
-    print "transferring notes for serialnos %s" % sno,
-    notes_dict = get_notes(sno)
-    query = '''insert into formatted_notes
-    (serialno, ndate, op1 , op2 , ntype, note)
-    values (%s, %s, %s, %s, %s, %s)'''
-
-    values = []
-    for key in notes_dict:
-        date, ops = key
-        op2 = None
-        if "/" in ops:
-            op1, op2 = ops.split("/")
-        else:
-            op1 = ops
-
-        for ntype, note in notes_dict[key]:
-            values.append((sno, date, op1, op2, ntype, note))
-    if values:
-        db = connect.connect()
-        cursor = db.cursor()
-        rows = cursor.executemany(query, values)
-        print "%d rows of notes inserted" % rows
-        cursor.close()
-        db.commit()
-    else:
-        print "no notes inserted"
-
-
-def get_max_sno():
-    db = connect.connect()
-    cursor = db.cursor()
-    cursor.execute("select max(serialno) from notes")
-    max_sno = cursor.fetchone()[0]
-    cursor.close()
-    db.close()
-    return max_sno
-
-if __name__ == "__main__":
-    max_sno = get_max_sno()
-    print "modding notes up to maximum found", max_sno
-    sno = 0
-    while sno < max_sno:
-        transfer(sno)
diff --git a/src/openmolar/schema_upgrades/schema1_0to1_1.py b/src/openmolar/schema_upgrades/schema1_0to1_1.py
index fd95d75..11831f5 100644
--- a/src/openmolar/schema_upgrades/schema1_0to1_1.py
+++ b/src/openmolar/schema_upgrades/schema1_0to1_1.py
@@ -29,10 +29,20 @@ The NewTable schema is contained in module variable NEW_TABLE_SQLSTRINGS
 Incidentally - this script introduces the "settings table" in which the schema
 variable is stored.
 '''
-from PyQt4 import QtGui, QtCore
+import logging
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-NEW_TABLE_SQLSTRINGS = ['''
-CREATE TABLE IF NOT EXISTS newestimates (
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+    'DROP TABLE IF EXISTS newestimates',
+    'DROP TABLE IF EXISTS settings',
+    'DROP TABLE IF EXISTS calendar',
+    '''
+CREATE TABLE newestimates (
 `ix` int(10) unsigned NOT NULL auto_increment ,
 `serialno` int(11) NOT NULL ,
 `courseno` int(10) unsigned ,
@@ -55,8 +65,8 @@ PRIMARY KEY (ix),
 KEY (serialno),
 KEY (courseno));
 ''',
-                        '''
-CREATE TABLE IF NOT EXISTS settings (
+    '''
+CREATE TABLE settings (
 `ix` int(10) unsigned NOT NULL auto_increment ,
 `value` varchar(128),
 `data` text,
@@ -68,60 +78,30 @@ CREATE TABLE IF NOT EXISTS settings (
 PRIMARY KEY (ix),
 KEY (value));
 ''',
-                        '''
-CREATE TABLE IF NOT EXISTS calendar (
+    '''
+CREATE TABLE calendar (
 `ix` int(10) unsigned NOT NULL auto_increment ,
 `adate` DATE NOT NULL,
 `memo` char(30),
 PRIMARY KEY (ix),
 KEY (adate));
 '''
-                        ]
+]
 
-import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-'''this checks for names which have changed.'''
 
+SRC_QUERY = '''select serialno, courseno, type, number, itemcode,
+description, fee, ptfee, feescale, csetype, dent, completed,
+carriedover, linked from estimates'''
 
-class dbUpdater(QtCore.QThread):
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def createNewTables(self):
-        '''
-        creates the newEstimatesTable.
-        NOTE - this function may fail depending on the mysql permissions in place
-        '''
-        try:
-            db = connect.connect()
-            cursor = db.cursor()
-            for sql_strings in NEW_TABLE_SQLSTRINGS:
-                cursor.execute(sql_strings)
-            db.commit()
-            return True
-        except Exception as e:
-            print e
-            print "unable to execute createNewEstimates"
+class DatabaseUpdater(DatabaseUpdaterThread):
 
     def getRowsFromOld(self):
         '''
         get ALL data from the estimates table
         '''
-        db = connect.connect()
-        cursor = db.cursor()
-        cursor.execute('''select serialno, courseno, type, number, itemcode,
-        description, fee, ptfee, feescale, csetype, dent, completed,
-        carriedover, linked from estimates''')
-        rows = cursor.fetchall()
-        cursor.close()
-        db.close()
+        self.cursor.execute(SRC_QUERY)
+        rows = self.cursor.fetchall()
         return rows
 
     def convertData(self, rows):
@@ -154,7 +134,7 @@ class dbUpdater(QtCore.QThread):
                 if i % 100 == 0:
                     self.progressSig((i / progress_var) * 40 + 20)
             if len(row) != len(newrow) - 1:
-                print "Error converting ", row
+                LOGGER.error("Error converting %s", str(row))
                 sys.exit()
             retlist.append(newrow)
         return retlist
@@ -163,8 +143,6 @@ class dbUpdater(QtCore.QThread):
         '''
         insert new row types into the newestimates table
         '''
-        db = connect.connect()
-        cursor = db.cursor()
         progress_var = len(rows)
         i = 0
         query = '''insert into newestimates
@@ -174,54 +152,38 @@ class dbUpdater(QtCore.QThread):
         %s, %s, %s, %s, %s, %s, %s, %s, %s, '1_0to1_1script', NOW())'''
 
         for values in rows:
-            cursor.execute(query, values)
+            self.cursor.execute(query, values)
             i += 1
             if i % 100 == 0:
                 self.progressSig((i / progress_var) * 90 + 40)
 
-        db.commit()
-        db.close()
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
     def run(self):
-        print "running script to convert from schema 1.0 to 1.1"
+        LOGGER.info("running script to convert from schema 1.0 to 1.1")
         try:
-            if self.createNewTables():
-                self.progressSig(10, "extracting estimates")
-                oldrows = self.getRowsFromOld()
-                self.progressSig(20, "converting data")
-                newRows = self.convertData(oldrows)
-
-                self.progressSig(40, "exporting into newestimates table")
-                print 'now exporting, this can take some time'
-                self.insertRowsIntoNew(newRows)
-                self.progressSig(90, "updating stored schema version")
-                schema_version.update(("1.1",), "1_0 to 1_1 script")
-
-                self.progressSig(100)
-                self.completed = True
-                self.completeSig("ALL DONE - sucessfully moved db to 1,1")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.connect()
+            #- execute the SQL commands
+            self.progressSig(10, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
+            self.progressSig(15, "extracting estimates")
+            oldrows = self.getRowsFromOld()
+            self.progressSig(20, "converting data")
+            newRows = self.convertData(oldrows)
+            self.progressSig(40, "exporting into newestimates table")
+            self.insertRowsIntoNew(newRows)
+            self.progressSig(90, "updating stored schema version")
+            self.update_schema_version(("1.1",), "1_0 to 1_1 script")
+            self.progressSig(100)
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 1.1")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_1to1_2.py b/src/openmolar/schema_upgrades/schema1_1to1_2.py
index 88194d3..4fbfbdd 100644
--- a/src/openmolar/schema_upgrades/schema1_1to1_2.py
+++ b/src/openmolar/schema_upgrades/schema1_1to1_2.py
@@ -23,17 +23,20 @@
 # ############################################################################ #
 
 '''
-This module provides a function 'run' which will move data from the estimates
-table in schema 1_0 to the newestimates table in schema 1_1
-The NewTable schema is contained in module variable NEW_TABLE_SQLSTRINGS
-Incidentally - this script introduces the "settings table" in which the schema
-variable is stored.
+This module provides a function 'run' which will move data
+to schema 1_2
 '''
-from PyQt4 import QtGui, QtCore
+
+import logging
+import sys
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
-    '''alter table forum add column recipient char(8);''',
-    '''alter table forum change column comment comment char(255);''',
+    'ALTER TABLE forum ADD COLUMN recipient char(8)',
+    'ALTER TABLE forum CHANGE COLUMN comment comment char(255)',
     '''
 CREATE TABLE if not exists forumread (
 ix int(10) unsigned NOT NULL auto_increment ,
@@ -41,7 +44,8 @@ id int(10) unsigned NOT NULL ,
 op char(8),
 readdate DATETIME NOT NULL,
 PRIMARY KEY (ix),
-KEY (id))''',
+KEY (id))
+''',
     '''
 CREATE TABLE if not exists tasks (
 ix int(10) unsigned NOT NULL auto_increment,
@@ -53,108 +57,69 @@ due DATETIME NOT NULL,
 message char(255),
 completed bool NOT NULL default False,
 visible bool NOT NULL default True,
-PRIMARY KEY (ix))''',
+PRIMARY KEY (ix))
+''',
 ]
 
-import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-
-
-def create_alter_tables():
-    '''
-    execute the above commands
-    NOTE - this function may fail depending on the mysql permissions in place
-    '''
-    db = connect.connect()
-    cursor = db.cursor()
-    for sql_string in SQLSTRINGS:
-        cursor.execute(sql_string)
-    db.commit()
-    return True
-
-
-def copy_OMforum_into_forum():
-    '''
-    I am scrapping the omforum table, put these posts into the forum
-    '''
-    db = connect.connect()
-    cursor = db.cursor()
-    cursor.execute('''lock tables omforum read,forum write''')
-    cursor.execute('''select ix, parent_ix, inits, fdate, topic, comment, open
-from omforum order by ix''')
-    rows = cursor.fetchall()
-
-    cursor.execute('''select max(ix) from forum''')
-    start_ix = cursor.fetchone()[0] + 1
-    print "start_ix =", start_ix
-
-    query = '''insert into forum (parent_ix, inits, fdate, topic, comment,
-    open) values (%s, %s, %s, %s, %s, %s)'''
-
-    for row in rows:
-        if row[1]:
-            parent_ix = row[1] + start_ix
-        else:
-            parent_ix = None
-        values = (parent_ix, row[2], row[3], row[4], row[5], row[6])
-        cursor.execute(query, values)
-
-    db.commit()
+LOCK_QUERY = 'lock tables omforum read,forum write'
 
-    cursor.execute("unlock tables")
-    cursor.close()
+SOURCE_QUERY = '''select ix, parent_ix, inits, fdate, topic, comment, open
+from omforum order by ix'''
 
-    db.close()
-    return True
+FORUM_QUERY = '''insert into forum
+(parent_ix, inits, fdate, topic, comment, open)
+values (%s, %s, %s, %s, %s, %s)'''
 
+MAX_QUERY = 'select max(ix) from forum'
 
-class dbUpdater(QtCore.QThread):
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
+class DatabaseUpdater(DatabaseUpdaterThread):
 
-    def progressSig(self, val, message):
+    def copy_OMforum_into_forum(self):
         '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
+        I am scrapping the omforum table, put these posts into the forum
         '''
-        self.emit(QtCore.SIGNAL("progress"), val, message)
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+        self.cursor.execute(LOCK_QUERY)
+
+        self.cursor.execute(SOURCE_QUERY)
+        rows = self.cursor.fetchall()
+        self.cursor.execute(MAX_QUERY)
+        start_ix = self.cursor.fetchone()[0] + 1
+        LOGGER.debug("start_ix = %s", start_ix)
+
+        for row in rows:
+            if row[1]:
+                parent_ix = row[1] + start_ix
+            else:
+                parent_ix = None
+            values = (parent_ix, row[2], row[3], row[4], row[5], row[6])
+            self.cursor.execute(FORUM_QUERY, values)
+        self.cursor.execute("unlock tables")
 
     def run(self):
-        print "running script to convert from schema 1.1 to 1.2"
+        LOGGER.info("running script to convert from schema 1.1 to 1.2")
         try:
+            self.connect()
             self.progressSig(30, "updating schema to 1,2")
-            if create_alter_tables():
-                self.progressSig(50, 'created new table "forumread"')
-
-                if copy_OMforum_into_forum():
-                    self.progressSig(80,
-                                     'copied data from obsolete table OMforum')
-
-                schema_version.update(("1.2",), "1_1 to 1_2 script")
-
-                self.progressSig(100, _("updating stored schema version"))
-                self.completed = True
-                self.completeSig(_("ALL DONE - sucessfully moved db to")
-                                 + " 1.2")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.execute_statements(SQLSTRINGS)
+            self.progressSig(50, 'created new table "forumread"')
+
+            self.copy_OMforum_into_forum()
+            self.progressSig(80, 'copied data from obsolete table OMforum')
+            self.update_schema_version(("1.2",), "1_1 to 1_2 script")
+
+            self.progressSig(100, _("updating stored schema version"))
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 1.2")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_2to1_3.py b/src/openmolar/schema_upgrades/schema1_2to1_3.py
index 0a3625e..efcba49 100644
--- a/src/openmolar/schema_upgrades/schema1_2to1_3.py
+++ b/src/openmolar/schema_upgrades/schema1_2to1_3.py
@@ -23,19 +23,24 @@
 # ############################################################################ #
 
 '''
-This module provides a function 'run' which will move data from the estimates
-table in schema 1_1 to the newestimates table in schema 1_2
+This module provides a function 'run' which will move data
+to schema 1_3
 '''
+import logging
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
-    '''alter table newfeetable drop column spare1''',
-    '''alter table newfeetable drop column spare2''',
-    '''alter table newfeetable drop column spare3''',
-    '''alter table newfeetable drop column spare4''',
-    '''alter table newfeetable change column PFC NF09 int(11)''',
-    '''alter table newfeetable change column PFI NF09_pt int(11)''',
+    'alter table newfeetable drop column spare1',
+    'alter table newfeetable drop column spare2',
+    'alter table newfeetable drop column spare3',
+    'alter table newfeetable drop column spare4',
+    'alter table newfeetable change column PFC NF09 int(11)',
+    'alter table newfeetable change column PFI NF09_pt int(11)',
     '''
 CREATE TABLE if not exists clinical_memos (
 ix int(10) unsigned NOT NULL auto_increment ,
@@ -47,88 +52,34 @@ PRIMARY KEY (ix),
 KEY (serialno))''',
 ]
 
-import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-
 
-class dbUpdater(QtCore.QThread):
-
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def create_alter_tables(self):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(SQLSTRINGS)
-            for sql_string in SQLSTRINGS:
-                cursor.execute(sql_string)
-                self.progressSig(
-                    10 + 70 * i / commandNo,
-                    sql_string[:20] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE create_alter_tables", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        return sucess
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+class DatabaseUpdater(DatabaseUpdaterThread):
 
     def run(self):
-        print "running script to convert from schema 1.2 to 1.3"
+        LOGGER.info("running script to convert from schema 1.2 to 1.3")
         try:
+            self.connect()
             self.progressSig(10, _("creating new tables"))
-            if self.create_alter_tables():
-                self.progressSig(90, _('updating settings'))
-                print "update database settings..."
-
-                # pass a tuple of compatible clients and the "user"
-                # who made these changes.
-                schema_version.update(("1.2", "1.3"), "1_2 to 1_3 script")
-
-                self.progressSig(100, _("updating stored schema version"))
-                self.completed = True
-                self.completeSig(_("ALL DONE - sucessfully moved db to")
-                                 + " 1.3")
-            else:
-                localsettings.CLIENT_SCHEMA_VERSION = " 1.2"
-                self.completeSig(_("couldn't create tables, rolled back to")
-                                 + "1.2")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.execute_statements(SQLSTRINGS)
+            self.progressSig(90, _('updating settings'))
+            LOGGER.debug("update database settings...")
+
+            # pass a tuple of compatible clients and the "user"
+            # who made these changes.
+            self.update_schema_version(("1.2", "1.3"), "1_2 to 1_3 script")
+
+            self.progressSig(100, _("updating stored schema version"))
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 1.3")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_3to1_4.py b/src/openmolar/schema_upgrades/schema1_3to1_4.py
index fcfe989..5d283e1 100644
--- a/src/openmolar/schema_upgrades/schema1_3to1_4.py
+++ b/src/openmolar/schema_upgrades/schema1_3to1_4.py
@@ -23,19 +23,30 @@
 # ############################################################################ #
 
 '''
-This module provides a function 'run' which will move data from the estimates
-table in schema 1_3 to the newestimates table in schema 1_4
+This module provides a function 'run' which will move data
+to schema 1_4
 '''
+
+import logging
 import sys
+
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
+    'DROP TABLE IF EXISTS feetable_key',
+    'DROP TABLE IF EXISTS feetable_scotNHS_08_Adult',
+    'DROP TABLE IF EXISTS feetable_scotNHS_08_Child',
+    'DROP TABLE IF EXISTS feetable_scotNHS_09_Adult',
+    'DROP TABLE IF EXISTS feetable_scotNHS_09_Child',
+    'DROP TABLE IF EXISTS feetable_HDP',
+    'DROP TABLE IF EXISTS feetable_Private_2009',
+    'DROP TABLE IF EXISTS feetable_Private_2010',
+    'DROP TABLE IF EXISTS docsimported',
     '''
-CREATE TABLE if not exists feetable_key (
+CREATE TABLE feetable_key (
 ix int(10) unsigned NOT NULL auto_increment ,
 tablename char(30),
 categories char(30),
@@ -53,11 +64,15 @@ enddate, display_order, feecoltypes)
 values ("feetable_scotNHS_08_Adult","N",
 "Scottish NHS Adult feescale implemented April 2008",
 20080401, 20090831, 5,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
+'<?xml version="1.0"?>
+    <columns>
+        <column type="fee">fee</column>
+        <column type="ptfee">pt_fee</column>
+    </columns>'
 )
 ''',
     '''
-CREATE TABLE if not exists feetable_scotNHS_08_Adult (
+CREATE TABLE feetable_scotNHS_08_Adult (
 ix int(10) unsigned NOT NULL auto_increment ,
 section smallint(6),
 code char(8),
@@ -71,19 +86,21 @@ pt_fee int(11),
 hide bool NOT NULL default False,
 PRIMARY KEY (ix))
 ''',
-
     '''
 INSERT into feetable_key (tablename, categories, description, startdate,
 enddate, display_order, feecoltypes)
 values ("feetable_scotNHS_08_Child","C",
 "Scottish NHS Child feescale implemented April 2008",
 20080401, 20090831, 6,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
+'<?xml version="1.0"?>
+    <columns>
+        <column type="fee">fee</column>
+        <column type="ptfee">pt_fee</column>
+    </columns>'
 )
-
 ''',
     '''
-CREATE TABLE if not exists feetable_scotNHS_08_Child (
+CREATE TABLE feetable_scotNHS_08_Child (
 ix int(10) unsigned NOT NULL auto_increment ,
 section smallint(6),
 code char(8),
@@ -97,18 +114,21 @@ pt_fee int(11),
 hide bool NOT NULL default False,
 PRIMARY KEY (ix))
 ''',
-
     '''
 INSERT into feetable_key (tablename, categories, description, startdate,
 display_order, feecoltypes)
 values ("feetable_scotNHS_09_Adult","N",
 "Scottish NHS Adult feescale implemented September 2009",
 20090901, 3,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
+'<?xml version="1.0"?>
+    <columns>
+        <column type="fee">fee</column>
+        <column type="ptfee">pt_fee</column>
+    </columns>'
 )
 ''',
     '''
-CREATE TABLE if not exists feetable_scotNHS_09_Adult (
+CREATE TABLE feetable_scotNHS_09_Adult (
 ix int(10) unsigned NOT NULL auto_increment ,
 section smallint(6),
 code char(8),
@@ -122,18 +142,21 @@ pt_fee int(11),
 hide bool NOT NULL default False,
 PRIMARY KEY (ix))
 ''',
-
     '''
 INSERT into feetable_key (tablename, categories, description, startdate,
 display_order, feecoltypes)
 values ("feetable_scotNHS_09_Child","C",
 "Scottish NHS Adult feescale implemented September 2009", 20090901, 4,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
+'<?xml version="1.0"?>
+    <columns>
+        <column type="fee">fee</column>
+        <column type="ptfee">pt_fee</column>
+    </columns>'
 )
 
 ''',
     '''
-CREATE TABLE if not exists feetable_scotNHS_09_Child (
+CREATE TABLE feetable_scotNHS_09_Child (
 ix int(10) unsigned NOT NULL auto_increment ,
 section smallint(6),
 code char(8),
@@ -147,18 +170,20 @@ pt_fee int(11),
 hide bool NOT NULL default False,
 PRIMARY KEY (ix))
 ''',
-
     '''
 INSERT into feetable_key (tablename, categories, description, startdate,
 display_order, feecoltypes)
 values ("feetable_HDP", "I",
 "Highland Dental Plan FeeScale", 20080401, 2,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
+'<?xml version="1.0"?>
+    <columns>
+        <column type="fee">fee</column>
+        <column type="ptfee">pt_fee</column>
+    </columns>'
 )
-
 ''',
     '''
-CREATE TABLE if not exists feetable_HDP (
+CREATE TABLE feetable_HDP (
 ix int(10) unsigned NOT NULL auto_increment ,
 section smallint(6),
 code char(8),
@@ -172,18 +197,22 @@ pt_fee int(11) NOT NULL default 0,
 hide bool NOT NULL default False,
 PRIMARY KEY (ix))
 ''',
-
     '''
 INSERT into feetable_key (tablename, categories, description, startdate,
 enddate, display_order, feecoltypes)
 values ("feetable_Private_2009","P,PB,PC,PD",
 "Private FeeScale", 20080401, 20091231, 1,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="fee">feeB</column>
-<column type="fee">feeC</column><column type="fee">feeD</column></columns>'
+'<?xml version="1.0"?>
+    <columns>
+        <column type="fee">fee</column>
+        <column type="fee">feeB</column>
+        <column type="fee">feeC</column>
+        <column type="fee">feeD</column>
+    </columns>'
 )
 ''',
     '''
-CREATE TABLE if not exists feetable_Private_2009 (
+CREATE TABLE feetable_Private_2009 (
 ix int(10) unsigned NOT NULL auto_increment ,
 section smallint(6),
 code char(8),
@@ -199,19 +228,22 @@ feeD int(11),
 hide bool NOT NULL default False,
 PRIMARY KEY (ix))
 ''',
-
     '''
 INSERT into feetable_key (tablename, categories, description, startdate,
 display_order, feecoltypes)
 values ("feetable_Private_2010","P,PB,PC,PD",
 "Private FeeScale", 20100101, 7,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="fee">feeB</column>
-<column type="fee">feeC</column><column type="fee">feeD</column></columns>'
+'<?xml version="1.0"?>
+    <columns>
+        <column type="fee">fee</column>
+        <column type="fee">feeB</column>
+        <column type="fee">feeC</column>
+        <column type="fee">feeD</column>
+    </columns>'
 )
 ''',
-
     '''
-CREATE TABLE if not exists feetable_Private_2010 (
+CREATE TABLE feetable_Private_2010 (
 ix int(10) unsigned NOT NULL auto_increment ,
 section smallint(6),
 code char(8),
@@ -227,9 +259,8 @@ feeD int(11),
 hide bool NOT NULL default False,
 PRIMARY KEY (ix))
 ''',
-
     '''
-CREATE TABLE if not exists docsimported (
+CREATE TABLE docsimported (
 ix int(10) unsigned NOT NULL auto_increment ,
 serialno int(11) NOT NULL ,
 importdate date ,
@@ -238,72 +269,28 @@ data blob ,
 PRIMARY KEY (ix),
 KEY (serialno))
 ''',
-
-    'DROP TABLE if exists omforum',
-    'DROP TABLE if exists estimates',
-
+    'DROP TABLE IF EXISTS omforum',
+    'DROP TABLE IF EXISTS estimates',
 ]
 
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
+SRC_QUERY = '''select section, code, oldcode, USERCODE,
+regulation, description, description1, %s from newfeetable
+order by code, ix'''
 
-class dbUpdater(QtCore.QThread):
+DEST_QUERY = '''insert into %s (section, code, oldcode, USERCODE,
+regulation, description, brief_description, fee, pt_fee)
+values (%%s, %%s, %%s, %%s, %%s, %%s, %%s, %%s, %%s)'''.replace("\n", " ")
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
+LOCK_QUERY = 'lock tables newfeetable read, %s write'
 
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
 
-    def create_alter_tables(self):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(SQLSTRINGS)
-            for sql_string in SQLSTRINGS:
-                cursor.execute(sql_string)
-                self.progressSig(
-                    10 + 70 * i / commandNo,
-                    sql_string[:20] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE create_alter_tables", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't create tables!")
+class DatabaseUpdater(DatabaseUpdaterThread):
 
     def transferData(self):
         '''
         move data into the new tables
         '''
-        db = connect.connect()
-        cursor = db.cursor()
         for table, vals in (
             ("feetable_scotNHS_08_Adult", "NF08, NF08_pt"),
             ("feetable_scotNHS_08_Child", "NF08, NF08_pt"),
@@ -311,46 +298,28 @@ class dbUpdater(QtCore.QThread):
             ("feetable_scotNHS_09_Child", "NF09, NF09_pt"),
             ("feetable_Private_2009", "PFA"),
             ("feetable_Private_2010", "PFA"),
-                ("feetable_HDP", "PFA")):
-            cursor.execute('lock tables newfeetable read, %s write' % table)
-
-            cursor.execute('''select section, code, oldcode, USERCODE,
-regulation, description, description1, %s from newfeetable
-order by code, ix''' % vals)
-            rows = cursor.fetchall()
+            ("feetable_HDP", "PFA")
+        ):
+            self.cursor.execute(LOCK_QUERY % table)
+            self.cursor.execute(SRC_QUERY % vals)
+            rows = self.cursor.fetchall()
 
-            query = 'insert into %s' % table
-            query += ''' (section, code, oldcode, USERCODE,
-regulation, description, brief_description, fee'''
+            query = DEST_QUERY % table
+            if not "," in vals:
+                query = query.replace(", pt_fee", "")
+                query = query.replace("%s,", "", 1)
 
-            if "," in vals:
-                query += ' , pt_fee) values (%s, %s, %s, %s, %s, %s, %s, %s, %s)'
-            else:
-                query += ') values (%s, %s, %s, %s, %s, %s, %s, %s)'
-
-            values = []
-            for row in rows:
-                if "NHS" in table or row[7] != 0:
-                    values.append(row)
-
-            cursor.executemany(query, values)
-
-            db.commit()
-            cursor.execute("unlock tables")
-
-        cursor.close()
-        db.close()
-        return True
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+            values = [row for row in rows if "NHS" in table or row[7] != 0]
+            self.cursor.executemany(query, values)
+            self.cursor.execute("unlock tables")
 
     def run(self):
-        print "running script to convert from schema 1.3 to 1.4"
+        LOGGER.info("running script to convert from schema 1.3 to 1.4")
         try:
+            self.connect()
             #- execute the SQL commands
             self.progressSig(10, _("creating new tables"))
-            self.create_alter_tables()
+            self.execute_statements(SQLSTRINGS)
 
             #- transfer data
             self.progressSig(20,
@@ -363,28 +332,22 @@ regulation, description, brief_description, fee'''
             # only 1.4 client will work now.
 
             self.progressSig(90, _('updating settings'))
-            print "update database settings..."
 
-            schema_version.update(("1.4",), "1_3 to 1_4 script")
+            self.update_schema_version(("1.4",), "1_3 to 1_4 script")
 
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 1.4")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "1.3"
-            self.completeSig(_("rolled back to") + " 1.3")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 1.4")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    LOGGER.setLevel(logging.DEBUG)
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_4to1_5.py b/src/openmolar/schema_upgrades/schema1_4to1_5.py
index 889e21a..3057314 100644
--- a/src/openmolar/schema_upgrades/schema1_4to1_5.py
+++ b/src/openmolar/schema_upgrades/schema1_4to1_5.py
@@ -29,19 +29,21 @@ in schema 1_4 to a new exemptions table in schema 1_5
 also, remove the key for calendar, it makes more sense to have the date
 as the primary key. (cleaner code for updates)
 '''
+import logging
 import sys
+
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
-    'alter table clinical_memos add column synopsis text',
-    'alter table calendar drop column ix',
-    'alter table calendar add primary key(adate)',
-    '''
-CREATE TABLE if not exists exemptions (
+'alter table clinical_memos add column synopsis text',
+'alter table calendar drop column ix',
+'alter table calendar add primary key(adate)',
+'DROP TABLE if exists exemptions',
+'''
+CREATE TABLE exemptions (
 ix int(10) unsigned NOT NULL auto_increment ,
 serialno int(11) unsigned NOT NULL ,
 exemption varchar(10),
@@ -52,136 +54,54 @@ key (serialno))
 '''
 ]
 
+SRC_QUERY = '''select serialno, exmpt, exempttext from patients
+where exmpt != "" or exempttext !=""'''
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
+DEST_QUERY = '''insert into exemptions (serialno, exemption, exempttext)
+values (%s, %s, %s)'''
 
 
-class dbUpdater(QtCore.QThread):
+class DatabaseUpdater(DatabaseUpdaterThread):
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def create_alter_tables(self):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(SQLSTRINGS)
-            for sql_string in SQLSTRINGS:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    10 + 70 * i / commandNo,
-                    sql_string[:20] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
 
     def transferData(self):
         '''
         move data into the new tables
         '''
-        db = connect.connect()
-        cursor = db.cursor()
-        cursor.execute('lock tables patients read, exemptions write')
-
-        cursor.execute('select serialno, exmpt, exempttext from patients')
-        rows = cursor.fetchall()
-
-        query = '''insert into exemptions (serialno, exemption, exempttext)
-        values (%s, %s, %s)'''
-
-        values = []
-        for row in rows:
-            if row[1] != "" or row[2] != "":
-                values.append(row)
-
-        cursor.executemany(query, values)
-
-        db.commit()
-        cursor.execute("unlock tables")
-
-        cursor.close()
-        db.close()
-        return True
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+        self.cursor.execute('lock tables patients read, exemptions write')
+        self.cursor.execute(SRC_QUERY)
+        rows = self.cursor.fetchall()
+        self.cursor.executemany(DEST_QUERY, rows)
+        self.cursor.execute("unlock tables")
 
     def run(self):
-        print "running script to convert from schema 1.4 to 1.5"
+        LOGGER.info("running script to convert from schema 1.4 to 1.5")
         try:
-            #- execute the SQL commands
-            self.progressSig(20, _("executing statements"))
-            self.create_alter_tables()
+            self.connect()
+            self.progressSig(20, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
 
             #- transfer data between tables
             self.progressSig(50, _('transfering data'))
 
-            print "transfering data to new table, ...",
-            if self.transferData():
-                print "ok"
-            else:
-                print "FAILED!!!!!"
-
+            LOGGER.info("transfering data to new table, ..."),
+            self.transferData()
             self.progressSig(90, _('updating settings'))
-            print "update database settings..."
 
-            schema_version.update(("1.5",), "1_4 to 1_5 script")
+            self.update_schema_version(("1.5",), "1_4 to 1_5 script")
 
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 1.5")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "1.4"
-            self.completeSig(_("rolled back to") + " 1.4")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 1.5")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_5to1_6.py b/src/openmolar/schema_upgrades/schema1_5to1_6.py
index 1ab0f28..14dfa1d 100644
--- a/src/openmolar/schema_upgrades/schema1_5to1_6.py
+++ b/src/openmolar/schema_upgrades/schema1_5to1_6.py
@@ -26,22 +26,20 @@
 This module provides a function 'run' which will move data
 to schema 1_6
 '''
+import logging
 import sys
+
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
-    '''
-alter table forum change comment comment text not null
-''',
-    '''
-drop table docsimported
-''',
-    '''
-CREATE TABLE if not exists docsimported (
+'drop table if exists docsimported',
+'drop table if exists docsimporteddata',
+'alter table forum change comment comment text not null',
+'''
+CREATE TABLE docsimported (
 ix mediumint(8) unsigned NOT NULL auto_increment,
 serialno int(11) unsigned NOT NULL default 0,
 datatype varchar(60) NOT NULL default 'application/octet-stream',
@@ -52,7 +50,7 @@ importime timestamp NOT NULL default CURRENT_TIMESTAMP,
 PRIMARY KEY (ix) )
 ''',
     '''
-CREATE TABLE if not exists docsimporteddata (
+CREATE TABLE docsimporteddata (
 ix mediumint(8) unsigned NOT NULL auto_increment,
 masterid mediumint(8) unsigned NOT NULL default '0',
 filedata blob NOT NULL,
@@ -90,7 +88,6 @@ TYPEDICT = {
             '5902', '5905', '5923', '5932', '5942', '5952'),
     "odl": ('2802', '2804', '2822', '2832', '2852', '2854', '2856', '2862', '2864', '2866', '5502',
             '5504', '5522', '5532', '5551', '5553', '5555', '5562', '5564', '5566', ),
-
     "ortho": ('3241', '3242', '3243', '3244', '3245', '3246', '3247', '3248', '3249', '3261', '3262',
               '3263', '3264', '3281', '3282', '3283', '3284', '3285', '3291', '5581', '5582', '5583',
               '5584', '5585', '5586', '5587', '5588', '5589')
@@ -98,159 +95,62 @@ TYPEDICT = {
 }
 
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
-
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def create_alter_tables(self):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(SQLSTRINGS)
-            for sql_string in SQLSTRINGS:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    10 + 70 * i / commandNo,
-                    sql_string[:20] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
+class DatabaseUpdater(DatabaseUpdaterThread):
 
     def addColumns(self):
         '''
         fee tables need a new column
         '''
-
-        db = connect.connect()
-        cursor = db.cursor()
-
-        cursor.execute('select tablename from feetable_key')
-        rows = cursor.fetchall()
-
+        self.cursor.execute('select tablename from feetable_key')
+        rows = self.cursor.fetchall()
         for row in rows:
-            print "altering feetable", row[0]
+            LOGGER.info("altering feetable '%s'", row[0])
             query = 'alter table %s add column pl_cmp char(20)' % row[0]
-            cursor.execute(query)
-
-        db.commit()
-
-        cursor.close()
-        db.close()
-        return True
+            self.cursor.execute(query)
 
     def insertValues(self):
         '''
         fee tables need a new column
         '''
-
-        db = connect.connect()
-        cursor = db.cursor()
-
-        cursor.execute('select tablename from feetable_key')
-        rows = cursor.fetchall()
+        self.cursor.execute('select tablename from feetable_key')
+        rows = self.cursor.fetchall()
         for row in rows:
-            print "altering feetable", row[0]
+            LOGGER.info("updating codes in feetable '%s'", row[0])
             query = 'update %s set pl_cmp=%%s where code=%%s' % row[0]
             for key in TYPEDICT:
                 for code in TYPEDICT[key]:
                     values = (key, code)
-                    cursor.execute(query, values)
-        db.commit()
-
-        cursor.close()
-        db.close()
-        return True
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+                    self.cursor.execute(query, values)
 
     def run(self):
-        print "running script to convert from schema 1.5 to 1.6"
+        LOGGER.info("running script to convert from schema 1.5 to 1.6")
         try:
-            #- execute the SQL commands
-            self.progressSig(20, _("executing statements"))
-            self.create_alter_tables()
+            self.connect()
+            self.progressSig(20, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
 
             #- transfer data between tables
             self.progressSig(40, _('transfering data'))
-
-            print "adding columns to the feetables table, ...",
-            if self.addColumns():
-                print "ok"
-            else:
-                print "FAILED!!!!!"
+            LOGGER.info("adding columns to the feetables table, ...")
+            self.addColumns()
             self.progressSig(60, _('inserting values'))
-
-            print "inserting values"
-            if self.insertValues():
-                print "ok"
-            else:
-                print "FAILED!!!!!"
-
+            LOGGER.info("inserting values")
+            self.insertValues()
             self.progressSig(90, _('updating settings'))
-            print "update database settings..."
-
-            schema_version.update(("1.6",), "1_5 to 1_6 script")
+            self.update_schema_version(("1.6",), "1_5 to 1_6 script")
 
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 1.6")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "1.5"
-            self.completeSig(_("rolled back to") + " 1.5")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 1.6")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_6to1_7.py b/src/openmolar/schema_upgrades/schema1_6to1_7.py
index 403fbd4..47cd667 100644
--- a/src/openmolar/schema_upgrades/schema1_6to1_7.py
+++ b/src/openmolar/schema_upgrades/schema1_6to1_7.py
@@ -26,14 +26,17 @@
 This module provides a function 'run' which will move data
 to schema 1_7
 '''
+import logging
 import sys
 import types
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
+from xml.dom import minidom
 
-from openmolar import connect
+from openmolar.settings import localsettings
+from openmolar.connect import params
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
+DATABASE_NAME = params.db_name
 
 SQLSTRINGS = [
     '''
@@ -184,232 +187,140 @@ REGEXDICT = {'2733': 'SR P', '0131': 'CTS', '1782': 'reg [ul]lr][1-8]CR,RC',
              '0701': 'FS'}
 
 
-#
-# SOME FUNCTIONS SPECIFIC TO this update                                  ##
-#
+TABLE_QUERY = 'select ix, tablename from feetable_key'
 
-from xml.dom import minidom
+COLUMN_QUERY = '''SELECT column_name FROM information_schema.columns WHERE table_name = %s AND table_schema = %s'''
 
+UPDATE_QUERY = "UPDATE feetable_key SET data = %s WHERE ix = %s"
 
-def getFeeDictForModification(table):
-    '''
-    a comprehensive dictionary formed from the entire table in the database
-    '''
-    query = '''select column_name from information_schema.columns
-    where table_name = %s and table_schema = %s'''
-    values = (table, connect.myDb)
-
-    db = connect.connect()
-    cursor = db.cursor()
-    cursor.execute(query, values)
-    rows = cursor.fetchall()
-    header = []
-    for row in rows:
-        header.append(row[0])
-
-    query = 'select * from %s' % table
-    cursor.execute(query)
-    rows = cursor.fetchall()
-    cursor.close()
-
-    return (header, rows)
-
-
-def getAsXML(table):
-    '''
-    convert the table to XML
-    called by schema upgrade script 1_6 to 1_7
-    '''
-    print "converting %s to xml" % table
-    col_names, rows = getFeeDictForModification(table)
-    dom = minidom.Document()
-    tab = dom.createElement("table")
 
-    itemcodeIndex = col_names.index("code")
-    currentItem = ""
+class DatabaseUpdater(DatabaseUpdaterThread):
 
-    for row in rows:
-        newNode = row[itemcodeIndex] != currentItem
-        currentItem = row[itemcodeIndex]
-        if newNode:
-            item = dom.createElement("item")
-
-        i = 0
-        fees = []
-        ptfees = []
-        for col in col_names:
-            makeNode = (col != "ix" and (newNode or not
-                                         col in (
-                                             "section", "code", "oldcode", "USERCODE", "regulation",
-                                         "description", "hide", "pl_cmp")))
-
-            if col.startswith("fee") or col.startswith("pt_fee"):
-                makeNode = False
-                try:
-                    val = int(row[i])
-                except ValueError:
-                    val = 0
-                except TypeError:
-                    val = 0
-                if col.startswith("fee"):
-                    fees.append(val)
-                else:
-                    ptfees.append(val)
-
-            if makeNode:
-                if col == "USERCODE":
-                    colno = col_names.index("code")
-                    d = dom.createElement("USERCODE")
-                    val = REGEXDICT.get(row[colno], "")
-                    d.appendChild(dom.createTextNode(val))
-                elif row[i]:
-                    d = dom.createElement(col)
-                    val = str(row[i])
-                    val = val.replace('\xc3\xbe', '3/4')
-                    d.appendChild(dom.createTextNode(val))
-                item.appendChild(d)
-            i += 1
-
-        d = dom.createElement("fee")
-        d.appendChild(dom.createTextNode(str(fees).strip("[]")))
-        item.appendChild(d)
-
-        p_fees_str = str(ptfees).strip("[]")
-        if p_fees_str:
-            d = dom.createElement("pt_fee")
-            d.appendChild(dom.createTextNode(p_fees_str))
+    def convert_table_to_XML(self, table):
+        '''
+        convert the table to XML
+        called by schema upgrade script 1_6 to 1_7
+        '''
+        LOGGER.info("converting %s to xml", table)
+
+        # poll database for fee tables
+        self.cursor.execute(COLUMN_QUERY, (table, DATABASE_NAME))
+        rows = self.cursor.fetchall()
+        col_names = []
+        for row in rows:
+            col_names.append(row[0])
+
+        # now convert to xml
+        dom = minidom.Document()
+        tab = dom.createElement("table")
+        itemcodeIndex = col_names.index("code")
+        currentItem = ""
+
+        query = 'select * from %s' % table
+        self.cursor.execute(query)  # , (table,))
+
+        for row in self.cursor.fetchall():
+            newNode = row[itemcodeIndex] != currentItem
+            currentItem = row[itemcodeIndex]
+            if newNode:
+                item = dom.createElement("item")
+
+            fees = []
+            ptfees = []
+            for i, col in enumerate(col_names):
+                makeNode = (
+                    col != "ix" and (newNode or not
+                                     col in ("section",
+                                             "code",
+                                             "oldcode",
+                                             "USERCODE",
+                                             "regulation",
+                                             "description",
+                                             "hide",
+                                             "pl_cmp")
+                                     ))
+
+                if col.startswith("fee") or col.startswith("pt_fee"):
+                    makeNode = False
+                    try:
+                        val = int(row[i])
+                    except ValueError:
+                        val = 0
+                    except TypeError:
+                        val = 0
+                    if col.startswith("fee"):
+                        fees.append(val)
+                    else:
+                        ptfees.append(val)
+
+                if makeNode:
+                    if col == "USERCODE":
+                        colno = col_names.index("code")
+                        d = dom.createElement("USERCODE")
+                        val = REGEXDICT.get(row[colno], "")
+                        d.appendChild(dom.createTextNode(val))
+                    elif row[i]:
+                        d = dom.createElement(col)
+                        try:
+                            val = unicode(row[i]).encode("ascii", "replace")
+                        except UnicodeEncodeError:
+                            LOGGER.exception("Unicode error from %s", row[i])
+                        # val = val.replace('\xc3\xbe', '3/4')
+                        d.appendChild(dom.createTextNode(val))
+                    item.appendChild(d)
+
+            d = dom.createElement("fee")
+            d.appendChild(dom.createTextNode(str(fees).strip("[]")))
             item.appendChild(d)
 
-        tab.appendChild(item)
-    dom.appendChild(tab)
-
-    result = dom.toxml()
-    dom.unlink()
-    return result
-
-
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
+            p_fees_str = str(ptfees).strip("[]")
+            if p_fees_str:
+                d = dom.createElement("pt_fee")
+                d.appendChild(dom.createTextNode(p_fees_str))
+                item.appendChild(d)
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
+            tab.appendChild(item)
+        dom.appendChild(tab)
 
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def create_alter_tables(self):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(SQLSTRINGS)
-            for sql_string in SQLSTRINGS:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    10 + 70 * i / commandNo,
-                    sql_string[:20] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
+        result = dom.toxml()
+        dom.unlink()
+        return result
 
     def insertValues(self):
         '''
         fee tables need a new column "Data" to replace the multiple tables
         '''
-
-        db = connect.connect()
-        cursor = db.cursor()
-
-        cursor.execute('select ix, tablename from feetable_key')
-        rows = cursor.fetchall()
-
+        self.cursor.execute(TABLE_QUERY)
+        rows = self.cursor.fetchall()
         for ix, tablename in rows:
-            print "altering feetable", tablename
-
-            table_xml = getAsXML(tablename)
-            query = "update feetable_key set data = %s where ix = %s"
-            values = (table_xml, ix)
-            cursor.execute(query, values)
-
-        db.commit()
-
-        cursor.close()
-        db.close()
-        return True
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+            LOGGER.info("altering feetable %s", tablename)
+            values = (self.convert_table_to_XML(tablename), ix)
+            self.cursor.execute(UPDATE_QUERY, values)
 
     def run(self):
-        print "running script to convert from schema 1.6 to 1.7"
+        LOGGER.info("running script to convert from schema 1.6 to 1.7")
         try:
+            self.connect()
             #- execute the SQL commands
             self.progressSig(20, _("executing statements"))
-            self.create_alter_tables()
-
+            self.execute_statements(SQLSTRINGS)
             #- transfer data between tables
             self.progressSig(60, _('inserting values'))
-
-            print "inserting values"
-            if self.insertValues():
-                print "ok"
-            else:
-                print "FAILED!!!!!"
-
+            self.insertValues()
             self.progressSig(90, _('updating settings'))
-            print "update database settings..."
-
-            schema_version.update(("1.6", "1.7",), "1_6 to 1_7 script")
-
+            self.update_schema_version(("1.6", "1.7",), "1_6 to 1_7 script")
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 1.7 " + _("you may now remove old feetables"))
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "1.6"
-            self.completeSig(_("rolled back to") + " 1.6")
-
-        return self.completed
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 1.7")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_7to1_8.py b/src/openmolar/schema_upgrades/schema1_7to1_8.py
index 3fe7647..85ebfee 100644
--- a/src/openmolar/schema_upgrades/schema1_7to1_8.py
+++ b/src/openmolar/schema_upgrades/schema1_7to1_8.py
@@ -26,12 +26,13 @@
 This module provides a function 'run' which will move data
 to schema 1_8
 '''
+import logging
 import sys
+
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
     '''
@@ -94,122 +95,40 @@ EXAMPLE_PHRASEBOOK = '''<?xml version="1.0" ?>
 </phrasebook>'''
 
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
+INSERT_QUERY = "insert into phrasebook values (%s, %s)"
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showhing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def create_alter_tables(self):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(SQLSTRINGS)
-            for sql_string in SQLSTRINGS:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    10 + 70 * i / commandNo,
-                    sql_string[:20] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
+class DatabaseUpdater(DatabaseUpdaterThread):
 
     def insertValues(self):
         '''
         insert the demo phrasebook
         '''
-
-        db = connect.connect()
-        cursor = db.cursor()
-
-        query = "insert into phrasebook values (%s, %s)"
         values = (0, EXAMPLE_PHRASEBOOK)
-        cursor.execute(query, values)
-        db.commit()
-
-        cursor.close()
-        db.close()
-        return True
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+        self.cursor.execute(INSERT_QUERY, values)
 
     def run(self):
-        print "running script to convert from schema 1.7 to 1.8"
+        LOGGER.info("running script to convert from schema 1.7 to 1.8")
         try:
-            #- execute the SQL commands
-            self.progressSig(20, _("executing statements"))
-            self.create_alter_tables()
+            self.connect()
+            self.progressSig(20, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
             self.progressSig(60, _('inserting values'))
 
-            print "inserting values"
-            if self.insertValues():
-                print "ok"
-            else:
-                print "FAILED!!!!!"
-
+            self.insertValues()
             self.progressSig(90, _('updating settings'))
-            print "update database settings..."
-
-            schema_version.update(("1.8",), "1_7 to 1_8 script")
-
+            self.update_schema_version(("1.8",), "1_7 to 1_8 script")
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 1.8")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "1.7"
-            self.completeSig(_("rolled back to") + " 1.7")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 1.8")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_8to1_9.py b/src/openmolar/schema_upgrades/schema1_8to1_9.py
index f8c817f..b7df0e8 100644
--- a/src/openmolar/schema_upgrades/schema1_8to1_9.py
+++ b/src/openmolar/schema_upgrades/schema1_8to1_9.py
@@ -27,16 +27,25 @@ This module provides a function 'run' which will move data
 to schema 1_9
 '''
 from __future__ import division
+
+import logging
 import sys
+
+try:
+    from collections import OrderedDict
+except ImportError:
+    # OrderedDict only came in python 2.7
+    print "using openmolar.backports for OrderedDict"
+    from openmolar.backports import OrderedDict
+
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
     '''
-create table formatted_notes (ix serial, serialno int(11),
+CREATE TABLE IF NOT EXISTS formatted_notes (ix serial, serialno int(11),
 ndate date, op1 varchar(8), op2 varchar(8), ntype varchar(32),
 note varchar(80), timestamp timestamp default NOW());
 ''',
@@ -49,124 +58,105 @@ create index newdocsprinted_serialno_index on newdocsprinted(serialno);
 ]
 
 
-class UpdateException(Exception):
+class DatabaseUpdater(DatabaseUpdaterThread):
 
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
+    def __init__(self, *args, **kwargs):
+        DatabaseUpdaterThread.__init__(self,  *args, **kwargs)
+        from openmolar.ptModules import notes
+        self.decipher_noteline = notes.decipher_noteline
 
+    def get_notes(self, sno):
+        self.cursor.execute('''SELECT line from notes where serialno = %s
+        order by lineno''', sno)
+        results = self.cursor.fetchall()
 
-class dbUpdater(QtCore.QThread):
+        notes_dict = OrderedDict()
+        ndate, op = "", ""
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
+        # a line is like ('\x01REC\x0c\x08m\x0c\x08m\n\x08',)
+        for line, in results:
+            line = line.encode("ascii", "replace")
+            ntype, note, operator, date2 = self.decipher_noteline(line)
+            if date2 != "":
+                ndate = date2
+            if operator != "":
+                op = operator
 
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
+            key = (ndate, op)
+            if key in notes_dict:
+                notes_dict[key].append((ntype, note))
+            else:
+                notes_dict[key] = [(ntype, note)]
+
+        return notes_dict
+
+
+    def transfer(self, sno):
+        LOGGER.debug("transferring notes for serialnos %s", sno)
+        notes_dict = self.get_notes(sno)
+        query = '''insert into formatted_notes
+        (serialno, ndate, op1 , op2 , ntype, note)
+        values (%s, %s, %s, %s, %s, %s)'''
+
+        values = []
+        for key in notes_dict:
+            date, ops = key
+            op2 = None
+            if "/" in ops:
+                op1, op2 = ops.split("/")
+            else:
+                op1 = ops
+            for ntype, note in notes_dict[key]:
+                values.append((sno, date, op1, op2, ntype, note))
+        if values:
+            rows = self.cursor.executemany(query, values)
+            LOGGER.debug("%d rows of notes inserted", rows)
+
+    def get_max_sno(self):
+        self.cursor.execute("select max(serialno) from notes")
+        max_sno = self.cursor.fetchone()[0]
+        return max_sno
 
-    def create_alter_tables(self):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(SQLSTRINGS)
-            for sql_string in SQLSTRINGS:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    2 + 70 * i / commandNo,
-                    sql_string[:40] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
 
     def insertValues(self):
         '''
         this code is complex, so in a separate module for ease of maintenance
         '''
-        from openmolar.schema_upgrades import formatted_notes1_9
-        max_sno = formatted_notes1_9.get_max_sno()
+        max_sno = self.get_max_sno()
         sno = 0
-        print "max_sno in notes = %s " % max_sno
+        LOGGER.info("max_sno in notes = %s ", max_sno)
 
         while sno < max_sno:
             sno += 1
-            formatted_notes1_9.transfer(sno)
+            self.transfer(sno)
             progress = int(sno / max_sno * 90) + 8
             self.progressSig(progress, "%s %s" % (
                 _('converting note'), sno))
-            QtGui.QApplication.instance().processEvents()
-
-        return True
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
 
     def run(self):
-        print "running script to convert from schema 1.8 to 1.9"
+        LOGGER.info("running script to convert from schema 1.8 to 1.9")
         try:
-            #- execute the SQL commands
-            self.progressSig(2, _("executing statements"))
-            self.create_alter_tables()
+            self.connect()
+            self.progressSig(2, _("creating new tables and indexes"))
+            self.execute_statements(SQLSTRINGS)
             self.progressSig(8, _('inserting values'))
 
-            print "inserting values"
-            if self.insertValues():
-                print "ok"
-            else:
-                print "FAILED!!!!!"
-
+            self.insertValues()
             self.progressSig(99, _('updating settings'))
-            print "update database settings..."
-
-            schema_version.update(("1.9",), "1_8 to 1_9 script")
 
+            self.update_schema_version(("1.9",), "1_8 to 1_9 script")
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 1.9")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "1.8"
-            self.completeSig(_("rolled back to") + " 1.8")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 1.9")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_9to2_0.py b/src/openmolar/schema_upgrades/schema1_9to2_0.py
index 06afea3..e6cefae 100644
--- a/src/openmolar/schema_upgrades/schema1_9to2_0.py
+++ b/src/openmolar/schema_upgrades/schema1_9to2_0.py
@@ -27,15 +27,16 @@ This module provides a function 'run' which will move data
 to schema 2_0
 '''
 from __future__ import division
+import logging
 import sys
+
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
 
-SQLSTRINGS_1 = [
-    '''
+SQLSTRINGS_1 = ['DROP table IF EXISTS appt_prefs',
+'''
 create table appt_prefs (
     serialno int(11),
     recall_active bool not null default True,
@@ -78,71 +79,12 @@ where t1.serialno = t2.serialno and t1.memo = t2.note;
 ]
 
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
-
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def execute_statements(self, sql_strings):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(sql_strings)
-            for sql_string in sql_strings:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    2 + 70 * i / commandNo,
-                    sql_string[:40] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+class DatabaseUpdater(DatabaseUpdaterThread):
 
     def run(self):
-        print "running script to convert from schema 1.9 to 2.0"
+        LOGGER.info("running script to convert from schema 1.9 to 2.0")
         try:
+            self.connect()
             #- execute the SQL commands
             self.progressSig(10, _("creating new appt_prefs table"))
             self.execute_statements(SQLSTRINGS_1)
@@ -151,28 +93,20 @@ class dbUpdater(QtCore.QThread):
             self.progressSig(80, _('statements executed'))
 
             self.progressSig(90, _('updating settings'))
-            print "update database settings..."
-
-            schema_version.update(("2.0",), "1_9 to 2_0 script")
+            self.update_schema_version(("2.0",), "1_9 to 2_0 script")
 
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 2.0")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "1.9"
-            self.completeSig(_("rolled back to") + " 1.9")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 2.0")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_0to2_1.py b/src/openmolar/schema_upgrades/schema2_0to2_1.py
index 663ced7..257d713 100644
--- a/src/openmolar/schema_upgrades/schema2_0to2_1.py
+++ b/src/openmolar/schema_upgrades/schema2_0to2_1.py
@@ -31,13 +31,11 @@ from __future__ import division
 import logging
 import sys
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
 
-from PyQt4 import QtGui, QtCore
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
 
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
     'drop table if exists currtrtmt2',
@@ -202,8 +200,6 @@ xraycmp="" AND periocmp="" AND anaescmp="" AND othercmp="" AND nducmp=""
 AND ndlcmp="" AND oducmp="" AND odlcmp="" AND customcmp=""
 '''
 
-# don't use this one.. seems unnecessary.
-
 CORRECTION_QUERY = '''
 update patients join
 (select serialno, max(courseno) cno from currtrtmt2 group by serialno) as t
@@ -212,71 +208,30 @@ where cno > courseno0
 '''
 
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
+class DatabaseUpdater(DatabaseUpdaterThread):
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
+    def transfer_data(self):
         '''
-        emits a signal showing how we are proceeding.
-        val is a number between 0 and 100
+        function specific to this update.
         '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def execute_statements(self, sql_strings):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(sql_strings)
-            for sql_string in sql_strings:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    2 + 70 * i / commandNo,
-                    sql_string[:40] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+        self.cursor.execute(SOURCE_QUERY)
+        rows = self.cursor.fetchall()
+        step = 1 / len(rows)
+        for i, row in enumerate(rows):
+            courseno = row[0]
+            serialno = row[1]
+            self.cursor.execute(DEST_QUERY, row[1:])
+            new_cno = self.db.insert_id()
+            self.cursor.execute(PATIENT_QUERY, (new_cno, serialno, courseno))
+            self.cursor.execute(ESTIMATES_QUERY, (new_cno, serialno, courseno))
+            if i % 100 == 0:
+                self.progressSig(80 * i / len(rows) + 10,
+                                 _("transfering data"))
 
     def run(self):
-        print "running script to convert from schema 2.0 to 2.1"
+        LOGGER.info("running script to convert from schema 2.0 to 2.1")
         try:
+            self.connect()
             #- execute the SQL commands
             self.progressSig(5, _("creating currtrtmt2 table"))
             self.execute_statements(SQLSTRINGS)
@@ -288,59 +243,22 @@ class dbUpdater(QtCore.QThread):
             self.execute_statements([GARBAGE_QUERY, CORRECTION_QUERY])
 
             self.progressSig(97, _('updating settings'))
-            print "update database settings..."
+            LOGGER.info("updating stored database version in settings table")
 
-            schema_version.update(("2.1",), "2_0 to 2_1 script")
+            self.update_schema_version(("2.1",), "2_0 to 2_1 script")
 
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 2.1")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "2.0"
-            self.completeSig(_("rolled back to") + " 2.0")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
-
-    def transfer_data(self):
-        '''
-        function specific to this update.
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        try:
-            cursor = db.cursor()
-            cursor.execute(SOURCE_QUERY)
-            rows = cursor.fetchall()
-            cursor.close()
-            cursor = db.cursor()
-            step = 1 / len(rows)
-            for i, row in enumerate(rows):
-                courseno = row[0]
-                serialno = row[1]
-                cursor.execute(DEST_QUERY, row[1:])
-                new_cno = db.insert_id()
-                cursor.execute(PATIENT_QUERY, (new_cno, serialno, courseno))
-                cursor.execute(ESTIMATES_QUERY, (new_cno, serialno, courseno))
-                if i % 100 == 0:
-                    self.progressSig(80 * i / len(rows) + 10,
-                                     _("transfering data"))
-            cursor.close()
-            db.commit()
-            db.close()
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 2.1")
+            return True
         except Exception as exc:
-            logging.exception("error transfering data")
-            db.rollback()
-            raise UpdateException(exc)
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_1to2_2.py b/src/openmolar/schema_upgrades/schema2_1to2_2.py
index e28c0e8..7661642 100644
--- a/src/openmolar/schema_upgrades/schema2_1to2_2.py
+++ b/src/openmolar/schema_upgrades/schema2_1to2_2.py
@@ -32,18 +32,16 @@ import logging
 import os
 import sys
 from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
 
-from PyQt4 import QtGui, QtCore
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
     'drop table if exists currtrtmt',
     'drop table if exists est_link',
     'drop table if exists feescales',
-    'drop table est_logger',
+    'drop table if exists est_logger',
     'update patients set addr2="" where addr2 is NULL',
     'update patients set addr3="" where addr3 is NULL',
     'update patients set town="" where town is NULL',
@@ -149,198 +147,107 @@ LOGGER_INSERT_QUERY = ('insert into est_logger '
                        '(courseno, est_data, operator) values (%s,%s, %s)')
 
 
-class UpdateException(Exception):
+class DatabaseUpdater(DatabaseUpdaterThread):
 
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
-
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
+    def transfer_data(self):
         '''
-        emits a signal showing how we are proceeding.
-        val is a number between 0 and 100
+        function specific to this update.
         '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
+        self.cursor.execute(SOURCE_QUERY)
+        rows = self.cursor.fetchall()
+        step = 1 / len(rows)
+        count, prev_courseno, prev_cat_type = 1, 0, ""
+        prev_hash = None
+        for i, row in enumerate(rows):
+            courseno, ix, category, type_, completed = row
+            cat_type = "%s%s" % (category, type_)
+            if courseno != prev_courseno:
+                count = 1
+            elif cat_type != prev_cat_type:
+                count = 1
+            else:
+                count += 1
+
+            prev_courseno = courseno
+            prev_cat_type = cat_type
+
+            tx_hash = hash("%s%s%s%s" % (courseno, category, count, type_))
+
+            if completed is None:
+                completed = False
+            values = (ix, tx_hash, completed)
+            self.cursor.execute(DEST_QUERY, values)
+            if i % 1000 == 0:
+                self.progressSig(50 * i / len(rows) + 10,
+                                 _("transfering data"))
+
+        self.cursor.execute(LOGGER_SELECT_QUERY)
+        rows = self.cursor.fetchall()
+        prev_courseno = None
+        est_log_text = ""
+        total, p_total = 0, 0
+        for i, (courseno, number, itemcode, description, csetype,
+                feescale, dent, fee, ptfee) in enumerate(rows):
+            line_text = \
+                "%s || %s || %s || %s || %s || %s || %s || %s||\n" % (
+                    number, itemcode, description, csetype,
+                    feescale, dent, fee, ptfee)
+
+            if prev_courseno is None or courseno == prev_courseno:
+                est_log_text += line_text
+                total += fee
+                p_total += ptfee
+            else:
+                est_log_text += "TOTAL ||  ||  ||  ||  ||  || %s || %s" % (
+                    total, p_total)
+                values = (prev_courseno, est_log_text, "2_2script")
+                self.cursor.execute(LOGGER_INSERT_QUERY, values)
+                est_log_text = line_text
+                total, p_total = fee, ptfee
+
+            prev_courseno = courseno
+            if i % 1000 == 0:
+                self.progressSig(30 * i / len(rows) + 60,
+                                 _("transfering data"))
 
-    def execute_statements(self, sql_strings):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(sql_strings)
-            for sql_string in sql_strings:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    2 + 70 * i / commandNo,
-                    sql_string[:40] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+    def insert_feescales(self):
+        feescale_path = os.path.join(
+            localsettings.wkdir,
+            'resources',
+            'feescales',
+            'example_feescale.xml'
+            )
+        f = open(feescale_path, "r")
+        data = f.read()
+        f.close()
+        self.cursor.execute(FEESCALE_QUERY, (data,))
 
     def run(self):
-        print "running script to convert from schema 2.1 to 2.2"
+        LOGGER.info("running script to convert from schema 2.1 to 2.2")
         try:
+            self.connect()
             #- execute the SQL commands
             self.progressSig(5, _("creating tables"))
             self.execute_statements(SQLSTRINGS)
-
             self.progressSig(10, _("populating est_link table"))
             self.transfer_data()
-
             self.progressSig(95, _("populating feescales"))
             self.insert_feescales()
-
             self.progressSig(97, _('updating settings'))
-            print "update database settings..."
-
-            schema_version.update(("2.2",), "2_1 to 2_2 script")
-
+            LOGGER.info("updating stored database version in settings table")
+            self.update_schema_version(("2.2",), "2_1 to 2_2 script")
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 2.2")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "2.1"
-            self.completeSig(_("rolled back to") + " 2.1")
-
-        except Exception as e:
-            print "Exception caught", e
-            self.completeSig(str(e))
-
-        return self.completed
-
-    def transfer_data(self):
-        '''
-        function specific to this update.
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        try:
-            cursor = db.cursor()
-            cursor.execute(SOURCE_QUERY)
-            rows = cursor.fetchall()
-            cursor.close()
-            cursor = db.cursor()
-            step = 1 / len(rows)
-            count, prev_courseno, prev_cat_type = 1, 0, ""
-            prev_hash = None
-            for i, row in enumerate(rows):
-                courseno, ix, category, type_, completed = row
-                cat_type = "%s%s" % (category, type_)
-                if courseno != prev_courseno:
-                    count = 1
-                elif cat_type != prev_cat_type:
-                    count = 1
-                else:
-                    count += 1
-
-                prev_courseno = courseno
-                prev_cat_type = cat_type
-
-                tx_hash = hash("%s%s%s%s" % (courseno, category, count, type_))
-
-                if completed is None:
-                    completed = False
-                values = (ix, tx_hash, completed)
-                cursor.execute(DEST_QUERY, values)
-                if i % 1000 == 0:
-                    self.progressSig(50 * i / len(rows) + 10,
-                                     _("transfering data"))
-
-            cursor.execute(LOGGER_SELECT_QUERY)
-            rows = cursor.fetchall()
-            prev_courseno = None
-            est_log_text = ""
-            total, p_total = 0, 0
-            for i, (courseno, number, itemcode, description, csetype,
-                    feescale, dent, fee, ptfee) in enumerate(rows):
-                line_text = \
-                    "%s || %s || %s || %s || %s || %s || %s || %s||\n" % (
-                        number, itemcode, description, csetype,
-                        feescale, dent, fee, ptfee)
-
-                if prev_courseno is None or courseno == prev_courseno:
-                    est_log_text += line_text
-                    total += fee
-                    p_total += ptfee
-                else:
-                    est_log_text += "TOTAL ||  ||  ||  ||  ||  || %s || %s" % (
-                        total, p_total)
-                    values = (prev_courseno, est_log_text, "2_2script")
-                    cursor.execute(LOGGER_INSERT_QUERY, values)
-                    est_log_text = line_text
-                    total, p_total = fee, ptfee
-
-                prev_courseno = courseno
-                if i % 1000 == 0:
-                    self.progressSig(30 * i / len(rows) + 60,
-                                     _("transfering data"))
-
-            db.commit()
-            db.close()
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 2.2")
+            return True
         except Exception as exc:
-            logging.exception("error transfering data")
-            db.rollback()
-            raise UpdateException(exc)
-
-    def insert_feescales(self):
-        feescale_path = os.path.join(localsettings.wkdir, 'resources',
-                                     "feescales", "example_feescale.xml")
-        db = connect.connect()
-        db.autocommit(False)
-        try:
-            f = open(feescale_path, "r")
-            data = f.read()
-            f.close()
-            cursor = db.cursor()
-            cursor.execute(FEESCALE_QUERY, (data,))
-            cursor.close()
-            db.commit()
-            db.close()
-        except Exception as exc:
-            logging.exception("error inserting test feescale")
-            db.rollback()
-            raise UpdateException(exc)
-
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_2to2_3.py b/src/openmolar/schema_upgrades/schema2_2to2_3.py
index a9e276d..1b9eb05 100644
--- a/src/openmolar/schema_upgrades/schema2_2to2_3.py
+++ b/src/openmolar/schema_upgrades/schema2_2to2_3.py
@@ -31,13 +31,11 @@ from __future__ import division
 import logging
 import os
 import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
 
-from PyQt4 import QtGui, QtCore
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
     'drop table if exists est_link2',
@@ -79,71 +77,45 @@ on est_link.est_id=est_link2.est_id where est_link2.tx_hash is NULL
 ]
 
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
+class DatabaseUpdater(DatabaseUpdaterThread):
 
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def execute_statements(self, sql_strings):
+    def transfer_data(self):
         '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
+        function specific to this update.
         '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(sql_strings)
-            for sql_string in sql_strings:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    2 + 70 * i / commandNo,
-                    sql_string[:40] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+        self.cursor.execute(SOURCE_QUERY)
+        rows = self.cursor.fetchall()
+        step = 1 / len(rows)
+        count, prev_courseno, prev_cat_type = 1, 0, ""
+        prev_hash = None
+        for i, row in enumerate(rows):
+            courseno, ix, category, type_, completed = row
+            cat_type = "%s%s" % (category, type_)
+            if courseno != prev_courseno:
+                count = 1
+            elif cat_type != prev_cat_type:
+                count = 1
+            else:
+                count += 1
+
+            prev_courseno = courseno
+            prev_cat_type = cat_type
+
+            tx_hash = localsettings.hash_func(
+                "%s%s%s%s" % (courseno, category, count, type_))
+
+            if completed is None:
+                completed = False
+            values = (ix, tx_hash, completed)
+            self.cursor.execute(DEST_QUERY, values)
+            if i % 1000 == 0:
+                self.progressSig(85 * i / len(rows) + 10,
+                                     _("transfering data"))
 
     def run(self):
-        print "running script to convert from schema 2.2 to 2.3"
+        LOGGER.info("running script to convert from schema 2.2 to 2.3")
         try:
+            self.connect()
             #- execute the SQL commands
             self.progressSig(5, _("creating est_link2 table"))
             self.execute_statements(SQLSTRINGS)
@@ -155,73 +127,23 @@ class dbUpdater(QtCore.QThread):
             self.execute_statements(CLEANUPSTRINGS)
 
             self.progressSig(97, _('updating settings'))
-            print "update database settings..."
+            LOGGER.info("updating stored database version in settings table")
 
-            schema_version.update(("2.3",), "2_2 to 2_3 script")
+            self.update_schema_version(("2.3",), "2_2 to 2_3 script")
 
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 2.3")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "2.2"
-            self.completeSig(_("rolled back to") + " 2.2")
-
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 2.3")
+            return True
         except Exception as exc:
-            logging.exception("Exception caught")
-            self.completeSig(str(exc))
-
-        return self.completed
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
-    def transfer_data(self):
-        '''
-        function specific to this update.
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        try:
-            cursor = db.cursor()
-            cursor.execute(SOURCE_QUERY)
-            rows = cursor.fetchall()
-            cursor.close()
-            cursor = db.cursor()
-            step = 1 / len(rows)
-            count, prev_courseno, prev_cat_type = 1, 0, ""
-            prev_hash = None
-            for i, row in enumerate(rows):
-                courseno, ix, category, type_, completed = row
-                cat_type = "%s%s" % (category, type_)
-                if courseno != prev_courseno:
-                    count = 1
-                elif cat_type != prev_cat_type:
-                    count = 1
-                else:
-                    count += 1
-
-                prev_courseno = courseno
-                prev_cat_type = cat_type
-
-                tx_hash = localsettings.hash_func(
-                    "%s%s%s%s" % (courseno, category, count, type_))
-
-                if completed is None:
-                    completed = False
-                values = (ix, tx_hash, completed)
-                cursor.execute(DEST_QUERY, values)
-                if i % 1000 == 0:
-                    self.progressSig(85 * i / len(rows) + 10,
-                                     _("transfering data"))
-            db.commit()
-            db.close()
-        except Exception as exc:
-            logging.exception("error transfering data")
-            db.rollback()
-            raise UpdateException(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_3to2_4.py b/src/openmolar/schema_upgrades/schema2_3to2_4.py
index 42b9a99..c83f095 100644
--- a/src/openmolar/schema_upgrades/schema2_3to2_4.py
+++ b/src/openmolar/schema_upgrades/schema2_3to2_4.py
@@ -31,13 +31,11 @@ from __future__ import division
 import logging
 import os
 import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
 
-from PyQt4 import QtGui, QtCore
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
 
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
 
 SQLSTRINGS = [
     'drop table if exists daybook_link',
@@ -60,110 +58,36 @@ CLEANUPSTRINGS = [
 ]
 
 
-class UpdateException(Exception):
-
-    '''
-    A custom exception. If this is thrown the db will be rolled back
-    '''
-    pass
-
-
-class dbUpdater(QtCore.QThread):
-
-    def __init__(self, parent=None):
-        super(dbUpdater, self).__init__(parent)
-        self.stopped = False
-        self.path = None
-        self.completed = False
-        self.MESSAGE = "upating database"
-
-    def progressSig(self, val, message=""):
-        '''
-        emits a signal showing how we are proceeding.
-        val is a number between 0 and 100
-        '''
-        if message != "":
-            self.MESSAGE = message
-        self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
-    def execute_statements(self, sql_strings):
-        '''
-        execute the above commands
-        NOTE - this function may fail depending on the mysql permissions
-        in place
-        '''
-        db = connect.connect()
-        db.autocommit(False)
-        cursor = db.cursor()
-        sucess = False
-        try:
-            i, commandNo = 0, len(sql_strings)
-            for sql_string in sql_strings:
-                try:
-                    cursor.execute(sql_string)
-                except connect.GeneralError as e:
-                    print "FAILURE in executing sql statement", e
-                    print "erroneous statement was ", sql_string
-                    if 1060 in e.args:
-                        print "continuing, as column already exists issue"
-                self.progressSig(
-                    2 + 70 * i / commandNo,
-                    sql_string[:40] + "...")
-            sucess = True
-        except Exception as e:
-            print "FAILURE in executing sql statements", e
-            db.rollback()
-        if sucess:
-            db.commit()
-            db.autocommit(True)
-        else:
-            raise UpdateException("couldn't execute all statements!")
-
-    def completeSig(self, arg):
-        self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+class DatabaseUpdater(DatabaseUpdaterThread):
 
     def run(self):
-        print "running script to convert from schema 2.3 to 2.4"
+        LOGGER.info("running script to convert from schema 2.3 to 2.4")
         try:
+            self.connect()
             #- execute the SQL commands
             self.progressSig(50, _("creating est_link2 table"))
             self.execute_statements(SQLSTRINGS)
 
-            # self.progressSig(30, _("transferring data"))
-            # self.transfer_data()
-
             self.progressSig(95, _("executing cleanup statements"))
             self.execute_statements(CLEANUPSTRINGS)
 
             self.progressSig(97, _('updating settings'))
-            print "update database settings..."
+            LOGGER.info("updating stored database version in settings table")
 
-            schema_version.update(("2.4",), "2_3 to 2_4 script")
+            self.update_schema_version(("2.4",), "2_3 to 2_4 script")
 
             self.progressSig(100, _("updating stored schema version"))
-            self.completed = True
-            self.completeSig(_("ALL DONE - sucessfully moved db to")
-                             + " 2.4")
-
-        except UpdateException as e:
-            localsettings.CLIENT_SCHEMA_VERSION = "2.3"
-            self.completeSig(_("rolled back to") + " 2.3")
-
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 2.4")
+            return True
         except Exception as exc:
-            logging.exception("Exception caught")
-            self.completeSig(str(exc))
-
-        return self.completed
-
-    def transfer_data(self):
-        '''
-        function specific to this update.
-        '''
-        pass
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
 
 if __name__ == "__main__":
-    dbu = dbUpdater()
+    dbu = DatabaseUpdater()
     if dbu.run():
-        print "ALL DONE, conversion sucessful"
+        LOGGER.info("ALL DONE, conversion successful")
     else:
-        print "conversion failed"
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_4to2_5.py b/src/openmolar/schema_upgrades/schema2_4to2_5.py
new file mode 100644
index 0000000..f154d27
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_4to2_5.py
@@ -0,0 +1,132 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+'''
+This module provides a function 'run' which will move data
+to schema 2_5
+'''
+from __future__ import division
+
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+    'drop table if exists referral_centres',
+    'drop table if exists previous_snames',
+    '''
+create table referral_centres (
+  ix             int(11) unsigned not null auto_increment ,
+  description    char(64) NOT NULL DEFAULT "referral",
+  greeting       char(64) NOT NULL DEFAULT "Dear Sir/Madam",
+  addr1          char(64) NOT NULL DEFAULT "",
+  addr2          char(64) NOT NULL DEFAULT "",
+  addr3          char(64) NOT NULL DEFAULT "",
+  addr4          char(64) NOT NULL DEFAULT "",
+  addr5          char(64) NOT NULL DEFAULT "",
+  addr6          char(64) NOT NULL DEFAULT "",
+  addr7          char(64) NOT NULL DEFAULT "",
+PRIMARY KEY (ix)
+)''',
+'''
+INSERT INTO referral_centres
+(description, greeting, addr1, addr2, addr3, addr4, addr5, addr6)
+values ("Example Referral Centre", "Dear Sir/Madam", "The Head Clinician",
+"Orthodontic Department", "The Local Dental Hospital", "Any Street",
+"Any Town", "POST CODE")
+'''
+,
+    '''
+create table previous_snames (
+  ix           int(11) unsigned not null auto_increment ,
+  serialno     int(11),
+  psn          char(40) NOT NULL,
+PRIMARY KEY (ix),
+INDEX (serialno)
+)''',
+'''
+UPDATE patients SET county="" WHERE COUNTY is NULL
+'''
+]
+
+#NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+    'ALTER TABLE patients DROP COLUMN recd',
+]
+
+SOURCE_QUERY = \
+'SELECT serialno, psn FROM patients WHERE psn != "" AND psn IS NOT NULL'
+
+DEST_QUERY = \
+'INSERT INTO previous_snames (serialno, psn) VALUES (%s, %s)'
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+    def transfer_data(self):
+        '''
+        function specific to this update.
+        '''
+        self.cursor.execute(SOURCE_QUERY)
+        rows = self.cursor.fetchall()
+        self.cursor.executemany(DEST_QUERY, rows)
+
+    def run(self):
+        LOGGER.info("running script to convert from schema 2.4 to 2.5")
+        try:
+            self.connect()
+            #- execute the SQL commands
+            self.progressSig(10, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
+
+            self.progressSig(50, _("transferring data"))
+            self.transfer_data()
+
+            self.progressSig(95, _("executing cleanup statements"))
+            self.execute_statements(CLEANUPSTRINGS)
+
+            self.progressSig(97, _('updating settings'))
+            LOGGER.info("updating stored database version in settings table")
+
+            self.update_schema_version(("2.5",), "2_4 to 2_5 script")
+
+            self.progressSig(100, _("updating stored schema version"))
+            self.commit()
+            self.completeSig(_("Successfully moved db to")+ " 2.5")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+    dbu = DatabaseUpdater()
+    if dbu.run():
+        LOGGER.info("ALL DONE, conversion successful")
+    else:
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_5to2_6.py b/src/openmolar/schema_upgrades/schema2_5to2_6.py
new file mode 100644
index 0000000..b2b189b
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_5to2_6.py
@@ -0,0 +1,91 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+'''
+This module provides a function 'run' which will move data
+to schema 2_6
+'''
+from __future__ import division
+
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+    '''ALTER TABLE currtrtmt2 ADD COLUMN ftr bool DEFAULT false''',
+]
+
+# NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+    'ALTER TABLE patients DROP COLUMN psn',
+]
+
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+    def transfer_data(self):
+        '''
+        function specific to this update.
+        '''
+        pass
+
+    def run(self):
+        LOGGER.info("running script to convert from schema 2.5 to 2.6")
+        try:
+            self.connect()
+            #- execute the SQL commands
+            self.progressSig(10, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
+
+            self.progressSig(50, _("transferring data"))
+            self.transfer_data()
+
+            self.progressSig(95, _("executing cleanup statements"))
+            self.execute_statements(CLEANUPSTRINGS)
+
+            self.progressSig(97, _('updating settings'))
+            LOGGER.info("updating stored database version in settings table")
+
+            self.update_schema_version(("2.6",), "2_5 to 2_6 script")
+
+            self.progressSig(100, _("updating stored schema version"))
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 2.6")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+    dbu = DatabaseUpdater()
+    if dbu.run():
+        LOGGER.info("ALL DONE, conversion successful")
+    else:
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_6to2_7.py b/src/openmolar/schema_upgrades/schema2_6to2_7.py
new file mode 100644
index 0000000..dffe6cf
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_6to2_7.py
@@ -0,0 +1,166 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+'''
+This module provides a function 'run' which will move data
+to schema 2_7
+'''
+from __future__ import division
+
+import datetime
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+'DROP TABLE IF EXISTS clinician_dates',
+'DROP TABLE IF EXISTS diary_link',
+'DROP TABLE IF EXISTS clinicians',
+'''
+CREATE TABLE clinicians (
+  ix             smallint(5) unsigned not null auto_increment,
+  initials       CHAR(5) NOT NULL,
+  name           VARCHAR(64) NOT NULL,
+  formal_name    VARCHAR(128) ,
+  qualifications VARCHAR(64) ,
+  type           smallint(5)  NOT NULL default 1,
+  speciality     VARCHAR(64),
+  data           VARCHAR(255),
+  comments       VARCHAR(255),
+  PRIMARY KEY (ix)
+)
+''',
+'''
+CREATE TABLE clinician_dates (
+  clinician_ix           smallint(5) UNSIGNED NOT NULL,
+  start_date             date NOT NULL,
+  end_date               date,
+  date_comments          VARCHAR(255),
+  FOREIGN KEY (clinician_ix) REFERENCES clinicians(ix)
+)
+''',
+'''
+CREATE TABLE diary_link (
+  clinician_ix       smallint(5) unsigned not null,
+  apptix             smallint(5) unsigned not null,
+  FOREIGN KEY (clinician_ix) REFERENCES clinicians(ix)
+)
+'''
+]
+
+# NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+]
+
+
+PRACTITIONERS_QUERY = "select id, inits, apptix from practitioners"
+DENTIST_DATA_QUERY = "select id,inits,name,formalname,fpcno,quals from practitioners where flag0=1"
+APPTIX_QUERY = "select apptix,inits from practitioners where flag3=1"
+ACTIVE_DENTS_QUERY = "select apptix, inits from practitioners where flag3=1 and flag0=1"
+ACTIVE_HYGS_QUERY = "select apptix, inits from practitioners where flag3=1 and flag0=0"
+
+SOURCE_QUERY = \
+'select id, inits, apptix, name, formalname, fpcno, quals, flag0, flag3 from practitioners WHERE inits IS NOT NULL'
+
+DEST_QUERY = \
+'INSERT INTO clinicians (ix, initials, name, formal_name, qualifications, type, speciality, data, comments) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)'
+
+GET_DATES_QUERY = 'select min(adate), max(adate) from aslot where apptix=%s'
+
+ACTIVE_QUERY = '''INSERT INTO clinician_dates
+(clinician_ix, start_date, end_date, date_comments)
+VALUES (%s, %s, %s, %s)'''
+
+DIARY_LINK_QUERY = 'INSERT INTO diary_link (clinician_ix, apptix) VALUES (%s, %s)'
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+    def transfer_data(self):
+        '''
+        function specific to this update.
+        '''
+        self.cursor.execute(SOURCE_QUERY)
+        rows = self.cursor.fetchall()
+        for id, inits, apptix, name, formalname, fpcno, quals, flag0, flag3 in rows:
+            self.cursor.execute(DEST_QUERY,
+                (id,
+                inits,
+                name,
+                formalname,
+                quals,
+                2 if flag0==0 else 1,
+                None,
+                "list_no=%s" % fpcno if fpcno else None,
+                "transferred from practitioners table by 2_7 script")
+                )
+            appt_book_ix = apptix if apptix!=0 else id
+            self.cursor.execute(GET_DATES_QUERY, (appt_book_ix,))
+            start_date, end_date = self.cursor.fetchone()
+            self.cursor.execute(ACTIVE_QUERY,
+                (id,
+                start_date,
+                None if flag3==1 else end_date,
+                "data generated by 2_7 script")
+                )
+            self.cursor.execute(DIARY_LINK_QUERY, (id, apptix))
+
+    def run(self):
+        LOGGER.info("running script to convert from schema 2.6 to 2.7")
+        try:
+            self.connect()
+            #- execute the SQL commands
+            self.progressSig(10, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
+
+            self.progressSig(50, _("transferring data"))
+            self.transfer_data()
+
+            self.progressSig(95, _("executing cleanup statements"))
+            self.execute_statements(CLEANUPSTRINGS)
+
+            self.progressSig(97, _('updating settings'))
+            LOGGER.info("updating stored database version in settings table")
+
+            self.update_schema_version(("2.7",), "2_6 to 2_7 script")
+
+            self.progressSig(100, _("updating stored schema version"))
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 2.7")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+    dbu = DatabaseUpdater()
+    if dbu.run():
+        LOGGER.info("ALL DONE, conversion successful")
+    else:
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_7to2_8.py b/src/openmolar/schema_upgrades/schema2_7to2_8.py
new file mode 100644
index 0000000..a4df24e
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_7to2_8.py
@@ -0,0 +1,320 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+'''
+This module provides a function 'run' which will move data
+to schema 2_8
+'''
+from __future__ import division
+
+import datetime
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+'DROP TABLE IF EXISTS static_chart',
+'DROP TABLE IF EXISTS patient_money',
+'DROP TABLE IF EXISTS patient_dates',
+'DROP TABLE IF EXISTS patient_nhs',
+'DROP TABLE IF EXISTS new_patients',
+'''
+CREATE TABLE new_patients (
+  serialno       int(11) NOT NULL,
+  sname          varchar(30),
+  fname          varchar(30),
+  title          varchar(30),
+  sex            char(1),
+  dob            date,
+  addr1          varchar(30) not null default "",
+  addr2          varchar(30) not null default "",
+  addr3          varchar(30) not null default "",
+  town           varchar(30) not null default "",
+  county         varchar(30) not null default "",
+  pcde           varchar(30) not null default "",
+  tel1           varchar(30) not null default "",
+  tel2           varchar(30) not null default "",
+  mobile         varchar(30) not null default "",
+  fax            varchar(30) not null default "",
+  email1         varchar(50) not null default "",
+  email2         varchar(50) not null default "",
+  occup          varchar(30) not null default "",
+  nhsno          varchar(30) not null default "",
+  cnfd           date,
+  cset           varchar(10),
+  dnt1           smallint(6),
+  dnt2           smallint(6),
+  courseno0      int(11),
+  billdate       date,
+  billct         tinyint(3) unsigned,
+  billtype       char(1),
+  familyno       int(11),
+  memo           varchar(255) not null default "",
+  status         varchar(30) not null default "",
+  PRIMARY KEY (serialno)
+)
+''',
+'''
+CREATE TABLE patient_nhs (
+  pt_sno         int(11)     not null,
+  initaccept     date,
+  lastreaccept   date,
+  lastclaim      date,
+  expiry         date,
+  cstatus        tinyint(3) unsigned,
+  transfer       date,
+  pstatus        tinyint(3) unsigned,
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+''',
+
+'''
+CREATE TABLE static_chart (
+pt_sno             int(11)     not null,
+dent0              tinyint(4),
+dent1              tinyint(4),
+dent2              tinyint(4),
+dent3              tinyint(4),
+ur1                varchar(34) not null default "",
+ur2                varchar(34) not null default "",
+ur3                varchar(34) not null default "",
+ur4                varchar(34) not null default "",
+ur5                varchar(34) not null default "",
+ur6                varchar(34) not null default "",
+ur7                varchar(34) not null default "",
+ur8                varchar(34) not null default "",
+ul1                varchar(34) not null default "",
+ul2                varchar(34) not null default "",
+ul3                varchar(34) not null default "",
+ul4                varchar(34) not null default "",
+ul5                varchar(34) not null default "",
+ul6                varchar(34) not null default "",
+ul7                varchar(34) not null default "",
+ul8                varchar(34) not null default "",
+lr1                varchar(34) not null default "",
+lr2                varchar(34) not null default "",
+lr3                varchar(34) not null default "",
+lr4                varchar(34) not null default "",
+lr5                varchar(34) not null default "",
+lr6                varchar(34) not null default "",
+lr7                varchar(34) not null default "",
+lr8                varchar(34) not null default "",
+ll1                varchar(34) not null default "",
+ll2                varchar(34) not null default "",
+ll3                varchar(34) not null default "",
+ll4                varchar(34) not null default "",
+ll5                varchar(34) not null default "",
+ll6                varchar(34) not null default "",
+ll7                varchar(34) not null default "",
+ll8                varchar(34) not null default "",
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+''',
+'''
+CREATE TABLE patient_money (
+pt_sno             int(11)     not null,
+money0             int(11)     not null default 0,
+money1             int(11)     not null default 0,
+money2             int(11)     not null default 0,
+money3             int(11)     not null default 0,
+money4             int(11)     not null default 0,
+money5             int(11)     not null default 0,
+money6             int(11)     not null default 0,
+money7             int(11)     not null default 0,
+money8             int(11)     not null default 0,
+money9             int(11)     not null default 0,
+money10            int(11)     not null default 0,
+money11            int(11)     not null default 0,
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+''',
+'''
+CREATE TABLE patient_dates (
+  pt_sno         int(11)     not null,
+  pd0            date,
+  pd1            date,
+  pd2            date,
+  pd3            date,
+  pd4            date,
+  pd5            date,
+  pd6            date,
+  pd7            date,
+  pd8            date,
+  pd9            date,
+  pd10           date,
+  pd11           date,
+  pd12           date,
+  pd13           date,
+  pd14           date,
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+'''
+]
+
+# NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+]
+
+
+SOURCE1_QUERY = '''
+select serialno, IFNULL(sname, ""), IFNULL(fname, ""), IFNULL(title, ""),
+IFNULL(sex, "") , dob , IFNULL(addr1, ""), IFNULL(addr2, ""), IFNULL(addr3, ""),
+IFNULL(town, ""), IFNULL(county, ""), IFNULL(pcde, ""), IFNULL(tel1, ""),
+IFNULL(tel2, ""), IFNULL(mobile, ""), IFNULL(fax, ""), IFNULL(email1, ""),
+IFNULL(email2, ""), IFNULL(occup, ""), IFNULL(nhsno, ""), cnfd, cset,dnt1, dnt2,
+courseno0, billdate, billct, billtype, familyno, IFNULL(memo,""),
+IFNULL(status,"") from patients'''
+
+DEST1_QUERY = '''
+INSERT INTO new_patients (serialno, sname, fname, title, sex , dob , addr1,
+addr2, addr3, town, county, pcde, tel1, tel2, mobile, fax, email1, email2,
+occup, nhsno, cnfd, cset, dnt1, dnt2, courseno0, billdate, billct, billtype,
+familyno, memo, status)
+VALUES (%s)''' % ", ".join(("%s",)*31)
+
+SOURCE2_QUERY = '''
+select serialno, dent0, dent1, dent2, dent3, IFNULL(ur1st, "") ,
+IFNULL(ur2st, "") , IFNULL(ur3st, "") , IFNULL(ur4st, "") , IFNULL(ur5st, "") ,
+IFNULL(ur6st, "") , IFNULL(ur7st, "") , IFNULL(ur8st, "") , IFNULL(ul1st, "") ,
+IFNULL(ul2st, "") , IFNULL(ul3st, "") , IFNULL(ul4st, "") , IFNULL(ul5st, "") ,
+IFNULL(ul6st, "") , IFNULL(ul7st, "") , IFNULL(ul8st, "") , IFNULL(lr1st, "") ,
+IFNULL(lr2st, "") , IFNULL(lr3st, "") , IFNULL(lr4st, "") , IFNULL(lr5st, "") ,
+IFNULL(lr6st, "") , IFNULL(lr7st, "") , IFNULL(lr8st, "") , IFNULL(ll1st, "") ,
+IFNULL(ll2st, "") , IFNULL(ll3st, "") , IFNULL(ll4st, "") , IFNULL(ll5st, "") ,
+IFNULL(ll6st, "") , IFNULL(ll7st, "") , IFNULL(ll8st, "") from patients'''
+
+DEST2_QUERY = '''
+INSERT INTO static_chart (pt_sno, dent0, dent1, dent2, dent3,
+ur1, ur2, ur3, ur4, ur5, ur6, ur7, ur8,
+ul1, ul2, ul3, ul4, ul5, ul6, ul7, ul8,
+lr1, lr2, lr3, lr4, lr5, lr6, lr7, lr8,
+ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8)
+VALUES (%s)''' % ", ".join(("%s",)*37)
+
+SOURCE3_QUERY = '''
+SELECT  serialno, pd0, pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd8, pd9, pd10, pd11,
+pd12, pd13, pd14 FROM patients'''
+
+DEST3_QUERY = '''
+INSERT INTO patient_dates
+(pt_sno, pd0, pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd8, pd9, pd10, pd11,
+pd12, pd13, pd14) VALUES (%s)''' % ", ".join(("%s",)*16)
+
+SOURCE4_QUERY = '''
+SELECT  serialno, IFNULL(money0, 0), IFNULL(money1, 0), IFNULL(money2, 0),
+IFNULL(money3, 0), IFNULL(money4, 0), IFNULL(money5, 0), IFNULL(money6, 0),
+IFNULL(money7, 0), IFNULL(money8, 0), IFNULL(money9, 0), IFNULL(money10, 0),
+IFNULL(money11, 0) FROM patients'''
+
+DEST4_QUERY = '''
+INSERT INTO patient_money
+(pt_sno, money0, money1, money2, money3, money4, money5, money6, money7,
+money8, money9, money10, money11) VALUES (%s)''' % ", ".join(("%s",)*13)
+
+SOURCE5_QUERY = '''
+SELECT  serialno, initaccept, lastreaccept, lastclaim,
+expiry, cstatus, transfer, pstatus FROM patients
+WHERE initaccept IS NOT NULL AND lastreaccept IS NOT NULL AND
+lastclaim IS NOT NULL AND expiry IS NOT NULL AND cstatus IS NOT NULL AND
+transfer IS NOT NULL AND  pstatus IS NOT NULL'''
+
+DEST5_QUERY = '''
+INSERT INTO patient_nhs (pt_sno, initaccept, lastreaccept, lastclaim,
+expiry, cstatus, transfer, pstatus) VALUES (%s)''' % ", ".join(("%s",)*8)
+
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+    def transfer_data(self):
+        '''
+        function specific to this update.
+        '''
+        self.progressSig(15, _("pulling information from patient table"))
+        self.cursor.execute(SOURCE1_QUERY)
+        rows = self.cursor.fetchall()
+        self.progressSig(25, _("inserting information into new tables"))
+        self.cursor.executemany(DEST1_QUERY, rows)
+
+        self.progressSig(35, _("pulling information from patient table"))
+        self.cursor.execute(SOURCE2_QUERY)
+        rows = self.cursor.fetchall()
+        self.progressSig(50, _("inserting information into new tables"))
+        self.cursor.executemany(DEST2_QUERY, rows)
+
+        self.progressSig(55, _("pulling information from patient table"))
+        self.cursor.execute(SOURCE3_QUERY)
+        rows = self.cursor.fetchall()
+        self.progressSig(60, _("inserting information into new tables"))
+        self.cursor.executemany(DEST3_QUERY, rows)
+
+        self.progressSig(65, _("pulling information from patient table"))
+        self.cursor.execute(SOURCE4_QUERY)
+        rows = self.cursor.fetchall()
+        self.progressSig(70, _("inserting information into new tables"))
+        self.cursor.executemany(DEST4_QUERY, rows)
+
+        self.progressSig(75, _("pulling information from patient table"))
+        self.cursor.execute(SOURCE5_QUERY)
+        rows = self.cursor.fetchall()
+        self.progressSig(80, _("inserting information into new tables"))
+        self.cursor.executemany(DEST5_QUERY, rows)
+
+    def run(self):
+        LOGGER.info("running script to convert from schema 2.7 to 2.8")
+        try:
+            self.connect()
+            #- execute the SQL commands
+            self.progressSig(10, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
+
+            self.transfer_data()
+
+            self.progressSig(95, _("executing cleanup statements"))
+            self.execute_statements(CLEANUPSTRINGS)
+
+            self.progressSig(97, _('updating settings'))
+            LOGGER.info("updating stored database version in settings table")
+
+            self.update_schema_version(("2.8",), "2_7 to 2_8 script")
+
+            self.progressSig(100, _("updating stored schema version"))
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 2.8")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+    dbu = DatabaseUpdater()
+    if dbu.run():
+        LOGGER.info("ALL DONE, conversion successful")
+    else:
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_8to2_9.py b/src/openmolar/schema_upgrades/schema2_8to2_9.py
new file mode 100644
index 0000000..376b240
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_8to2_9.py
@@ -0,0 +1,92 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# #                                                                          # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
+# #                                                                          # #
+# # This file is part of OpenMolar.                                          # #
+# #                                                                          # #
+# # OpenMolar is free software: you can redistribute it and/or modify        # #
+# # it under the terms of the GNU General Public License as published by     # #
+# # the Free Software Foundation, either version 3 of the License, or        # #
+# # (at your option) any later version.                                      # #
+# #                                                                          # #
+# # OpenMolar is distributed in the hope that it will be useful,             # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
+# # GNU General Public License for more details.                             # #
+# #                                                                          # #
+# # You should have received a copy of the GNU General Public License        # #
+# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
+# #                                                                          # #
+# ############################################################################ #
+
+'''
+This module provides a function 'run' which will move data
+to schema 2_9
+'''
+from __future__ import division
+
+import datetime
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+    'alter table static_chart add unique(pt_sno)',
+    'alter table patient_money add unique(pt_sno)',
+    'alter table patient_dates add unique(pt_sno)',
+    'alter table patient_nhs add unique(pt_sno)',
+]
+
+CLEANUPSTRINGS = [
+]
+
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+    def transfer_data(self):
+        '''
+        function specific to this update.
+        '''
+        pass
+
+    def run(self):
+        LOGGER.info("running script to convert from schema 2.8 to 2.9")
+        try:
+            self.connect()
+            #- execute the SQL commands
+            self.progressSig(50, _("creating new tables"))
+            self.execute_statements(SQLSTRINGS)
+
+            self.transfer_data()
+
+            self.progressSig(75, _("executing cleanup statements"))
+            self.execute_statements(CLEANUPSTRINGS)
+
+            self.progressSig(97, _('updating settings'))
+            LOGGER.info("updating stored database version in settings table")
+
+            self.update_schema_version(("2.9",), "2_8 to 2_9 script")
+
+            self.progressSig(100, _("updating stored schema version"))
+            self.commit()
+            self.completeSig(_("Successfully moved db to") + " 2.9")
+            return True
+        except Exception as exc:
+            LOGGER.exception("error transfering data")
+            self.rollback()
+            raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+    dbu = DatabaseUpdater()
+    if dbu.run():
+        LOGGER.info("ALL DONE, conversion successful")
+    else:
+        LOGGER.warning("conversion failed")
diff --git a/src/openmolar/settings/localsettings.py b/src/openmolar/settings/localsettings.py
index a8aa7c1..a79660b 100644
--- a/src/openmolar/settings/localsettings.py
+++ b/src/openmolar/settings/localsettings.py
@@ -39,22 +39,32 @@ from openmolar.settings.version import VERSION
 
 LOGGER = logging.getLogger("openmolar")
 
-SUPERVISOR = '05b1f356646c24bf1765f6f1b65aea3bde7247e1'
+SALT = "OIHoIHyO"
+# default supervisor password is blank
+SUPERVISOR = "c1219df26de403348e211a314ff2fce58aa6e28d"
+
 DBNAME = "default"
 
-# updated 28.11.2013
-CLIENT_SCHEMA_VERSION = "2.4"
+# updated 27.06.2014
+CLIENT_SCHEMA_VERSION = "2.9"
+
 DB_SCHEMA_VERSION = "unknown"
 
 ENCODING = locale.getpreferredencoding()
 
 FEETABLES = None
 WIKIURL = ""
+cashbookCodesDict = None
+
+IGNORE_SCHEMA_CHECK = False
+FORCE_FIRST_RUN = False
+
+PT_COUNT = 0
 
 locale.setlocale(locale.LC_ALL, '')
 
 try:
-    s = _("translation tools are installed sucessfully")
+    s = _("translation tools are installed successfully")
     LOGGER.debug(s)
 except NameError:
     LOGGER.error("installing gettext for translations")
@@ -73,21 +83,34 @@ def showVersion():
 if LOGGER.level == logging.DEBUG:
     showVersion()
 
-PRACTICE_NAME = "The Academy Dental Practice"
-
-APPOINTMENT_CARD_HEADER = \
-    "%s, 19 Union Street\nInverness. tel 01463 232423" % PRACTICE_NAME
-
-
+PRACTICE_NAME = _("Example Dental Practice")
 APPOINTMENT_CARD_FOOTER = _("Please try and give at least 24 hours notice") +\
     "\n" + _("if you need to change an appointment.")
 
-CORRESPONDENCE_SIG = "The Academy Dental Practice"
 
-MH_HEADER = ("The Academy Dental Practice",
-             _("Confidential Medical History Questionaire"))
-
-WINDOWS = False
+MESSAGE_TEMPLATE = '''
+<html>
+  <head>
+    <link rel="stylesheet" href="%s" type="text/css">
+  </head>
+  <body>
+    <div align="center">
+      <img src="%s" width="150", height="100", align="left" />
+      <img src="%s" width="150", height="100", align="right" />
+      <h1>%s</h1>
+        <ul><li class="about">%s %s</li></ul>
+      <br clear="all" />
+      <p>%s</p>
+      <p>%s</p>
+    </div>
+  </body>
+</html>
+'''
+LOCALSETTINGS_TEMPLATE = '''<?xml version="1.0" ?>
+<settings>
+    <version>1.0</version>
+</settings>
+'''
 
 
 def determine_path():
@@ -113,24 +136,15 @@ chosenserver = 0
 
 def setChosenServer(i):
     global DBNAME, chosenserver
+    LOGGER.debug("chosen server number is set as %s", i)
     chosenserver = i
     try:
         DBNAME = server_names[i]
-        LOGGER.debug("DBNAME = %s" % DBNAME)
+        LOGGER.warning("User has chosen database '%s'", DBNAME)
     except IndexError:
         LOGGER.warning("no server name.. config file is old format?")
 
 wkdir = determine_path()
-referralfile = os.path.join(wkdir, "resources", "referral_data.xml")
-appt_shortcut_file = os.path.join(wkdir, "resources",
-                                  "appointment_shortcuts.xml")
-stylesheet = "file://" + os.path.join(wkdir, "resources", "style.css")
-printer_png = "file://" + os.path.join(wkdir, "resources", "icons", "ps.png")
-money_png = "file://" + os.path.join(wkdir, "resources", "icons", "vcard.png")
-LOGOPATH = "file://" + os.path.join(wkdir, "html", "images", "newlogo.png")
-resources_location = os.path.join(wkdir, "resources")
-resources_path = "file://" + resources_location
-
 if "win" in sys.platform:
     WINDOWS = True
     LOGGER.info("Windows OS detected - modifying settings")
@@ -153,6 +167,7 @@ if "win" in sys.platform:
         "://", ":///").replace(" ", "%20").replace("\\", "/")
 
 else:
+    WINDOWS = False
     if not "linux" in sys.platform:
         LOGGER.warning(
             "unknown system platform (mac?) - defaulting to linux settings")
@@ -164,6 +179,16 @@ LOGIN_CONF = os.path.join(localFileDirectory, "autologin.conf")
 TEMP_PDF = os.path.join(localFileDirectory, "temp.pdf")
 DOCS_DIRECTORY = os.path.join(localFileDirectory, "documents")
 
+appt_shortcut_file = os.path.join(wkdir, "resources",
+                                  "appointment_shortcuts.xml")
+stylesheet = "file://" + os.path.join(wkdir, "resources", "style.css")
+printer_png = "file://" + os.path.join(wkdir, "resources", "icons", "ps.png")
+money_png = "file://" + os.path.join(wkdir, "resources", "icons", "vcard.png")
+LOGOPATH = "file://" + os.path.join(wkdir, "html", "images", "newlogo.png")
+resources_location = os.path.join(wkdir, "resources")
+resources_path = "file://" + resources_location
+
+
 if not os.path.exists(DOCS_DIRECTORY):
     os.makedirs(DOCS_DIRECTORY)
 
@@ -255,7 +280,7 @@ allowed_logins = []
 
 #-- this list is used for navigating back and forth through the list
 recent_snos = []
-recent_sno_index = 0
+recent_sno_index = -1
 last_family_no = 0
 
 #-- update whenever a manual search is made
@@ -292,7 +317,7 @@ apptix_reverse = {}
 #--(necessary if a very long appointment goes right on through)
 #-- would get maximum recursion, quite quickly!
 # todo - this will need to change!!!!
-bookEnd = datetime.date(2010, 12, 31)
+BOOKEND = datetime.date.today() + datetime.timedelta(days=183)
 
 #--treatment codes..
 
@@ -332,12 +357,8 @@ surgeryno = -1
 CSETYPES = []
 DEFAULT_COURSETYPE = ""
 
-
-#--for debugging purposes... set this to true.- not yet implemented throughout.
-
 #-- self evident
-practiceAddress = ("The Academy Dental Practice", "19 Union Street",
-                   "Inverness", "IV1 1PP")
+PRACTICE_ADDRESS = ("The Dental Practice", "My Street", "My Town", "POST CODE")
 
 #-- this is updated whenever a patient record loads, for ease of address
 #-- manipulation
@@ -361,6 +382,25 @@ def hash_func(message):
     return hashlib.sha1(message).hexdigest()
 
 
+def pencify(input_):
+    '''
+    safely convert "0.29" to 29, or "1.50" to 150 etc..
+    in python int(0.29 * 100) is 28!
+    '''
+    m = re.match("(\d+)?\.?(\d)?(\d)?", input_)
+    if not m:
+        return 0
+    return int("%s%s%s" % (
+        "0" if m.groups()[0] is None else m.groups()[0],
+        "0" if m.groups()[1] is None else m.groups()[1],
+        "0" if m.groups()[2] is None else m.groups()[2])
+    )
+
+
+def decimalise(pence):
+    return "%d.%02d" % (pence // 100, pence % 100)
+
+
 def convert_deciduous(tooth):
     '''
     if the tooth is a match for ulD or llE etc..
@@ -717,7 +757,7 @@ def autologin():
         try:
             PASSWORD = scp.get("login", "PASSWORD")
         except ConfigParser.NoOptionError:
-            PASSWORD = ""
+            pass
         try:
             USER1 = scp.get("login", "USER1")
         except ConfigParser.NoOptionError:
@@ -727,8 +767,8 @@ def autologin():
         except ConfigParser.NoOptionError:
             pass
     except ConfigParser.NoSectionError:
-        LOGGER.exception("autologin")
-        pass
+        LOGGER.info("no autologin")
+
     return PASSWORD, USER1, USER2
 
 
@@ -756,9 +796,7 @@ def getLocalSettings():
         #-- no file found..
         #--so create a settings file.
         f = open(localSets, "w")
-        f.write('''<?xml version="1.0" ?>
-        <settings><version>1.0</version></settings>
-        ''')
+        f.write(LOCALSETTINGS_TEMPLATE)
         f.close()
 
 
@@ -785,124 +823,67 @@ def updateLocalSettings(setting, value):
     return True
 
 
-def initiateUsers(changedServer=False):
+def force_reconnect():
     '''
-    just grab user names. necessary because the db schema could be OOD here
+    user has changed server!
     '''
-    global allowed_logins
     from openmolar import connect
-
-    if changedServer and connect.mainconnection:
-        print "closing connection"
+    if connect.mainconnection:
+        LOGGER.warning("closing connection to previously chosen database")
         connect.mainconnection.close()
-        reload(connect)
+    connect.params.reload()
+
 
-    db = connect.connect()
-    cursor = db.cursor()
-    cursor.execute("select id from opid")
-    # grab initials of those currently allowed to log in
-    trows = cursor.fetchall()
-    cursor.close()
-    allowed_logins = []
-    for row in trows:
-        allowed_logins.append(row[0])
+def initiateUsers(changed_server=False):
+    '''
+    just grab user names. necessary because the db schema could be OOD here
+    '''
+    global allowed_logins
+    LOGGER.debug(
+        "initiating allowed users changed_server = %s", changed_server)
+    from openmolar.dbtools.db_settings import SettingsFetcher
 
+    if changed_server:
+        force_reconnect()
+    settings_fetcher = SettingsFetcher()
+    allowed_logins = settings_fetcher.allowed_logins
 
-def initiate(changedServer=False, debug=False):
-    # print "initiating settings"
+
+def initiate(changed_server=False):
+    LOGGER.debug("initiating settings from database")
     global message, dentDict, ops, SUPERVISOR, \
         ops_reverse, activedents, activehygs, activedent_ixs, activehyg_ixs, \
-        apptix, apptix_reverse, bookEnd, clinicianNo, clinicianInits, WIKIURL
-
-    from openmolar import connect
-    from openmolar.dbtools import db_settings
+        apptix, apptix_reverse, BOOKEND, clinicianNo, clinicianInits, \
+        WIKIURL, cashbookCodesDict, PT_COUNT, PRACTICE_ADDRESS, PRACTICE_NAME
 
-    if changedServer and connect.mainconnection:
-        print "closing connection"
-        connect.mainconnection.close()
-        reload(connect)
+    from openmolar.dbtools import cashbook
+    from openmolar.dbtools.db_settings import SettingsFetcher
 
-    data = db_settings.getData("bookend")
-    if data:
-        bookEndVals = data[-1][0].split(",")
-        bookEnd = datetime.date(int(bookEndVals[0]), int(bookEndVals[1]),
-                                int(bookEndVals[2]))
+    if changed_server:
+        force_reconnect()
 
-    data = db_settings.getData("supervisor_pword")
-    if data:
-        SUPERVISOR = data[0][0]
-    else:
-        LOGGER.warning("#" * 30)
-        LOGGER.warning(
-            "WARNING - no supervisor password is set, restting to default")
-        LOGGER.warning("#" * 30)
-        db_settings.updateData("supervisor_pword", SUPERVISOR,
-                               "not found reset")
+    settings_fetcher = SettingsFetcher()
+    settings_fetcher.fetch()
+    cashbookCodesDict = cashbook.CashBookCodesDict()
 
-    db = connect.connect()
-    cursor = db.cursor()
+    PT_COUNT = settings_fetcher.PT_COUNT
+    WIKIURL = settings_fetcher.wiki_url
+    BOOKEND = settings_fetcher.book_end
+    SUPERVISOR = settings_fetcher.supervisor_pword
 
-    # set up four lists with key/value pairs reversedto make for easy
+    # set up four lists with key/value pairs reversed to make for easy
     # referencing
 
-    # first"ops" which is all practitioners
-    ops = {}
-    ops_reverse = {}
-    apptix_reverse = {}
-    cursor.execute("select id, inits, apptix from practitioners")
-    practitioners = cursor.fetchall()
-    for practitioner in practitioners:
-        if practitioner[1] is not None:
-            ops[practitioner[0]] = practitioner[1]
-            ops_reverse[practitioner[1]] = practitioner[0]
-            if practitioner[2] != 0:
-                apptix_reverse[practitioner[2]] = practitioner[1]
-        else:
-            ops[0] = "NONE"
-            ops_reverse["NONE"] = 0
+    ops = settings_fetcher.ops
+    ops_reverse = settings_fetcher.ops_reverse
+    apptix_reverse = settings_fetcher.apptix_reverse
+    dentDict = settings_fetcher.dentist_data
+    apptix = settings_fetcher.apptix_dict
+    activedents, activedent_ixs = settings_fetcher.active_dents
+    activehygs, activehyg_ixs = settings_fetcher.active_hygs
 
-    try:
-        # correspondence details for NHS forms
-        query = ("select id,inits,name,formalname,fpcno,quals "
-                 "from practitioners where flag0=1")
-
-        cursor.execute(query)
-        practitioners = cursor.fetchall()
-        dentDict = {}
-        for practitioner in practitioners:
-            dentDict[practitioner[0]] = practitioner[1:]
-
-        # now get only practitioners who have an active daybook
-        query = "select apptix,inits from practitioners where flag3=1"
-        cursor.execute(query)
-        practitioners = cursor.fetchall()
-        apptix = {}
-        for practitioner in practitioners:
-            if practitioner[0] != 0 and practitioner[0] is not None:  # apptix
-                apptix[practitioner[1]] = practitioner[0]
-
-        cursor.execute(
-            "select apptix, inits from practitioners where flag3=1 and flag0=1")
-        # dentists where appts active
-        ixs, activedents = [], []
-        practitioners = cursor.fetchall()
-        for ix, inits in practitioners:
-            ixs.append(ix)
-            activedents.append(inits)
-        activedent_ixs = tuple(ixs)
-
-        cursor.execute(
-            "select apptix, inits from practitioners where flag3=1 and flag0=0")
-        # hygenists where appts active
-        practitioners = cursor.fetchall()
-        ixs, activehygs = [], []
-        for ix, inits in practitioners:
-            ixs.append(ix)
-            activehygs.append(inits)
-        activehyg_ixs = tuple(ixs)
-
-    except Exception as exc:
-        LOGGER.exception("error loading practitioners")
+    PRACTICE_NAME = settings_fetcher.practice_name
+    PRACTICE_ADDRESS = settings_fetcher.practice_address
 
     #-- set the clinician if possible
     u1 = operator.split("/")[0].strip(" ")
@@ -914,32 +895,28 @@ def initiate(changedServer=False, debug=False):
 
     getLocalSettings()
 
-    WIKIURL = db_settings.getWikiUrl()
-
-    message = ('''<html><head>
-<link rel="stylesheet" href="%s" type="text/css">
-</head><body><div align="center">
-<img src="%s" width="150", height="100", align="left" />
-<img src="%s" width="150", height="100", align="right" />
-<h1>''' % (stylesheet, LOGOPATH, LOGOPATH) +
-        _("Welcome to OpenMolar!") + '''</h1>
-<ul><li class="about">''' + _("Version") + ''' %s</li>
-<li class="about">''' % VERSION +
-        '''</li></ul><br clear="all" /><p>''' +
-        _("Your Data is Accessible, and the server reports no issues.") +
-        '''</p><p>''' + _("Have a great day!") + '''</p></div></body></html>''')
-
-    if debug:
-        print "LOCALSETTINGS CALLED WITH DEBUG = TRUE"
-        print "ops = ", ops
-        print "ops_reverse = ", ops_reverse
-        print "apptix = ", apptix
-        print "apptix_reverse = ", apptix_reverse
-        print "activedents =", activedents
-        print "activehygs =", activehygs
-        print "allowed logins =", allowed_logins
-        print "stylesheet =", stylesheet
-        print "referralfile = ", referralfile
+    message = MESSAGE_TEMPLATE % (stylesheet,
+                                  LOGOPATH,
+                                  LOGOPATH,
+                                  _("Welcome to OpenMolar!"),
+                                  _("Version"),
+                                  VERSION,
+                                  _(
+                                  "Your Data is Accessible, and the server reports no issues."),
+                                  _("Have a great day!")
+                                  )
+
+    LOGGER.debug("LOCALSETTINGS")
+    LOGGER.debug("ops = %s", ops)
+    LOGGER.debug("ops_reverse = %s", ops_reverse)
+    LOGGER.debug("apptix = %s", apptix)
+    LOGGER.debug("apptix_reverse = %s", apptix_reverse)
+    LOGGER.debug("activedents = %s", activedents)
+    LOGGER.debug("activehygs = %s", activehygs)
+    LOGGER.debug("allowed logins = %s", allowed_logins)
+    LOGGER.debug("stylesheet = %s", stylesheet)
+    LOGGER.debug("practice name - %s", PRACTICE_NAME)
+    LOGGER.debug("practice address - %s", PRACTICE_ADDRESS)
 
 
 def loadFeeTables():
@@ -962,4 +939,5 @@ def _test():
 
 if __name__ == "__main__":
     LOGGER.setLevel(logging.DEBUG)
+    initiate()
     _test()
diff --git a/src/openmolar/settings/version.py b/src/openmolar/settings/version.py
index d44015a..8597ae0 100644
--- a/src/openmolar/settings/version.py
+++ b/src/openmolar/settings/version.py
@@ -27,39 +27,7 @@ This file contains the version number for openmolar
 Do not edit this file manually, as it should be updated when git tag is updated.
 '''
 
-VERSION = "0.5.5"
-
-# -------------------------- DEV CODE ---------------------------------------- #
-# this section of code is removed when making a release
-#
-
-import logging
-import os
-import re
-
-LOGGER = logging.getLogger("openmolar")
-
-LOGGER.warning("You are running a development version of OpenMolar!")
-
-try:
-    import git
-    repo = git.Repo(os.path.dirname(__file__))
-    if repo.description == "openmolar1":
-        try:
-            git_version = repo.git.describe()
-            VERSION = re.sub("v", "", git_version, 1)
-        except git.exc.GitCommandError:
-            LOGGER.exception("No git tags found?")
-
-        if repo.is_dirty():
-            VERSION += "-dirty"
-    else:
-        VERSION = "unofficial_build"
-except ImportError:
-    LOGGER.debug("unable to import git")
-    VERSION = "Built without python-git"
-
-# --------------------------END OF DEV CODE ---------------------------------- #
+VERSION = "0.6.0"
 
 
 if __name__ == '__main__':
diff --git a/src/standalone_chart/lib_om_chart/__init__.py b/src/standalone_chart/lib_om_chart/__init__.py
deleted file mode 100644
index c701215..0000000
--- a/src/standalone_chart/lib_om_chart/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
diff --git a/src/standalone_chart/lib_om_chart/chart_colours.py b/src/standalone_chart/lib_om_chart/chart_colours.py
deleted file mode 100644
index 40df597..0000000
--- a/src/standalone_chart/lib_om_chart/chart_colours.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-from PyQt4 import QtGui, QtCore
-
-CHARTTEXT = QtGui.QColor("#111111")
-LINEEDIT = QtGui.QColor("#ffffaa")
-TOOTHLINES = QtGui.QColor("#aaaaaa")
-IVORY = QtGui.QColor("#ffeedd")
-
-# these numbers are grabbed for the stylesheet of the toothprop buttons
-GI_ = "#75d185"
-GOLD_ = "#ffff00"
-COMP_ = "#ffffff"
-PORC_ = "#ddffff"
-AMALGAM_ = "#666666"
-
-GI = QtGui.QColor(GI_)
-GOLD = QtGui.QColor(GOLD_)
-COMP = QtGui.QColor(COMP_)
-PORC = QtGui.QColor(PORC_)
-AMALGAM = QtGui.QColor(AMALGAM_)
-
-FISSURE = QtGui.QColor("#bbd0d0")
-METAL = QtGui.QColor("#000075")
-DRESSING = QtGui.QColor("magenta")
-GUTTA_PERCHA = QtGui.QColor("#bb0000")
-FILL_OUTLINE = QtGui.QColor("#333333")  # used to be blue
-TRANSPARENT = QtCore.Qt.transparent
-BACKGROUND = QtGui.QPalette().window()
diff --git a/src/standalone_chart/lib_om_chart/chart_widget.py b/src/standalone_chart/lib_om_chart/chart_widget.py
deleted file mode 100644
index 88cd147..0000000
--- a/src/standalone_chart/lib_om_chart/chart_widget.py
+++ /dev/null
@@ -1,967 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-has one class, a custom widget which inherits from QWidget
-'''
-
-from __future__ import division
-
-import logging
-import re
-import sys
-from PyQt4 import QtGui, QtCore
-
-import chart_colours as colours
-
-
-class ChartWidget(QtGui.QWidget):
-
-    '''
-    a custom widget to show a standard UK dental chart
-    - allows for user navigation with mouse and/or keyboard
-    '''
-
-    def __init__(self, parent=None):
-        QtGui.QWidget.__init__(self, parent)
-
-        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
-                                             QtGui.QSizePolicy.Expanding))
-
-        self.grid = (["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
-                      'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
-                     ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
-                      'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'])
-
-        self.clear()
-        self.isStaticChart = True
-        self.isPlanChart = False
-        self.setMinimumSize(self.minimumSizeHint())
-        self.showLeftRight = True
-        self.showSelected = False
-
-    def clear(self, keepSelection=False):
-        '''
-        clears all fillings etc from the chart
-        '''
-        #--clear individual teeth
-        self.ur8, self.ur7, self.ur6, self.ur5, self.ur4, self.ur3, self.ur2, \
-            self.ur1 = [], [], [], [], [], [], [], []
-        self.ul8, self.ul7, self.ul6, self.ul5, self.ul4, self.ul3, self.ul2, \
-            self.ul1 = [], [], [], [], [], [], [], []
-        self.ll8, self.ll7, self.ll6, self.ll5, self.ll4, self.ll3, self.ll2, \
-            self.ll1 = [], [], [], [], [], [], [], []
-        self.lr8, self.lr7, self.lr6, self.lr5, self.lr4, self.lr3, self.lr2, \
-            self.lr1 = [], [], [], [], [], [], [], []
-
-        #--clear comments
-        self.commentedTeeth = []
-
-        #-- set to an adult dentition
-        self.chartgrid = {
-            'lr1': 'lr1', 'lr3': 'lr3', 'lr2': 'lr2', 'lr5': 'lr5',
-            'lr4': 'lr4', 'lr7': 'lr7', 'lr6': 'lr6', 'lr8': 'lr8',
-            'ul8': 'ul8', 'ul2': 'ul2', 'ul3': 'ul3', 'ul1': 'ul1',
-            'ul6': 'ul6', 'ul7': 'ul7', 'ul4': 'ul4', 'ul5': 'ul5',
-            'ur4': 'ur4', 'ur5': 'ur5', 'ur6': 'ur6', 'ur7': 'ur7',
-            'ur1': 'ur1', 'ur2': 'ur2', 'ur3': 'ur3', 'ur8': 'ur8',
-            'll8': 'll8', 'll3': 'll3', 'll2': 'll2', 'll1': 'll1',
-            'll7': 'll7', 'll6': 'll6', 'll5': 'll5', 'll4': 'll4'
-        }
-
-        #-- select the ur8
-        if keepSelection:
-            logging.debug("keeping existing chart selection(s)")
-        else:
-            self.showSelected = False
-            self.selected = [0, 0]
-            self.multiSelection = []
-            self.highlighted = [-1, -1]
-        self.update()
-
-    def sizeHint(self):
-        '''
-        set an arbitrary size
-        '''
-        return QtCore.QSize(500, 200)
-
-    def minimumSizeHint(self):
-        '''
-        arbitrary minimum size
-        '''
-        return QtCore.QSize(300, 100)
-
-    def setShowLeftRight(self, arg):
-        '''
-        a boolean for user preference whether to display right / left text
-        on the widget
-        '''
-        self.showLeftRight = arg
-
-    def setShowSelected(self, arg):
-        '''
-        a boolean as to whether to "select" a tooth
-        by default the overview (summary) chart doesn't
-        '''
-        self.showSelected = arg
-
-    def setToothProps(self, tooth, props):
-        '''
-        adds fillings and comments to a tooth
-        '''
-        if tooth in self.commentedTeeth:
-                self.commentedTeeth.remove(tooth)
-        if "!" in props:
-            self.commentedTeeth.append(tooth)
-
-        proplist = props.split(" ")
-        self.__dict__[tooth] = []
-        for prop in proplist:
-            if prop != "":
-                if not re.match("!.*", prop):
-                    prop = "%s " % prop.lower()
-                else:
-                    prop = "%s " % prop
-                self.__dict__[tooth].append(prop)
-
-    def paintEvent(self, event=None):
-        '''
-        overrides the paint event so that we can draw our grid
-        '''
-        painter = QtGui.QPainter(self)
-        painter.save()
-        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
-        midline = self.width() / 100
-        #-- cell width
-        xOffset = (self.width() - midline) / 16
-        #-- cell height
-        yOffset = self.height() / 2
-        #--red pen
-        if self.isEnabled():
-            painter.setPen(QtGui.QPen(QtCore.Qt.red, 2))
-        else:
-            painter.setPen(QtGui.QPen(QtCore.Qt.gray, 2))
-        sansFont = QtGui.QFont("Helvetica", 8)
-        painter.setFont(sansFont)
-        fm = QtGui.QFontMetrics(sansFont)
-        leftpad = fm.width("Right ")
-        rightpad = fm.width(" Left")
-
-        #--big horizontal dissection of entire widget
-        painter.drawLine(leftpad, self.height() / 2, self.width() - rightpad,
-                         self.height() / 2)
-        #--vertical dissection of entire widget
-        painter.drawLine(self.width() / 2, 0, self.width() / 2, self.height())
-
-        for x in range(16):
-            if x > 7:
-                midx = midline
-            else:
-                midx = 0
-            for y in range(2):
-                tooth_notation = self.grid[y][x]
-                rect = QtCore.QRectF(x * xOffset + midx, y * yOffset,
-                                     xOffset, yOffset).adjusted(0.5, 0.5, -0.5, -0.5)
-
-                #-- draw a tooth (subroutine)
-                self.tooth(painter, rect, tooth_notation)
-                if [x, y] == self.highlighted:
-                    painter.setPen(QtGui.QPen(QtCore.Qt.cyan, 1))
-                    painter.setBrush(colours.TRANSPARENT)
-                    painter.drawRect(rect.adjusted(1, 1, -1, -1))
-
-                if self.showSelected:
-                    #-- these conditions mean that the tooth needs to be
-                    #--highlighted draw a rectangle around the selected tooth,
-                    #--but don't overwrite the centre
-
-                    if [x, y] == self.selected:
-                        painter.setPen(QtGui.QPen(QtCore.Qt.darkBlue, 2))
-                        painter.setBrush(colours.TRANSPARENT)
-                        painter.drawRect(rect.adjusted(1, 1, -1, -1))
-
-                    elif [x, y] in self.multiSelection:
-                        painter.setPen(QtGui.QPen(QtCore.Qt.blue, 2))
-                        painter.setBrush(colours.TRANSPARENT)
-                        painter.drawRect(rect.adjusted(1, 1, -1, -1))
-
-        if self.isEnabled():
-            painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
-        else:
-            painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-
-        textRect = QtCore.QRectF(0, 0, self.width(), self.height())
-
-        if self.showLeftRight:
-            #--show left/right (this is done here to avoid being overwritten
-            #--during the rest of the paint job
-            painter.drawText(textRect, QtCore.Qt.AlignRight |
-                             QtCore.Qt.AlignVCenter, (_("Left")))
-
-            painter.drawText(textRect, QtCore.Qt.AlignLeft |
-                             QtCore.Qt.AlignVCenter, (_("Right")))
-
-        #--free the painter's saved state
-        painter.restore()
-
-    def tooth(self, painter, rect, ident):
-        painter.save()
-
-        #--get tooth props - ie fillings, plans etc....
-        #--this will be a list of values eg ["MOD","RT"]
-        props = self.__dict__[ident]
-
-        isUpper = ident[0] == "u"
-
-        #-- split tooth rectangle into a large graphic square...
-        #-- and a smaller text square
-        thirdheight = rect.height() * 1 / 3
-        if isUpper:
-            #-- the 2 allows for the "select" box to be drawn around the tooth
-            toothRect = rect.adjusted(0, 2, 0, -thirdheight)
-            textRect = rect.adjusted(0, 2 * thirdheight, 0, -2)
-        else:
-            toothRect = rect.adjusted(0, thirdheight, 0, -2)
-            textRect = rect.adjusted(0, 2, 0, -2 * thirdheight)
-
-        #--colours are grabbed from the separate colours module
-        painter.setPen(colours.TOOTHLINES)
-        painter.setBrush(colours.IVORY)
-        toothid = self.chartgrid[ident]
-
-        # DRAW THE TOOTH's TEXT###########################
-        #--tooth ident is always ur1, ur2 ...
-        #--tooth name is more flexible for deciduous teeth etc...
-        toothtext = toothid[2]
-        # check for deciduous teeth
-        if toothtext in ("A", "B", "C", "D", "E", "*"):
-            # BABY TOOTH###########################
-            #-- paint deciduous notation in RED
-            painter.save()
-            if self.isEnabled():
-                painter.setPen(QtGui.QPen(QtCore.Qt.red, 1))
-            else:
-                painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-            painter.drawText(textRect, QtCore.Qt.AlignCenter, (toothtext))
-            painter.restore()
-
-            #-- and "shrink" the tooth
-            toothRect = toothRect.adjusted(toothRect.width() * 0.1,
-                                           toothRect.height(
-                                           ) * 0.15, -toothRect.width() * 0.1,
-                                           -toothRect.height() * 0.15)
-
-        else:
-            #--adult tooth
-            painter.save()
-            if self.isEnabled():
-                painter.setPen(QtGui.QPen(colours.CHARTTEXT, 1))
-            else:
-                painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-            painter.drawText(textRect, QtCore.Qt.AlignCenter, toothtext)
-            painter.restore()
-
-        #--more occlusal/incisal edge sizing
-
-        if ident in self.commentedTeeth:
-            #-- comments
-            #-- commented teeth have a red exclamation mark on a yellow square
-            painter.save()
-            painter.setPen(QtGui.QPen(QtCore.Qt.yellow, 1))
-            painter.setBrush(QtCore.Qt.yellow)
-            comRect = textRect.adjusted(textRect.width() * .7, 0, 0, 0)
-            painter.drawRect(comRect)
-            sansFont = QtGui.QFont("Helvetica", 9)
-            painter.setFont(sansFont)
-            painter.setPen(QtGui.QPen(QtCore.Qt.red, 2))
-            painter.drawText(comRect, QtCore.Qt.AlignCenter, "!")
-            painter.restore()
-        for prop in ("rt ", "ap ", "-m,1 ", "-m,2 ",
-                     "+p ", "+s ", "oe", "px", "px+"):
-            #-- these properties are written in... not drawn
-            if prop in props:
-                painter.save()
-                comRect = textRect.adjusted(0, 0, -textRect.width() * 0.6,
-                                            0)
-                painter.setPen(QtGui.QPen(QtCore.Qt.blue, 1))
-                painter.drawRect(comRect)
-                sansFont = QtGui.QFont("Helvetica", 7)
-                painter.setFont(sansFont)
-                painter.drawText(comRect, QtCore.Qt.AlignCenter,
-                                 prop.upper())
-                painter.restore()
-
-        toothS = toothSurfaces(self, toothRect, toothid, self.isStaticChart)
-        toothS.setProps(props)
-        toothS.draw(self, painter)
-        painter.restore()
-
-
-class toothSurfaces():
-
-    '''
-    draws the tooth surfaces
-    '''
-
-    def __init__(self, parent, rect, ident, isStatic=True):
-        '''
-        initiate using the following args
-        parent (a Qwidget), rect (a Qrect), ident (eg. ur5),
-        and optionally isStatic=True
-        '''
-        self.rect = rect
-        self.parent = parent
-        self.props = ""
-        #--backtooth?
-        self.backTooth = False
-        self.toothtext = ident[2]
-        if re.match("[DE45678*]", self.toothtext):
-            self.backTooth = True
-        self.isStatic = isStatic
-
-        self.quadrant = ident[0:2]
-        self.isUpper = ident[0] == "u"
-
-        #--the occlusal surface (for backteeth)
-        #--or incisal edge for front teeth..
-        #-- is given a width here.
-        #-- irw = inner rectangle width
-        irw = self.rect.width() * 0.25
-
-        if self.backTooth:
-            irh = rect.height() * 0.25
-        else:
-            irh = rect.height() * 0.45
-        self.innerRect = self.rect.adjusted(irw, irh, -irw, -irh)
-
-    def setProps(self, props):
-        self.props = props
-
-    def draw(self, parent, painter=None):
-        if painter is None:
-            self.painter = QtGui.QPainter(parent)
-        else:
-            self.painter = painter
-        for prop in self.props:
-            prop = prop.strip(" ")
-            if re.match("\(.*", prop):
-                #-- brackets are used to indicate the start/end of a bridge
-                #--let's see bridge start by shrinking that edge.
-                # TODO - draw a demarcation line here??
-                adj = self.rect.width() * 0.10
-                if self.isUpper:
-                    self.rect = self.rect.adjusted(adj, 0, 0, 0)
-                else:
-                    self.rect = self.rect.adjusted(0, 0, -adj, 0)
-                #--remove the bracket
-                #--necessary for condition in a few lines time
-                prop = prop.strip("(")
-
-            elif re.match(".*\)$", prop):
-                #--other end of a bridge
-                adj = self.rect.width() * 0.10
-                if self.isUpper:
-                    self.rect = self.rect.adjusted(0, 0, -adj, 0)
-                else:
-                    self.rect = self.rect.adjusted(adj, 0, 0, 0)
-                prop = prop.strip(")")
-
-            if "br/p" in prop:
-                # bridge pontic found - shrink
-                self.rect = self.rect.adjusted(0, self.rect.height() * 0.10, 0,
-                                               -self.rect.height() * 0.10)
-
-        #--draw the tooth if static chart or properties to show
-        #--leave blank if treatment chart.
-        if self.isStatic or self.props != []:
-            self.painter.drawRect(self.rect)
-            self.painter.drawRect(self.innerRect)
-            self.painter.drawLine(
-                self.rect.topLeft(),
-                self.innerRect.topLeft())
-            self.painter.drawLine(
-                self.rect.topRight(),
-                self.innerRect.topRight())
-            self.painter.drawLine(
-                self.rect.bottomLeft(),
-                self.innerRect.bottomLeft())
-            self.painter.drawLine(
-                self.rect.bottomRight(),
-                self.innerRect.bottomRight())
-
-        #-deciduos (ie. indeterminate) 6, 7, 8 are marked as "*"
-        #--paint over these.
-        if self.toothtext == "*":
-            erase_color = parent.palette().background().color()
-            self.painter.setPen(erase_color)
-            self.painter.setBrush(erase_color)
-            self.painter.drawRect(self.rect)
-
-        #--set variables for fill draw points
-        #--this are NOT static as the widget is resizable
-        # TODO I could probably get performance improvement here.
-        # by having a default set which changes only if the "tooth" has been
-        # resized.
-
-        if self.props != []:
-            if self.backTooth:
-                toothdimen = self.rect.width()
-                ax = self.rect.topLeft().x() + toothdimen * 0.05
-                bx = self.rect.topLeft().x() + toothdimen * 0.15
-                cx = self.rect.topLeft().x() + toothdimen * 0.2
-                dx = self.rect.topLeft().x() + toothdimen * 0.35
-                ex = self.rect.topLeft().x() + toothdimen * 0.5
-                fx = self.rect.topLeft().x() + toothdimen * 0.7
-                gx = self.rect.topLeft().x() + toothdimen * 0.8
-                hx = self.rect.topLeft().x() + toothdimen * 0.85
-                ix = self.rect.topLeft().x() + toothdimen * 0.95
-                toothdimen = self.rect.height()
-                ay = self.rect.topLeft().y() + toothdimen * 0.05
-                by = self.rect.topLeft().y() + toothdimen * 0.15
-                cy = self.rect.topLeft().y() + toothdimen * 0.2
-                dy = self.rect.topLeft().y() + toothdimen * 0.35
-                ey = self.rect.topLeft().y() + toothdimen * 0.5
-                fy = self.rect.topLeft().y() + toothdimen * 0.65
-                gy = self.rect.topLeft().y() + toothdimen * 0.8
-                hy = self.rect.topLeft().y() + toothdimen * 0.85
-                iy = self.rect.topLeft().y() + toothdimen * 0.95
-            else:
-                #--front tooth - different patterns
-                toothdimen = self.rect.width()
-                ax = self.rect.topLeft().x() + toothdimen * 0.05
-                bx = self.rect.topLeft().x() + toothdimen * 0.15
-                cx = self.rect.topLeft().x() + toothdimen * 0.2
-                dx = self.rect.topLeft().x() + toothdimen * 0.3
-                ex = self.rect.topLeft().x() + toothdimen * 0.5
-                fx = self.rect.topLeft().x() + toothdimen * 0.7
-                gx = self.rect.topLeft().x() + toothdimen * 0.8
-                hx = self.rect.topLeft().x() + toothdimen * 0.85
-                ix = self.rect.topLeft().x() + toothdimen * 0.95
-                toothdimen = self.rect.height()
-                ay = self.rect.topLeft().y() + toothdimen * 0.05
-                by = self.rect.topLeft().y() + toothdimen * 0.15
-                cy = self.rect.topLeft().y() + toothdimen * 0.2
-                dy = self.rect.topLeft().y() + toothdimen * 0.3
-                ey = self.rect.topLeft().y() + toothdimen * 0.5
-                fy = self.rect.topLeft().y() + toothdimen * 0.7
-                gy = self.rect.topLeft().y() + toothdimen * 0.8
-                hy = self.rect.topLeft().y() + toothdimen * 0.85
-                iy = self.rect.topLeft().y() + toothdimen * 0.95
-
-            for prop in self.props:
-                prop = prop.strip(" ")
-                material = ""
-                self.painter.save()
-
-                prop = prop.strip("#&")
-                if prop == "pv":
-                    prop = "pv,pj"
-                if re.match("!.*", prop):
-                    prop = ""
-                if "/" in prop:
-                    if re.match("\(.*", prop):
-                        #--start of a bridge
-                        leading_bracket = True
-                        prop = prop[1:]
-                    else:
-                        leading_bracket = False
-                    if re.match("br/.*", prop):
-                        #--bridge
-                        prop = prop[3:]
-                        if leading_bracket:
-                            prop = prop.replace(",", ",(")
-                        if "p," in prop:
-                            #--some gold crowns are cr/modbl,go
-                            prop = "PONTIC," + prop[2:]
-                        if "mr" in prop:
-                            prop = "p,mr"
-                    else:
-                        if "pi" in prop:
-                            #--porcelain inlays are pi/modp etc
-                            prop = prop[3:] + ",pi"
-                        if "cr" in prop:
-                            #--some gold crowns are cr/modbl,go
-                            prop = prop[3:]
-                        if "gi" in prop:
-                            prop = prop[3:] + ",go"
-                        if "gc" in prop:
-                            #-- code for gi treatment where exceptional
-                            #-- circumstances apply
-                            #-- "gc/mod".. so  for drawing purposes
-                            #-- change this to "mod,gi"
-                            prop = prop[3:] + ",gl"
-
-                if prop[:2] in ("tm", "at"):
-                    erase_color = parent.palette().background().color()
-                    self.painter.setPen(erase_color)
-                    self.painter.setBrush(erase_color)
-                    self.painter.drawRect(self.rect)
-                    self.painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-                    self.painter.drawText(self.rect, QtCore.Qt.AlignCenter,
-                                          prop.upper())
-
-                    prop = ""
-                if prop[:2] in ("ue", "pe", "oe", "rp"):
-                    if prop[:2] == "ue":
-                        erase_color = parent.palette().background().color()
-                        self.painter.setBrush(erase_color)
-                    else:
-                        self.painter.setBrush(QtCore.Qt.transparent)
-                    self.painter.drawRect(self.rect)
-                    self.painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
-                    if self.backTooth:
-                        self.painter.drawText(
-                            self.rect,
-                            QtCore.Qt.AlignCenter,
-                            prop)
-                    else:
-                        self.painter.drawText(self.rect.adjusted(0,
-                                                                 self.rect.height(
-                                                                 ) / 2, 0, 0),
-                                              QtCore.Qt.AlignCenter, prop)
-                    #--prevent the o's and p's being interpreted as fills
-                    prop = ""
-
-                if ",pr" in prop:
-                    # TODO - pin??
-                    prop = prop.replace(",pr", "")
-
-                if "," in prop:
-                    #--get materal if present
-                    material = prop.split(",")[1]
-                    material = re.sub("[()]", "", material)
-                    prop = prop.split(",")[0]
-                    #--adjust for mirror imaging
-                else:
-                    #--set default material
-                    if self.toothtext == "4":
-                        if prop in ("B", "P"):
-                            material = "co"
-                        else:
-                            material = "am"
-                    elif self.backTooth:
-                        material = "am"
-                    else:
-                        material = "co"
-
-                if prop[:2] == "fs":
-                    material = "fs"
-
-                if prop[:2] == "dr":
-                    material = "dr"
-
-                #--put an outline around the filling
-                self.painter.setPen(QtGui.QPen(colours.FILL_OUTLINE, 1))
-
-                #--set filling color
-                if material == "co":
-                    self.painter.setBrush(colours.COMP)
-                elif material in ("pj", "ot", "pi", "a1", "v1", "v2", "opal",
-                                  "opalite", "lava"):
-                    self.painter.setBrush(colours.PORC)
-                elif material == "gl":
-                    self.painter.setBrush(colours.GI)
-                elif material == "go":
-                    self.painter.setBrush(colours.GOLD)
-                elif material == "am":
-                    self.painter.setBrush(colours.AMALGAM)
-                elif material == "mr":
-                    self.painter.setBrush(colours.METAL)
-                elif material == "dr":
-                    self.painter.setBrush(colours.DRESSING)
-                elif material == "fs":
-                    self.painter.setPen(QtGui.QPen(colours.FISSURE, 1))
-                    self.painter.setBrush(colours.FISSURE)
-                else:
-                    logging.debug("unhandled material colour %s %s %s" % (
-                        self.toothtext, prop, material))
-
-                if self.quadrant[1] == "l" and prop != "dr":
-                    #-- left hand side - reverse fills
-                    #-- this loods a confusing merry dance...
-                    #-- capitalisation used to prevent changes being undone
-                    prop = prop.replace("m", "D")
-                    prop = prop.replace("d", "m")
-                    prop = prop.replace("D", "d")
-                if self.quadrant[0] == "l":
-                    prop = prop.replace("b", "L")
-                    prop = prop.replace("l", "b")
-                    prop = prop.replace("L", "l")
-                if prop[0:2] == "cr" or "PONTIC" in prop:
-                    if "PONTIC" in prop:
-                        crRect = self.rect
-                    else:
-                        crRect = self.rect.adjusted(0, 2, 0, -2)
-                    self.painter.drawRect(crRect)
-                    self.painter.drawRect(self.innerRect)
-                    self.painter.drawLine(
-                        crRect.topLeft(),
-                        self.innerRect.topLeft())
-                    self.painter.drawLine(
-                        crRect.topRight(),
-                        self.innerRect.topRight())
-                    self.painter.drawLine(crRect.bottomLeft(),
-                                          self.innerRect.bottomLeft())
-
-                    self.painter.drawLine(crRect.bottomRight(),
-                                          self.innerRect.bottomRight())
-
-                    if self.backTooth:
-                        self.painter.drawText(self.rect, QtCore.Qt.AlignCenter,
-                                              material)
-                    else:
-                        self.painter.drawText(self.rect.adjusted(0,
-                                                                 self.rect.height(
-                                                                 ) / 2, 0, 0), QtCore.Qt.AlignCenter,
-                                              material)
-
-                if prop == "pv" and self.isUpper:
-                    self.painter.drawPolygon(QtGui.QPolygon(
-                                             [self.rect.topLeft(
-                                             ).x(), self.rect.topLeft().y(),
-                                                 self.rect.topRight().x(
-                                                 ), self.rect.topRight(
-                                                 ).y(),
-                                                 self.innerRect.topRight().x(
-                                                 ), self.innerRect.topRight(
-                                                 ).y(),
-                                                 self.innerRect.topLeft().x(), self.innerRect.topLeft().y()]))
-
-                    self.painter.drawText(self.rect.adjusted(0, 0, 0,
-                                                             -self.rect.height() / 2), QtCore.Qt.AlignCenter, prop)
-
-                    prop = ""
-
-                if prop == "pv" and not self.isUpper:
-                    self.painter.drawPolygon(QtGui.QPolygon(
-                                             [self.rect.bottomLeft(
-                                             ).x(), self.rect.bottomLeft().y(),
-                                                 self.rect.bottomRight().x(
-                                                 ), self.rect.bottomRight(
-                                                 ).y(),
-                                                 self.innerRect.bottomRight().x(
-                                                 ), self.innerRect.bottomRight(
-                                                 ).y(),
-                                                 self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y()]))
-
-                    self.painter.drawText(self.rect.adjusted(0,
-                                                             self.rect.height(
-                                                             ) / 2, 0, 0),
-                                          QtCore.Qt.AlignCenter, prop)
-
-                    prop = ""
-
-                if prop == "ex":
-                    #-- draw a big red X
-                    self.painter.save()
-
-                    self.painter.setPen(QtGui.QPen(QtCore.Qt.red, 4))
-                    self.painter.drawLine(self.rect.topLeft(),
-                                          self.rect.bottomRight())
-
-                    self.painter.drawLine(self.rect.topRight(),
-                                          self.rect.bottomLeft())
-
-                    self.painter.restore()
-
-                # IGNORE LIST
-                if prop in ("px", "oe"):
-                    prop = ""
-
-                prop = prop.replace("l", "p")
-                shapes = []
-                if self.backTooth:
-                    if "fs" in prop:
-                        shapes.append(QtGui.QPolygon(
-                                      [dx, ey - 1, fx, ey - 1, fx + 1, ey + 1, dx, ey + 1]))
-                        shapes.append(QtGui.QPolygon(
-                                      [ex - 1, dy, ex + 1, dy, ex + 1, fy, ex - 1, fy]))
-                    elif "dr" in prop:
-                        n = QtGui.QPolygon([cx, dy, dx, by, fx, by, hx, dy,
-                                            hx, fy, fx, hy, dx, hy, cx, fy])
-                        shapes.append(n)
-                    elif re.match("[modbp]{5}", prop):
-                        n = QtGui.QPolygon([ax, by, cx, dy, dx, dy, dx, by,
-                                            fx, by, fx, dy, gx, dy, ix, by, ix, hy, gx, fy, fx,
-                                            fy, fx, hy, dx, hy, dx, fy, cx, fy, ax, hy])
-                        shapes.append(n)
-                    elif re.match("[modb]{4}", prop):
-                        n = QtGui.QPolygon([ax, by, dx, dy, dx, by, fx, by,
-                                            fx, dy, ix, by, ix, hy, fx, fy, dx, fy, ax, hy])
-                        shapes.append(n)
-                    elif re.match("[modp]{4}", prop):
-                        n = QtGui.QPolygon([ax, by, dx, dy, fx, dy, ix, by,
-                                            ix, hy, fx, fy, fx, hy, dx, hy, dx, fy, ax, hy])
-                        shapes.append(n)
-                    elif re.match("[mod]{3}", prop):
-                        n = QtGui.QPolygon([ax, by, dx, dy, fx, dy, ix, by,
-                                            ix, hy, fx, fy, dx, fy, ax, hy])
-                        shapes.append(n)
-                    elif re.match("[mob]{3}", prop):
-                        n = QtGui.QPolygon([dx, dy, ex, dy, ex, by, fx, by,
-                                            fx, dy, gx, dy, ix, by, ix, hy, gx, fy, dx, fy])
-                        shapes.append(n)
-                    elif re.match("[mop]{3}", prop):
-                        n = QtGui.QPolygon([dx, dy, gx, dy, ix, by, ix, hy,
-                                            gx, fy, fx, fy, fx, hy, ex, hy, ex, fy, dx, fy])
-                        shapes.append(n)
-                    elif re.match("[dob]{3}", prop):
-                        n = QtGui.QPolygon([ax, cy, cx, dy, ex, dy, ex, by,
-                                            fx, by, fx, dy, fx, dy, fx, fy, cx, fy, ax, gy])
-                        shapes.append(n)
-                    elif re.match("[dop]{3}", prop):
-                        n = QtGui.QPolygon([ax, cy, cx, dy, fx, dy, fx, fy,
-                                            ex, fy, ex, hy, dx, hy, dx, fy, cx, fy, ax, gy])
-                        shapes.append(n)
-                    elif re.match("[mbd]{3}", prop):
-                        n = QtGui.QPolygon([ax, by, dx, ay, fx, ay, ix, by,
-                                            ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
-                        shapes.append(n)
-                    elif re.match("[mpd]{3}", prop):
-                        n = QtGui.QPolygon([ax, ey, bx, ey, bx, hy, hx, hy,
-                                            hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
-                        shapes.append(n)
-                    elif re.match("[ob]{2}", prop):
-                        n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
-                                            dx, fy, dx, cy])
-                        shapes.append(n)
-                    elif re.match("[op]{2}", prop):
-                        n = QtGui.QPolygon([dx, dy, fx, dy, fx, gy, gx, iy,
-                                            cx, iy, dx, gy])
-                        shapes.append(n)
-                    elif re.match("[mb]{2}", prop):
-                        n = QtGui.QPolygon([dx, ay, fx, ay, ix, by, ix, ey,
-                                            hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
-                        shapes.append(n)
-                    elif re.match("[mp]{2}", prop):
-                        n = QtGui.QPolygon([dx, iy, fx, iy, ix, hy, ix, ey,
-                                            hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
-                        shapes.append(n)
-                    elif re.match("[db]{2}", prop):
-                        n = QtGui.QPolygon([fx, ay, dx, ay, ax, by, ax, ey,
-                                            bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
-                        shapes.append(n)
-                    elif re.match("[dp]{2}", prop):
-                        n = QtGui.QPolygon([fx, iy, dx, iy, ax, hy, ax, ey,
-                                            bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
-                        shapes.append(n)
-                    elif re.match("[mo]{2}", prop):
-                        n = QtGui.QPolygon([dx, dy, gx, dy, ix, cy, ix, gy,
-                                            gx, fy, dx, fy])
-                        shapes.append(n)
-                    elif re.match("[do]{2}", prop):
-                        n = QtGui.QPolygon([ax, cy, cx, dy, fx, dy, fx, fy,
-                                            cx, fy, ax, gy])
-                        shapes.append(n)
-
-                    elif "o" in prop:
-                        n = QtGui.QPolygon([dx, dy, fx, dy, fx, fy, dx, fy])
-                        shapes.append(n)
-                    elif "m" in prop:
-                        n = QtGui.QPolygon([gx, dy, ix, by, ix, hy, gx, fy])
-                        shapes.append(n)
-                    elif "d" in prop:
-                        n = QtGui.QPolygon([ax, by, cx, dy, cx, fy, ax, hy])
-                        shapes.append(n)
-                    elif "p" in prop:
-                        n = QtGui.QPolygon([bx, iy, dx, gy, fx, gy, hx, iy])
-                        shapes.append(n)
-                    elif "b" in prop:
-                        n = QtGui.QPolygon([bx, ay, hx, ay, fx, cy, dx, cy])
-                        shapes.append(n)
-                else:  # front tooth
-                    if "dr" in prop:
-                        n = QtGui.QPolygon([cx, dy, dx, by, fx, by, hx, dy,
-                                            hx, fy, fx, hy, dx, hy, cx, fy])
-                        shapes.append(n)
-                    elif re.match("[mbd]{3}", prop):
-                        n = QtGui.QPolygon([ax, by, dx, ay, fx, ay, ix, by,
-                                            ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
-                        shapes.append(n)
-                    elif re.match("[mpd]{3}", prop):
-                        n = QtGui.QPolygon([ax, ey, bx, ey, bx, hy, hx, hy,
-                                            hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
-                        shapes.append(n)
-                    elif re.match("[ib]{2}", prop):
-                        n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
-                                            dx, fy, dx, cy])
-                        shapes.append(n)
-                    elif re.match("[ip]{2}", prop):
-                        n = QtGui.QPolygon([dx, dy, fx, dy, fx, gy, gx, iy,
-                                            cx, iy, dx, gy])
-                        shapes.append(n)
-                    elif re.match("[mb]{2}", prop):
-                        n = QtGui.QPolygon([dx, ay, fx, ay, ix, by, ix, ey,
-                                            hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
-                        shapes.append(n)
-                    elif re.match("[mp]{2}", prop):
-                        n = QtGui.QPolygon([dx, iy, fx, iy, ix, hy, ix, ey,
-                                            hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
-                        shapes.append(n)
-                    elif re.match("[db]{2}", prop):
-                        n = QtGui.QPolygon([fx, ay, dx, ay, ax, by, ax, ey,
-                                            bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
-                        shapes.append(n)
-                    elif re.match("[dp]{2}", prop):
-                        n = QtGui.QPolygon([fx, iy, dx, iy, ax, hy, ax, ey,
-                                            bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
-                        shapes.append(n)
-                    elif re.match("[mid]{3}", prop):
-                        n = QtGui.QPolygon([ax, cy, cx, dy,
-                                            self.innerRect.topLeft().x(
-                                            ), self.innerRect.topLeft().y(),
-                                            self.innerRect.topRight().x(
-                                            ), self.innerRect.topRight().y(),
-                                            gx, dy, ix, cy, ix, gy, gx, fy,
-                                            self.innerRect.bottomRight().x(),
-                                            self.innerRect.bottomRight().y(),
-                                            self.innerRect.bottomLeft().x(),
-                                            self.innerRect.bottomLeft().y(), cx, fy, ax, gy])
-                        shapes.append(n)
-                    elif re.match("[mi]{2}", prop):
-                        n = QtGui.QPolygon([self.innerRect.topLeft().x(),
-                                            self.innerRect.topLeft().y(),
-                                            self.innerRect.topRight().x(
-                                            ), self.innerRect.topRight().y(),
-                                            gx, dy, ix, cy, ix, gy, gx, fy,
-                                            self.innerRect.bottomRight().x(),
-                                            self.innerRect.bottomRight().y(),
-                                            self.innerRect.bottomLeft().x(),
-                                            self.innerRect.bottomLeft().y(),
-                                            ])
-                        shapes.append(n)
-                    elif re.match("[di]{2}", prop):
-                        n = QtGui.QPolygon([ax, cy, cx, dy,
-                                            self.innerRect.topLeft().x(
-                                            ), self.innerRect.topLeft().y(),
-                                            self.innerRect.topRight().x(
-                                            ), self.innerRect.topRight().y(),
-                                            self.innerRect.bottomRight().x(),
-                                            self.innerRect.bottomRight().y(),
-                                            self.innerRect.bottomLeft().x(),
-                                            self.innerRect.bottomLeft().y(),
-                                            cx, fy, ax, gy])
-                        shapes.append(n)
-                    elif "i" in prop:
-                        n = QtGui.QPolygon([self.innerRect.topLeft().x(),
-                                            self.innerRect.topLeft().y(),
-                                            self.innerRect.topRight().x(),
-                                            self.innerRect.topRight().y(),
-                                            self.innerRect.bottomRight().x(),
-                                            self.innerRect.bottomRight().y(),
-                                            self.innerRect.bottomLeft().x(),
-                                            self.innerRect.bottomLeft().y()])
-                        shapes.append(n)
-                    elif "m" in prop:
-                        shapes.append(QtGui.QPolygon(
-                                      [hx, dy, ix, dy, ix, fy, hx, fy, gx, ey]))
-                    elif "d" in prop:
-                        shapes.append(QtGui.QPolygon(
-                                      [ax, dy, bx, dy, cx, ey, bx, fy, ax, fy]))
-                    elif "p" in prop:
-                        shapes.append(QtGui.QPolygon([cx, hy, cx, gy, ex, fy,
-                                                      gx, gy, gx, hy, fx, iy, dx, iy]))
-                    elif "b" in prop:
-                        shapes.append(QtGui.QPolygon([cx, cy, cx, ay, ex, ay,
-                                                      gx, ay, gx, cy, fx, dy, dx, dy]))
-                for shape in shapes:
-                    self.painter.drawPolygon(shape)
-                    # todo - drawPath may be MUCH better (curvier)
-                    # - a lot of work to change though?
-
-                self.painter.restore()
-
-
-class toothImage(QtGui.QWidget):
-
-    '''
-    a class to grab an image of the tooth widget
-    '''
-
-    def __init__(self, parent=None):
-        super(toothImage, self).__init__(parent)
-
-    def paintEvent(self, event=None):
-        recd = QtCore.QRectF(0, 0, self.width(), self.height())
-        toothS = toothSurfaces(self, recd, "ur8")
-        toothS.setProps(["m do,gl ", ])
-        toothS.draw(self)
-
-    def image(self):
-        '''
-        returns a png image of the tooth
-        '''
-        myimage = QtGui.QPixmap.grabWidget(self)
-
-        return myimage
-
-if __name__ == "__main__":
-    from gettext import gettext as _
-    app = QtGui.QApplication(sys.argv)
-    form = ChartWidget()
-    form.chartgrid = {'lr1': 'lr1', 'lr3': 'lr3', 'lr2': 'lr2', 'lr5': 'lr5',
-                      'lr4': 'lr4',
-                      'lr7': 'lr7',
-                      'lr6': 'lr6',
-                      'lr8': 'lr8',
-                      'ul8': '***',
-                      'ul2': 'ul2',
-                      'ul3': 'ulC',
-                      'ul1': 'ul1',
-                      'ul6': 'ul6',
-                      'ul7': 'ul7',
-                      'ul4': 'ul4',
-                      'ul5': 'ul5',
-                      'ur4': 'ur4',
-                      'ur5': 'ur5',
-                      'ur6': 'ur6',
-                      'ur7': 'ur7',
-                      'ur1': 'ur1',
-                      'ur2': 'ur2',
-                      'ur3': 'ur3',
-                      'ur8': 'ur8',
-                      'll8': 'll8',
-                      'll3': 'll3',
-                      'll2': 'll2',
-                      'll1': 'll1',
-                      'll7': 'll7',
-                      'll6': 'll6', 'll5': 'll5', 'll4': 'll4'}
-
-    for properties in (
-        ("ur7", "ex "), ("ur6", "gi/modbp mb"), ("ur5", "cr,go mp"),
-        ("ur4", "mop,co"), ("ur3", "AT"), ("ur2", "di,co b"), ("ur1", "pv rt"),
-        ("ul1", "cr,pj"), ("ul2", "dp,co b,co"), ("ul3", "di p,go"),
-        ("ll3", "pv"), ("ll2", "dip"), ("ll1", "midi"),
-        ("lr1", "mpd"), ("lr2", "mld,gl"), ("lr3", "dr"),
-        ("ul4", "do"), ("ul6", "mo"), ("lr8", "("),
-        ("ul7", "mop,co"), ("ur8", "mdb,gl mpd,go ob"), ("ll4", "b,gl dl,co"),
-        ("ll5", "ob ml"), ("ll6", "mod,co"), (
-            "ll7", "pe"), ("ll8", "ue !watch"),
-            ("lr4", "b"), ("lr5", "dr"), ("lr7", "fs"), ("lr6", "modbl,pr")):
-        form.setToothProps(properties[0], properties[1])
-    form.show()
-    pixmap = QtGui.QPixmap.grabWidget(form)
-    pixmap.save("/home/neil/chart.png")
-    form.selected = [0, 2]
-    sys.exit(app.exec_())
diff --git a/src/standalone_chart/lib_om_chart/config.py b/src/standalone_chart/lib_om_chart/config.py
deleted file mode 100644
index 0d73bcc..0000000
--- a/src/standalone_chart/lib_om_chart/config.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-this module has one purpose...
-read the config file
-'''
-
-import base64
-import ConfigParser
-import logging
-import os
-
-CONF_FILE_LOC = os.path.join(os.path.expanduser("~"),
-                             ".openmolar", "om_chart.conf")
-logging.debug("using conf file at '%s'" % CONF_FILE_LOC)
-
-try:
-    parser = ConfigParser.SafeConfigParser()
-    parser.read(CONF_FILE_LOC)
-
-    KWARGS = {
-        "host": parser.get("Database", "host"),
-        "port": int(parser.get("Database", "port")),
-        "user": parser.get("Database", "user"),
-        "passwd": base64.b64decode(parser.get("Database", "password")),
-        "db": parser.get("Database", "db_name"),
-        "use_unicode": True,
-        "charset": "utf8"
-    }
-
-    SURGERY_NO = int(parser.get("Surgery", "number"))
-
-except ConfigParser.NoSectionError:
-    logging.error("unable to parse config file - first run??")
-    KWARGS = {}
-    SURGERY_NO = 0
-
-
-def write_config(host, port, db_name, user, passwd, surgery, ssl=True):
-    parser = ConfigParser.RawConfigParser()
-
-    parser.add_section('Database')
-    parser.set('Database', 'host', host)
-    parser.set('Database', 'port', port)
-    parser.set('Database', 'db_name', db_name)
-    parser.set('Database', 'user', user)
-    parser.set('Database', 'password', base64.b64encode(passwd))
-    parser.set('Database', 'ssl', ssl)
-    parser.add_section('Surgery')
-    parser.set('Surgery', 'number', surgery)
-
-    # Writing our configuration file to 'example.cfg'
-    if os.path.exists(CONF_FILE_LOC):
-        os.remove(CONF_FILE_LOC)
-    with open(CONF_FILE_LOC, 'wb') as configfile:
-        parser.write(configfile)
-
-
-if __name__ == "__main__":
-    logging.basicConfig(level=logging.DEBUG)
-    print KWARGS
diff --git a/src/standalone_chart/lib_om_chart/config_dialog.py b/src/standalone_chart/lib_om_chart/config_dialog.py
deleted file mode 100644
index c08441a..0000000
--- a/src/standalone_chart/lib_om_chart/config_dialog.py
+++ /dev/null
@@ -1,155 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-has one class, a dialog to write the config
-'''
-
-import logging
-import sys
-
-from PyQt4 import QtGui, QtCore
-
-import config
-
-
-class ConfigDialog(QtGui.QDialog):
-
-    def __init__(self, parent=None):
-        QtGui.QDialog.__init__(self, parent)
-
-        label = QtGui.QLabel(u"<b>%s</b>" % _(
-            "Please complete the following form"))
-        label.setAlignment(QtCore.Qt.AlignCenter)
-        frame = QtGui.QFrame()
-        form_layout = QtGui.QFormLayout(frame)
-
-        self.host_le = QtGui.QLineEdit()
-        self.port_le = QtGui.QLineEdit()
-        self.database_le = QtGui.QLineEdit()
-        self.user_le = QtGui.QLineEdit()
-        self.password_le = QtGui.QLineEdit()
-        self.password_le.setEchoMode(QtGui.QLineEdit.Password)
-        self.surgery_sb = QtGui.QSpinBox()
-
-        form_layout.addRow(_("host"), self.host_le)
-        form_layout.addRow(_("port"), self.port_le)
-        form_layout.addRow(_("database"), self.database_le)
-        form_layout.addRow(_("user"), self.user_le)
-        form_layout.addRow(_("password"), self.password_le)
-        form_layout.addRow(_("Surgery number"), self.surgery_sb)
-
-        self.button_box = QtGui.QDialogButtonBox(self)
-        self.button_box.setOrientation(QtCore.Qt.Horizontal)
-        self.button_box.setStandardButtons(
-            self.button_box.Cancel | self.button_box.Apply)
-        self.button_box.setCenterButtons(True)
-
-        layout = QtGui.QVBoxLayout(self)
-        layout.addWidget(label)
-        layout.addWidget(frame)
-        layout.addStretch()
-        layout.addWidget(self.button_box)
-
-        self.button_box.clicked.connect(self._clicked)
-
-    def sizeHint(self):
-        return QtCore.QSize(300, 400)
-
-    def _clicked(self, but):
-        role = self.button_box.buttonRole(but)
-        if role == self.button_box.ApplyRole:
-            self.accept()
-        else:
-            self.reject()
-
-    @property
-    def host(self):
-        return unicode(self.host_le.text())
-
-    @property
-    def port(self):
-        port, result = self.port_le.text().toInt()
-        return port
-
-    @property
-    def user(self):
-        return unicode(self.user_le.text())
-
-    @property
-    def password(self):
-        return unicode(self.password_le.text())
-
-    @property
-    def db_name(self):
-        return unicode(self.database_le.text())
-
-    @property
-    def surgery(self):
-        return self.surgery_sb.value()
-
-    @property
-    def has_acceptable_values(self):
-        return (
-            self.host != "" and
-            self.user != "" and
-            self.port != 0 and
-            self.password != "" and
-            self.db_name != "" and
-            self.surgery != 0
-        )
-
-    def exec_(self, reconfigure=False):
-        result = True
-        while (result and not self.has_acceptable_values) or reconfigure:
-            result = QtGui.QDialog.exec_(self)
-            reconfigure = False
-        return result
-
-    def load_config(self):
-        self.host_le.setText(config.KWARGS["host"])
-        self.port_le.setText(str(config.KWARGS["port"]))
-        self.database_le.setText(config.KWARGS["db"])
-        self.user_le.setText(config.KWARGS["user"])
-        self.password_le.setText(config.KWARGS["passwd"])
-        self.surgery_sb.setValue(config.SURGERY_NO)
-
-    def write_config(self):
-        if self.has_acceptable_values:
-            config.write_config(
-                self.host,
-                self.port,
-                self.db_name,
-                self.user,
-                self.password,
-                self.surgery)
-        else:
-            sys.exit("TERMINAL ERROR - Unable to write config file")
-
-if __name__ == "__main__":
-    from gettext import gettext as _
-    app = QtGui.QApplication([])
-    dl = ConfigDialog()
-    if dl.exec_():
-        dl.write_config()
diff --git a/src/standalone_chart/lib_om_chart/connect.py b/src/standalone_chart/lib_om_chart/connect.py
deleted file mode 100644
index ddc43f4..0000000
--- a/src/standalone_chart/lib_om_chart/connect.py
+++ /dev/null
@@ -1,77 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-this module has one purpose... provide a connection to the mysqldatabase
-using 3rd party MySQLdb module
-'''
-
-import config
-import logging
-import sys
-import time
-import MySQLdb
-
-
-class Connection(object):
-    _connection = None
-
-    @property
-    def is_configured(self):
-        return config.KWARGS != {}
-
-    def reload(self):
-        '''
-        config file has been written (after first run)
-        '''
-        reload(config)
-
-    @property
-    def connection(self):
-        attempts = 0
-        while not (self._connection and self._connection.open):
-            logging.debug("New connection needed")
-            logging.debug(
-                "connecting to %s on %s port %s" % (
-                    config.KWARGS.get("host"),
-                    config.KWARGS.get("db"),
-                    config.KWARGS.get("port"))
-            )
-
-            try:
-                self._connection = MySQLdb.connect(**config.KWARGS)
-            except MySQLdb.Error as exc:
-                logging.error("failed to connect, attempt %s" % attempts)
-                time.sleep(2)
-                attempts += 1
-                if attempts >= 10:
-                    raise exc
-        # next line not necessary as read only application ??
-        self._connection.commit()
-        return self._connection
-
-if __name__ == "__main__":
-    logging.basicConfig(level=logging.DEBUG)
-    conn = Connection().connection
-    print conn
diff --git a/src/standalone_chart/lib_om_chart/main_window.py b/src/standalone_chart/lib_om_chart/main_window.py
deleted file mode 100644
index 94743ac..0000000
--- a/src/standalone_chart/lib_om_chart/main_window.py
+++ /dev/null
@@ -1,421 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-'''
-provides the BaseMainWindow class
-a basic re-implementation of QtGui.QMainWindow that can save state etc..
-'''
-import logging
-import sys
-import traceback
-
-from PyQt4 import QtGui, QtCore
-from lib_openmolar.common.qt4.widgets import Advisor, DockableMenuBar
-
-logging.basicConfig(level=logging.DEBUG)
-
-
-class BaseMainWindow(QtGui.QMainWindow, Advisor):
-
-    '''
-    This class is a MainWindow, with menu, toolbar and statusbar.
-    Some of the layout signals/slots already connected.
-    Provides about, about QT and license dialogs.
-    '''
-    log = logging.getLogger()
-    _toolbars = []
-
-    def __init__(self, parent=None):
-
-        QtGui.QMainWindow.__init__(self, parent)
-        Advisor.__init__(self, parent)
-
-        sys.excepthook = self.excepthook
-
-        self.setMinimumSize(300, 300)
-
-        # setup menu and headers                              ####
-
-        #: a pointer to the main toolbar
-        self.main_toolbar = QtGui.QToolBar()
-        self.main_toolbar.setObjectName("Main Toolbar")
-        self.main_toolbar.toggleViewAction().setText(_("Toolbar"))
-
-        #: a pointer to the :doc:`DockableMenuBar`
-        menubar = DockableMenuBar(self)
-
-        # add them to the app
-        self.setMenuBar(menubar)
-
-        self.addToolBar(QtCore.Qt.TopToolBarArea, self.main_toolbar)
-
-        # setup a statusbar with a label                       ####
-
-        #: a pointer to the QtGui.QStatusBar
-        self.statusbar = QtGui.QStatusBar()
-        self.setStatusBar(self.statusbar)
-
-        #: a pointer to the label in the statusbar
-        self.status_label = QtGui.QLabel()
-        self.statusbar.addPermanentWidget(self.status_label)
-
-        #: a pointer to the File menu
-        self.menu_file = QtGui.QMenu(_("&File"), self)
-        menubar.addMenu(self.menu_file)
-
-        #: a pointer to the Edit menu
-        self.menu_edit = QtGui.QMenu(_("&Edit"), self)
-        menubar.addMenu(self.menu_edit)
-
-        #: a pointer to the View menu of :attr:`menubar`
-        self.menu_view = menubar.menu_view
-
-        #: a pointer to the Help menu
-        self.menu_help = QtGui.QMenu(_("&Help"), self)
-        menubar.addMenu(self.menu_help)
-
-        # file menu                                            ####
-
-        icon = QtGui.QIcon.fromTheme("application-exit")
-
-        #: a pointer to the quit qaction
-        self.action_quit = QtGui.QAction(icon, _("Quit"), self)
-
-        self.menu_file.addSeparator()
-        self.menu_file.addAction(self.action_quit)
-
-        # edit menu                                             ####
-
-        icon = QtGui.QIcon.fromTheme("preferences-desktop")
-        #: a pointer to the preferences qAction
-        self.action_preferences = QtGui.QAction(icon, _("&Preferences"), self)
-
-        self.menu_edit.addAction(self.action_preferences)
-
-        # view menu                                             ####
-
-        #: a pointer to the show statusbar qaction
-        self.action_show_statusbar = QtGui.QAction(_("Show Status&bar"), self)
-        self.action_show_statusbar.setCheckable(True)
-        self.action_show_statusbar.setChecked(True)
-
-        icon = QtGui.QIcon.fromTheme("view-fullscreen")
-        #: a pointer to the fullscreen mode qaction
-        self.action_fullscreen = QtGui.QAction(
-            icon, _("FullScreen Mode"), self)
-        self.action_fullscreen.setCheckable(True)
-        self.action_fullscreen.setShortcut("f11")
-
-        self.menu_view.addSeparator()
-        self.menu_view.addAction(self.action_show_statusbar)
-        self.menu_view.addAction(self.action_fullscreen)
-
-        # about menu                                            ####
-
-        icon = QtGui.QIcon.fromTheme("help-about")
-        #: a pointer to the about qaction
-        self.action_about = QtGui.QAction(icon, _("About"), self)
-
-        #: a pointer to the about qt qaction
-        self.action_about_qt = QtGui.QAction(icon, _("About Qt"), self)
-
-        #: a pointer to the license qaction
-        self.action_license = QtGui.QAction(icon, _("License"), self)
-
-        icon = QtGui.QIcon.fromTheme("help", QtGui.QIcon("icons/help.png"))
-
-        #: a pointer to the help qaction
-        self.action_help = QtGui.QAction(icon, _("Help"), self)
-
-        self.menu_help.addAction(self.action_about)
-        self.menu_help.addAction(self.action_license)
-        self.menu_help.addAction(self.action_about_qt)
-        self.menu_help.addSeparator()
-        self.menu_help.addAction(self.action_help)
-
-        # toolbar                                               ####
-        # add selected menu items to the toolbar                ####
-
-        #:
-        self.help_toolbar = QtGui.QToolBar()
-        self.help_toolbar.setObjectName("help toolbar")
-        self.help_toolbar.toggleViewAction().setText(_("Help Toolbar"))
-        self.help_toolbar.addAction(self.action_help)
-        self.addToolBar(self.help_toolbar)
-
-        self.connect_default_signals()
-
-    def connect_default_signals(self):
-        '''
-        this function connects the triggered signals from the default menu
-        it should not need to be called, as it is called during the
-        :func:`__init__`
-        '''
-        self.connect(self.action_quit, QtCore.SIGNAL("triggered()"),
-                     QtGui.QApplication.instance().closeAllWindows)
-
-        self.action_preferences.triggered.connect(self.show_preferences_dialog)
-
-        self.action_show_statusbar.triggered.connect(self.show_statusbar)
-        self.action_fullscreen.triggered.connect(self.fullscreen)
-
-        self.action_fullscreen.triggered.connect(self.fullscreen)
-        self.action_about.triggered.connect(self.show_about)
-        self.action_license.triggered.connect(self.show_license)
-
-        self.connect(self.action_about_qt, QtCore.SIGNAL("triggered()"),
-                     QtGui.qApp, QtCore.SLOT("aboutQt()"))
-
-        self.action_help.triggered.connect(self.show_help)
-
-    def excepthook(self, exc_type, exc_val, tracebackobj):
-        '''
-        PyQt4 prints unhandled exceptions to stdout and carries on regardless
-        I don't want this to happen.
-        so sys.excepthook is passed to this
-        '''
-        message = ""
-        for l in traceback.format_exception(exc_type, exc_val, tracebackobj):
-            message += l
-
-        self.log.error('UNHANDLED EXCEPTION!\n\n%s\n' % message)
-        self.advise('UNHANDLED EXCEPTION!<hr /><pre>%s' % message, 2)
-
-    def resizeEvent(self, event):
-        '''
-        this function is overwritten so that the advisor popup can be
-        put in the correct place
-        '''
-        QtGui.QMainWindow.resizeEvent(self, event)
-        self.setBriefMessageLocation()
-
-    def setBriefMessageLocation(self):
-        '''
-        make the Advisor sub class aware of the windows geometry.
-        set it top right, and right_to_left
-        '''
-        widg = self.menuBar()
-        brief_pos_x = (widg.pos().x() + widg.width())
-        brief_pos_y = (widg.pos().y() + widg.height())
-
-        brief_pos = QtCore.QPoint(brief_pos_x, brief_pos_y)
-        self.setBriefMessagePosition(brief_pos, True)
-
-    def addToolBar(self, *args):
-        QtGui.QMainWindow.addToolBar(self, *args)
-        if self.menuWidget():
-            self.menuBar().update_toolbars()
-
-    @property
-    def toolbar_list(self):
-        '''
-        yield all toolbars of the application
-        '''
-        for child in self.children():
-            if isinstance(child, QtGui.QToolBar):
-                yield child
-
-    def insertToolBar(self, *args):
-        QtGui.QMainWindow.insertToolBar(self, *args)
-        if self.menuWidget():
-            self.menuBar().update_toolbars()
-
-    def insertMenu_(self, menu):
-        '''
-        a convenience function that slots new actions in just before the
-        "help" menu item on the menubar
-        '''
-        insertpoint = self.menu_help.menuAction()
-        return self.menuBar().insertMenu(insertpoint, menu)
-
-    def insertToolBarWidget(self, action, sep=False):
-        '''
-        a convenience function that slots new widgets in just before the
-        "help" menu item on the main Toolbar.
-        accepts either a QAction, or a widget.
-        If option 2nd argument (sep) is True, a separator is also added.
-        '''
-        added = []
-        insertpoint = self.action_help
-        if sep:
-            insertpoint = self.main_toolbar.insertSeparator(insertpoint)
-            added.append(insertpoint)
-        if isinstance(action, QtGui.QAction):
-            added.append(self.main_toolbar.insertAction(insertpoint, action))
-        else:
-            added.append(self.main_toolbar.insertWidget(insertpoint, action))
-        return added
-
-    def loadSettings(self):
-        '''
-        load settings from QtCore.QSettings.
-        '''
-        settings = QtCore.QSettings()
-        # Qt settings
-        self.restoreGeometry(settings.value("geometry").toByteArray())
-        self.restoreState(settings.value("windowState").toByteArray())
-        statusbar_hidden = settings.value("statusbar_hidden").toBool()
-        self.statusbar.setVisible(not statusbar_hidden)
-        self.action_show_statusbar.setChecked(not self.statusbar.isHidden())
-
-        font = settings.value("Font").toPyObject()
-        if font:
-            QtGui.QApplication.instance().setFont(font)
-
-        toolbar_set = settings.value(
-            "Toolbar", QtCore.Qt.ToolButtonTextUnderIcon).toInt()[0]
-        for tb in self.toolbar_list:
-            tb.setToolButtonStyle(toolbar_set)
-
-        tiny_menu = settings.value("TinyMenu").toBool()
-        if tiny_menu:
-            self.menuBar().toggle_visability(True)
-            self.menuBar().menu_toolbar.toggleViewAction().setChecked(True)
-
-    def saveSettings(self):
-        '''
-        save settings from QtCore.QSettings
-        '''
-        settings = QtCore.QSettings()
-        # Qt settings
-        settings.setValue("geometry", self.saveGeometry())
-        settings.setValue("windowState", self.saveState())
-        settings.setValue("statusbar_hidden", self.statusbar.isHidden())
-        settings.setValue("Font", self.font())
-        settings.setValue("Toolbar", self.main_toolbar.toolButtonStyle())
-        settings.setValue("TinyMenu", not self.menuBar().isVisible())
-
-    def show_toolbar(self):
-        if self.action_show_toolbar.isChecked():
-            self.main_toolbar.show()
-        else:
-            self.main_toolbar.hide()
-
-    def show_statusbar(self):
-        if self.action_show_statusbar.isChecked():
-            self.statusbar.show()
-        else:
-            self.statusbar.hide()
-
-    def reimplement_needed(self, func_name):
-        QtGui.QMessageBox.information(self, "please re-implement",
-                                      '''please overwrite function <b>'%s'</b><br />
-        in any class which inherits from 'BaseMainWindow' ''' % func_name)
-
-    def show_preferences_dialog(self):
-        self.reimplement_needed('show_preferences_dialog')
-
-    def show_about(self):
-        self.reimplement_needed('show_about')
-
-    def show_help(self):
-        self.reimplement_needed('show_help')
-
-    def show_license(self):
-        '''
-        attempts to read and show the license text
-        from file COPYRIGHT.txt in the apps directory
-        on failure, gives a simple message box with link.
-        '''
-        message = '''
-        GPLv3 - see <a href='http://www.gnu.org/licenses/gpl.html'>
-        http://www.gnu.org/licenses/gpl.html</a>'''
-        try:
-            f = open("../COPYING.txt")
-            data = f.read()
-            f.close()
-
-            dl = QtGui.QDialog(self)
-            dl.setWindowTitle(_("License"))
-            dl.setFixedSize(400, 400)
-
-            layout = QtGui.QVBoxLayout(dl)
-
-            buttonBox = QtGui.QDialogButtonBox(dl)
-            buttonBox.setOrientation(QtCore.Qt.Horizontal)
-            buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
-
-            te = QtGui.QTextBrowser()
-            te.setText(data)
-
-            label = QtGui.QLabel(message)
-            label.setWordWrap(True)
-
-            layout.addWidget(te)
-            layout.addWidget(label)
-            layout.addWidget(buttonBox)
-
-            buttonBox.accepted.connect(dl.accept)
-
-            dl.exec_()
-        except IOError:
-            QtGui.QMessageBox.information(self, _("License"), message)
-
-    def fullscreen(self):
-        if self.action_fullscreen.isChecked():
-            self.setWindowState(QtCore.Qt.WindowFullScreen)
-        else:
-            self.setWindowState(QtCore.Qt.WindowNoState)
-
-    def closeEvent(self, event=None):
-        '''
-        re-implement the close event of QtGui.QMainWindow, and check the user
-        really meant to do this.
-        '''
-        if self.get_confirm(_("Quit Application?"), "yes", "no"):
-            self.saveSettings()
-        else:
-            event.ignore()
-
-    def get_confirm(self, message,
-                    accept="ok", reject="cancel", default="accept"):
-        '''
-        a convenience function to raise a dialog for confirmation of an action
-        '''
-        if accept == "ok":
-            accept_but = QtGui.QMessageBox.Ok
-        elif accept == "yes":
-            accept_but = QtGui.QMessageBox.Yes
-
-        if reject == "cancel":
-            reject_but = QtGui.QMessageBox.Cancel
-        elif reject == "no":
-            reject_but = QtGui.QMessageBox.No
-
-        buttons = accept_but | reject_but
-        default_but = accept_but if default == "accept" else reject_but
-
-        return QtGui.QMessageBox.question(self, _("Confirm"),
-                                          message, buttons, default_but) == accept_but
-
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install("")
-
-    app = QtGui.QApplication([])
-    mw = BaseMainWindow()
-    mw.main_toolbar.addAction(QtGui.QAction("Placeholder", mw))
-    mw.show()
-    app.exec_()
diff --git a/src/standalone_chart/lib_om_chart/patient.py b/src/standalone_chart/lib_om_chart/patient.py
deleted file mode 100644
index aed7351..0000000
--- a/src/standalone_chart/lib_om_chart/patient.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-import logging
-
-from connect import Connection
-
-
-class PatientNotFoundException(Exception):
-    pass
-
-
-def from_signed_byte(val):
-    '''
-    this returns a bit by bit representation of a signed byte -
-    used for deciduous tooth
-    '''
-    if val is None:
-        val = 0
-    if val >= 0:
-        base = (128, 64, 32, 16, 8, 4, 2, 1)
-        bstring = ""
-        for b in base:
-            if val >= b:
-                bstring += "1"
-                val -= b
-            else:
-                bstring += "0"
-    else:
-        base = (-64, -32, -16, -8, -4, -2, -1)
-        bstring = "1"  # set the negative bit
-        for b in base:
-            if val < b:
-                bstring += "0"
-                val -= b
-            else:
-                bstring += "1"
-    return bstring
-
-
-class Patient(object):
-
-    '''
-    has a tiny percentage of the footprint (and loading time) of the
-    main patient class
-    '''
-    TOOTH_FIELDS = (
-        "ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
-        'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
-        "lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
-        'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'
-    )
-    DECIDUOUS = (
-        '***', '***', '***', 'ulE', 'ulD', 'ulC', 'ulB', 'ulA',
-        'urA', 'urB', 'urC', 'urD', 'urE', '***', '***', '***',
-        '***', '***', '***', 'lrE', 'lrD', 'lrC', 'lrB', 'lrA',
-        'llA', 'llB', 'llC', 'llD', 'llE', '***', '***', '***'
-    )
-
-    connection = Connection()
-
-    def __init__(self, sno):
-        '''
-        initiate the class with default variables, then load from database
-        '''
-        if sno <= 0:
-            raise PatientNotFoundException
-
-        self.serialno = sno
-        db = self.connection.connection
-        cursor = db.cursor()
-        cursor.execute(self.query, (sno,))
-        row = cursor.fetchone()
-
-        if not row:
-            raise PatientNotFoundException
-
-        self.dent1, self.dent0, self.dent3, self.dent2 = row[:4]
-        for i, field in enumerate(self.TOOTH_FIELDS):
-            self.__dict__[field] = row[i + 4]
-
-    @property
-    def query(self):
-        query = 'SELECT dent1, dent0, dent3, dent2, '
-        for field in self.TOOTH_FIELDS:
-            query += "%sst, " % field
-        return '%s from patients where serialno = %%s' % query.rstrip(", ")
-
-    #@property
-    def chartgrid(self):
-        grid = ""
-        chart_dict = {}
-        for quad in (self.dent1, self.dent0, self.dent3, self.dent2):
-            grid += from_signed_byte(quad)
-
-        for i, tooth in enumerate(self.TOOTH_FIELDS):
-            if grid[i] == "0":
-                chart_dict[tooth] = tooth
-            else:
-                chart_dict[tooth] = self.DECIDUOUS[i]
-        return chart_dict
-
-if __name__ == "__main__":
-    try:
-        serialno = int(sys.argv[len(sys.argv) - 1])
-    except:
-        serialno = 11956
-
-    pt = Patient(serialno)
-    print pt.__dict__
diff --git a/src/standalone_chart/lib_om_chart/restorable_app.py b/src/standalone_chart/lib_om_chart/restorable_app.py
deleted file mode 100644
index 9687ab3..0000000
--- a/src/standalone_chart/lib_om_chart/restorable_app.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-import sys
-from PyQt4 import QtGui
-
-
-class RestorableApplication(QtGui.QApplication):
-
-    '''
-    A subclass which play ball if app state is to be remembered by an X11
-    Session manager.
-    Will write settings to ~/.config/application_name on linux systems
-    '''
-
-    def __init__(self, name):
-        '''
-        the name given here is important as is used in saving the settings
-        '''
-        # super(RestorableApplication, self).__init__(sys.argv)
-        QtGui.QApplication.__init__(self, sys.argv)
-        self.setOrganizationName(name)
-        self.setApplicationName(name)
-
-    def commitData(self, session):
-        '''re-implement this method, called on quit'''
-        pass
-
-    def saveState(self, session):
-        '''re-implement this method, called on run'''
-        pass
-
-if __name__ == "__main__":
-    app = RestorableApplication("test_organisation_name")
-    app.closeAllWindows()
diff --git a/src/standalone_chart/om_chart.py b/src/standalone_chart/om_chart.py
deleted file mode 100755
index 86f55a0..0000000
--- a/src/standalone_chart/om_chart.py
+++ /dev/null
@@ -1,236 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-import gettext
-import logging
-import os
-import sys
-import traceback
-
-from PyQt4 import QtCore, QtGui
-
-sys.path.insert(0, os.path.dirname(__file__))
-
-from lib_om_chart.restorable_app import RestorableApplication
-from lib_om_chart.chart_widget import ChartWidget
-from lib_om_chart.patient import Patient, PatientNotFoundException
-from lib_om_chart.config import SURGERY_NO
-from lib_om_chart.config_dialog import ConfigDialog
-from lib_om_chart.connect import Connection
-
-
-class MainWindow(QtGui.QMainWindow):
-    connection = Connection()
-    _loaded_serialno = None
-
-    def __init__(self, parent=None):
-        QtGui.QMainWindow.__init__(self, parent)
-
-        if not self.connection.is_configured:
-            self.configure()
-
-        self.setWindowTitle("Dental Chart Viewer")
-        self.chart_widget = ChartWidget(self)
-        self.setCentralWidget(self.chart_widget)
-
-        menu_file = QtGui.QMenu(_("&File"), self)
-        load_action = QtGui.QAction("&Load", self)
-        quit_action = QtGui.QAction("&Quit", self)
-        reload_action = QtGui.QAction("&Reload", self)
-
-        reconfigure_action = QtGui.QAction("Re&configure", self)
-
-        menu_file.addAction(load_action)
-        menu_file.addAction(quit_action)
-
-        self.menuBar().addMenu(menu_file)
-        self.menuBar().addAction(reload_action)
-        self.menuBar().addAction(reconfigure_action)
-
-        load_action.triggered.connect(self.get_patient)
-        reload_action.triggered.connect(self.reload_patient)
-        reconfigure_action.triggered.connect(self.check_reconfigure)
-        quit_action.triggered.connect(
-            QtGui.QApplication.instance().closeAllWindows)
-
-        self.timer = QtCore.QTimer()
-        self.timer.setInterval(3000)
-        self.timer.timeout.connect(self.check_record_in_use)
-        self.timer.start()
-
-    def sizeHint(self):
-        return QtCore.QSize(800, 200)
-
-    def loadSettings(self):
-        '''
-        load settings from QtCore.QSettings.
-        '''
-        settings = QtCore.QSettings()
-        # Qt settings
-        self.restoreGeometry(settings.value("geometry").toByteArray())
-        self.restoreState(settings.value("windowState").toByteArray())
-
-    def saveSettings(self):
-        '''
-        save settings from QtCore.QSettings
-        '''
-        settings = QtCore.QSettings()
-        # Qt settings
-        settings.setValue("geometry", self.saveGeometry())
-        settings.setValue("windowState", self.saveState())
-
-    def closeEvent(self, event=None):
-        '''
-        re-implement the close event of QtGui.QMainWindow, and check the user
-        really meant to do this.
-        '''
-        result = QtGui.QMessageBox.question(self, _("Confirm"),
-                                            _("Quit Application?"),
-                                            QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
-                                            QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok
-
-        if result:
-            self.saveSettings()
-        else:
-            event.ignore()
-
-    @property
-    def max_sno(self):
-        '''
-        TODO - poll the database for this value.
-        '''
-        db = self.connection.connection
-        cursor = db.cursor()
-        cursor.execute("select max(serialno) from patients")
-        row = cursor.fetchone()
-        return row[0] + 10  # allow for a few new patients.
-
-    def get_patient(self):
-        sno, result = QtGui.QInputDialog.getInt(self,
-                                                _("Manual Select"),
-                                                _("Select a serialno to load"),
-                                                1, 1, self.max_sno)
-
-        if result:
-            self.load_patient(sno)
-
-    def load_patient(self, sno):
-        '''
-        load the data for patient with this serialno
-        '''
-        self.chart_widget.clear()
-
-        QtGui.QApplication.instance().setOverrideCursor(
-            QtCore.Qt.WaitCursor)
-        logging.debug("loading patient %s" % sno)
-        try:
-            pt = Patient(sno)
-
-            self.chart_widget.chartgrid = pt.chartgrid()
-            #--sets the tooth numbering
-            row = 0
-
-            for tooth in pt.TOOTH_FIELDS:
-                static_text = pt.__dict__[tooth]
-                if static_text:
-                    self.chart_widget.setToothProps(tooth, static_text)
-
-        except PatientNotFoundException:
-            self._message_box = QtGui.QMessageBox(self)
-            self._message_box.setText("Patient Serialno %s not found!" % sno)
-            self._message_box.setIcon(self._message_box.Warning)
-            self._message_box.setWindowTitle("whoops")
-            self._message_box.show()
-            QtCore.QTimer.singleShot(1000, self._message_box.hide)
-
-        self.chart_widget.update()
-
-        QtGui.QApplication.instance().restoreOverrideCursor()
-
-    def reload_patient(self):
-        if self._loaded_serialno:
-            self.load_patient(self._loaded_serialno)
-        else:
-            self.check_record_in_use()
-
-    def check_reconfigure(self):
-        if QtGui.QMessageBox.question(self, _("confirm"),
-                                      _(
-                                      "Do you really want to reconfigure this application?"),
-                                      QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
-                                      QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
-                self.reconfigure()
-
-    def configure(self):
-        self.reconfigure(reconfigure=False)
-
-    def reconfigure(self, reconfigure=True):
-        dl = ConfigDialog(self)
-        if reconfigure:
-            dl.load_config()
-        if dl.exec_(True):
-            dl.write_config()
-            Patient.connection.reload()
-
-    def excepthook(self, exc_type, exc_val, tracebackobj):
-        '''
-        PyQt4 prints unhandled exceptions to stdout and carries on regardless
-        I don't want this to happen.
-        so sys.excepthook is passed to this
-        '''
-        self.timer.stop()
-        QtGui.QApplication.instance().restoreOverrideCursor()
-        message = ""
-        for l in traceback.format_exception(exc_type, exc_val, tracebackobj):
-            message += l
-        QtGui.QMessageBox.warning(self, _("Error"),
-                                  'UNHANDLED EXCEPTION!<hr /><pre>%s</pre>' % message)
-        self.timer.start()
-
-    def check_record_in_use(self):
-        if not SURGERY_NO:
-            return
-        logging.debug("checking record in use")
-        db = self.connection.connection
-        cursor = db.cursor()
-        cursor.execute(
-            "select serialno from calldurr where stn = %s", (SURGERY_NO,))
-        row = cursor.fetchone()
-        if row:
-            serialno = row[0]
-            if serialno and serialno != self._loaded_serialno:
-                self.load_patient(serialno)
-                self._loaded_serialno = serialno
-                # self.setWindowState(
-                #    QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
-                self.activateWindow()
-
-if __name__ == "__main__":
-    gettext.install("openmolar")
-    logging.basicConfig(level=logging.DEBUG)
-    app = RestorableApplication("om_charter")
-    mw = MainWindow()
-    sys.excepthook = mw.excepthook
-    mw.show()
-    app.exec_()
diff --git a/src/tests/appt_drag_test.py b/src/tests/appt_drag_test.py
deleted file mode 100644
index 98eb266..0000000
--- a/src/tests/appt_drag_test.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# ############################################################################ #
-# #                                                                          # #
-# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com>                # #
-# #                                                                          # #
-# # This file is part of OpenMolar.                                          # #
-# #                                                                          # #
-# # OpenMolar is free software: you can redistribute it and/or modify        # #
-# # it under the terms of the GNU General Public License as published by     # #
-# # the Free Software Foundation, either version 3 of the License, or        # #
-# # (at your option) any later version.                                      # #
-# #                                                                          # #
-# # OpenMolar is distributed in the hope that it will be useful,             # #
-# # but WITHOUT ANY WARRANTY; without even the implied warranty of           # #
-# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            # #
-# # GNU General Public License for more details.                             # #
-# #                                                                          # #
-# # You should have received a copy of the GNU General Public License        # #
-# # along with OpenMolar.  If not, see <http://www.gnu.org/licenses/>.       # #
-# #                                                                          # #
-# ############################################################################ #
-
-import datetime
-import cPickle
-import pickle
-import sys
-
-from PyQt4 import QtGui, QtCore
-from openmolar.dbtools import appointments
-from openmolar.settings import localsettings
-
-from openmolar.qt4gui.appointment_gui_modules.draggable_list \
-    import DraggableList
-from openmolar.qt4gui.appointment_gui_modules.list_models \
-    import SimpleListModel, BlockListModel
-
-
-class _DragTestDialog(QtGui.QDialog):
-
-    def __init__(self, parent=None):
-        QtGui.QDialog.__init__(self, parent)
-        self.setWindowTitle("Drag Drop Test")
-        self.pt = duckPt()
-
-        layout = QtGui.QGridLayout(self)
-
-        self.model = SimpleListModel()
-
-        appts = appointments.get_pts_appts(duckPt())
-
-        self.model.set_appointments(appts, appts[1])
-
-        self.appt_listView = DraggableList(True)
-        self.appt_listView.setModel(self.model)
-
-        self.block_model = BlockListModel()
-        self.blockView = DraggableList(False)
-        self.blockView.setModel(self.block_model)
-
-        self.book = appointmentwidget.AppointmentWidget("1000", "1200", self)
-        self.book.setDentist(1)
-        self.book.setStartTime(1015)
-        self.book.setEndTime(1145)
-        for appoint in (
-            (1, 1030, 1045, 'MCDONALD I', 6155, 'EXAM', '', '', '', 1, 73, 0,
-             0, datetime.datetime.now()), (1, 1115, 1130, 'EMERGENCY', 0, '', '', '', '', -128, 0, 0,
-                                           0, datetime.datetime.now())):
-            self.book.setAppointment(appoint)
-
-        self.OVbook = AppointmentOverviewWidget("1000", "1200", 15, 2, self)
-
-        d1 = appointments.DentistDay(1)
-        d1.start = 1015
-        d1.end = 1145
-        d1.memo = "hello"
-
-        d2 = appointments.DentistDay(4)
-        d2.start = 1015
-        d2.end = 1145
-
-        self.OVbook.dents = [d1, d2]
-        self.OVbook.clear()
-        self.OVbook.init_dicts()
-
-        for d in (d1, d2):
-            self.OVbook.setStartTime(d)
-            self.OVbook.setEndTime(d)
-            self.OVbook.setMemo(d)
-            self.OVbook.setFlags(d)
-
-        slot = appointments.FreeSlot(datetime.datetime(2009, 2, 2, 10, 45),
-                                     1, 20)
-        slot2 = appointments.FreeSlot(datetime.datetime(2009, 2, 2, 11, 0o5),
-                                      4, 60)
-
-        self.OVbook.addSlot(slot)
-        self.OVbook.addSlot(slot2)
-
-        appt = appointments.WeekViewAppointment()
-        appt.mpm = 10 * 60 + 30
-        appt.length = 15
-        appt.dent = 1
-        self.OVbook.appts[1] = (appt,)
-
-        emerg = appointments.WeekViewAppointment()
-        emerg.mpm = 11 * 60 + 15
-        emerg.length = 15
-        emerg.reason = "emergency"
-        self.OVbook.eTimes[1] = (emerg,)
-        self.OVbook.setMinimumWidth(200)
-
-        self.tw = QtGui.QTabWidget(self)
-        self.tw.addTab(self.book, "day")
-        self.tw.addTab(self.OVbook, "week")
-
-        layout.addWidget(self.appt_listView, 0, 0)
-        layout.addWidget(self.blockView, 2, 0)
-
-        layout.addWidget(self.tw, 0, 1, 3, 1)
-        # self.tw.setCurrentIndex(1)
-
-        self.model.appointment_selected.connect(slot_catcher)
-
-
-if __name__ == "__main__":
-
-    from openmolar.qt4gui.customwidgets import appointmentwidget
-    from openmolar.qt4gui.customwidgets.appointment_overviewwidget \
-        import AppointmentOverviewWidget
-
-    from openmolar.dbtools import appointments
-    from openmolar.settings import localsettings
-    localsettings.initiate()
-
-    def slot_catcher(arg):
-        print arg
-
-    class duckPt(object):
-
-        def __init__(self):
-            self.serialno = 11956
-            self.title = "Mr"
-            self.sname = "Neil"
-            self.fname = "Wallace"
-            self.cset = "P"
-
-    app = QtGui.QApplication([])
-    dl = _DragTestDialog()
-    dl.exec_()

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/openmolar.git



More information about the debian-med-commit mailing list